From: Alan Knowles Date: Wed, 13 Mar 2019 08:05:10 +0000 (+0800) Subject: sync X-Git-Url: http://git.roojs.org/?p=gitlive;a=commitdiff_plain;h=4362a05e702125354c3e9afb7d58b0be7dffa1e3 sync --- diff --git a/Git.vala b/Git.vala index f4ec391d..8b5d7d39 100644 --- a/Git.vala +++ b/Git.vala @@ -20,7 +20,7 @@ void main() Ggit.init(); var a = new GitLive.Repo("/home/alan/gitlive/gitlive"); - a.loadBranches(); + a.loadLocalBranches(); a.fetchAll(); // /* @@ -69,33 +69,33 @@ namespace GitLive { } Gee.ArrayList branches = null; - public void loadBranches() + public void loadLocalBranches() { this.branches = new Gee.ArrayList(); var r = this.repo.enumerate_branches(Ggit.BranchType.LOCAL); - - - - while (r.next()) { var br = r.get() as Ggit.Branch; - var head = this.repo.revparse("refs/heads/" + br.get_name() ).get_id(); - var rhead = this.repo.revparse(br.get_upstream().get_name() ).get_id(); - GLib.debug("got branch: name = %s upstream = %s oid = %s ", - br.get_name(), br.get_upstream().get_name(), - head.to_string()); + //var head = this.repo.revparse("refs/heads/" + br.get_name() ).get_id(); + //var rhead = this.repo.revparse(br.get_upstream().get_name() ).get_id(); + //GLib.debug("got branch: name = %s upstream = %s oid = %s ", + // br.get_name(), br.get_upstream().get_name(), + // head.to_string()); this.branches.add(br); } - - - } + Ggit.Branch? getBranch(string remote_name, string remote_branch_name) { + //GLib.debug("bn=%s",remote_branch_name); + if (remote_branch_name.has_prefix("refs/remotes/")) { + return null; + } var target = remote_branch_name.replace("refs/heads/", remote_name+"/") .replace("refs/remotes/", ""); - + if (target == "HEAD") { + target = remote_name +"/master"; + } foreach(var br in this.branches) { // GLib.debug("test:%s=%s", br.get_upstream().get_shorthand() , target); @@ -113,6 +113,7 @@ namespace GitLive { public void fetchAll() { + this.loadLocalBranches(); // remotes probably will not work with http auth.. var ar = this.repo.list_remotes(); foreach(var n in ar) { @@ -128,30 +129,53 @@ namespace GitLive { GLib.debug("Got Error Message: %s", e.message); return; } - + string[] far = {}; var heads = r.list(); foreach(var rh in heads) { - var br = this.getBranch(n, rh.get_name()); + if (rh.get_name().has_prefix("refs/remotes/")) { + continue; + } + var br = this.getBranch(n, rh.get_name()); + GLib.debug("got heads: name=%s rev=%s localrev=%s", rh.get_name(), rh.get_oid().to_string(), br == null ? "?": this.repo.revparse(br.get_name() ).get_id().to_string() ); + var loc_oid = this.repo.revparse(br.get_name() ).get_id(); + size_t ahead, behind; + this.repo.get_ahead_behind( + loc_oid, + rh.get_oid(), + out ahead, + out behind + ); + + if (rh.get_oid().to_string() == this.repo.revparse(br.get_name() ).get_id().to_string()) { + continue; + } + if (ahead > 0) { + continue; + } + far += ("+refs/heads/" + br.get_name()) + ":refs/remotes/" + n + "/" + rh.get_name().replace("refs/heads/",""); + } + if (far.length < 1) { + GLib.debug("no fetch required.. it's uptodate"); + return; } + GLib.debug("getting remote specs '%s', %d", n, far.length); - - GLib.debug("getting specs '%s'", n); - - +/* var far = r.get_fetch_specs(); - + */ foreach(var rs in far) { GLib.debug("got remote spec: %s", rs); } + var options = new Ggit.FetchOptions(); options.set_remote_callbacks(this.callbacks); //yield Async.thread(() => { @@ -192,10 +216,48 @@ namespace GitLive { "+%s:%s".printf(head.get_shorthand(),head.get_name()) ); */ - var head = this.repo.get_head(); + + string[] far = {}; + var heads = r.list(); + foreach(var rh in heads) { + if (rh.get_name().has_prefix("refs/remotes/")) { + continue; + } + + var br = this.getBranch(n, rh.get_name()); + + GLib.debug("got heads: name=%s rev=%s localrev=%s", + rh.get_name(), + rh.get_oid().to_string(), + br == null ? "?": this.repo.revparse(br.get_name() ).get_id().to_string() + ); + var loc_oid = this.repo.revparse(br.get_name() ).get_id(); + size_t ahead, behind; + this.repo.get_ahead_behind( + loc_oid, + rh.get_oid(), + out ahead, + out behind + ); + + if (rh.get_oid().to_string() == this.repo.revparse(br.get_name() ).get_id().to_string()) { + continue; + } + if (behind > 0) { + continue; + } + far += ("+refs/heads/" + br.get_name()) + ":"+ rh.get_name(); + } + + if (far.length < 1) { + GLib.debug("no push required.. it's uptodate"); + return; + } + + /*var head = this.repo.get_head(); string[] far = {}; far += "+%s:%s".printf(head.get_name(),head.get_name()); - + */ foreach(var rs in far) { GLib.debug("got remote spec: %s", rs);