X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=GitRepo.vala;h=21cf4de4f52001c238ef28ea8c67f4a3eb91a0f8;hb=01af28a18150e1c30fd20ef32da736c7ceee80ef;hp=6f669c2603e1838bc4ba9153da3689fcf9982ef4;hpb=7eac1c1589d76685dee481d3f423ad6be54abf7d;p=gitlive diff --git a/GitRepo.vala b/GitRepo.vala index 6f669c26..21cf4de4 100644 --- a/GitRepo.vala +++ b/GitRepo.vala @@ -25,7 +25,9 @@ public class GitRepo : Object public string ahead_or_behind = ""; public Gee.HashMap ignore_files; - public GitBranch currentBranch; + + public GitBranch currentBranch; + public Gee.HashMap branches; // accessed in GitBranch.. public RooTicket? activeTicket; public Gee.HashMap cache; @@ -48,7 +50,7 @@ public class GitRepo : Object */ public static int indexOf( Array repos, string gitpath) { // make a fake object to compare against.. - var test_repo = GitRepo.get(gitpath); + var test_repo = GitRepo.get_sync(gitpath); for(var i =0; i < repos.length; i++) { if (repos.index(i).gitdir == test_repo.gitdir) { @@ -128,7 +130,7 @@ public class GitRepo : Object continue; } - var rep = GitRepo.get( sp ); + var rep = GitRepo.get_sync( sp ); list_cache.append_val(rep); } @@ -137,13 +139,39 @@ public class GitRepo : Object } - public static GitRepo get(string path) + public static GitRepo get_sync(string path) { + GitRepo ret; var cache = GitRepo.singleton().cache; if (cache.has_key(path)) { - return cache.get(path); + ret = cache.get(path); + } else { + ret = new GitRepo(path); } - return new GitRepo(path); + return ret; + } + + public static async GitRepo? get(string path) + { + + SourceFunc callback = GitRepo.get.callback; + GitRepo ret = null; + ThreadFunc run = () => { + + var cache = GitRepo.singleton().cache; + if (cache.has_key(path)) { + ret = cache.get(path); + } else { + ret = new GitRepo(path); + } + Idle.add((owned) callback); + return true; + + }; + new Thread("thread-new-gitrepo-" + path, run); + yield; + return ret; + } private GitRepo.single() { @@ -927,7 +955,88 @@ public class GitRepo : Object } + + public async void doUpdate() + { + SourceFunc callback = this.doUpdate.callback; + GitRepo ret = null; + ThreadFunc run = () => { + + + // update the branches.. + this.loadBranches(); + + //GLib.debug("connecting '%s'", r.get_url()); + string[] far = {}; + foreach(var br in this.branches.values) { + if (br.remote == "" || br.remoterev == br.lastrev) { + continue; + } + far += ("+refs/heads/" + br.name + ":refs/remotes/" + br.remote); + } + if (far.length > 0) { + GLib.debug("PUlling %s", this.name); + var r = this.repo.lookup_remote("origin"); + r.connect(Ggit.Direction.FETCH, new GitCallbacks(this), null, null); + var options = new Ggit.FetchOptions(); + options.set_remote_callbacks( new GitCallbacks(this)); + r.download(far, options); + } + this.loadStatus(); + + + Idle.add((owned) callback); + return true; + + }; + new Thread("thread-new-gitpull-" + this.name, run); + yield; + + + } + + + public static void updateAllAsync(string after) + { + + var doing = new Gee.HashMap();; + + var tr = GitRepo.singleton().cache; + + var update_all_total = tr.size; + foreach(var repo in tr.values) { + if (!repo.is_managed()) { + update_all_total--; + continue; + } + doing.set(repo.name, true); + repo.doUpdate.begin((obj, res) => { + repo.doUpdate.end(res); + doing.set(repo.name, false); + + foreach(var b in doing.keys) { + if (doing.get(b)) { + GLib.debug("pending: %s", b); + return; + } + } + + + switch (after) { + case "show_clones": + Clones.singleton().show(); + break; + default: + GLib.debug("Unkown call after load = %s", update_all_after); + break; + } + }); + } + + + } + @@ -958,6 +1067,9 @@ public class GitRepo : Object } GLib.debug("calls total = %d", (int) update_all_total); } + + + public static void updateAllCallback(GitRepo repo, int err, string res) { repo.loadBranches(); @@ -983,15 +1095,16 @@ public class GitRepo : Object } public void loadRemoteHeads(bool force = false) - { - - if (!force && this.remote_heads != null) { - return; - } - var r = this.repo.lookup_remote("origin"); - r.connect(Ggit.Direction.FETCH, this.callbacks, null, null); - this.remote_heads = r.list(); + { + if (!force && this.remote_heads != null) { + return; } + var r = this.repo.lookup_remote("origin"); + var cb = new GitCallbacks(this); + r.connect(Ggit.Direction.FETCH, cb, null, null); + this.remote_heads = r.list(); + + } }