X-Git-Url: http://git.roojs.org/?p=gitlive;a=blobdiff_plain;f=Git.vala;h=795eabbb1ae3dd342dad56151d92586e2a41509b;hp=07558991c5dbb8422e652eb4bdbbd4b6cdf1f995;hb=refs%2Fheads%2Fwip_alan_T5782_messing_around_with_libgit2glib;hpb=14a44f176a5eac7b296be2b584a24a6f101bacaa diff --git a/Git.vala b/Git.vala index 07558991..795eabbb 100644 --- a/Git.vala +++ b/Git.vala @@ -1,7 +1,6 @@ // valac -o /tmp/ggit Git.vala --pkg libgit2-glib-1.0 --pkg libsoup-2.4 --pkg gee-0.8 -g - - + void main() { @@ -17,17 +16,37 @@ void main() } ); - Ggit.init(); + Ggit.init(); var a = new GitLive.Repo("/home/alan/gitlive/gitlive"); - a.mergeMasterIntoHead(); - //a.walkDiff(); + a.diffhead(); + //a.fetchAll(); return; - a.is_managed(); - a.is_autocommit(); - a.loadLocalBranches(); - a.loadRemoteHeads(); - a.fetchAll(); + /* + GLib.Timeout.add (1, () => { + GLib.debug("Meanwhile"); + return true; + }, GLib.Priority.HIGH); + + var loop = new MainLoop(); + + var a = new GitLive.Repo("/home/alan/gitlive/web.coba"); + GLib.debug("Starting"); + a.loadRemoteHeads.begin(true, (obj,res) => { + a.loadRemoteHeads.end(res); + GLib.debug("got results"); + a.loadLocalBranches(); + loop.quit(); + }); + loop.run(); + //a.mergeMasterIntoHead(); + //a.walkDiff(); + //return; + //a.is_managed(); + //a.is_autocommit(); + + + //a.fetchAll(); // /* var a = new GitLive.Repo("/home/alan/git/test1-clone"); @@ -56,7 +75,7 @@ void main() //string[] spawn_env = Environ.get (); // Process.spawn_sync ("/home/alan/git/test1-clone", spawn_args, spawn_env, SpawnFlags.SEARCH_PATH, null); - a.pushAll(); + //a.pushAll(); } @@ -88,17 +107,29 @@ namespace GitLive { var r = this.repo.enumerate_branches(Ggit.BranchType.LOCAL); while (r.next()) { var br = r.get() as Ggit.Branch; + if (br == null) { + continue; + } + if (br.is_tag()) { + continue; + } + //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); - if (br.is_head()) { - GLib.debug("HEAD= %s", br.get_name()); - this.head = br; + try { + GLib.debug("got branch: N=%s", br.get_name() ); + GLib.debug("is_head %s", br.is_head() ? "Y" : "n"); + + GLib.debug("upstream = %s", br.get_upstream() == null ? "??" : br.get_upstream().get_name().substring(20)); + GLib.debug("oid = %s",br.get_target().to_string()); + this.branches.add(br); + if (br.is_head()) { + GLib.debug("HEAD= %s", br.get_name()); + this.head = br; + } + } catch (Error e) { + GLib.debug("Skip branch"); } - } @@ -182,20 +213,56 @@ namespace GitLive { this.repo.get_config().get_string("user.name"), this.repo.get_config().get_string("user.email") ); - this.repo.create_commit("HEAD", sig, sig, null, "Test Merge", new_tree, parents); - + this.repo.create_commit("HEAD", sig, sig, null, "Test Merge", new_tree, parents); + + + + } + + public void diffhead() + { + var r = this.repo.enumerate_branches(Ggit.BranchType.LOCAL); + Ggit.Branch? head = null; + while (r.next()) { + var gbr = r.get() as Ggit.Branch; + if (gbr.is_head()) { + head = gbr; + } + } + GLib.debug("checking head=%s",head == null ? "EMPTY" : head.get_name()); + var br = this.repo.lookup_branch(head.get_name(),Ggit.BranchType.LOCAL); + var commit = this.repo.lookup_commit(br.get_target()); + + var diff = new Ggit.Diff.tree_to_workdir(this.repo, commit.get_tree(), new Ggit.DiffOptions()); + var ret = ""; + diff.print(Ggit.DiffFormatType.PATCH, (delta, hunk, line) => { + switch(line.get_origin()) { + case Ggit.DiffLineType.ADDITION: ret+="+"; break; + case Ggit.DiffLineType.DELETION: ret+="-";break; + case Ggit.DiffLineType.CONTEXT: ret+=" ";break; + case Ggit.DiffLineType.HUNK_HDR: break; + case Ggit.DiffLineType.FILE_HDR: break; + default: ret+=" ";break; + } + ret += " " + line.get_text(); + return 0; + }); + GLib.debug("%s", ret); } + + public void mergeMasterIntoHead() { // assumes head is not master... this.loadLocalBranches(); GLib.debug("head rev = %s", this.head.get_name()); var head_oid = this.repo.revparse(this.head.get_name() ).get_id() ; - var master_oid = this.repo.revparse("refs/heads/master" ).get_id() ; + //var master_oid = this.repo.revparse("refs/heads/master" ).get_id() ; + var master_oid = this.repo.revparse("HEAD" ).get_id() ; var master_commit = this.repo.lookup_commit(master_oid);; var head_commit = this.repo.lookup_commit(head_oid); @@ -206,31 +273,43 @@ namespace GitLive { var anc_commit = this.repo.lookup_commit(anc_oid); var anc_tree = anc_commit.get_tree(); - var master_tree = master_commit.get_tree(); - var head_tree = head_commit.get_tree(); var mo = new Ggit.MergeOptions(); - mo.set_file_favor(Ggit.MergeFileFavor.THEIRS); - var ix = this.repo.merge_trees(anc_tree, master_tree, head_tree, mo); - ix.write(); - var treeoid = ix.write_tree(); - - - - var parents = new Ggit.Commit[] { master_commit }; + var co = new Ggit.CheckoutOptions(); + var the_ref = this.repo.lookup_reference_dwim("refs/heads/master"); + + var ac = new Ggit.AnnotatedCommit.from_ref(this.repo, the_ref); + + var commits = new Ggit.AnnotatedCommit[] { ac }; + + this.repo.merge(commits, mo, co); + + var cfg = this.repo.get_config().snapshot(); + + var sig = new Ggit.Signature.now( + cfg.get_string("user.name"), + cfg.get_string("user.email") + ); + var new_head = this.repo.get_head(); + var oid = new_head.get_target(); + var ix = this.repo.get_index(); + + ix.write(); + var treeoid = ix.write_tree(); var new_tree = this.repo.lookup(treeoid,typeof (Ggit.Tree)) as Ggit.Tree; - var sig = new Ggit.Signature.now( - this.repo.get_config().get_string("user.name"), - this.repo.get_config().get_string("user.email") - ); - this.repo.create_commit("HEAD", sig, sig, null, "Test Merge", new_tree, parents); - - + var parent = new_head.lookup() as Ggit.Commit; + Ggit.Commit[] parents = new Ggit.Commit[] { parent }; + + this.repo.create_commit("refs/heads/" + this.head.get_name(), sig, sig, null, "Test Merge", new_tree, parents); + } + + + /* public bool doMergeClose(string commit_message) { @@ -273,19 +352,41 @@ namespace GitLive { } - public void loadRemoteHeads(bool force = false) + public async void loadRemoteHeads(bool force = false) { + SourceFunc callback = loadRemoteHeads.callback; - 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(); - + ThreadFunc run = () => { + + if (!force && this.remote_heads != null) { + return true;; + } + var r = this.repo.lookup_remote("origin"); + r.connect(Ggit.Direction.FETCH, this.callbacks, null, null); + yield; + this.remote_heads = r.list(); + + foreach(var br in this.remote_heads) { + if (!br.get_name().has_prefix("refs/heads/")) { + continue; + } + + GLib.debug("Remote: name=%s oid=%s local_oid=%s is_local=%s", + br.get_name(), + br.get_oid().to_string(), + br.get_local_oid().to_string(), + br.is_local() ? "Y" : "n" + ); + } + Idle.add((owned) callback); + return true;; + }; + new Thread("loadRemoteHeads-" , run); + yield; + + } - - + Ggit.Branch? getBranch(string remote_name, string remote_branch_name) { @@ -349,7 +450,10 @@ namespace GitLive { br == null ? "?": this.repo.revparse(br.get_name() ).get_id().to_string() ); */ - var loc_oid = this.repo.revparse(br.get_name() ).get_id(); + //var loc_oid = this.repo.revparse(br.get_name() ).get_id(); + + var loc_oid = br.get_target(); + size_t ahead, behind; this.repo.get_ahead_behind( loc_oid,