public string gitdir;
public string git_working_dir;
public bool debug = false;
+ public bool has_local_changes = false;
+ public string git_status;
+ public string git_diff;
+ public string ahead_or_behind = "";
public Gee.HashMap<string,bool> ignore_files;
public GitBranch currentBranch;
- Gee.HashMap<string,GitBranch> branches;
+ public Gee.HashMap<string,GitBranch> branches; // accessed in GitBranch..
public RooTicket? activeTicket;
public Gee.HashMap<string,GitRepo> cache;
}
return list_cache;
-
-
}
public static GitRepo get(string path)
}
this.loadBranches();
this.loadActiveTicket();
+ this.loadStatus();
}
public bool is_wip_branch()
}
+ public bool is_managed()
+ {
+ // is it a roojs origin?
+ var r = this.git({ "remote" , "get-url" , "--push" , "origin"});
+ var uri = new Soup.URI(r);
+ if (uri.get_host() != "git.roojs.com") { // we can only push to this url. -- unless we have forced it to be managed.
+ return FileUtils.test(this.gitdir + "/.gitlive-managed" , FileTest.EXISTS);
+ }
+ // otherwise see if unmanaged is set to disable it..
+ return !FileUtils.test(this.gitdir + "/.gitlive-unmanaged" , FileTest.EXISTS);
+
+ }
+
+
public bool is_autocommit ()
{
return !FileUtils.test(this.gitdir + "/.gitlive-disable-autocommit" , FileTest.EXISTS);
}
-
+ public void loadStatus()
+ {
+ var r = this.git({ "status" , "--porcelain" });
+ this.git_status = r;
+ this.has_local_changes = r.length > 0;
+
+ var rs = this.git({ "status" , "-sb" });
+
+ this.ahead_or_behind = rs.contains("[ahead") ? "A" : (rs.contains("[behind") ? "B" : "");
+
+
+ this.git_diff = this.git({ "diff" , "HEAD", "--no-color" });
+ }
public void loadBranches()
{
- this.branches = new Gee.HashMap<string,GitBranch>();
-
- 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;
- }
- }
-
+
+ GitBranch.loadBranches(this);
}
var fl = files.split("\n");
cmd = { "commit", "-m" , "Changed " + string.joinv("",fl) };
foreach(var f in fl) {
+ if (f.length < 1) continue;
cmd += f;
}
this.git(cmd);
var fl = files.split("\n");
cmd = { "commit", "-m" , "Changed " + string.joinv("",fl) };
foreach(var f in fl) {
+ if (f.length < 1) continue;
cmd += f;
}
this.git(cmd);
public void pull_async(GitAsyncCallback cb)
{
- string[] cmd = { "pull" , "--no-edit" };
+ string[] cmd = { "pull" , "--no-edit" };
this.git_async( cmd , cb);
//if (File.exists(this.repo + '/.git/config')) {
//env.push("GITPATH=" + this.repo );
//}
-
-
+
var cfg = new SpawnConfig(this.git_working_dir , args , env);
-
+ //cfg.debug = true;
// may throw error...
var sp = new Spawn(cfg);
-
- GLib.debug( "GOT: %s" , sp.output);
+ // diff output is a bit big..
+ if (args_in[0] != "diff") {
+ GLib.debug( "GOT: %s" , sp.output);
+ }
// parse output for some commands ?
return sp.output;
}
}
+
+
+
+
+ public void update_async(GitAsyncCallback cb)
+ {
+ string[] cmd = { "fetch" , "--all" };
+ this.git_async( cmd , cb);
+
+ }
+
+
+ static uint update_all_total = 0;
+ static string update_all_after = "";
+
+ public static void updateAll(string after)
+ {
+ update_all_after = after;
+ var tr = GitRepo.singleton().cache;
+
+
+ update_all_total = tr.size;
+ foreach(var repo in tr.values) {
+ if (!repo.is_managed()) {
+ update_all_total--;
+ continue;
+ }
+ repo.update_async(updateAllCallback);
+ }
+
+ }
+ public static void updateAllCallback(GitRepo repo, int err, string res)
+ {
+ repo.loadBranches();
+ repo.loadStatus();
+
+ update_all_total--;
+ if (update_all_total > 0 ) {
+ return;
+ }
+ switch (update_all_after) {
+ case "show_clones":
+ Clones.singleton().show();
+ break;
+ default:
+ break;
+ }
+ return;
+ }
+
+
+
}