/* * Copyright 2011, Tim Branyen @tbranyen * @author Michael Robinson @codeofinterest * * Dual licensed under the MIT and GPL licenses. */ #include #include #include #include #include #include "../vendor/libgit2/include/git2.h" #include "../include/repo.h" using namespace node; using namespace v8; /** * Class wrapper for libgit2 git_diff_list */ class GitDiffList : public ObjectWrap { public: /** * v8::FunctionTemplate used to create Node.js constructor */ static Persistent constructor_template; static const int WALK_DELTA_THRESHHOLD = 10; /** * Used to intialize the EventEmitter from Node.js * * @param target v8::Object the Node.js module object */ static void Initialize (Handle target); git_diff_list* GetValue(); void SetValue(git_diff_list* diffList); void Close(); protected: GitDiffList() {} ~GitDiffList() {} static Handle New(const Arguments& args); static Handle Close(const Arguments& args); static Handle TreeToTree(const Arguments& args); static void TreeToTreeWork(uv_work_t *req); static void TreeToTreeAfterWork(uv_work_t *req); /** * Walk the current git_diff_list */ static Handle Walk(const Arguments& args); static void WalkWork(void *payload); static int WalkWorkFile(const git_diff_delta *delta, float progress, void *payload); static int WalkWorkHunk(const git_diff_delta *delta, const git_diff_range *range, const char *header, size_t header_len, void *payload); static int WalkWorkData(const git_diff_delta *delta, /** delta that contains this data */ const git_diff_range *range, /** range of lines containing this data */ char line_origin, /** git_diff_list_t value from above */ const char *content, /** diff data - not NUL terminated */ size_t content_len, /** number of bytes of diff data */ void *payload); /** user reference data */ /** * Called when WalkWorkFile reaches its cache * thresholds. Passes data back to main thread * * @param payload The WalkBaton */ static void WalkWorkSendFile(uv_async_t *handle, int status /*UNUSED*/); static void WalkWorkSendHunk(uv_async_t *handle, int status /*UNUSED*/); static void WalkWorkSendData(uv_async_t *handle, int status /*UNUSED*/); static void WalkWorkSendEnd(uv_async_t *handle, int status /*UNUSED*/); private: git_diff_list* diffList; // git_oid* oldOid; // git_oid* newOid; struct TreeToTreeBaton { uv_work_t request; const git_error* error; GitDiffList *diffList; git_repository* repo; git_oid oldOid; std::string oldSha; git_oid newOid; std::string newSha; git_diff_list* rawDiffList; Persistent callback; }; struct DeltaContent { git_diff_range *range; char lineOrigin; size_t contentLength; std::string content; }; struct Delta { git_diff_delta *raw; std::vector contents; }; struct WalkBaton { uv_thread_t threadId; uv_mutex_t mutex; uv_async_t asyncFile; uv_async_t asyncHunk; uv_async_t asyncData; uv_async_t asyncEnd; const git_error* error; std::map fileDeltas; git_diff_list* rawDiffList; Persistent fileCallback; Persistent hunkCallback; Persistent lineCallback; Persistent endCallback; }; };