36
30
from bzrlib.branch import Branch
37
import bzrlib.errors as bzrerrors
38
from bzrlib.lazy_import import lazy_import
39
from bzrlib.ui import ui_factory
31
import bzrlib.errors as errors
40
32
from bzrlib.workingtree import WorkingTree
42
from bzrlib.plugins.gtk import _i18n
43
from bzrlib.plugins.gtk.dialog import error_dialog, info_dialog, warning_dialog
44
from bzrlib.plugins.gtk.errors import show_bzr_error
45
from bzrlib.plugins.gtk.olive.window import OliveGui
47
from bzrlib.plugins.gtk.diff import DiffWindow
48
lazy_import(globals(), """
49
from bzrlib.plugins.gtk.viz import branchwin
51
from bzrlib.plugins.gtk.annotate.gannotate import GAnnotateWindow
52
from bzrlib.plugins.gtk.annotate.config import GAnnotateConfig
53
from bzrlib.plugins.gtk.commit import CommitDialog
54
from bzrlib.plugins.gtk.conflicts import ConflictsDialog
55
from bzrlib.plugins.gtk.initialize import InitDialog
56
from bzrlib.plugins.gtk.push import PushDialog
57
from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
60
""" Display the AboutDialog. """
61
from bzrlib.plugins.gtk import __version__, icon_path
63
iconpath = icon_path() + os.sep
65
dialog = gtk.AboutDialog()
66
dialog.set_name("Olive")
67
dialog.set_version(__version__)
68
dialog.set_copyright("Copyright (C) 2006 Szilveszter Farkas (Phanatic)")
69
dialog.set_website("https://launchpad.net/products/olive")
70
dialog.set_website_label("https://launchpad.net/products/olive")
71
dialog.set_icon_from_file(iconpath+"oliveicon2.png")
72
dialog.set_logo(gtk.gdk.pixbuf_new_from_file(iconpath+"oliveicon2.png"))
73
dialog.set_authors([ _i18n("Lead Developer:"),
74
"Szilveszter Farkas <szilveszter.farkas@gmail.com>",
75
_i18n("Contributors:"),
76
"Jelmer Vernooij <jelmer@samba.org>",
77
"Mateusz Korniak <mateusz.korniak@ant.gliwice.pl>",
78
"Gary van der Merwe <garyvdm@gmail.com>" ])
79
dialog.set_artists([ "Simon Pascal Klein <klepas@klepas.org>",
80
"Jakub Steiner <jimmac@novell.com>" ])
34
# Olive GTK UI version
35
__version__ = '0.11.0'
38
if sys.platform == 'win32':
39
gladefile = os.path.dirname(sys.executable) + "/share/olive/olive.glade"
41
gladefile = "/usr/share/olive/olive.glade"
43
if not os.path.exists(gladefile):
44
# Load from current directory if not installed
45
gladefile = "olive.glade"
47
if not os.path.exists(gladefile):
49
print _('Glade file cannot be found.')
52
from dialog import error_dialog, info_dialog
87
55
""" The main Olive GTK frontend class. This is called when launching the
90
58
def __init__(self):
91
self.window = OliveGui(calling_app = self)
93
self.pref = Preferences()
59
self.toplevel = gtk.glade.XML(gladefile, 'window_main', 'olive-gtk')
61
self.window = self.toplevel.get_widget('window_main')
63
self.pref = OlivePreferences()
96
65
# Initialize the statusbar
97
self.context_id = self.window.statusbar.get_context_id('olive')
100
self.treeview_left = self.window.treeview_left
101
self.treeview_right = self.window.treeview_right
66
self.statusbar = self.toplevel.get_widget('statusbar')
67
self.context_id = self.statusbar.get_context_id('olive')
70
self.window_main = self.toplevel.get_widget('window_main')
72
self.hpaned_main = self.toplevel.get_widget('hpaned_main')
74
self.treeview_left = self.toplevel.get_widget('treeview_left')
75
self.treeview_right = self.toplevel.get_widget('treeview_right')
76
# Get some important menu items
77
self.menuitem_add_files = self.toplevel.get_widget('menuitem_add_files')
78
self.menuitem_remove_files = self.toplevel.get_widget('menuitem_remove_file')
79
self.menuitem_file_make_directory = self.toplevel.get_widget('menuitem_file_make_directory')
80
self.menuitem_file_rename = self.toplevel.get_widget('menuitem_file_rename')
81
self.menuitem_file_move = self.toplevel.get_widget('menuitem_file_move')
82
self.menuitem_view_show_hidden_files = self.toplevel.get_widget('menuitem_view_show_hidden_files')
83
self.menuitem_branch = self.toplevel.get_widget('menuitem_branch')
84
self.menuitem_branch_init = self.toplevel.get_widget('menuitem_branch_initialize')
85
self.menuitem_branch_get = self.toplevel.get_widget('menuitem_branch_get')
86
self.menuitem_branch_checkout = self.toplevel.get_widget('menuitem_branch_checkout')
87
self.menuitem_branch_pull = self.toplevel.get_widget('menuitem_branch_pull')
88
self.menuitem_branch_push = self.toplevel.get_widget('menuitem_branch_push')
89
self.menuitem_branch_commit = self.toplevel.get_widget('menuitem_branch_commit')
90
self.menuitem_branch_status = self.toplevel.get_widget('menuitem_branch_status')
91
self.menuitem_branch_missing = self.toplevel.get_widget('menuitem_branch_missing_revisions')
92
self.menuitem_stats = self.toplevel.get_widget('menuitem_stats')
93
self.menuitem_stats_diff = self.toplevel.get_widget('menuitem_stats_diff')
94
self.menuitem_stats_log = self.toplevel.get_widget('menuitem_stats_log')
95
# Get some toolbuttons
96
#self.menutoolbutton_diff = self.toplevel.get_widget('menutoolbutton_diff')
97
self.toolbutton_diff = self.toplevel.get_widget('toolbutton_diff')
98
self.toolbutton_log = self.toplevel.get_widget('toolbutton_log')
99
self.toolbutton_commit = self.toplevel.get_widget('toolbutton_commit')
100
self.toolbutton_pull = self.toplevel.get_widget('toolbutton_pull')
101
self.toolbutton_push = self.toplevel.get_widget('toolbutton_push')
103
102
# Get the drive selector
104
103
self.combobox_drive = gtk.combo_box_new_text()
105
104
self.combobox_drive.connect("changed", self._refresh_drives)
107
# Get the navigation widgets
108
self.hbox_location = self.window.locationbar
109
self.button_location_up = self.window.button_location_up
110
self.button_location_jump = self.window.button_location_jump
111
self.entry_location = self.window.entry_location
112
self.image_location_error = self.window.image_location_error
114
# Get the History widgets
115
self.check_history = self.window.checkbutton_history
116
self.entry_history = self.window.entry_history_revno
117
self.button_history = self.window.button_history_browse
119
self._just_started = True
106
self.vbox_main_right = self.toplevel.get_widget('vbox_main_right')
109
# Dictionary for signal_autoconnect
110
dic = { "on_window_main_destroy": gtk.main_quit,
111
"on_window_main_delete_event": self.on_window_main_delete_event,
112
"on_quit_activate": self.on_window_main_delete_event,
113
"on_about_activate": self.on_about_activate,
114
"on_menuitem_add_files_activate": self.on_menuitem_add_files_activate,
115
"on_menuitem_remove_file_activate": self.on_menuitem_remove_file_activate,
116
"on_menuitem_file_make_directory_activate": self.on_menuitem_file_make_directory_activate,
117
"on_menuitem_file_move_activate": self.on_menuitem_file_move_activate,
118
"on_menuitem_file_rename_activate": self.on_menuitem_file_rename_activate,
119
"on_menuitem_view_show_hidden_files_activate": self.on_menuitem_view_show_hidden_files_activate,
120
"on_menuitem_view_refresh_activate": self.on_menuitem_view_refresh_activate,
121
"on_menuitem_branch_initialize_activate": self.on_menuitem_branch_initialize_activate,
122
"on_menuitem_branch_get_activate": self.on_menuitem_branch_get_activate,
123
"on_menuitem_branch_checkout_activate": self.on_menuitem_branch_checkout_activate,
124
"on_menuitem_branch_commit_activate": self.on_menuitem_branch_commit_activate,
125
"on_menuitem_branch_push_activate": self.on_menuitem_branch_push_activate,
126
"on_menuitem_branch_pull_activate": self.on_menuitem_branch_pull_activate,
127
"on_menuitem_branch_status_activate": self.on_menuitem_branch_status_activate,
128
"on_menuitem_branch_missing_revisions_activate": self.on_menuitem_branch_missing_revisions_activate,
129
"on_menuitem_stats_diff_activate": self.on_menuitem_stats_diff_activate,
130
"on_menuitem_stats_log_activate": self.on_menuitem_stats_log_activate,
131
"on_menuitem_stats_infos_activate": self.on_menuitem_stats_infos_activate,
132
"on_toolbutton_refresh_clicked": self.on_menuitem_view_refresh_activate,
133
"on_toolbutton_log_clicked": self.on_menuitem_stats_log_activate,
134
#"on_menutoolbutton_diff_clicked": self.on_menuitem_stats_diff_activate,
135
"on_toolbutton_diff_clicked": self.on_menuitem_stats_diff_activate,
136
"on_toolbutton_commit_clicked": self.on_menuitem_branch_commit_activate,
137
"on_toolbutton_pull_clicked": self.on_menuitem_branch_pull_activate,
138
"on_toolbutton_push_clicked": self.on_menuitem_branch_push_activate,
139
"on_treeview_right_button_press_event": self.on_treeview_right_button_press_event,
140
"on_treeview_right_row_activated": self.on_treeview_right_row_activated,
141
"on_treeview_left_button_press_event": self.on_treeview_left_button_press_event,
142
"on_treeview_left_row_activated": self.on_treeview_left_row_activated }
144
# Connect the signals to the handlers
145
self.toplevel.signal_autoconnect(dic)
121
147
# Apply window size and position
122
148
width = self.pref.get_preference('window_width', 'int')
127
153
self.window.move(x, y)
128
154
# Apply paned position
129
155
pos = self.pref.get_preference('paned_position', 'int')
130
self.window.hpaned_main.set_position(pos)
156
self.hpaned_main.set_position(pos)
158
# Apply menu to the toolbutton
159
#menubutton = self.toplevel.get_widget('menutoolbutton_diff')
160
#menubutton.set_menu(handler.menu.toolbar_diff)
132
162
# Now we can show the window
133
163
self.window.show()
135
165
# Show drive selector if under Win32
136
166
if sys.platform == 'win32':
137
self.hbox_location.pack_start(self.combobox_drive, False, False, 0)
138
self.hbox_location.reorder_child(self.combobox_drive, 1)
167
self.vbox_main_right.pack_start(self.combobox_drive, False, True, 0)
168
self.vbox_main_right.reorder_child(self.combobox_drive, 0)
139
169
self.combobox_drive.show()
140
170
self.gen_hard_selector()
142
# Acceptable errors when loading files/folders in the treeviews
143
self.acceptable_errors = (errno.ENOENT, errno.ELOOP)
145
172
self._load_left()
147
174
# Apply menu state
148
self.window.mb_view_showhidden.set_active(self.pref.get_preference('dotted_files', 'bool'))
149
self.window.mb_view_showignored.set_active(self.pref.get_preference('ignored_files', 'bool'))
175
self.menuitem_view_show_hidden_files.set_active(self.pref.get_preference('dotted_files', 'bool'))
151
# We're starting local
153
self.remote_branch = None
154
self.remote_path = None
155
self.remote_revision = None
157
177
self.set_path(os.getcwd())
158
178
self._load_right()
160
self._just_started = False
162
def set_path(self, path, force_remote=False):
180
def set_path(self, path):
163
182
self.notbranch = False
166
# Forcing remote mode (reading data from inventory)
167
self._show_stock_image(gtk.STOCK_DISCONNECT)
169
br = Branch.open_containing(path)[0]
170
except bzrerrors.NotBranchError:
171
self._show_stock_image(gtk.STOCK_DIALOG_ERROR)
172
self.check_history.set_active(False)
173
self.check_history.set_sensitive(False)
175
except bzrerrors.UnsupportedProtocol:
176
self._show_stock_image(gtk.STOCK_DIALOG_ERROR)
177
self.check_history.set_active(False)
178
self.check_history.set_sensitive(False)
181
self._show_stock_image(gtk.STOCK_CONNECT)
186
self.remote_branch, self.remote_path = Branch.open_containing(path)
188
if self.remote_revision is None:
189
self.remote_revision = self.remote_branch.last_revision()
191
self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_revision).entries()
193
if len(self.remote_path) == 0:
194
self.remote_parent = self.remote_branch.repository.get_inventory(self.remote_branch.last_revision()).iter_entries_by_dir().next()[1].file_id
196
for (name, type) in self.remote_entries:
197
if name == self.remote_path:
198
self.remote_parent = type.file_id
201
if not path.endswith('/'):
204
if self.remote_branch.base == path:
205
self.button_location_up.set_sensitive(False)
207
self.button_location_up.set_sensitive(True)
209
if os.path.isdir(path):
210
self.image_location_error.destroy()
215
self.wt, self.wtpath = WorkingTree.open_containing(path)
216
except (bzrerrors.NotBranchError, bzrerrors.NoWorkingTree):
217
self.notbranch = True
219
# If we're in the root, we cannot go up anymore
220
if sys.platform == 'win32':
221
drive, tail = os.path.splitdrive(path)
222
if tail in ('', '/', '\\'):
223
self.button_location_up.set_sensitive(False)
225
self.button_location_up.set_sensitive(True)
228
self.button_location_up.set_sensitive(False)
230
self.button_location_up.set_sensitive(True)
231
elif not os.path.isfile(path):
232
# Doesn't seem to be a file nor a directory, trying to open a
234
self._show_stock_image(gtk.STOCK_DISCONNECT)
236
br = Branch.open_containing(path)[0]
237
except bzrerrors.NotBranchError:
238
self._show_stock_image(gtk.STOCK_DIALOG_ERROR)
239
self.check_history.set_active(False)
240
self.check_history.set_sensitive(False)
242
except bzrerrors.UnsupportedProtocol:
243
self._show_stock_image(gtk.STOCK_DIALOG_ERROR)
244
self.check_history.set_active(False)
245
self.check_history.set_sensitive(False)
248
self._show_stock_image(gtk.STOCK_CONNECT)
253
self.remote_branch, self.remote_path = Branch.open_containing(path)
255
if self.remote_revision is None:
256
self.remote_revision = self.remote_branch.last_revision()
258
self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_revision).entries()
260
if len(self.remote_path) == 0:
261
self.remote_parent = self.remote_branch.repository.get_inventory(self.remote_branch.last_revision()).iter_entries_by_dir().next()[1].file_id
263
for (name, type) in self.remote_entries:
264
if name == self.remote_path:
265
self.remote_parent = type.file_id
268
if not path.endswith('/'):
271
if self.remote_branch.base == path:
272
self.button_location_up.set_sensitive(False)
274
self.button_location_up.set_sensitive(True)
277
self.check_history.set_active(False)
278
self.check_history.set_sensitive(False)
280
self.check_history.set_sensitive(True)
282
self.window.statusbar.push(self.context_id, path)
283
self.entry_location.set_text(path)
184
self.wt, self.wtpath = WorkingTree.open_containing(self.path)
185
except errors.NotBranchError:
186
self.notbranch = True
287
188
def get_path(self):
292
if len(self.remote_path) > 0:
293
return self.remote_branch.base + self.remote_path + '/'
295
return self.remote_branch.base
297
191
def on_about_activate(self, widget):
192
from dialog import about
300
def on_button_history_browse_clicked(self, widget):
301
""" Browse for revision button handler. """
303
br = self.remote_branch
307
revb = RevisionBrowser(br, self.window)
308
response = revb.run()
309
if response != gtk.RESPONSE_NONE:
312
if response == gtk.RESPONSE_OK:
313
if revb.selected_revno is not None:
314
self.entry_history.set_text(revb.selected_revno)
315
self.on_entry_history_revno_activate()
319
def on_button_location_jump_clicked(self, widget):
320
""" Location Jump button handler. """
321
location = self.entry_location.get_text()
323
if self.set_path(location):
326
def on_button_location_up_clicked(self, widget):
327
""" Location Up button handler. """
330
self.set_path(os.path.split(self.get_path())[0])
334
newpath = delim.join(self.get_path().split(delim)[:-2])
336
self.set_path(newpath)
340
def on_checkbutton_history_toggled(self, widget):
341
""" History Mode toggle handler. """
342
if self.check_history.get_active():
343
# History Mode activated
344
self.entry_history.set_sensitive(True)
345
self.button_history.set_sensitive(True)
346
if self.entry_history.get_text() != "":
347
self.on_entry_history_revno_activate()
349
# History Mode deactivated
350
self.entry_history.set_sensitive(False)
351
self.button_history.set_sensitive(False)
353
# Return right window to normal view by acting like we jump to it
354
self.on_button_location_jump_clicked(widget)
357
def on_entry_history_revno_activate(self, widget=None):
358
""" Key pressed handler for the history entry. """
359
path = self.get_path()
362
self.remote_branch = self.wt.branch
364
revno = int(self.entry_history.get_text())
365
self.remote_revision = self.remote_branch.get_rev_id(revno)
366
if self.set_path(path, True):
369
195
def on_menuitem_add_files_activate(self, widget):
370
196
""" Add file(s)... menu handler. """
371
from bzrlib.plugins.gtk.olive.add import AddDialog
372
add = AddDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
375
if response == gtk.RESPONSE_OK:
197
from add import OliveAdd
198
add = OliveAdd(self.wt, self.wtpath, self.get_selected_right())
378
201
def on_menuitem_branch_get_activate(self, widget):
379
202
""" Branch/Get... menu handler. """
380
from bzrlib.plugins.gtk.branch import BranchDialog
383
branch = BranchDialog(os.getcwd(), self.window, self.remote_branch.base)
385
branch = BranchDialog(self.get_path(), self.window)
386
response = branch.run()
387
if response != gtk.RESPONSE_NONE:
390
if response == gtk.RESPONSE_OK:
203
from branch import OliveBranch
204
branch = OliveBranch()
395
207
def on_menuitem_branch_checkout_activate(self, widget):
396
208
""" Branch/Checkout... menu handler. """
397
from bzrlib.plugins.gtk.checkout import CheckoutDialog
400
checkout = CheckoutDialog(os.getcwd(), self.window, self.remote_branch.base)
402
checkout = CheckoutDialog(self.get_path(), self.window)
403
response = checkout.run()
404
if response != gtk.RESPONSE_NONE:
407
if response == gtk.RESPONSE_OK:
209
from checkout import OliveCheckout
210
checkout = OliveCheckout()
413
213
def on_menuitem_branch_commit_activate(self, widget):
414
214
""" Branch/Commit... menu handler. """
415
selected = self.get_selected_right()
417
selected = os.path.join(self.wtpath, selected)
418
commit = CommitDialog(wt=self.wt,
422
response = commit.run()
423
if response != gtk.RESPONSE_NONE:
426
if response == gtk.RESPONSE_OK:
431
def on_menuitem_branch_conflicts_activate(self, widget):
432
""" Branch/Conflicts... menu handler. """
433
conflicts = ConflictsDialog(self.wt, self.window)
434
response = conflicts.run()
435
if response != gtk.RESPONSE_NONE:
438
def on_menuitem_branch_merge_activate(self, widget):
439
""" Branch/Merge... menu handler. """
440
from bzrlib.plugins.gtk.merge import MergeDialog
442
if self.check_for_changes():
443
error_dialog(_i18n('There are local changes in the branch'),
444
_i18n('Please commit or revert the changes before merging.'))
446
parent_branch_path = self.wt.branch.get_parent()
447
merge = MergeDialog(self.wt, self.wtpath, parent_branch_path, self.window)
448
response = merge.run()
450
if response == gtk.RESPONSE_OK:
215
from commit import OliveCommit
216
commit = OliveCommit(self.wt, self.wtpath)
454
219
def on_menuitem_branch_missing_revisions_activate(self, widget):
455
220
""" Branch/Missing revisions menu handler. """
457
from bzrlib.missing import find_unmerged, iter_log_revisions
459
221
local_branch = self.wt.branch
460
parent_branch_path = local_branch.get_parent()
461
if parent_branch_path is None:
462
error_dialog(_i18n('Parent location is unknown'),
463
_i18n('Cannot determine missing revisions if no parent location is known.'))
223
other_branch = local_branch.get_parent()
224
if other_branch is None:
225
error_dialog(_('Parent location is unknown'),
226
_('Cannot determine missing revisions if no parent location is known.'))
466
parent_branch = Branch.open(parent_branch_path)
468
if parent_branch.base == local_branch.base:
469
parent_branch = local_branch
471
local_extra, remote_extra = find_unmerged(local_branch,parent_branch)
473
if local_extra or remote_extra:
475
## def log_revision_one_line_text(log_revision):
476
## """ Generates one line description of log_revison ended with end of line."""
477
## revision = log_revision.rev
478
## txt = "- %s (%s)\n" % (revision.get_summary(), revision.committer, )
479
## txt = txt.replace("<"," ") # Seems < > chars are expected to be xml tags ...
480
## txt = txt.replace(">"," ")
485
dlg_txt += _i18n('%d local extra revision(s). \n') % (len(local_extra),)
486
## NOTE: We do not want such ugly info about missing revisions
487
## Revision Browser should be used there
488
## max_revisions = 10
489
## for log_revision in iter_log_revisions(local_extra, local_branch.repository, verbose=1):
490
## dlg_txt += log_revision_one_line_text(log_revision)
491
## if max_revisions <= 0:
492
## dlg_txt += _i18n("more ... \n")
494
## max_revisions -= 1
497
dlg_txt += _i18n('%d local missing revision(s).\n') % (len(remote_extra),)
498
## max_revisions = 10
499
## for log_revision in iter_log_revisions(remote_extra, parent_branch.repository, verbose=1):
500
## dlg_txt += log_revision_one_line_text(log_revision)
501
## if max_revisions <= 0:
502
## dlg_txt += _i18n("more ... \n")
504
## max_revisions -= 1
506
info_dialog(_i18n('There are missing revisions'),
229
remote_branch = Branch.open(other_branch)
231
if remote_branch.base == local_branch.base:
232
remote_branch = local_branch
234
ret = len(local_branch.missing_revisions(remote_branch))
237
info_dialog(_('There are missing revisions'),
238
_('%d revision(s) missing.') % ret)
509
info_dialog(_i18n('Local branch up to date'),
510
_i18n('There are no missing revisions.'))
240
info_dialog(_('Local branch up to date'),
241
_('There are no missing revisions.'))
513
243
def on_menuitem_branch_pull_activate(self, widget):
514
244
""" Branch/Pull menu handler. """
515
245
branch_to = self.wt.branch
517
247
location = branch_to.get_parent()
518
248
if location is None:
519
error_dialog(_i18n('Parent location is unknown'),
520
_i18n('Pulling is not possible until there is a parent location.'))
249
error_dialog(_('Parent location is unknown'),
250
_('Pulling is not possible until there is a parent location.'))
523
branch_from = Branch.open(location)
254
branch_from = Branch.open(location)
255
except errors.NotBranchError:
256
error_dialog(_('Directory is not a branch'),
257
_('You can perform this action only in a branch.'))
525
259
if branch_to.get_parent() is None:
526
260
branch_to.set_parent(branch_from.base)
528
ret = branch_to.pull(branch_from)
530
info_dialog(_i18n('Pull successful'), _i18n('%d revision(s) pulled.') % ret)
533
def on_menuitem_branch_update_activate(self, widget):
534
""" Brranch/checkout update menu handler. """
536
ret = self.wt.update()
537
conflicts = self.wt.conflicts()
539
info_dialog(_i18n('Update successful but conflicts generated'), _i18n('Number of conflicts generated: %d.') % (len(conflicts),) )
541
info_dialog(_i18n('Update successful'), _i18n('No conflicts generated.') )
262
#old_rh = branch_to.revision_history()
263
#if tree_to is not None:
264
# tree_to.pull(branch_from)
266
# branch_to.pull(branch_from)
267
branch_to.pull(branch_from)
269
# TODO: get the number of pulled revisions
272
info_dialog(_('Pull successful'), _('%d revision(s) pulled.') % ret)
543
274
def on_menuitem_branch_push_activate(self, widget):
544
275
""" Branch/Push... menu handler. """
545
push = PushDialog(repository=None,revid=None,branch=self.wt.branch, parent=self.window)
546
response = push.run()
547
if response != gtk.RESPONSE_NONE:
551
def on_menuitem_branch_revert_activate(self, widget):
552
""" Branch/Revert all changes menu handler. """
553
ret = self.wt.revert(None)
555
warning_dialog(_i18n('Conflicts detected'),
556
_i18n('Please have a look at the working tree before continuing.'))
558
info_dialog(_i18n('Revert successful'),
559
_i18n('All files reverted to last revision.'))
276
from push import OlivePush
277
push = OlivePush(self.wt.branch)
562
280
def on_menuitem_branch_status_activate(self, widget):
563
281
""" Branch/Status... menu handler. """
564
from bzrlib.plugins.gtk.status import StatusDialog
565
status = StatusDialog(self.wt, self.wtpath)
566
response = status.run()
567
if response != gtk.RESPONSE_NONE:
282
from status import OliveStatus
283
status = OliveStatus(self.wt, self.wtpath)
570
286
def on_menuitem_branch_initialize_activate(self, widget):
571
287
""" Initialize current directory. """
572
init = InitDialog(self.path, self.window)
573
response = init.run()
574
if response != gtk.RESPONSE_NONE:
577
if response == gtk.RESPONSE_OK:
582
def on_menuitem_branch_tags_activate(self, widget):
583
""" Branch/Tags... menu handler. """
584
from bzrlib.plugins.gtk.tags import TagsWindow
586
window = TagsWindow(self.wt.branch, self.window)
588
window = TagsWindow(self.remote_branch, self.window)
591
def on_menuitem_file_annotate_activate(self, widget):
592
""" File/Annotate... menu handler. """
593
if self.get_selected_right() is None:
594
error_dialog(_i18n('No file was selected'),
595
_i18n('Please select a file from the list.'))
598
branch = self.wt.branch
599
file_id = self.wt.path2id(self.wt.relpath(os.path.join(self.path, self.get_selected_right())))
601
window = GAnnotateWindow(all=False, plain=False, parent=self.window)
602
window.set_title(os.path.join(self.path, self.get_selected_right()) + " - Annotate")
603
config = GAnnotateConfig(window)
288
import bzrlib.bzrdir as bzrdir
607
window.annotate(self.wt, branch, file_id)
611
def on_menuitem_file_bookmark_activate(self, widget):
612
""" File/Bookmark current directory menu handler. """
613
if self.pref.add_bookmark(self.path):
614
info_dialog(_i18n('Bookmark successfully added'),
615
_i18n('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
291
if not os.path.exists(self.path):
295
existing_bzrdir = bzrdir.BzrDir.open(self.path)
296
except errors.NotBranchError:
297
bzrdir.BzrDir.create_branch_convenience(self.path)
299
if existing_bzrdir.has_branch():
300
if existing_bzrdir.has_workingtree():
301
raise errors.AlreadyBranchError(self.path)
303
raise errors.BranchExistsWithoutWorkingTree(self.path)
305
existing_bzrdir.create_branch()
306
existing_bzrdir.create_workingtree()
307
except errors.AlreadyBranchError, errmsg:
308
error_dialog(_('Directory is already a branch'),
309
_('The current directory (%s) is already a branch.\nYou can start using it, or initialize another directory.') % errmsg)
310
except errors.BranchExistsWithoutWorkingTree, errmsg:
311
error_dialog(_('Branch without a working tree'),
312
_('The current directory (%s)\nis a branch without a working tree.') % errmsg)
618
warning_dialog(_i18n('Location already bookmarked'),
619
_i18n('The current directory is already bookmarked.\nSee the left panel for reference.'))
314
info_dialog(_('Initialize successful'),
315
_('Directory successfully initialized.'))
623
318
def on_menuitem_file_make_directory_activate(self, widget):
624
319
""" File/Make directory... menu handler. """
625
from bzrlib.plugins.gtk.olive.mkdir import MkdirDialog
626
mkdir = MkdirDialog(self.wt, self.wtpath, self.window)
627
response = mkdir.run()
629
if response == gtk.RESPONSE_OK:
320
from mkdir import OliveMkdir
321
mkdir = OliveMkdir(self.wt, self.wtpath)
632
324
def on_menuitem_file_move_activate(self, widget):
633
325
""" File/Move... menu handler. """
634
from bzrlib.plugins.gtk.olive.move import MoveDialog
635
move = MoveDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
636
response = move.run()
638
if response == gtk.RESPONSE_OK:
326
from move import OliveMove
327
move = OliveMove(self.wt, self.wtpath, self.get_selected_right())
641
330
def on_menuitem_file_rename_activate(self, widget):
642
331
""" File/Rename... menu handler. """
643
from bzrlib.plugins.gtk.olive.rename import RenameDialog
644
rename = RenameDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
645
response = rename.run()
647
if response == gtk.RESPONSE_OK:
332
from rename import OliveRename
333
rename = OliveRename(self.wt, self.wtpath, self.get_selected_right())
650
336
def on_menuitem_remove_file_activate(self, widget):
651
337
""" Remove (unversion) selected file. """
652
from bzrlib.plugins.gtk.olive.remove import RemoveDialog
653
remove = RemoveDialog(self.wt, self.wtpath,
654
selected=self.get_selected_right(),
656
response = remove.run()
658
if response != gtk.RESPONSE_NONE:
661
if response == gtk.RESPONSE_OK:
662
self.set_path(self.path)
338
from remove import OliveRemove
339
remove = OliveRemove(self.wt, self.wtpath, self.get_selected_right())
667
342
def on_menuitem_stats_diff_activate(self, widget):
668
343
""" Statistics/Differences... menu handler. """
669
window = DiffWindow(parent=self.window)
344
from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
345
window = DiffWindow()
670
346
parent_tree = self.wt.branch.repository.revision_tree(self.wt.branch.last_revision())
671
347
window.set_diff(self.wt.branch.nick, self.wt, parent_tree)
674
350
def on_menuitem_stats_infos_activate(self, widget):
675
351
""" Statistics/Informations... menu handler. """
676
from bzrlib.plugins.gtk.olive.info import InfoDialog
678
info = InfoDialog(self.remote_branch)
680
info = InfoDialog(self.wt.branch)
352
from info import OliveInfo
353
info = OliveInfo(self.wt)
683
356
def on_menuitem_stats_log_activate(self, widget):
684
357
""" Statistics/Log... menu handler. """
687
branch = self.wt.branch
689
branch = self.remote_branch
691
window = branchwin.BranchWindow(branch, [branch.last_revision()], None,
358
from bzrlib.plugins.gtk.viz.branchwin import BranchWindow
359
window = BranchWindow()
360
window.set_branch(self.wt.branch, self.wt.branch.last_revision(), None)
695
363
def on_menuitem_view_refresh_activate(self, widget):
749
396
if newdir == None:
752
if self.set_path(newdir):
399
self.set_path(newdir)
755
402
def on_treeview_right_button_press_event(self, widget, event):
756
""" Occurs when somebody clicks in the file list. """
757
treepathpos = widget.get_path_at_pos(int(event.x), int(event.y))
758
if event.button == 1:
759
if treepathpos is None and widget.get_selection is not None:
760
treeselection = widget.get_selection()
761
treeselection.unselect_all()
762
elif event.button == 3:
763
treeselection = widget.get_selection()
764
if treepathpos is not None:
765
treeselection.select_path(treepathpos[0])
767
if treeselection is not None:
768
treeselection.unselect_all()
403
""" Occurs when somebody right-clicks in the file list. """
404
if event.button == 3:
770
406
from menu import OliveMenu
771
menu = OliveMenu(path=self.get_path(),
772
selected=self.get_selected_right(),
407
menu = OliveMenu(self.get_path(), self.get_selected_right())
774
408
# get the menu items
775
m_open = menu.ui.get_widget('/context_right/open')
776
409
m_add = menu.ui.get_widget('/context_right/add')
777
410
m_remove = menu.ui.get_widget('/context_right/remove')
778
m_remove_and_delete = menu.ui.get_widget('/context_right/remove_and_delete')
779
m_rename = menu.ui.get_widget('/context_right/rename')
780
m_revert = menu.ui.get_widget('/context_right/revert')
781
411
m_commit = menu.ui.get_widget('/context_right/commit')
782
m_annotate = menu.ui.get_widget('/context_right/annotate')
783
412
m_diff = menu.ui.get_widget('/context_right/diff')
784
413
# check if we're in a branch
786
415
from bzrlib.branch import Branch
787
416
Branch.open_containing(self.get_path())
789
m_open.set_sensitive(False)
790
m_add.set_sensitive(False)
791
m_remove.set_sensitive(False)
792
m_remove_and_delete.set_sensitive(False)
793
m_rename.set_sensitive(False)
794
m_revert.set_sensitive(False)
795
m_commit.set_sensitive(False)
796
m_annotate.set_sensitive(False)
797
m_diff.set_sensitive(False)
799
if treepathpos is None:
800
m_open.set_sensitive(False)
801
m_add.set_sensitive(False)
802
m_remove.set_sensitive(False)
803
m_remove_and_delete.set_sensitive(False)
804
m_rename.set_sensitive(False)
805
m_annotate.set_sensitive(False)
806
m_diff.set_sensitive(False)
807
m_revert.set_sensitive(False)
809
m_open.set_sensitive(True)
810
m_add.set_sensitive(True)
811
m_remove.set_sensitive(True)
812
m_remove_and_delete.set_sensitive(True)
813
m_rename.set_sensitive(True)
814
m_annotate.set_sensitive(True)
815
m_diff.set_sensitive(True)
816
m_revert.set_sensitive(True)
817
m_commit.set_sensitive(True)
818
except bzrerrors.NotBranchError:
819
if treepathpos is None:
820
m_open.set_sensitive(False)
822
m_open.set_sensitive(True)
417
m_add.set_sensitive(True)
418
m_remove.set_sensitive(True)
419
m_commit.set_sensitive(True)
420
m_diff.set_sensitive(True)
421
except errors.NotBranchError:
823
422
m_add.set_sensitive(False)
824
423
m_remove.set_sensitive(False)
825
m_remove_and_delete.set_sensitive(False)
826
m_rename.set_sensitive(False)
827
m_revert.set_sensitive(False)
828
424
m_commit.set_sensitive(False)
829
m_annotate.set_sensitive(False)
830
425
m_diff.set_sensitive(False)
833
menu.right_context_menu().popup(None, None, None, 0,
836
menu.remote_context_menu().popup(None, None, None, 0,
426
menu.right_context_menu().popup(None, None, None, 0,
839
429
def on_treeview_right_row_activated(self, treeview, path, view_column):
840
430
""" Occurs when somebody double-clicks or enters an item in the
842
434
from launch import launch
844
436
newdir = self.get_selected_right()
849
self.set_path(os.path.split(self.get_path())[0])
439
self.set_path(os.path.split(self.get_path())[0])
441
fullpath = self.get_path() + os.sep + newdir
442
if os.path.isdir(fullpath):
443
# selected item is an existant directory
444
self.set_path(fullpath)
851
fullpath = os.path.join(self.get_path(), newdir)
852
if os.path.isdir(fullpath):
853
# selected item is an existant directory
854
self.set_path(fullpath)
859
if self._is_remote_dir(self.get_path() + newdir):
860
self.set_path(self.get_path() + newdir)
862
448
self.refresh_right()
864
450
def on_window_main_delete_event(self, widget, event=None):
865
451
""" Do some stuff before exiting. """
866
width, height = self.window.get_size()
452
width, height = self.window_main.get_size()
867
453
self.pref.set_preference('window_width', width)
868
454
self.pref.set_preference('window_height', height)
869
x, y = self.window.get_position()
455
x, y = self.window_main.get_position()
870
456
self.pref.set_preference('window_x', x)
871
457
self.pref.set_preference('window_y', y)
872
458
self.pref.set_preference('paned_position',
873
self.window.hpaned_main.get_position())
459
self.hpaned_main.get_position())
875
461
self.pref.write()
876
self.window.destroy()
462
self.window_main.destroy()
878
464
def _load_left(self):
879
465
""" Load data into the left panel. (Bookmarks) """
940
517
delta = self.wt.changes_from(tree2, want_unchanged=True)
942
519
# Add'em to the ListStore
945
statinfo = os.stat(self.path + os.sep + item)
947
if e.errno in self.acceptable_errors:
951
liststore.append([ gtk.STOCK_DIRECTORY,
959
self._format_date(statinfo.st_mtime),
521
liststore.append([gtk.STOCK_DIRECTORY, item, ''])
961
522
for item in files:
962
523
status = 'unknown'
964
524
if not self.notbranch:
965
525
filename = self.wt.relpath(self.path + os.sep + item)
970
for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed:
971
if rpathnew == filename:
974
for rpath, id, kind in delta.added:
975
if rpath == filename:
978
for rpath, id, kind in delta.removed:
979
if rpath == filename:
982
for rpath, id, kind, text_modified, meta_modified in delta.modified:
983
if rpath == filename:
986
for rpath, id, kind in delta.unchanged:
987
if rpath == filename:
990
for rpath, file_class, kind, id, entry in self.wt.list_files():
991
if rpath == filename and file_class == 'I':
527
for rpath, id, kind, text_modified, meta_modified in delta.renamed:
528
if rpath == filename:
530
for rpath, id, kind in delta.added:
531
if rpath == filename:
533
for rpath, id, kind in delta.removed:
534
if rpath == filename:
536
for rpath, id, kind, text_modified, meta_modified in delta.modified:
537
if rpath == filename:
539
for rpath, id, kind in delta.unchanged:
540
if rpath == filename:
544
# status = fileops.status(path + os.sep + item)
545
#except errors.PermissionDenied:
996
548
if status == 'renamed':
997
st = _i18n('renamed')
998
550
elif status == 'removed':
999
st = _i18n('removed')
1000
552
elif status == 'added':
1002
554
elif status == 'modified':
1003
st = _i18n('modified')
1004
556
elif status == 'unchanged':
1005
st = _i18n('unchanged')
1006
elif status == 'ignored':
1007
st = _i18n('ignored')
1009
st = _i18n('unknown')
1012
statinfo = os.stat(self.path + os.sep + item)
1014
if e.errno in self.acceptable_errors:
1018
liststore.append([gtk.STOCK_FILE,
1023
str(statinfo.st_size), # NOTE: if int used there it will fail for large files (size expressed as long int)
1024
self._format_size(statinfo.st_size),
1026
self._format_date(statinfo.st_mtime),
560
liststore.append([gtk.STOCK_FILE, item, st])
1029
562
# Create the columns and add them to the TreeView
1030
563
self.treeview_right.set_model(liststore)
1031
self._tvcolumn_filename = gtk.TreeViewColumn(_i18n('Filename'))
1032
self._tvcolumn_status = gtk.TreeViewColumn(_i18n('Status'))
1033
self._tvcolumn_size = gtk.TreeViewColumn(_i18n('Size'))
1034
self._tvcolumn_mtime = gtk.TreeViewColumn(_i18n('Last modified'))
1035
self.treeview_right.append_column(self._tvcolumn_filename)
1036
self.treeview_right.append_column(self._tvcolumn_status)
1037
self.treeview_right.append_column(self._tvcolumn_size)
1038
self.treeview_right.append_column(self._tvcolumn_mtime)
564
tvcolumn_filename = gtk.TreeViewColumn(_('Filename'))
565
tvcolumn_status = gtk.TreeViewColumn(_('Status'))
566
self.treeview_right.append_column(tvcolumn_filename)
567
self.treeview_right.append_column(tvcolumn_status)
1040
569
# Set up the cells
1041
570
cellpb = gtk.CellRendererPixbuf()
1042
571
cell = gtk.CellRendererText()
1043
self._tvcolumn_filename.pack_start(cellpb, False)
1044
self._tvcolumn_filename.pack_start(cell, True)
1045
self._tvcolumn_filename.set_attributes(cellpb, stock_id=0)
1046
self._tvcolumn_filename.add_attribute(cell, 'text', 2)
1047
self._tvcolumn_status.pack_start(cell, True)
1048
self._tvcolumn_status.add_attribute(cell, 'text', 3)
1049
self._tvcolumn_size.pack_start(cell, True)
1050
self._tvcolumn_size.add_attribute(cell, 'text', 6)
1051
self._tvcolumn_mtime.pack_start(cell, True)
1052
self._tvcolumn_mtime.add_attribute(cell, 'text', 8)
1054
# Set up the properties of the TreeView
1055
self.treeview_right.set_headers_visible(True)
1056
self.treeview_right.set_headers_clickable(True)
1057
self.treeview_right.set_search_column(1)
1058
self._tvcolumn_filename.set_resizable(True)
1059
self._tvcolumn_status.set_resizable(True)
1060
self._tvcolumn_size.set_resizable(True)
1061
self._tvcolumn_mtime.set_resizable(True)
1063
liststore.set_sort_func(13, self._sort_filelist_callback, None)
1064
liststore.set_sort_column_id(13, gtk.SORT_ASCENDING)
1065
self._tvcolumn_filename.set_sort_column_id(13)
1066
self._tvcolumn_status.set_sort_column_id(3)
1067
self._tvcolumn_size.set_sort_column_id(5)
1068
self._tvcolumn_mtime.set_sort_column_id(7)
1071
self.set_sensitivity()
1073
def get_selected_fileid(self):
1074
""" Get the file_id of the selected file. """
1075
treeselection = self.treeview_right.get_selection()
1076
(model, iter) = treeselection.get_selected()
1081
return model.get_value(iter, 9)
572
tvcolumn_filename.pack_start(cellpb, False)
573
tvcolumn_filename.pack_start(cell, True)
574
tvcolumn_filename.set_attributes(cellpb, stock_id=0)
575
tvcolumn_filename.add_attribute(cell, 'text', 1)
576
tvcolumn_status.pack_start(cell, True)
577
tvcolumn_status.add_attribute(cell, 'text', 2)
579
self.menuitem_branch_init.set_sensitive(self.notbranch)
580
# Check if current directory is a branch
581
self.menuitem_branch_get.set_sensitive(not self.notbranch)
582
self.menuitem_branch_checkout.set_sensitive(not self.notbranch)
583
self.menuitem_branch_pull.set_sensitive(not self.notbranch)
584
self.menuitem_branch_push.set_sensitive(not self.notbranch)
585
self.menuitem_branch_commit.set_sensitive(not self.notbranch)
586
self.menuitem_branch_status.set_sensitive(not self.notbranch)
587
self.menuitem_branch_missing.set_sensitive(not self.notbranch)
588
self.menuitem_stats.set_sensitive(not self.notbranch)
589
self.menuitem_add_files.set_sensitive(not self.notbranch)
590
self.menuitem_remove_files.set_sensitive(not self.notbranch)
591
self.menuitem_file_make_directory.set_sensitive(not self.notbranch)
592
self.menuitem_file_rename.set_sensitive(not self.notbranch)
593
self.menuitem_file_move.set_sensitive(not self.notbranch)
594
#self.menutoolbutton_diff.set_sensitive(True)
595
self.toolbutton_diff.set_sensitive(not self.notbranch)
596
self.toolbutton_log.set_sensitive(not self.notbranch)
597
self.toolbutton_commit.set_sensitive(not self.notbranch)
598
self.toolbutton_pull.set_sensitive(not self.notbranch)
599
self.toolbutton_push.set_sensitive(not self.notbranch)
1083
601
def get_selected_right(self):
1084
602
""" Get the selected filename. """
1085
603
treeselection = self.treeview_right.get_selection()
1146
651
def refresh_right(self, path=None):
1147
652
""" Refresh the file list. """
1150
from bzrlib.workingtree import WorkingTree
1153
path = self.get_path()
1155
# A workaround for double-clicking Bookmarks
1156
if not os.path.exists(path):
1159
# Get ListStore and clear it
1160
liststore = self.treeview_right.get_model()
1163
# Show Status column
1164
self._tvcolumn_status.set_visible(True)
1169
# Fill the appropriate lists
1170
dotted_files = self.pref.get_preference('dotted_files', 'bool')
1171
ignored_files = self.pref.get_preference('ignored_files', 'bool')
1173
for item in os.listdir(path):
1174
if not dotted_files and item[0] == '.':
1176
if os.path.isdir(path + os.sep + item):
1181
# Try to open the working tree
1184
tree1 = WorkingTree.open_containing(path)[0]
1185
except (bzrerrors.NotBranchError, bzrerrors.NoWorkingTree):
653
from bzrlib.workingtree import WorkingTree
656
path = self.get_path()
658
# A workaround for double-clicking Bookmarks
659
if not os.path.exists(path):
662
# Get ListStore and clear it
663
liststore = self.treeview_right.get_model()
669
# Fill the appropriate lists
670
dotted_files = self.pref.get_preference('dotted_files', 'bool')
671
for item in os.listdir(path):
672
if not dotted_files and item[0] == '.':
674
if os.path.isdir(path + os.sep + item):
683
# Try to open the working tree
686
tree1 = WorkingTree.open_containing(path)[0]
687
except errors.NotBranchError:
689
except errors.PermissionDenied:
690
print "DEBUG: permission denied."
693
branch = tree1.branch
694
tree2 = tree1.branch.repository.revision_tree(branch.last_revision())
696
delta = tree1.changes_from(tree2, want_unchanged=True)
698
# Add'em to the ListStore
700
liststore.append([gtk.STOCK_DIRECTORY, item, ''])
1188
703
if not notbranch:
1189
branch = tree1.branch
1190
tree2 = tree1.branch.repository.revision_tree(branch.last_revision())
1192
delta = tree1.changes_from(tree2, want_unchanged=True)
1194
# Add'em to the ListStore
1197
statinfo = os.stat(self.path + os.sep + item)
1199
if e.errno in self.acceptable_errors:
1203
liststore.append([gtk.STOCK_DIRECTORY,
1211
self._format_date(statinfo.st_mtime),
1217
filename = tree1.relpath(path + os.sep + item)
1222
for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed:
1223
if rpathnew == filename:
1226
for rpath, id, kind in delta.added:
1227
if rpath == filename:
1230
for rpath, id, kind in delta.removed:
1231
if rpath == filename:
1234
for rpath, id, kind, text_modified, meta_modified in delta.modified:
1235
if rpath == filename:
1238
for rpath, id, kind in delta.unchanged:
1239
if rpath == filename:
1240
status = 'unchanged'
1242
for rpath, file_class, kind, id, entry in self.wt.list_files():
1243
if rpath == filename and file_class == 'I':
1248
if status == 'renamed':
1249
st = _i18n('renamed')
1250
elif status == 'removed':
1251
st = _i18n('removed')
1252
elif status == 'added':
1254
elif status == 'modified':
1255
st = _i18n('modified')
1256
elif status == 'unchanged':
1257
st = _i18n('unchanged')
1258
elif status == 'ignored':
1259
st = _i18n('ignored')
1260
if not ignored_files:
1263
st = _i18n('unknown')
1266
statinfo = os.stat(self.path + os.sep + item)
1268
if e.errno in self.acceptable_errors:
1272
liststore.append([gtk.STOCK_FILE,
1277
str(statinfo.st_size),
1278
self._format_size(statinfo.st_size),
1280
self._format_date(statinfo.st_mtime),
1285
# Get ListStore and clear it
1286
liststore = self.treeview_right.get_model()
1289
# Hide Status column
1290
self._tvcolumn_status.set_visible(False)
1295
self._show_stock_image(gtk.STOCK_REFRESH)
1297
for (name, type) in self.remote_entries:
1298
if type.kind == 'directory':
1300
elif type.kind == 'file':
1304
""" Cache based on revision history. """
1305
def __init__(self, history):
1306
self._history = history
1308
def _lookup_revision(self, revid):
1309
for r in self._history:
1310
if r.revision_id == revid:
1312
rev = repo.get_revision(revid)
1313
self._history.append(rev)
1316
repo = self.remote_branch.repository
1318
revhistory = self.remote_branch.revision_history()
1320
revs = repo.get_revisions(revhistory)
1321
cache = HistoryCache(revs)
1322
except bzrerrors.InvalidHttpResponse:
1323
# Fallback to dummy algorithm, because of LP: #115209
1324
cache = HistoryCache([])
1327
if item.parent_id == self.remote_parent:
1328
rev = cache._lookup_revision(item.revision)
1329
liststore.append([ gtk.STOCK_DIRECTORY,
1337
self._format_date(rev.timestamp),
1340
while gtk.events_pending():
1341
gtk.main_iteration()
1344
if item.parent_id == self.remote_parent:
1345
rev = cache._lookup_revision(item.revision)
1346
liststore.append([ gtk.STOCK_FILE,
1351
str(item.text_size),
1352
self._format_size(item.text_size),
1354
self._format_date(rev.timestamp),
1357
while gtk.events_pending():
1358
gtk.main_iteration()
1360
self.image_location_error.destroy()
1362
# Columns should auto-size
1363
self.treeview_right.columns_autosize()
1366
self.set_sensitivity()
704
filename = tree1.relpath(path + os.sep + item)
706
for rpath, id, kind, text_modified, meta_modified in delta.renamed:
707
if rpath == filename:
709
for rpath, id, kind in delta.added:
710
if rpath == filename:
712
for rpath, id, kind, text_modified, meta_modified in delta.removed:
713
if rpath == filename:
715
for rpath, id, kind, text_modified, meta_modified in delta.modified:
716
if rpath == filename:
718
for rpath, id, kind in delta.unchanged:
719
if rpath == filename:
723
# status = fileops.status(path + os.sep + item)
724
#except errors.PermissionDenied:
727
if status == 'renamed':
729
elif status == 'removed':
731
elif status == 'added':
733
elif status == 'modified':
735
elif status == 'unchanged':
739
liststore.append([gtk.STOCK_FILE, item, st])
741
# Add the ListStore to the TreeView
742
self.treeview_right.set_model(liststore)
1368
744
def _harddisks(self):
1369
745
""" Returns hard drive letters under Win32. """