Ggit.init();
var a = new GitLive.Repo("/home/alan/gitlive/gitlive");
- a.loadBranches();
+ a.loadLocalBranches();
a.fetchAll();
//
/*
}
Gee.ArrayList<Ggit.Branch> branches = null;
- public void loadBranches()
+ public void loadLocalBranches()
{
this.branches = new Gee.ArrayList<Ggit.Branch>();
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);
public void fetchAll()
{
+ this.loadLocalBranches();
// remotes probably will not work with http auth..
var ar = this.repo.list_remotes();
foreach(var n in ar) {
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(() => {
"+%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);