3 Pango = imports.gi.Pango;
4 GLib = imports.gi.GLib;
6 GObject = imports.gi.GObject;
7 GtkSource = imports.gi.GtkSource;
8 WebKit = imports.gi.WebKit;
10 console = imports.console;
11 XObject = imports.XObject.XObject;
15 destroy_event : function (self, event) {
19 response : function (self, id) {
25 if (typeof(this.get('bug').getValue()) != 'object') {
32 //var val = this.get('bug').getValue();
49 //this.el.set_title("Merger - ??? ");
50 // this.el.set_title("Merger - " + this.repo.repopath);
53 Merger.loading = true; // stop change firing on combos.
56 this.get('/historyTreeStore').el.clear();
57 this.get('/changedFilesStore').el.clear();
58 this.get('/patchview').clear();
62 this.get('/workingCombo').load(Merger.repo.branches);
64 this.get('/releaseCombo').load(Merger.repo.branches);
69 Merger.loading = false;
72 //this.get('/ok_button').el.set_sensitive(false);
74 // block until we return.
75 var run_ret = this.el.run();
79 print("RUN RETURN : " + run_ret);
81 //print(JSON.stringify(this.get('bug').getValue()));
82 // return this.get('bug').getValue();
83 //this.success = c.success;
88 pack : function(p,e) {
89 p.el.get_content_area().pack_start(e.el,true,true,0)
94 pack : "pack_start,false,true",
98 label : "Working Branch"
103 changed : function (self) {
104 this.get('/historyTreeStore').loadTree();
109 this.el = new Gtk.ComboBox.with_entry();
112 this.model = new XObject(this.model);
114 this.el.set_model(this.model.el);
115 this.el.set_entry_text_column (0);
116 XObject.prototype.init.call(this);
121 //this.insert(citer,iter,0);
122 this.model.el.clear();
127 for(var i =0 ; i < tr.length; i++) {
128 if (!tr[i].name.length) {
132 this.model.el.append(ret);
133 //print(JSON.stringify(ret,null,4));
134 if (tr[i].name == 'master') {
137 if (tr[i].name == 'working') {
140 this.model.el.set_value(ret.iter, 0, '' + tr[i].name );
141 this.model.el.set_value(ret.iter, 1, '' + tr[i].rev );
145 if (master !== false) {
146 this.el.set_active(master);
148 if (working !== false) {
149 this.el.set_active(working);
154 xtype: Gtk.ListStore,
156 XObject.prototype.init.call(this);
157 this.el.set_column_types ( 3, [
158 GObject.TYPE_STRING, // file
159 GObject.TYPE_STRING, // added
160 GObject.TYPE_STRING, // removed
167 label : "Release Branch"
172 changed : function (self) {
173 this.get('/historyTreeStore').loadTree();
178 this.el = new Gtk.ComboBox.with_entry();
181 this.model = new XObject(this.model);
183 this.el.set_model(this.model.el);
184 this.el.set_entry_text_column (0);
185 XObject.prototype.init.call(this);
190 //this.insert(citer,iter,0);
191 this.model.el.clear();
196 for(var i =0 ; i < tr.length; i++) {
198 if (!tr[i].name.length) {
202 this.model.el.append(ret);
203 //print(JSON.stringify(ret,null,4));
204 if (tr[i].name == 'master') {
207 if (tr[i].name == 'release') {
211 this.model.el.set_value(ret.iter, 0, '' + tr[i].name );
212 this.model.el.set_value(ret.iter, 1, '' + tr[i].rev );
216 if (master !== false) {
217 this.el.set_active(master);
219 if (release !== false) {
220 this.el.set_active(release);
225 xtype: Gtk.ListStore,
227 XObject.prototype.init.call(this);
228 this.el.set_column_types ( 3, [
229 GObject.TYPE_STRING, // file
230 GObject.TYPE_STRING, // added
231 GObject.TYPE_STRING, // removed
240 pack : "pack_end,true,true,0",
249 xtype: Gtk.ScrolledWindow,
251 XObject.prototype.init.call(this);
252 this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
258 cursor_changed : function (self) {
260 if (this.el.get_selection().count_selected_rows() < 1) {
264 var model = this.get('/historyTreeStore');
266 var s = this.el.get_selection();
269 var value = ''+ ret.model.get_value(ret.iter, 1).value.get_string();
270 print("OUT?" + value);// id..
271 // load the list in the right grid..
272 var Repo = imports.Scm.Git.Repo.Repo;
276 if (model.release === false) {
281 var files = Merger.repo.changedFiles('/', 'rev', model.release + '..' + value);
282 this.get('/changedFilesStore').load(files);
289 XObject.prototype.init.call(this);
290 var description = new Pango.FontDescription.c_new();
291 description.set_size(8000);
292 this.el.modify_font(description);
294 this.selection = this.el.get_selection();
295 this.selection.set_mode( Gtk.SelectionMode.SINGLE);
299 781 // is this really needed??
300 782 this.selection.signal['changed'].connect(function() {
301 783 _this.get('/LeftTree.view').listeners.cursor_changed.apply(
302 784 _this.get('/LeftTree.view'), [ _this.get('/LeftTree.view'), '']
310 xtype: Gtk.TreeStore,
311 id : "historyTreeStore",
315 XObject.prototype.init.call(this);
316 this.el.set_column_types ( 3, [
317 GObject.TYPE_STRING, // title
318 GObject.TYPE_STRING, // rev
321 load : function(tr,iter)
323 //this.insert(citer,iter,0);
328 for(var i =0 ; i < tr.length; i++) {
331 this.el.insert(ret ,iter,-1);
335 //print(JSON.stringify(ret,null,4));
338 this.el.set_value(ret.iter, 0, '' + tr[i].text );
339 this.el.set_value(ret.iter, 1, '' + tr[i].rev );
341 if (tr[i].children && tr[i].children.length) {
342 this.load(tr[i].children, ret.iter);
346 loadTree : function() {
348 this.working = false;
349 if (Merger.loading) {
354 var wid = this.get('/workingCombo').el.get_active();
355 var rid = this.get('/releaseCombo').el.get_active();
356 if (wid < 0 || rid < 0 || rid == wid) {
360 var w = Merger.repo.branches[wid];
361 var r = Merger.repo.branches[rid];
365 var rev = r.name + '..' + w.name;
366 this.release = r.name;
367 this.working = w.name;
369 // this takes some time, lets. try and dialog it..
374 var msg = new Gtk.MessageDialog( {
375 buttons : Gtk.ButtonsType.NONE,
376 text: "Loading History"
380 msg.set_transient_for(Merger.el);
384 var hist = Merger.repo.dayTree('/', false, 'rev', rev);
393 xtype: Gtk.TreeViewColumn,
394 pack : "append_column",
397 XObject.prototype.init.call(this);
398 this.el.add_attribute(this.items[0].el , 'markup', 0 );
403 xtype: Gtk.CellRendererText,
413 xtype: Gtk.ScrolledWindow,
415 XObject.prototype.init.call(this);
416 this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
422 cursor_changed : function (self) {
423 // SEE SELECTION.CHANGED
424 var files = this.files();
425 this.get('/patchview').showDiff(files);
426 //var value = ''+ ret.model.get_value(ret.iter, 1).value.get_string();
427 //print("OUT?" + value);// id..
428 // load the list in the right grid..
434 id : "changedFilesView",
437 if (this.el.get_selection().count_selected_rows() < 1) {
438 //nothing? - clea it?
445 var s = this.el.get_selection();
447 s.selected_foreach(function(model,p,iter) {
449 files.push( model.get_value(iter, 0).value.get_string());
455 XObject.prototype.init.call(this);
456 var description = new Pango.FontDescription.c_new();
457 description.set_size(8000);
458 this.el.modify_font(description);
460 this.selection = this.el.get_selection();
461 this.selection.set_mode( Gtk.SelectionMode.MULTIPLE);
463 this.selection.signal['changed'].connect(function() {
464 _this.listeners.cursor_changed.apply(
471 xtype: Gtk.ListStore,
472 id : "changedFilesStore",
475 XObject.prototype.init.call(this);
476 this.el.set_column_types ( 3, [
477 GObject.TYPE_STRING, // file
478 GObject.TYPE_STRING, // added
479 GObject.TYPE_STRING, // removed
484 //this.insert(citer,iter,0);
486 for(var i =0 ; i < tr.length; i++) {
491 //print(JSON.stringify(ret,null,4));
494 this.el.set_value(ret.iter, 0, '' + tr[i].filename );
495 this.el.set_value(ret.iter, 1, '' + tr[i].added );
496 this.el.set_value(ret.iter, 2, '' + tr[i].removed );
503 xtype: Gtk.TreeViewColumn,
506 pack : "append_column",
509 XObject.prototype.init.call(this);
510 this.el.add_attribute(this.items[0].el , 'markup', 0 );
515 xtype: Gtk.CellRendererText,
521 xtype: Gtk.TreeViewColumn,
523 pack : "append_column",
526 XObject.prototype.init.call(this);
527 this.el.add_attribute(this.items[0].el , 'markup', 1 );
532 xtype: Gtk.CellRendererText,
538 xtype: Gtk.TreeViewColumn,
540 pack : "append_column",
543 XObject.prototype.init.call(this);
544 this.el.add_attribute(this.items[0].el , 'markup', 2 );
549 xtype: Gtk.CellRendererText,
561 xtype: Gtk.ListStore,
575 pack : "pack_start,false,false,0",
580 clicked : function (self) {
583 var model = this.get('/historyTreeStore');
585 if (model.release === false) {
590 var files = this.get('/changedFilesView').files();
595 var diff = Merger.repo.diff(files, model.release, model.rev);
601 var history = Merger.repo.history(files, 1, 'rev', model.rev);
603 print("History" + JSON.stringify(history, null,4));
605 Commit = imports.Commit.Commit;
607 Commit.el.set_modal(true);
608 Commit.el.set_transient_for(Merger.el);
610 var ce = Commit.show({
613 release : model.release,
615 author : history[0].changeby,
616 changed : history[0].changed_raw
625 var diff = Merger.repo.diff(files, model.release, model.rev);
628 print(JSON.stringify(ce,null,4));
631 imports.GitMonitor.GitMonitor.pause();
635 var msg = new Gtk.MessageDialog( {
636 buttons : Gtk.ButtonsType.NONE,
637 text: "Committing Changes"
640 msg.set_transient_for(Merger.el);
648 Merger.repo.checkout(model.release);
650 print("Call apply patch");
652 Merger.repo.applyPatch(diff);
654 var author = Merger.repo.parseAuthor(ce.author);
656 print("Add new files.");
657 // add all the files..
658 Merger.repo.add(files);
660 print("Commit changes.");
663 email : author.email,
665 changed : ce.changed,
676 var emsg = new Gtk.MessageDialog({
677 message_type: Gtk.MessageType.ERROR,
678 buttons : Gtk.ButtonsType.OK,
681 emsg.set_transient_for(Merger.el);
682 emsg.set_modal(true);
685 Merger.repo.stash(); // revert change.. - so we can go back...
688 msg.set_markup("Changing to previous branch");
689 Merger.repo.checkout(model.working);
692 // if gitlive was previously running warn the user that it is now paused..
694 var cmsg = new Gtk.MessageDialog({
695 message_type: Gtk.MessageType.ERROR,
696 buttons : Gtk.ButtonsType.OK,
697 text: "Git Live is now paused "
703 GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, function() {
704 imports.GitMonitor.GitMonitor.resume();
707 _t.get('/historyTreeStore').loadTree();
708 _t.get('/changedFilesStore').el.clear();
709 _t.get('/patchview').showDiff(files);
710 return false; //only once.
718 label : "Commit diff (no merge)"
723 xtype: Gtk.ScrolledWindow,
724 pack : "pack_end,true,true,0",
726 XObject.prototype.init.call(this);
727 this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
731 xtype: WebKit.WebView,
740 var s = "document.body.textContent='';"
742 this.el.execute_script(s);
749 showDiff : function(files) {
753 var model = this.get('/historyTreeStore');
755 if (model.release === false) {
759 var diff = Merger.repo.diff(files, model.release, model.rev);
762 var s = "var pre = document.createElement('pre'); document.body.appendChild(pre);";
763 s += "pre.textContent = " +
764 JSON.stringify(Merger.repo.lastCmd + "\n") + '+ ' +
765 JSON.stringify(diff) + ";";
768 this.el.execute_script(s);
788 pack : "add_action_widget,1"
793 XObject.cache['/Merger'] = Merger;