Skip to content

Commit 63f2dac

Browse files
committed
Expose JavaScript function name in thrown error
When an error happens in libgit2, NodeGit will wrap the and expose the error code and message to be consumed via the JavaScript API. However, this information is often insufficient given the asynchronous nature of NodeGit and it may at times be unclear as to which JavaScript function caused the error on the libgit2 side. By exposing an 'errorFunction' property string that includes the name of the JavaScript function in the error, debugging should now be a lot easier as clients will now be able to quickly identify which JavaScript function in a long promise chain was the source of an error. Signed-off-by: Remy Suen <remy.suen@gmail.com>
1 parent 6ff67a8 commit 63f2dac

File tree

8 files changed

+15
-0
lines changed

8 files changed

+15
-0
lines changed

generate/scripts/helpers.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ var Helpers = {
315315

316316
fnDef.cppFunctionName = Helpers.cTypeToCppName(key, "git_" + typeDef.typeName);
317317
fnDef.jsFunctionName = Helpers.cTypeToJsName(key, "git_" + typeDef.typeName);
318+
fnDef.jsClassName = typeDef.jsClassName;
318319

319320
if (fnDef.cppFunctionName == typeDef.cppClassName) {
320321
fnDef.cppFunctionName = fnDef.cppFunctionName.replace("Git", "");

generate/templates/manual/patches/convenient_patches.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() {
102102
err = Nan::Error("Method convenientFromDiff has thrown an error.")->ToObject();
103103
}
104104
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
105+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked());
105106
Local<v8::Value> argv[1] = {
106107
err
107108
};
@@ -119,6 +120,7 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() {
119120
if (baton->error_code < 0) {
120121
Local<v8::Object> err = Nan::Error("method convenientFromDiff has thrown an error.")->ToObject();
121122
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
123+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked());
122124
Local<v8::Value> argv[1] = {
123125
err
124126
};

generate/templates/manual/remote/ls.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ void GitRemote::ReferenceListWorker::HandleOKCallback()
8787
{
8888
Local<v8::Object> err = Nan::Error("Reference List has thrown an error.")->ToObject();
8989
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
90+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Remote.referenceList").ToLocalChecked());
9091
Local<v8::Value> argv[1] = {
9192
err
9293
};

generate/templates/manual/revwalk/fast_walk.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback()
9595
err = Nan::Error("Method fastWalk has thrown an error.")->ToObject();
9696
}
9797
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
98+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked());
9899
Local<v8::Value> argv[1] = {
99100
err
100101
};
@@ -159,6 +160,7 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback()
159160
{
160161
Local<v8::Object> err = Nan::Error("Method next has thrown an error.")->ToObject();
161162
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
163+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked());
162164
Local<v8::Value> argv[1] = {
163165
err
164166
};

generate/templates/manual/revwalk/file_history_walk.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback()
296296
err = Nan::Error("Method fileHistoryWalk has thrown an error.")->ToObject();
297297
}
298298
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
299+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked());
299300
Local<v8::Value> argv[1] = {
300301
err
301302
};
@@ -312,6 +313,7 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback()
312313
if (baton->error_code < 0) {
313314
Local<v8::Object> err = Nan::Error("Method next has thrown an error.")->ToObject();
314315
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
316+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked());
315317
Local<v8::Value> argv[1] = {
316318
err
317319
};

generate/templates/manual/src/filter_registry.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() {
107107
err = Nan::Error("Method register has thrown an error.")->ToObject();
108108
}
109109
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
110+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked());
110111
v8::Local<v8::Value> argv[1] = {
111112
err
112113
};
@@ -118,6 +119,7 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() {
118119
else if (baton->error_code < 0) {
119120
v8::Local<v8::Object> err = Nan::Error("Method register has thrown an error.")->ToObject();
120121
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
122+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked());
121123
v8::Local<v8::Value> argv[1] = {
122124
err
123125
};
@@ -191,6 +193,7 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() {
191193
err = Nan::Error("Method register has thrown an error.")->ToObject();
192194
}
193195
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
196+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked());
194197
v8::Local<v8::Value> argv[1] = {
195198
err
196199
};
@@ -202,6 +205,7 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() {
202205
else if (baton->error_code < 0) {
203206
v8::Local<v8::Object> err = Nan::Error("Method unregister has thrown an error.")->ToObject();
204207
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
208+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked());
205209
v8::Local<v8::Value> argv[1] = {
206210
err
207211
};

generate/templates/partials/async_function.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() {
161161
err = Nan::Error("Method {{ jsFunctionName }} has thrown an error.")->ToObject();
162162
}
163163
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
164+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked());
164165
v8::Local<v8::Value> argv[1] = {
165166
err
166167
};
@@ -222,6 +223,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() {
222223
if (!callbackFired) {
223224
v8::Local<v8::Object> err = Nan::Error("Method {{ jsFunctionName }} has thrown an error.")->ToObject();
224225
err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code));
226+
err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked());
225227
v8::Local<v8::Value> argv[1] = {
226228
err
227229
};

test/tests/merge.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,6 +1628,7 @@ describe("Merge", function() {
16281628
"should not be able to retrieve common merge base"));
16291629
}, function(err) {
16301630
assert.equal("no merge base found", err.message);
1631+
assert.equal("Merge.base", err.errorFunction);
16311632
assert.equal(NodeGit.Error.CODE.ENOTFOUND, err.errno);
16321633
});
16331634
});

0 commit comments

Comments
 (0)