GitRepo.vala
[gitlive] / GitRepo.vala
1
2 /**
3  * @class Scm.Git.Repo
4  *
5  * @extends Scm.Repo
6  * 
7  *
8  *
9  */
10 public class GitRepo : Object
11 {
12     
13     public Array<GitMonitorQueue> cmds;
14
15
16     public string gitdir;
17     public bool debug = false;
18
19     /**
20     * index of.. matching gitpath..
21     */
22      public static int indexOfAdd( Array<GitRepo> repos, string gitpath) {
23         for(var i =0; i < repos.length; i++) {
24             if (repos.index(i).gitdir == gitpath) {
25                 return i;
26             }
27         }
28         return -1;
29     
30     }
31
32
33
34    
35     /**
36      * constructor:
37      * 
38      * @param {Object} cfg - Configuration
39      *     (basically repopath is currently only critical one.)
40      *
41      */
42      
43     public GitRepo(string path) {
44         // cal parent?
45         
46         this.gitdir = path + "/.git";
47         if (!FileUtils.test(this.gitdir , FileTest.IS_DIR)) {
48             this.gitdir = path; // naked...
49         }
50         this.cmds = new  Array<GitMonitorQueue> ();
51         //Repo.superclass.constructor.call(this,cfg);
52         
53     } 
54     /**
55      * add:
56      * add files to track.
57      *
58      * @argument {Array} files the files to add.
59      */
60     public string add ( Array<GitMonitorQueue> files )
61     {
62         // should really find out if these are untracked files each..
63         // we run multiple versions to make sure that if one failes, it does not ignore the whole lot..
64         // not sure if that is how git works.. but just be certian.
65         for (var i = 0; i < files.length;i++) {
66             var f = files.index(i).vname;
67             try {
68                 this.git( { "add" } + f);
69             } catch (Error e) {
70                 ret += e.message  + "\n";
71             }        
72
73         }
74     }
75     
76       /**
77      * remove:
78      * remove files to track.
79      *
80      * @argument {Array} files the files to add.
81      */
82     public string remove  ( Array<GitMonitorQueue> files )
83     {
84         // this may fail if files do not exist..
85         // should really find out if these are untracked files each..
86         // we run multiple versions to make sure that if one failes, it does not ignore the whole lot..
87         // not sure if that is how git works.. but just be certian.
88         var ret = "";
89
90         for (var i = 0; i < files.length;i++) {
91             var f = files.index(i).vname;
92             try {
93                 string[] cmd = { "rm",  "-f" ,  f  };
94                 this.git( cmd );
95             } catch (Error e) {
96                 ret += e.message  + "\n";
97             }        
98         }
99
100         return ret;
101
102     }
103     
104     /**
105      * commit:
106      * perform a commit.
107      *
108      * @argument {Object} cfg commit configuration
109      * 
110      * @property {String} name (optional)
111      * @property {String} email (optional)
112      * @property {String} changed (date) (optional)
113      * @property {String} reason (optional)
114      * @property {Array} files - the files that have changed. 
115      * 
116      */
117      
118     public string commit ( string message, Array<GitMonitorQueue> files  )
119     {
120         
121
122         /*
123         var env = [];
124
125         if (typeof(cfg.name) != 'undefined') {
126             args.push( {
127                 'author' : cfg.name + ' <' + cfg.email + '>'
128             });
129             env.push(
130                 "GIT_COMMITTER_NAME" + cfg.name,
131                 "GIT_COMMITTER_EMAIL" + cfg.email
132             );
133         }
134
135         if (typeof(cfg.changed) != 'undefined') {
136             env.push("GIT_AUTHOR_DATE= " + cfg.changed )
137             
138         }
139         */
140         var args = { "commit", "-m", };
141         arg +=  (message.length > 0  ? message : "Changed" );
142         for (var i = 0; i< files.length ; i++ ) {
143             args += files.index(i).vname; // full path?
144         }
145          
146         return this.git(args, env);
147     }
148     
149     /**
150      * pull:
151      * Fetch and merge remote repo changes into current branch..
152      *
153      * At present we just need this to update the current working branch..
154      * -- maybe later it will have a few options and do more stuff..
155      *
156      */
157     public string pull ()
158     {
159         // should probably hand error conditions better... 
160         return this.git({ "pull" });
161         
162         
163     }
164     /**
165      * push:
166      * Send local changes to remote repo(s)
167      *
168      * At present we just need this to push the current branch.
169      * -- maybe later it will have a few options and do more stuff..
170      *
171      */
172     public string push ()
173     {
174         // should 
175         return this.git({ "push" });
176         
177     }
178      /**
179      * git:
180      * The meaty part.. run spawn.. with git..
181      *
182      *
183      */
184     
185     public string git(string[] args_in, string[] env = {}) throws Error, SpawnError
186     {
187         // convert arguments.
188         
189
190         string[]  args = { "git" };
191         args +=  "--git-dir";
192         args +=  this.gitdir;
193         args +=  "--no-pager";
194
195
196         //if (this.gitdir != this.repopath) {
197         //    args +=   "--work-tree";
198          //   args += this.repopath; 
199         //}
200         for (var i = 0; i < args_in.length;i++) {
201             args += args_in[i];
202         }            
203
204         //this.lastCmd = args.join(" ");
205         if(this.debug) {
206          
207             print(  string.joinv (", ", args)); 
208         }
209         
210         env +=  ("HOME=" + Environment.get_home_dir() );
211         // do not need to set gitpath..
212         //if (File.exists(this.repo + '/.git/config')) {
213             //env.push("GITPATH=" + this.repo );
214         //}
215         
216
217         var cfg = new SpawnConfig(this.gitdir, args , env);
218         
219
220        // may throw error...
221         var sp = new Spawn(cfg);
222                 
223         //print("GOT: " + output)
224         // parse output for some commands ?
225         return sp.output;
226     }
227
228 }