Created
February 5, 2015 16:08
-
-
Save johnhaley81/84a2c32e5b62a525a5cb to your computer and use it in GitHub Desktop.
diff_options pre libgit2_supplement.json change
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is a generated file, modify: generate/templates/struct_content.cc. | |
#include <nan.h> | |
#include <string.h> | |
#include <chrono> | |
#include <thread> | |
#include <execinfo.h> | |
#include <signal.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
extern "C" { | |
#include <git2.h> | |
} | |
#include <iostream> | |
#include "../include/functions/copy.h" | |
#include "../include/diff_options.h" | |
#include "../include/strarray.h" | |
#include "../include/diff.h" | |
#include "../include/diff_delta.h" | |
using namespace v8; | |
using namespace node; | |
using namespace std; | |
// generated from struct_content.cc | |
GitDiffOptions::GitDiffOptions() { | |
git_diff_options wrappedValue = GIT_DIFF_OPTIONS_INIT; | |
this->raw = (git_diff_options*) malloc(sizeof(git_diff_options)); | |
memcpy(this->raw, &wrappedValue, sizeof(git_diff_options)); | |
this->ConstructFields(); | |
this->selfFreeing = true; | |
} | |
GitDiffOptions::GitDiffOptions(git_diff_options* raw, bool selfFreeing) { | |
this->raw = raw; | |
this->ConstructFields(); | |
this->selfFreeing = selfFreeing; | |
} | |
GitDiffOptions::~GitDiffOptions() { | |
// This is going to cause memory leaks. We'll have to solve that later | |
// TODO: Clean up memory better | |
if (this->selfFreeing) { | |
free(this->raw); | |
} | |
} | |
void GitDiffOptions::ConstructFields() { | |
Local<Object> pathspecTemp = GitStrarray::New( | |
&this->raw->pathspec, | |
false | |
)->ToObject(); | |
NanAssignPersistent(this->pathspec, pathspecTemp); | |
// Set the static method call and set the payload for this function to be | |
// the current instance | |
this->raw->notify_cb = (git_diff_notify_cb)notify_cb_cppCallback; | |
this->raw->notify_payload = (void *)this; | |
this->notify_cb = new NanCallback(); | |
Local<Value> notify_payload = NanUndefined(); | |
NanAssignPersistent(this->notify_payload, notify_payload); | |
} | |
void GitDiffOptions::InitializeComponent(Handle<v8::Object> target) { | |
NanScope(); | |
Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(JSNewFunction); | |
tpl->InstanceTemplate()->SetInternalFieldCount(1); | |
tpl->SetClassName(NanNew<String>("DiffOptions")); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("version"), GetVersion, SetVersion); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("flags"), GetFlags, SetFlags); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("ignoreSubmodules"), GetIgnoreSubmodules, SetIgnoreSubmodules); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("pathspec"), GetPathspec, SetPathspec); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("notifyCb"), GetNotifyCb, SetNotifyCb); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("notifyPayload"), GetNotifyPayload, SetNotifyPayload); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("contextLines"), GetContextLines, SetContextLines); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("interhunkLines"), GetInterhunkLines, SetInterhunkLines); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("idAbbrev"), GetIdAbbrev, SetIdAbbrev); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("maxSize"), GetMaxSize, SetMaxSize); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("oldPrefix"), GetOldPrefix, SetOldPrefix); | |
tpl->InstanceTemplate()->SetAccessor(NanNew<String>("newPrefix"), GetNewPrefix, SetNewPrefix); | |
Local<Function> _constructor_template = tpl->GetFunction(); | |
NanAssignPersistent(constructor_template, _constructor_template); | |
target->Set(NanNew<String>("DiffOptions"), _constructor_template); | |
} | |
NAN_METHOD(GitDiffOptions::JSNewFunction) { | |
NanScope(); | |
GitDiffOptions* instance; | |
if (args.Length() == 0 || !args[0]->IsExternal()) { | |
instance = new GitDiffOptions(); | |
} | |
else { | |
instance = new GitDiffOptions(static_cast<git_diff_options*>(Handle<External>::Cast(args[0])->Value()), args[1]->BooleanValue()); | |
} | |
instance->Wrap(args.This()); | |
NanReturnValue(args.This()); | |
} | |
Handle<Value> GitDiffOptions::New(void* raw, bool selfFreeing) { | |
NanEscapableScope(); | |
Handle<Value> argv[2] = { NanNew<External>((void *)raw), NanNew<Boolean>(selfFreeing) }; | |
return NanEscapeScope(NanNew<Function>(GitDiffOptions::constructor_template)->NewInstance(2, argv)); | |
} | |
git_diff_options *GitDiffOptions::GetValue() { | |
return this->raw; | |
} | |
git_diff_options **GitDiffOptions::GetRefValue() { | |
return &this->raw; | |
} | |
NAN_GETTER(GitDiffOptions::GetVersion) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(NanNew<Number>(wrapper->GetValue()->version)); | |
} | |
NAN_SETTER(GitDiffOptions::SetVersion) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsNumber()) { | |
wrapper->GetValue()->version = (unsigned int) value->Int32Value(); | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetFlags) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(NanNew<Number>(wrapper->GetValue()->flags)); | |
} | |
NAN_SETTER(GitDiffOptions::SetFlags) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsNumber()) { | |
wrapper->GetValue()->flags = (uint32_t) value->Int32Value(); | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetIgnoreSubmodules) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(NanNew((int)wrapper->GetValue()->ignore_submodules)); | |
} | |
NAN_SETTER(GitDiffOptions::SetIgnoreSubmodules) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsNumber()) { | |
wrapper->GetValue()->ignore_submodules = (git_submodule_ignore_t) value->Int32Value(); | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetPathspec) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(wrapper->pathspec); | |
} | |
NAN_SETTER(GitDiffOptions::SetPathspec) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanDisposePersistent(wrapper->pathspec); | |
wrapper->raw->pathspec = * ObjectWrap::Unwrap<GitStrarray>(value->ToObject())->GetValue(); | |
} | |
NAN_GETTER(GitDiffOptions::GetNotifyCb) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(wrapper->notify_cb->GetFunction()); | |
} | |
NAN_SETTER(GitDiffOptions::SetNotifyCb) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsFunction()) { | |
wrapper->notify_cb = new NanCallback(value.As<Function>()); | |
} | |
} | |
void handler(int sig) { | |
void *array[10]; | |
size_t size; | |
// get void*'s for all entries on the stack | |
size = backtrace(array, 10); | |
// print out all the frames to stderr | |
fprintf(stderr, "Error: signal %d:\n", sig); | |
backtrace_symbols_fd(array, size, STDERR_FILENO); | |
exit(1); | |
} | |
int GitDiffOptions::notify_cb_cppCallback ( | |
const git_diff * diff_so_far, git_diff_delta * delta_to_add, const char * matched_pathspec, void * payload ) { | |
NotifyCbBaton* baton = new NotifyCbBaton(); | |
signal(SIGSEGV, handler); | |
baton->diff_so_far = diff_so_far; | |
baton->delta_to_add = delta_to_add; | |
baton->matched_pathspec = matched_pathspec; | |
baton->payload = payload; | |
//cout << "matched_pathspec: " << matched_pathspec << "\n\n\n\n\n"; | |
baton->req.data = baton; | |
baton->done = false; | |
uv_queue_work(uv_default_loop(), &baton->req, notify_cb_asyncWork, notify_cb_asyncAfter); | |
while(!baton->done) { | |
this_thread::sleep_for(chrono::milliseconds(1)); | |
} | |
return baton->result; | |
} | |
void GitDiffOptions::notify_cb_asyncWork(uv_work_t* req) { | |
// We aren't doing any work on a seperate thread, just need to | |
// access the main node thread in the async after method. | |
// However, this worker method is still needed | |
} | |
void GitDiffOptions::notify_cb_asyncAfter(uv_work_t* req, int status) { | |
NanScope(); | |
NotifyCbBaton* baton = static_cast<NotifyCbBaton*>(req->data); | |
GitDiffOptions* instance = static_cast<GitDiffOptions*>(baton->payload); | |
if (instance->notify_cb->IsEmpty()) { | |
baton->result = 1; // no results acquired | |
baton->done = true; | |
return; | |
} | |
Local<Value> argv[3] = { | |
NanNew(GitDiff::New(&baton->diff_so_far, false)), | |
NanNew(GitDiffDelta::New(&baton->delta_to_add, false)), | |
NanNew(baton->matched_pathspec == 0 ? "" : baton->matched_pathspec) | |
}; | |
TryCatch tryCatch; | |
Handle<Value> result = instance->notify_cb->Call(3, argv); | |
if (result->IsObject() && result->ToObject()->Has(NanNew("then"))) { | |
Handle<Value> thenProp = result->ToObject()->Get(NanNew("then")); | |
if (thenProp->IsFunction()) { | |
// we can be reasonbly certain that the result is a promise | |
Local<Object> promise = result->ToObject(); | |
NanAssignPersistent(baton->promise, promise); | |
uv_queue_work(uv_default_loop(), &baton->req, notify_cb_asyncWork, notify_cb_asyncPromisePolling); | |
return; | |
} | |
} | |
int resultStatus; | |
baton->done = true; | |
} | |
void GitDiffOptions::notify_cb_asyncPromisePolling(uv_work_t* req, int status) { | |
NanScope(); | |
NotifyCbBaton* baton = static_cast<NotifyCbBaton*>(req->data); | |
Local<Object> promise = NanNew<Object>(baton->promise); | |
NanCallback* isPendingFn = new NanCallback(promise->Get(NanNew("isPending")).As<Function>()); | |
Local<Value> argv[1]; // MSBUILD won't assign an array of length 0 | |
Local<Boolean> isPending = isPendingFn->Call(0, argv)->ToBoolean(); | |
if (isPending->Value()) { | |
uv_queue_work(uv_default_loop(), &baton->req, notify_cb_asyncWork, notify_cb_asyncPromisePolling); | |
return; | |
} | |
NanCallback* isFulfilledFn = new NanCallback(promise->Get(NanNew("isFulfilled")).As<Function>()); | |
Local<Boolean> isFulfilled = isFulfilledFn->Call(0, argv)->ToBoolean(); | |
if (isFulfilled->Value()) { | |
NanCallback* resultFn = new NanCallback(promise->Get(NanNew("value")).As<Function>()); | |
Handle<Value> result = resultFn->Call(0, argv); | |
int resultStatus; | |
baton->done = true; | |
} | |
else { | |
// promise was rejected | |
baton->result = -1; | |
baton->done = false; | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetNotifyPayload) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(wrapper->notify_payload); | |
} | |
NAN_SETTER(GitDiffOptions::SetNotifyPayload) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanAssignPersistent(wrapper->notify_payload, value); | |
} | |
NAN_GETTER(GitDiffOptions::GetContextLines) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(NanNew<Number>(wrapper->GetValue()->context_lines)); | |
} | |
NAN_SETTER(GitDiffOptions::SetContextLines) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsNumber()) { | |
wrapper->GetValue()->context_lines = (uint16_t) value->Int32Value(); | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetInterhunkLines) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(NanNew<Number>(wrapper->GetValue()->interhunk_lines)); | |
} | |
NAN_SETTER(GitDiffOptions::SetInterhunkLines) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsNumber()) { | |
wrapper->GetValue()->interhunk_lines = (uint16_t) value->Int32Value(); | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetIdAbbrev) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(NanNew<Number>(wrapper->GetValue()->id_abbrev)); | |
} | |
NAN_SETTER(GitDiffOptions::SetIdAbbrev) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsNumber()) { | |
wrapper->GetValue()->id_abbrev = (uint16_t) value->Int32Value(); | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetMaxSize) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
NanReturnValue(NanNew((int)wrapper->GetValue()->max_size)); | |
} | |
NAN_SETTER(GitDiffOptions::SetMaxSize) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (value->IsNumber()) { | |
wrapper->GetValue()->max_size = (git_off_t) value->Int32Value(); | |
} | |
} | |
NAN_GETTER(GitDiffOptions::GetOldPrefix) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (wrapper->GetValue()->old_prefix) { | |
NanReturnValue(NanNew<String>(wrapper->GetValue()->old_prefix)); | |
} | |
else { | |
NanReturnUndefined(); | |
} | |
} | |
NAN_SETTER(GitDiffOptions::SetOldPrefix) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (wrapper->GetValue()->old_prefix) { | |
} | |
String::Utf8Value str(value); | |
wrapper->GetValue()->old_prefix = strdup(*str); | |
} | |
NAN_GETTER(GitDiffOptions::GetNewPrefix) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (wrapper->GetValue()->new_prefix) { | |
NanReturnValue(NanNew<String>(wrapper->GetValue()->new_prefix)); | |
} | |
else { | |
NanReturnUndefined(); | |
} | |
} | |
NAN_SETTER(GitDiffOptions::SetNewPrefix) { | |
NanScope(); | |
GitDiffOptions *wrapper = ObjectWrap::Unwrap<GitDiffOptions>(args.This()); | |
if (wrapper->GetValue()->new_prefix) { | |
} | |
String::Utf8Value str(value); | |
wrapper->GetValue()->new_prefix = strdup(*str); | |
} | |
Persistent<Function> GitDiffOptions::constructor_template; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef GITDIFFOPTIONS_H | |
#define GITDIFFOPTIONS_H | |
// generated from struct_header.h | |
#include <nan.h> | |
#include <string> | |
extern "C" { | |
#include <git2.h> | |
} | |
#include "../include/strarray.h" | |
#include "../include/diff.h" | |
#include "../include/diff_delta.h" | |
using namespace node; | |
using namespace v8; | |
class GitDiffOptions : public ObjectWrap { | |
public: | |
GitDiffOptions(git_diff_options* raw, bool selfFreeing); | |
static Persistent<Function> constructor_template; | |
static void InitializeComponent (Handle<v8::Object> target); | |
git_diff_options *GetValue(); | |
git_diff_options **GetRefValue(); | |
static Handle<Value> New(void *raw, bool selfFreeing); | |
bool selfFreeing; | |
static int notify_cb_cppCallback ( | |
const git_diff * diff_so_far | |
, | |
git_diff_delta * delta_to_add | |
, | |
const char * matched_pathspec | |
, | |
void * payload | |
); | |
static void notify_cb_asyncWork(uv_work_t* req); | |
static void notify_cb_asyncAfter(uv_work_t* req, int status); | |
static void notify_cb_asyncPromisePolling(uv_work_t* req, int status); | |
struct NotifyCbBaton { | |
const git_diff * diff_so_far; | |
git_diff_delta * delta_to_add; | |
const char * matched_pathspec; | |
void * payload; | |
uv_work_t req; | |
int result; | |
Persistent<Object> promise; | |
bool done; | |
}; | |
private: | |
GitDiffOptions(); | |
~GitDiffOptions(); | |
void ConstructFields(); | |
static NAN_METHOD(JSNewFunction); | |
static NAN_GETTER(GetVersion); | |
static NAN_SETTER(SetVersion); | |
static NAN_GETTER(GetFlags); | |
static NAN_SETTER(SetFlags); | |
static NAN_GETTER(GetIgnoreSubmodules); | |
static NAN_SETTER(SetIgnoreSubmodules); | |
Persistent<Object> pathspec; | |
static NAN_GETTER(GetPathspec); | |
static NAN_SETTER(SetPathspec); | |
NanCallback* notify_cb; | |
static NAN_GETTER(GetNotifyCb); | |
static NAN_SETTER(SetNotifyCb); | |
Persistent<Value> notify_payload; | |
static NAN_GETTER(GetNotifyPayload); | |
static NAN_SETTER(SetNotifyPayload); | |
static NAN_GETTER(GetContextLines); | |
static NAN_SETTER(SetContextLines); | |
static NAN_GETTER(GetInterhunkLines); | |
static NAN_SETTER(SetInterhunkLines); | |
static NAN_GETTER(GetIdAbbrev); | |
static NAN_SETTER(SetIdAbbrev); | |
static NAN_GETTER(GetMaxSize); | |
static NAN_SETTER(SetMaxSize); | |
static NAN_GETTER(GetOldPrefix); | |
static NAN_SETTER(SetOldPrefix); | |
static NAN_GETTER(GetNewPrefix); | |
static NAN_SETTER(SetNewPrefix); | |
git_diff_options *raw; | |
}; | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment