diff --git a/native/v8_extensions/git.js b/native/v8_extensions/git.js index aaae57510..fa4b1b49c 100644 --- a/native/v8_extensions/git.js +++ b/native/v8_extensions/git.js @@ -10,6 +10,7 @@ var $git = {}; native function getDiffStats(path); native function isSubmodule(path); native function refreshIndex(); + native function destroy(); function GitRepository(path) { var repo = getRepository(path); @@ -29,5 +30,6 @@ var $git = {}; GitRepository.prototype.getDiffStats = getDiffStats; GitRepository.prototype.isSubmodule = isSubmodule; GitRepository.prototype.refreshIndex = refreshIndex; + GitRepository.prototype.destroy = destroy; this.GitRepository = GitRepository; })(); diff --git a/native/v8_extensions/git.mm b/native/v8_extensions/git.mm index 39ef3dc0d..b0d8cebe9 100644 --- a/native/v8_extensions/git.mm +++ b/native/v8_extensions/git.mm @@ -16,10 +16,17 @@ public: } ~GitRepository() { - git_repository_free(repo); + Destroy(); } - BOOL exists() { + void Destroy() { + if (Exists()) { + git_repository_free(repo); + repo = NULL; + } + } + + BOOL Exists() { return repo != NULL; } @@ -190,7 +197,7 @@ bool Git::Execute(const CefString& name, CefString& exception) { if (name == "getRepository") { GitRepository *repository = new GitRepository(arguments[0]->GetStringValue().ToString().c_str()); - if (repository->exists()) { + if (repository->Exists()) { CefRefPtr userData = repository; retval = CefV8Value::CreateObject(NULL); retval->SetUserData(userData); @@ -248,6 +255,12 @@ bool Git::Execute(const CefString& name, return true; } + if (name == "destroy") { + GitRepository *userData = (GitRepository *)object->GetUserData().get(); + userData->Destroy(); + return true; + } + return false; } diff --git a/src/app/git.coffee b/src/app/git.coffee index ac8e6e3e0..e2142385f 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -1,4 +1,6 @@ $ = require 'jquery' +_ = require 'underscore' +Subscriber = require 'subscriber' module.exports = class Git @@ -23,12 +25,17 @@ class Git constructor: (path) -> @repo = new GitRepository(path) - $(window).on 'focus', => @refreshIndex() + @subscribe $(window), 'focus', => @refreshIndex() refreshIndex: -> @repo.refreshIndex() getPath: -> @repo.getPath() + destroy: -> + @repo.destroy() + @repo = null + @unsubscribe() + getWorkingDirectory: -> repoPath = @getPath() repoPath?.substring(0, repoPath.length - 6) @@ -85,3 +92,5 @@ class Git isSubmodule: (path) -> @repo.isSubmodule(@relativize(path)) + +_.extend Git.prototype, Subscriber diff --git a/src/app/project.coffee b/src/app/project.coffee index d49a1dae9..074035fda 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -34,6 +34,8 @@ class Project grammarOverridesByPath: @grammarOverridesByPath destroy: -> + @repo?.destroy() + @repo = null editSession.destroy() for editSession in @getEditSessions() addGrammarOverrideForPath: (path, grammar) ->