X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=GitRepo.vala;h=6664fddb4484c0fe4ef20cf8106679a7e43af1ff;hb=55e9325349365ed19eb69c73ea4a8f9759c5c056;hp=14064cc7586939660aa8a2a2b4f8d0ec6723fbc9;hpb=89ccf6795c52f050c701916460c7f279d839c3b7;p=gitlive diff --git a/GitRepo.vala b/GitRepo.vala index 14064cc7..6664fddb 100644 --- a/GitRepo.vala +++ b/GitRepo.vala @@ -16,6 +16,9 @@ public class GitRepo : Object public string gitdir; public string git_working_dir; public bool debug = false; + + public Gee.HashMap ignore_files; + public GitBranch currentBranch; /** * index of.. matching gitpath.. @@ -33,7 +36,6 @@ public class GitRepo : Object } - public static Array list() { @@ -60,7 +62,7 @@ public class GitRepo : Object return list_cache; } - + FileInfo next_file; while (true) { @@ -72,7 +74,7 @@ public class GitRepo : Object } } catch (Error e) { - print("Error: %s\n",e.message); + GLib.debug("Error: %s",e.message); break; } @@ -124,7 +126,7 @@ public class GitRepo : Object public GitRepo(string path) { // cal parent? this.name = File.new_for_path(path).get_basename(); - + this.ignore_files = new Gee.HashMap(); this.git_working_dir = path; this.gitdir = path + "/.git"; @@ -135,6 +137,69 @@ public class GitRepo : Object //Repo.superclass.constructor.call(this,cfg); } + + + 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; + + } + + public void setActiveTicket(RooTicket ticket) + { + + + } + + public void createBranchNamed(string branchname) + { + string[] cmd = { "checkout", "-b" , branchname }; + this.git(cmd); + + } + + /** * add: * add files to track. @@ -159,6 +224,28 @@ public class GitRepo : Object } return ret; } + + public bool is_ignore(string fname) throws Error, SpawnError + { + if (fname == ".gitignore") { + this.ignore_files.clear(); + } + + if (this.ignore_files.has_key(fname)) { + return this.ignore_files.get(fname); + } + + try { + var ret = this.git( { "check-ignore" , fname } ); + this.ignore_files.set(fname, ret.length > 0); + return ret.length > 0; + } catch (SpawnError e) { + this.ignore_files.set(fname, false); + return false; + } + + } + /** * remove: @@ -188,6 +275,7 @@ public class GitRepo : Object } + /** * commit: * perform a commit. @@ -248,8 +336,18 @@ public class GitRepo : Object return this.git( cmd ); - } + + public delegate void GitAsyncCallback (GitRepo repo, int err, string str); + public void pull_async(GitAsyncCallback cb) + { + + string[] cmd = { "pull" , "--no-edit" }; + this.git_async( cmd , cb); + + + } + /** * push: * Send local changes to remote repo(s) @@ -261,9 +359,12 @@ public class GitRepo : Object public string push () throws Error, SpawnError { // should - return this.git({ "push" }); + return this.git({ "push", "origin", "HEAD" }); } + + + /** * git: * The meaty part.. run spawn.. with git.. @@ -275,13 +376,12 @@ public class GitRepo : Object { // convert arguments. - string[] args = { "git" }; //args += "--git-dir"; //args += this.gitdir; args += "--no-pager"; - + //if (this.gitdir != this.repopath) { // args += "--work-tree"; // args += this.repopath; @@ -292,8 +392,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 = {}; @@ -310,10 +410,67 @@ public class GitRepo : Object // may throw error... 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; } + + 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; + args += "--no-pager"; + + + //if (this.gitdir != this.repopath) { + // args += "--work-tree"; + // args += this.repopath; + //} + for (var i = 0; i < args_in.length;i++) { + args += args_in[i]; + } + + //this.lastCmd = args.join(" "); + //if(this.debug) { + GLib.debug( "CWD=%s", this.git_working_dir ); + //print( "cmd: %s\n", string.joinv (" ", args)); + //} + + string[] env = {}; + string home = "HOME=" + Environment.get_home_dir() ; + env += home ; + // do not need to set gitpath.. + //if (File.exists(this.repo + '/.git/config')) { + //env.push("GITPATH=" + this.repo ); + //} + + + var cfg = new SpawnConfig(this.git_working_dir , args , env); + cfg.async = true; + + // may throw error... + var sp = new Spawn(cfg); + //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(); + + + } + }