X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=GitRepo.vala;h=ef8bf2b24a94f196c0ca4711fcaf9b22f0f8fa9e;hb=4edae3f21e2c258a3ff035d9bb98463c21d9be83;hp=014114faa3ac776f6f33fac7f952d4b7b478c892;hpb=a84d6712c42c2416de2b794091c1c4ab0c2bb2ef;p=gitlive diff --git a/GitRepo.vala b/GitRepo.vala index 014114fa..ef8bf2b2 100644 --- a/GitRepo.vala +++ b/GitRepo.vala @@ -7,9 +7,11 @@ * * */ +static GitRepo _GitRepo; + public class GitRepo : Object { - + public Array cmds; public string name; @@ -18,13 +20,25 @@ public class GitRepo : Object public bool debug = false; public Gee.HashMap ignore_files; + public GitBranch currentBranch; + + public RooTicket? activeTicket; + + public static GitRepo singleton() + { + if (_GitRepo == null) { + _GitRepo = new GitRepo.single(); + _GitRepo.cache = new Gee.HashMap(); + } + return _GitRepo; + } /** * index of.. matching gitpath.. */ public static int indexOf( Array repos, string gitpath) { // make a fake object to compare against.. - var test_repo = new GitRepo(gitpath); + var test_repo = GitRepo.get(gitpath); for(var i =0; i < repos.length; i++) { if (repos.index(i).gitdir == test_repo.gitdir) { @@ -35,15 +49,18 @@ public class GitRepo : Object } + public Gee.HashMap cache; + + public static Array list() { - + //if (GitRepo.list_cache != null) { // unowned Array ret = GitRepo.list_cache; // return ret; //} - + var cache = GitRepo.singleton().cache; var list_cache = new Array(); var dir = Environment.get_home_dir() + "/gitlive"; @@ -73,7 +90,7 @@ public class GitRepo : Object } } catch (Error e) { - print("Error: %s\n",e.message); + GLib.debug("Error: %s",e.message); break; } @@ -101,8 +118,8 @@ public class GitRepo : Object continue; } - list_cache.append_val(new GitRepo( sp )) ; - + var rep = GitRepo.get( sp ); + list_cache.append_val(rep); } @@ -110,10 +127,20 @@ public class GitRepo : Object -} - - - + } + + public static GitRepo get(string path) + { + var cache = GitRepo.singleton().cache; + if (cache.has_key(path)) { + return cache.get(path); + } + return new GitRepo(path); + } + + private GitRepo.single() { + // used to create the signleton + } /** * constructor: * @@ -122,7 +149,7 @@ public class GitRepo : Object * */ - public GitRepo(string path) { + private GitRepo(string path) { // cal parent? this.name = File.new_for_path(path).get_basename(); this.ignore_files = new Gee.HashMap(); @@ -133,9 +160,83 @@ public class GitRepo : Object this.gitdir = path; // naked... } this.cmds = new Array (); - //Repo.superclass.constructor.call(this,cfg); + var cache = GitRepo.singleton().cache; + //Repo.superclass.constructor.call(this,cfg); + if ( !cache.has_key(path) ) { + cache.set( path, this); + } + this.loadBranches(); } + + + public bool is_autocommit () + { + return !FileUtils.test(this.gitdir + "/.gitlive-disable-autocommit" , FileTest.EXISTS); + } + public bool is_autopush () + { + return !FileUtils.test(this.gitdir + "/.gitlive-disable-autopush" , FileTest.EXISTS); + } + + Gee.HashMap branches; + + public void loadBranches() + { + this.branches = new Gee.HashMap(); + + string[] cmd = { "branch", "--no-color", "--verbose", "--no-abbrev" , "-a" }; + var res = this.git( cmd ); + var lines = res.split("\n"); + for (var i = 0; i < lines.length ; i++) { + var br = new GitBranch(this); + if (!br.parseBranchListItem(lines[i])) { + continue; + } + GLib.debug("add branch %s", br.realName()); + + branches.set(br.realName(), br); + if (br.active) { + this.currentBranch = br; + } + } + + } + + + + + public string branchesToString() + { + var ret = ""; + foreach( var br in this.branches.values) { + if (br.name == "") { + continue; + } + ret += ret.length > 0 ? "," : ""; + ret += br.name; + + } + return ret; + + } + RooTicket? ticket = null; + + public void setActiveTicket(RooTicket ticket, string branchname) + { + this.createBranchNamed(branchname); + FileUtils.set_contents(this.gitdir + "/.gitlive-active-ticket" , ticket.id); + this.activeTicket = ticket; + } + + public void createBranchNamed(string branchname) + { + string[] cmd = { "checkout", "-b" , branchname }; + this.git(cmd); + this.loadBranches(); // update branch list... + } + + /** * add: * add files to track. @@ -274,12 +375,13 @@ public class GitRepo : Object } - public delegate void GitAsyncCallback (string str); - public string pull_async(GitAsyncCallback cb) + public delegate void GitAsyncCallback (GitRepo repo, int err, string str); + public void pull_async(GitAsyncCallback cb) { string[] cmd = { "pull" , "--no-edit" }; - return this.git_async( cmd , cb); + this.git_async( cmd , cb); + } @@ -327,8 +429,8 @@ public class GitRepo : Object //this.lastCmd = args.join(" "); //if(this.debug) { - stdout.printf( "CWD=%s\n", this.git_working_dir ); - print( "cmd: %s\n", string.joinv (" ", args)); + GLib.debug( "CWD=%s", this.git_working_dir ); + GLib.debug( "cmd: %s", string.joinv (" ", args)); //} string[] env = {}; @@ -347,16 +449,16 @@ public class GitRepo : Object var sp = new Spawn(cfg); - stdout.printf( "GOT: %s\n" , sp.output); + GLib.debug( "GOT: %s" , sp.output); // parse output for some commands ? return sp.output; } - - public string git_async( string[] args_in, unowned GitAsyncCallback cb ) throws Error, SpawnError + unowned GitAsyncCallback git_async_on_callback; + public void git_async( string[] args_in, GitAsyncCallback cb ) throws Error, SpawnError { // convert arguments. - + this.git_async_on_callback = cb; string[] args = { "git" }; //args += "--git-dir"; //args += this.gitdir; @@ -373,8 +475,8 @@ public class GitRepo : Object //this.lastCmd = args.join(" "); //if(this.debug) { - stdout.printf( "CWD=%s\n", this.git_working_dir ); - print( "cmd: %s\n", string.joinv (" ", args)); + GLib.debug( "CWD=%s", this.git_working_dir ); + //print( "cmd: %s\n", string.joinv (" ", args)); //} string[] env = {}; @@ -392,11 +494,20 @@ public class GitRepo : Object // may throw error... var sp = new Spawn(cfg); - sp.run(((err) => { - cb(sp.output); - }); - stdout.printf( "GOT: %s\n" , sp.output); - // parse output for some commands ? - return sp.output; + //sp.ref(); + //this.ref(); + sp.run(this.git_async_on_complete); + } + + void git_async_on_complete(int err, string output) + { + GLib.debug("GOT %d : %s", err, output); + this.git_async_on_callback(this, err, output); +// this.unref(); + // sp.unref(); + + + } + }