mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-11-11 04:48:44 +03:00
126 lines
3.3 KiB
Plaintext
126 lines
3.3 KiB
Plaintext
#import "git.h"
|
|
#import "include/git2.h"
|
|
#import <Cocoa/Cocoa.h>
|
|
|
|
namespace v8_extensions {
|
|
|
|
class GitRepository : public CefBase {
|
|
private:
|
|
bool exists;
|
|
git_repository *repo;
|
|
|
|
public:
|
|
GitRepository(const char *pathInRepo) {
|
|
exists = git_repository_open_ext(&repo, pathInRepo, 0, NULL) == GIT_OK;
|
|
}
|
|
|
|
~GitRepository() {
|
|
if (repo)
|
|
git_repository_free(repo);
|
|
}
|
|
|
|
CefRefPtr<CefV8Value> GetPath() {
|
|
if (exists)
|
|
return CefV8Value::CreateString(git_repository_path(repo));
|
|
else
|
|
return CefV8Value::CreateNull();
|
|
}
|
|
|
|
CefRefPtr<CefV8Value> GetHead() {
|
|
if (!exists)
|
|
return CefV8Value::CreateNull();
|
|
|
|
git_reference *head;
|
|
if (git_repository_head(&head, repo) == GIT_OK) {
|
|
if (git_repository_head_detached(repo) == 1) {
|
|
const git_oid* sha = git_reference_oid(head);
|
|
if (sha) {
|
|
char oid[GIT_OID_HEXSZ + 1];
|
|
git_oid_tostr(oid, GIT_OID_HEXSZ + 1, sha);
|
|
return CefV8Value::CreateString(oid);
|
|
}
|
|
}
|
|
return CefV8Value::CreateString(git_reference_name(head));
|
|
}
|
|
|
|
return CefV8Value::CreateNull();
|
|
}
|
|
|
|
CefRefPtr<CefV8Value> IsIgnored(const char *path) {
|
|
if (!exists) {
|
|
return CefV8Value::CreateBool(false);
|
|
}
|
|
|
|
int ignored;
|
|
if (git_ignore_path_is_ignored(&ignored, repo, path) == GIT_OK) {
|
|
return CefV8Value::CreateBool(ignored == 1);
|
|
}
|
|
else {
|
|
return CefV8Value::CreateBool(false);
|
|
}
|
|
}
|
|
|
|
CefRefPtr<CefV8Value> GetStatus(const char *path) {
|
|
if (!exists) {
|
|
return CefV8Value::CreateInt(-1);
|
|
}
|
|
|
|
unsigned int status;
|
|
if (git_status_file(&status, repo, path) == GIT_OK) {
|
|
return CefV8Value::CreateInt(status);
|
|
}
|
|
else {
|
|
return CefV8Value::CreateInt(-1);
|
|
}
|
|
}
|
|
|
|
IMPLEMENT_REFCOUNTING(GitRepository);
|
|
};
|
|
|
|
Git::Git() : CefV8Handler() {
|
|
NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"v8_extensions/git.js"];
|
|
NSString *extensionCode = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
|
|
CefRegisterExtension("v8/git", [extensionCode UTF8String], this);
|
|
}
|
|
|
|
bool Git::Execute(const CefString& name,
|
|
CefRefPtr<CefV8Value> object,
|
|
const CefV8ValueList& arguments,
|
|
CefRefPtr<CefV8Value>& retval,
|
|
CefString& exception) {
|
|
if (name == "getRepository") {
|
|
CefRefPtr<CefBase> userData = new GitRepository(arguments[0]->GetStringValue().ToString().c_str());
|
|
retval = CefV8Value::CreateObject(NULL);
|
|
retval->SetUserData(userData);
|
|
return true;
|
|
}
|
|
|
|
if (name == "getHead") {
|
|
GitRepository *userData = (GitRepository *)object->GetUserData().get();
|
|
retval = userData->GetHead();
|
|
return true;
|
|
}
|
|
|
|
if (name == "getPath") {
|
|
GitRepository *userData = (GitRepository *)object->GetUserData().get();
|
|
retval = userData->GetPath();
|
|
return true;
|
|
}
|
|
|
|
if (name == "isIgnored") {
|
|
GitRepository *userData = (GitRepository *)object->GetUserData().get();
|
|
retval = userData->IsIgnored(arguments[0]->GetStringValue().ToString().c_str());
|
|
return true;
|
|
}
|
|
|
|
if (name == "getStatus") {
|
|
GitRepository *userData = (GitRepository *)object->GetUserData().get();
|
|
retval = userData->GetStatus(arguments[0]->GetStringValue().ToString().c_str());
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
}
|