/** * This code is auto-generated; unless you know what you're doing, do not modify! **/ #include #include #include #include "git2.h" #include "../include/diff.h" #include "../include/functions/utilities.h" #include "../include/functions/string.h" using namespace v8; using namespace node; GitDiff::GitDiff(git_diff_list *raw) { this->raw = raw; } GitDiff::~GitDiff() { git_diff_list_free(this->raw); } void GitDiff::Initialize(Handle target) { NanScope(); Local tpl = FunctionTemplate::New(New); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(NanSymbol("Diff")); NODE_SET_METHOD(tpl, "treeToTree", TreeToTree); NODE_SET_METHOD(tpl, "treeToIndex", TreeToIndex); NODE_SET_METHOD(tpl, "indexToWorkdir", IndexToWorkdir); NODE_SET_METHOD(tpl, "treeToWorkdir", TreeToWorkdir); NODE_SET_PROTOTYPE_METHOD(tpl, "merge", Merge); NODE_SET_PROTOTYPE_METHOD(tpl, "findSimilar", FindSimilar); NODE_SET_METHOD(tpl, "statusChar", StatusChar); NODE_SET_PROTOTYPE_METHOD(tpl, "numDeltas", NumDeltas); NODE_SET_METHOD(tpl, "numDeltasOfType", NumDeltasOfType); NODE_SET_PROTOTYPE_METHOD(tpl, "getPatch", GetPatch); NanAssignPersistent(FunctionTemplate, constructor_template, tpl); target->Set(String::NewSymbol("Diff"), tpl->GetFunction()); } Handle GitDiff::New(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsExternal()) { return ThrowException(Exception::Error(String::New("git_diff_list is required."))); } GitDiff* object = new GitDiff((git_diff_list *) External::Unwrap(args[0])); object->Wrap(args.This()); return scope.Close(args.This()); } git_diff_list *GitDiff::GetValue() { return this->raw; } Handle GitDiff::TreeToTree(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("Repository repo is required."))); } if (args.Length() == 1 || !args[1]->IsObject()) { return ThrowException(Exception::Error(String::New("Tree old_tree is required."))); } if (args.Length() == 2 || !args[2]->IsObject()) { return ThrowException(Exception::Error(String::New("Tree new_tree is required."))); } if (args.Length() == 3 || !args[3]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffOptions opts is required."))); } if (args.Length() == 4 || !args[4]->IsFunction()) { return ThrowException(Exception::Error(String::New("Callback is required and must be a Function."))); } TreeToTreeBaton* baton = new TreeToTreeBaton; baton->error = NULL; baton->request.data = baton; baton->repoReference = Persistent::New(args[0]); baton->repo = ObjectWrap::Unwrap(args[0]->ToObject())->GetValue(); baton->old_treeReference = Persistent::New(args[1]); baton->old_tree = ObjectWrap::Unwrap(args[1]->ToObject())->GetValue(); baton->new_treeReference = Persistent::New(args[2]); baton->new_tree = ObjectWrap::Unwrap(args[2]->ToObject())->GetValue(); baton->optsReference = Persistent::New(args[3]); baton->opts = ObjectWrap::Unwrap(args[3]->ToObject())->GetValue(); baton->callback = Persistent::New(Local::Cast(args[4])); uv_queue_work(uv_default_loop(), &baton->request, TreeToTreeWork, (uv_after_work_cb)TreeToTreeAfterWork); return Undefined(); } void GitDiff::TreeToTreeWork(uv_work_t *req) { TreeToTreeBaton *baton = static_cast(req->data); int diff = git_diff_tree_to_tree( &baton->diff, baton->repo, baton->old_tree, baton->new_tree, baton->opts ); if (diff != GIT_OK) { baton->error = giterr_last(); } } void GitDiff::TreeToTreeAfterWork(uv_work_t *req) { HandleScope scope; TreeToTreeBaton *baton = static_cast(req->data); TryCatch try_catch; if (!baton->error) { Handle argv[1] = { External::New(baton->diff) }; Handle diff = GitDiffList::constructor_template->NewInstance(1, argv); Handle argv2[2] = { Local::New(Null()), diff }; baton->callback->Call(Context::GetCurrent()->Global(), 2, argv2); } else { Handle argv2[1] = { GitError::WrapError(baton->error) }; baton->callback->Call(Context::GetCurrent()->Global(), 1, argv2); } if (try_catch.HasCaught()) { node::FatalException(try_catch); } baton->repoReference.Dispose(); baton->old_treeReference.Dispose(); baton->new_treeReference.Dispose(); baton->optsReference.Dispose(); baton->callback.Dispose(); delete baton; } Handle GitDiff::TreeToIndex(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("Repository repo is required."))); } if (args.Length() == 1 || !args[1]->IsObject()) { return ThrowException(Exception::Error(String::New("Tree old_tree is required."))); } if (args.Length() == 2 || !args[2]->IsObject()) { return ThrowException(Exception::Error(String::New("Index index is required."))); } if (args.Length() == 3 || !args[3]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffOptions opts is required."))); } if (args.Length() == 4 || !args[4]->IsFunction()) { return ThrowException(Exception::Error(String::New("Callback is required and must be a Function."))); } TreeToIndexBaton* baton = new TreeToIndexBaton; baton->error = NULL; baton->request.data = baton; baton->repoReference = Persistent::New(args[0]); baton->repo = ObjectWrap::Unwrap(args[0]->ToObject())->GetValue(); baton->old_treeReference = Persistent::New(args[1]); baton->old_tree = ObjectWrap::Unwrap(args[1]->ToObject())->GetValue(); baton->indexReference = Persistent::New(args[2]); baton->index = ObjectWrap::Unwrap(args[2]->ToObject())->GetValue(); baton->optsReference = Persistent::New(args[3]); baton->opts = ObjectWrap::Unwrap(args[3]->ToObject())->GetValue(); baton->callback = Persistent::New(Local::Cast(args[4])); uv_queue_work(uv_default_loop(), &baton->request, TreeToIndexWork, (uv_after_work_cb)TreeToIndexAfterWork); return Undefined(); } void GitDiff::TreeToIndexWork(uv_work_t *req) { TreeToIndexBaton *baton = static_cast(req->data); int diff = git_diff_tree_to_index( &baton->diff, baton->repo, baton->old_tree, baton->index, baton->opts ); if (diff != GIT_OK) { baton->error = giterr_last(); } } void GitDiff::TreeToIndexAfterWork(uv_work_t *req) { HandleScope scope; TreeToIndexBaton *baton = static_cast(req->data); TryCatch try_catch; if (!baton->error) { Handle argv[1] = { External::New(baton->diff) }; Handle diff = GitDiffList::constructor_template->NewInstance(1, argv); Handle argv2[2] = { Local::New(Null()), diff }; baton->callback->Call(Context::GetCurrent()->Global(), 2, argv2); } else { Handle argv2[1] = { GitError::WrapError(baton->error) }; baton->callback->Call(Context::GetCurrent()->Global(), 1, argv2); } if (try_catch.HasCaught()) { node::FatalException(try_catch); } baton->repoReference.Dispose(); baton->old_treeReference.Dispose(); baton->indexReference.Dispose(); baton->optsReference.Dispose(); baton->callback.Dispose(); delete baton; } Handle GitDiff::IndexToWorkdir(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("Repository repo is required."))); } if (args.Length() == 1 || !args[1]->IsObject()) { return ThrowException(Exception::Error(String::New("Index index is required."))); } if (args.Length() == 2 || !args[2]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffOptions opts is required."))); } if (args.Length() == 3 || !args[3]->IsFunction()) { return ThrowException(Exception::Error(String::New("Callback is required and must be a Function."))); } IndexToWorkdirBaton* baton = new IndexToWorkdirBaton; baton->error = NULL; baton->request.data = baton; baton->repoReference = Persistent::New(args[0]); baton->repo = ObjectWrap::Unwrap(args[0]->ToObject())->GetValue(); baton->indexReference = Persistent::New(args[1]); baton->index = ObjectWrap::Unwrap(args[1]->ToObject())->GetValue(); baton->optsReference = Persistent::New(args[2]); baton->opts = ObjectWrap::Unwrap(args[2]->ToObject())->GetValue(); baton->callback = Persistent::New(Local::Cast(args[3])); uv_queue_work(uv_default_loop(), &baton->request, IndexToWorkdirWork, (uv_after_work_cb)IndexToWorkdirAfterWork); return Undefined(); } void GitDiff::IndexToWorkdirWork(uv_work_t *req) { IndexToWorkdirBaton *baton = static_cast(req->data); int diff = git_diff_index_to_workdir( &baton->diff, baton->repo, baton->index, baton->opts ); if (diff != GIT_OK) { baton->error = giterr_last(); } } void GitDiff::IndexToWorkdirAfterWork(uv_work_t *req) { HandleScope scope; IndexToWorkdirBaton *baton = static_cast(req->data); TryCatch try_catch; if (!baton->error) { Handle argv[1] = { External::New(baton->diff) }; Handle diff = GitDiffList::constructor_template->NewInstance(1, argv); Handle argv2[2] = { Local::New(Null()), diff }; baton->callback->Call(Context::GetCurrent()->Global(), 2, argv2); } else { Handle argv2[1] = { GitError::WrapError(baton->error) }; baton->callback->Call(Context::GetCurrent()->Global(), 1, argv2); } if (try_catch.HasCaught()) { node::FatalException(try_catch); } baton->repoReference.Dispose(); baton->indexReference.Dispose(); baton->optsReference.Dispose(); baton->callback.Dispose(); delete baton; } Handle GitDiff::TreeToWorkdir(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("Repository repo is required."))); } if (args.Length() == 1 || !args[1]->IsObject()) { return ThrowException(Exception::Error(String::New("Tree old_tree is required."))); } if (args.Length() == 2 || !args[2]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffOptions opts is required."))); } if (args.Length() == 3 || !args[3]->IsFunction()) { return ThrowException(Exception::Error(String::New("Callback is required and must be a Function."))); } TreeToWorkdirBaton* baton = new TreeToWorkdirBaton; baton->error = NULL; baton->request.data = baton; baton->repoReference = Persistent::New(args[0]); baton->repo = ObjectWrap::Unwrap(args[0]->ToObject())->GetValue(); baton->old_treeReference = Persistent::New(args[1]); baton->old_tree = ObjectWrap::Unwrap(args[1]->ToObject())->GetValue(); baton->optsReference = Persistent::New(args[2]); baton->opts = ObjectWrap::Unwrap(args[2]->ToObject())->GetValue(); baton->callback = Persistent::New(Local::Cast(args[3])); uv_queue_work(uv_default_loop(), &baton->request, TreeToWorkdirWork, (uv_after_work_cb)TreeToWorkdirAfterWork); return Undefined(); } void GitDiff::TreeToWorkdirWork(uv_work_t *req) { TreeToWorkdirBaton *baton = static_cast(req->data); int diff = git_diff_tree_to_workdir( &baton->diff, baton->repo, baton->old_tree, baton->opts ); if (diff != GIT_OK) { baton->error = giterr_last(); } } void GitDiff::TreeToWorkdirAfterWork(uv_work_t *req) { HandleScope scope; TreeToWorkdirBaton *baton = static_cast(req->data); TryCatch try_catch; if (!baton->error) { Handle argv[1] = { External::New(baton->diff) }; Handle diff = GitDiffList::constructor_template->NewInstance(1, argv); Handle argv2[2] = { Local::New(Null()), diff }; baton->callback->Call(Context::GetCurrent()->Global(), 2, argv2); } else { Handle argv2[1] = { GitError::WrapError(baton->error) }; baton->callback->Call(Context::GetCurrent()->Global(), 1, argv2); } if (try_catch.HasCaught()) { node::FatalException(try_catch); } baton->repoReference.Dispose(); baton->old_treeReference.Dispose(); baton->optsReference.Dispose(); baton->callback.Dispose(); delete baton; } Handle GitDiff::Merge(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffList from is required."))); } int result = git_diff_merge( ObjectWrap::Unwrap(args.This())->GetValue() , ObjectWrap::Unwrap(args[0]->ToObject())->GetValue() ); if (result != GIT_OK) { return ThrowException(GitError::WrapError(giterr_last())); } return scope.Close(Int32::New(result)); } Handle GitDiff::FindSimilar(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffFindOptions options is required."))); } int result = git_diff_find_similar( ObjectWrap::Unwrap(args.This())->GetValue() , ObjectWrap::Unwrap(args[0]->ToObject())->GetValue() ); if (result != GIT_OK) { return ThrowException(GitError::WrapError(giterr_last())); } return scope.Close(Int32::New(result)); } Handle GitDiff::StatusChar(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsInt32()) { return ThrowException(Exception::Error(String::New("Number status is required."))); } char result = git_diff_status_char( (git_delta_t) args[0]->ToInt32()->Value() ); return scope.Close(String::New(result)); } Handle GitDiff::NumDeltas(const Arguments& args) { HandleScope scope; size_t result = git_diff_num_deltas( ObjectWrap::Unwrap(args.This())->GetValue() ); return scope.Close(Uint32::New(result)); } Handle GitDiff::NumDeltasOfType(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffList diff is required."))); } if (args.Length() == 1 || !args[1]->IsInt32()) { return ThrowException(Exception::Error(String::New("Number type is required."))); } size_t result = git_diff_num_deltas_of_type( ObjectWrap::Unwrap(args[0]->ToObject())->GetValue() , (git_delta_t) args[1]->ToInt32()->Value() ); return scope.Close(Uint32::New(result)); } Handle GitDiff::GetPatch(const Arguments& args) { HandleScope scope; if (args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("DiffDelta delta_out is required."))); } if (args.Length() == 1 || !args[1]->IsUint32()) { return ThrowException(Exception::Error(String::New("Number idx is required."))); } git_diff_patch * patch_out; int result = git_diff_get_patch( & patch_out , & ObjectWrap::Unwrap(args[0]->ToObject())->GetValue() , ObjectWrap::Unwrap(args.This())->GetValue() , (size_t) args[1]->ToUint32()->Value() ); if (result != GIT_OK) { return ThrowException(GitError::WrapError(giterr_last())); } // XXX need to copy object? Handle argv[1] = { External::New((void *)patch_out) }; return scope.Close(DiffPatch::constructor_template->NewInstance(1, argv)); } Persistent GitDiff::constructor_template;