Mercurial and Git clients can push and pull from this alias URL to interact with this repository. You can change to which repository an alias points by going to the Aliases link on the project page.
## history.py - Changelog dialog for TortoiseHg## Copyright 2007 Brad Schick, brad at gmail . com# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>#importosimportgtkimportgobjectimportpangoimportStringIOfrommercurial.nodeimport*frommercurialimportui,hg,commands,extensionsfromthgutil.i18nimport_fromthgutilimporthglib,pathsfromgdialogimport*fromchangesetimportChangeSetfrom logview import treemodel
from logview.treeview import TreeView as LogTreeView
-from hggtk import gtklib
+from hggtk import gtklib, hgcmd, synch, datamine, logfilter+from hggtk import backout, status, hgemail, tagadd, update, mergedef create_menu(label, callback):
menuitem = gtk.MenuItem(label, True)
menuitem.connect('activate',callback)menuitem.set_border_width(1)returnmenuitemclassGLog(GDialog):"""GTK+ based dialog for displaying repository logs """defget_title(self):returnos.path.basename(self.repo.root)+' log'defget_icon(self):return'menulog.ico'defparse_opts(self):# Disable quiet to get full log infoself.ui.quiet=Falsedefget_tbbuttons(self):tbar=[self.make_toolbutton(gtk.STOCK_REFRESH,_('Re_fresh'),self._refresh_clicked,tip=_('Reload revision history')),gtk.SeparatorToolItem(),self.make_toolbutton(gtk.STOCK_INDEX,_('_Filter'),self._filter_clicked,menu=self._filter_menu(),tip=_('Filter revisions for display')),gtk.SeparatorToolItem(),self.make_toolbutton(gtk.STOCK_FIND,_('_DataMine'),self._datamine_clicked,tip=_('Search Repository History')),gtk.SeparatorToolItem()]+self.changeview.get_tbbuttons()ifnotself.opts.get('from-synch'):tbar+=[gtk.SeparatorToolItem(),self.make_toolbutton(gtk.STOCK_NETWORK,_('Synchronize'),self._synch_clicked,tip=_('Launch synchronize tool')),] return tbar
def _synch_clicked(self, toolbutton, data):
- from synch import SynchDialog- dlg = SynchDialog([], False)
+ dlg = synch.SynchDialog([], False)
dlg.show_all()
def toggle_view_column(self, button, property):
active=button.get_active()self.graphview.set_property(property,active)def_more_clicked(self,button):self.graphview.next_revision_batch(self.limit)def_load_all_clicked(self,button):self.graphview.load_all_revisions()self.nextbutton.set_sensitive(False)self.allbutton.set_sensitive(False)defrevisions_loaded(self,graphview):'''Treeview reports log generator has exited'''ifnotself.graphview.graphdata:self.changeview._buffer.set_text('')self.changeview._filelist.clear()self._last_rev=Noneself.nextbutton.set_sensitive(False) self.allbutton.set_sensitive(False)
def _datamine_clicked(self, toolbutton, data=None):
-from datamine import DataMineDialog- dialog = DataMineDialog(self.ui, self.repo, self.cwd, [], {})
-dialog.display()
+dlg = datamine.DataMineDialog(self.ui, self.repo, self.cwd, [], {})
+dlg.display()
def _filter_clicked(self, toolbutton, data=None):
if self._filter_dialog:
self._filter_dialog.show()self._filter_dialog.present()else:self._show_filter_dialog()def_show_filter_dialog(self):'''Launch a modeless filter dialog'''defdo_reload(opts):self.custombutton.set_active(True)self.reload_log(opts)defclose_filter_dialog(dialog,response_id):dialog.hide()defdelete_event(dialog,event,data=None):# return True to prevent the dialog from being destroyedreturnTruerevs=[] if self.currow is not None:
revs.append(self.currow[treemodel.REVID])
- from logfilter import FilterDialog- dlg = FilterDialog(self.repo.root, revs, self.pats,
+ dlg = logfilter.FilterDialog(self.repo.root, revs, self.pats,
filterfunc=do_reload)
dlg.connect('response', close_filter_dialog)
dlg.connect('delete-event', delete_event)
dlg.set_modal(False)dlg.show()self._filter_dialog=dlgdef_filter_selected(self,widget,data=None):ifwidget.get_active():self._filter=dataself.reload_log()def_view_menu(self):menu=gtk.Menu()button=gtk.CheckMenuItem(_('Show Rev'))button.connect("toggled",self.toggle_view_column,'rev-column-visible')button.set_active(self.showcol.get('rev',True))button.set_draw_as_radio(True)menu.append(button)button=gtk.CheckMenuItem(_('Show ID'))button.connect("toggled",self.toggle_view_column,'id-column-visible')button.set_active(self.showcol.get('id',False))button.set_draw_as_radio(True)menu.append(button)button=gtk.CheckMenuItem(_('Show Date'))button.connect("toggled",self.toggle_view_column,'date-column-visible')button.set_active(self.showcol.get('date',True))button.set_draw_as_radio(True)menu.append(button)button=gtk.CheckMenuItem(_("Show Branch"))button.connect("toggled",self.toggle_view_column,'branch-column-visible')button.set_active(self.showcol.get('branch',False))button.set_draw_as_radio(True)menu.append(button)menu.show_all()returnmenudef_filter_menu(self):menu=gtk.Menu()button=gtk.RadioMenuItem(None,_('Show All Revisions'))button.set_active(True)button.connect('toggled',self._filter_selected,'all')menu.append(button)button=gtk.RadioMenuItem(button,_('Show Tagged Revisions'))button.connect('toggled',self._filter_selected,'tagged')menu.append(button)button=gtk.RadioMenuItem(button,_('Show Revision Ancestry'))button.connect('toggled',self._filter_selected,'ancestry')menu.append(button)button=gtk.RadioMenuItem(button,_('Show Working Parents'))button.connect('toggled',self._filter_selected,'parents')menu.append(button)button=gtk.RadioMenuItem(button,_('Show Head Revisions'))button.connect('toggled',self._filter_selected,'heads')menu.append(button)button=gtk.RadioMenuItem(button,_('Show Only Merge Revisions'))button.connect('toggled',self._filter_selected,'only_merges')menu.append(button)button=gtk.RadioMenuItem(button,_('Show Non-Merge Revisions'))button.connect('toggled',self._filter_selected,'no_merges')menu.append(button)self.custombutton=gtk.RadioMenuItem(button,_('Custom Filter'))self.custombutton.set_sensitive(False)menu.append(self.custombutton)menu.show_all()returnmenudefopen_with_file(self,file):'''Call this before display() to open with file history'''self.opts['filehist']=filedefprepare_display(self):'''Called at end of display() method'''self._last_rev=Noneself._filter="all"self.currow=Noneself.curfile=Noneself.opts['rev']=[]# This option is dangerous - used directly by hgself.opts['revs']=Noneos.chdir(self.repo.root)# for paths relative to repo rootif'filehist'inself.opts:self.custombutton.set_active(True)self.reload_log({'pats':[self.opts['filehist']]})elif'revrange'inself.opts:self.custombutton.set_active(True)self.graphview.refresh(True,None,self.opts)elifself.pats==[self.repo.root]orself.pats==['']:self.pats=[]self.reload_log()elifself.pats:self.custombutton.set_active(True)self.reload_log({'pats':self.pats})else:self.reload_log()defget_graphlimit(self,suggestion):limit_opt=self.repo.ui.config('tortoisehg','graphlimit','500')l=0forlimitin(suggestion,limit_opt):try:l=int(limit)ifl>0:returnlexcept(TypeError,ValueError):passreturnlor500defsave_settings(self):settings=GDialog.save_settings(self)settings['glog-vpane']=self._vpaned.get_position()settings['glog-hpane']=self._hpaned.get_position()forcolin('rev','date','id','branch'):vis=self.graphview.get_property(col+'-column-visible')settings['glog-vis-'+col]=visreturnsettingsdefload_settings(self,settings):'''Called at beginning of display() method'''self.stbar=gtklib.StatusBar()self.limit=self.get_graphlimit(None)# Allocate TreeView instance to use internallyif'limit'inself.opts:firstlimit=self.get_graphlimit(self.opts['limit'])self.graphview=LogTreeView(self.repo,firstlimit,self.stbar)else:self.graphview=LogTreeView(self.repo,self.limit,self.stbar)# Allocate ChangeSet instance to use internallyself.changeview=ChangeSet(self.ui,self.repo,self.cwd,[],self.opts,self.stbar)self.changeview.display(False)self.changeview.glog_parent=selfGDialog.load_settings(self,settings)self._setting_vpos=-1self._setting_hpos=-1self.showcol={}try:self._setting_vpos=settings['glog-vpane']self._setting_hpos=settings['glog-hpane']forcolin('rev','date','id','branch'):vis=settings['glog-vis-'+col]self.showcol[col]=visexceptKeyError:passdefreload_log(self,filteropts={}):"""Send refresh event to treeview object"""os.chdir(self.repo.root)# for paths relative to repo rootself.nextbutton.set_sensitive(True)self.allbutton.set_sensitive(True)self.opts['rev']=[]self.opts['revs']=Noneself.opts['no_merges']=Falseself.opts['only_merges']=Falseself.opts['revrange']=filteropts.get('revrange',None)self.opts['date']=filteropts.get('date',None)self.opts['keyword']=filteropts.get('keyword',[])iffilteropts:if'revrange'infilteroptsor'branch'infilteropts:branch=filteropts.get('branch',None)self.graphview.refresh(True,branch,self.opts)else:self.pats=filteropts.get('pats',[])self.graphview.refresh(False,self.pats,self.opts)elifself._filter=="all":self.graphview.refresh(True,None,self.opts)elifself._filter=="only_merges":self.opts['only_merges']=Trueself.graphview.refresh(False,[],self.opts)elifself._filter=="no_merges":self.opts['no_merges']=Trueself.graphview.refresh(False,[],self.opts)elifself._filter=="ancestry":ifnotself.currow:returnrange=[self.currow[treemodel.REVID],0]sopts={'noheads':True,'revrange':range}self.graphview.refresh(True,None,sopts)elifself._filter=="tagged":tagged=[]fort,rinself.repo.tagslist():hr=hex(r)ifhrnotintagged:tagged.insert(0,hr)self.opts['revs']=taggedself.graphview.refresh(False,[],self.opts)elifself._filter=="parents":repo_parents=[x.rev()forxinself.repo.changectx(None).parents()]self.opts['revs']=[str(x)forxinrepo_parents]self.graphview.refresh(False,[],self.opts)elifself._filter=="heads":heads=[self.repo.changelog.rev(x)forxinself.repo.heads()]self.opts['revs']=[str(x)forxinheads]self.graphview.refresh(False,[],self.opts)deftree_context_menu(self):_menu=gtk.Menu()_menu.append(create_menu(_('di_splay'),self._show_status))_menu.append(create_menu(_('visualize change'),self._vdiff_change))_menu.append(create_menu(_('diff to local'),self._vdiff_local))_menu.append(create_menu(_('_update'),self._checkout))self._cmenu_merge=create_menu(_('_merge with'),self._merge)_menu.append(self._cmenu_merge)_menu.append(create_menu(_('_copy hash'),self._copy_hash))_menu.append(create_menu(_('_export patch'),self._export_patch))_menu.append(create_menu(_('e_mail patch'),self._email_patch))_menu.append(create_menu(_('_bundle rev:tip'),self._bundle_rev_to_tip))_menu.append(create_menu(_('add/remove _tag'),self._add_tag))_menu.append(create_menu(_('backout revision'),self._backout_rev))_menu.append(create_menu(_('_revert'),self._revert))# need mq extension for strip commandextensions.loadall(self.ui)extensions.load(self.ui,'mq',None)_menu.append(create_menu(_('strip revision'),self._strip_rev))_menu.show_all()return_menudef_restore_original_selection(self,widget,*args):self.tree.get_selection().set_mode(gtk.SELECTION_SINGLE)self.tree.get_selection().select_path(self._orig_sel)deftree_diff_context_menu(self):_menu=gtk.Menu()_menu.append(create_menu(_('_diff with selected'),self._diff_revs))_menu.append(create_menu(_('visual diff with selected'),self._vdiff_selected))_menu.append(create_menu(_('email from here to selected'),self._email_revs))_menu.append(create_menu(_('bundle from here to selected'),self._bundle_revs))_menu.connect_after('selection-done',self._restore_original_selection)_menu.show_all()return_menudefget_body(self):self._filter_dialog=Noneself._menu=self.tree_context_menu()self._menu2=self.tree_diff_context_menu()self.tree_frame=gtk.Frame()self.tree_frame.set_shadow_type(gtk.SHADOW_ETCHED_IN)# PyGtk 2.6 and below did not automatically register typesifgobject.pygtk_version<(2,8,0):gobject.type_register(LogTreeView)self.tree=self.graphview.treeviewself.graphview.connect('revision-selected',self.selection_changed)self.graphview.connect('revisions-loaded',self.revisions_loaded)#self.tree.connect('button-release-event', self._tree_button_release)self.tree.connect('button-press-event',self._tree_button_press)#self.tree.connect('popup-menu', self._tree_popup_menu)self.tree.connect('row-activated',self._tree_row_act)#self.tree.modify_font(pango.FontDescription(self.fontlist))accelgroup=gtk.AccelGroup()self.add_accel_group(accelgroup)mod=gtklib.get_thg_modifier()key,modifier=gtk.accelerator_parse(mod+'d')self.tree.add_accelerator('thg-diff',accelgroup,key,modifier,gtk.ACCEL_VISIBLE)self.tree.connect('thg-diff',self.thgdiff)key,modifier=gtk.accelerator_parse(mod+'p')self.tree.add_accelerator('thg-parent',accelgroup,key,modifier,gtk.ACCEL_VISIBLE)self.tree.connect('thg-parent',self.thgparent)self.connect('thg-refresh',self.thgrefresh)hbox=gtk.HBox()hbox.pack_start(self.graphview,True,True,0)vbox=gtk.VBox()self.colmenu=gtk.MenuToolButton('')self.colmenu.set_menu(self._view_menu())# A MenuToolButton has two parts; a Button and a ToggleButton# we want to see the togglebutton, but not the buttonb=self.colmenu.child.get_children()[0]b.unmap()b.set_sensitive(False)self.nextbutton=gtk.ToolButton(gtk.STOCK_GO_DOWN)self.nextbutton.connect('clicked',self._more_clicked)self.allbutton=gtk.ToolButton(gtk.STOCK_GOTO_BOTTOM)self.allbutton.connect('clicked',self._load_all_clicked)vbox.pack_start(self.colmenu,False,False)vbox.pack_start(gtk.Label(''),True,True)# expanding blank labelvbox.pack_start(self.nextbutton,False,False)vbox.pack_start(self.allbutton,False,False)self.nextbutton.set_tooltip(self.tooltips,_('show next %d revisions')%self.limit)self.allbutton.set_tooltip(self.tooltips,_('show all remaining revisions'))hbox.pack_start(vbox,False,False,0)self.tree_frame.add(hbox)self.tree_frame.show_all()# Add ChangeSet instance to bottom half of vpaneself.changeview.graphview=self.graphviewself._hpaned=self.changeview.get_body()self._vpaned=gtk.VPaned()self._vpaned.pack1(self.tree_frame,True,False)self._vpaned.pack2(self._hpaned)gobject.idle_add(self.realize_settings)vbox=gtk.VBox()vbox.pack_start(self._vpaned,True,True)# Append status barvbox.pack_start(gtk.HSeparator(),False,False)vbox.pack_start(self.stbar,False,False)returnvboxdefrealize_settings(self):self._vpaned.set_position(self._setting_vpos)self._hpaned.set_position(self._setting_hpos)defthgdiff(self,treeview):'ctrl-d handler'self._vdiff_change(None)defthgparent(self,treeview):'ctrl-p handler'parent=self.repo['.'].rev()self.graphview.set_revision_id(parent)def_strip_rev(self,menuitem):rev=self.currow[treemodel.REVID]res=Confirm(_('Confirm Strip Revision(s)'),[],self, _('Remove revision %d and all descendants?') % rev).run()
if res != gtk.RESPONSE_YES:
return
- from hgcmd import CmdDialog cmdline = ['hg', 'strip', str(rev)]
- dlg = CmdDialog(cmdline)
+ dlg = hgcmd.CmdDialog(cmdline)
dlg.show_all()
dlg.run()
dlg.hide()
self.repo.invalidate() self.reload_log()
def _backout_rev(self, menuitem):
- from backout import BackoutDialog rev = self.currow[treemodel.REVID]
rev = short(self.repo.changelog.node(rev))
parents = [x.node() for x in self.repo.changectx(None).parents()]
-dialog = BackoutDialog(rev)
-dialog.set_transient_for(self)
-dialog.show_all()
-dialog.set_notify_func(self.checkout_completed, parents)
-dialog.present()
-dialog.set_transient_for(None)
+dlg = backout.BackoutDialog(rev)
+dlg.set_transient_for(self)
+dlg.show_all()
+dlg.set_notify_func(self.checkout_completed, parents)
+dlg.present()
+dlg.set_transient_for(None)
def _revert(self, menuitem):
rev = self.currow[treemodel.REVID]
res=Confirm(_('Confirm Revert Revision(s)'),[],self,_('Revert all files to revision %d?\nThis will overwrite your ''local changes')%rev).run()ifres!=gtk.RESPONSE_YES:return cmdline = ['hg', 'revert', '--verbose', '--all', '--rev', str(rev)]
- from hgcmd import CmdDialog- dlg = CmdDialog(cmdline)
+ dlg = hgcmd.CmdDialog(cmdline)
dlg.show_all()
dlg.run()
dlg.hide()
def_vdiff_change(self,menuitem,pats=[]):rev=self.currow[treemodel.REVID]self._do_diff(pats,{'change':rev},modal=True)def_vdiff_local(self,menuitem,pats=[]):rev=self.currow[treemodel.REVID]opts={'rev':["%s:."%rev]} self._do_diff(pats, opts, modal=True)
def _diff_revs(self, menuitem):
- from status import GStatus rev0, rev1 = self._revs
statopts = self.merge_opts(commands.table['^status|st'][1],
('include', 'exclude', 'git'))
statopts['rev']=['%u:%u'%(rev0,rev1)] statopts['modified'] = True
statopts['added'] = True
statopts['removed'] = True
- dialog = GStatus(self.ui, self.repo, self.cwd, self.pats,
+ dialog = status.GStatus(self.ui, self.repo, self.cwd, self.pats,
statopts)
dialog.display()
return True
def_vdiff_selected(self,menuitem):rev0,rev1=self._revsself.opts['rev']=["%s:%s"%(rev0,rev1)]iflen(self.pats)==1:self._diff_file(None,self.pats[0])else: self._diff_file(None, None)
def _email_revs(self, menuitem):
- from hgemail import EmailDialog revs = list(self._revs)
revs.sort()
opts = ['--rev', str(revs[0]) + ':' + str(revs[1])]
- dlg = EmailDialog(self.repo.root, opts)
+ dlg = hgemail.EmailDialog(self.repo.root, opts)
dlg.set_transient_for(self)
dlg.show_all()
dlg.present()
dlg.set_transient_for(None)def_bundle_revs(self,menuitem):revs=list(self._revs)revs.sort()parent=self.repo[revs[0]].parents()[0].rev()# Special case for revision 0's parent.ifparent==-1:parent='null'filename="%s_rev%d_to_rev%s.hg"%(os.path.basename(self.repo.root),revs[0],revs[1])result=NativeSaveFileDialogWrapper(Title=_('Write bundle to'), InitialDir=self.repo.root,
FileName=filename).run()
if result:
- from hgcmd import CmdDialog cmdline = ['hg', 'bundle', '--base', str(parent),
'--rev', str(revs[1]), result]
- dlg = CmdDialog(cmdline)
+ dlg = hgcmd.CmdDialog(cmdline)
dlg.show_all()
dlg.run()
dlg.hide()
def _add_tag(self, menuitem):
- from tagadd import TagAddDialog- # save tag info for detecting new tags added
oldtags = self.repo.tagslist()
rev = self.currow[treemodel.REVID]
defrefresh(*args):self.repo.invalidate()newtags=self.repo.tagslist() if newtags != oldtags:
self.reload_log()
- dialog = TagAddDialog(self.repo.root, rev=str(rev))
+ dialog = tagadd.TagAddDialog(self.repo.root, rev=str(rev))
dialog.set_transient_for(self)
dialog.connect('destroy', refresh)
dialog.show_all()
dialog.present()dialog.set_transient_for(None)def_show_status(self,menuitem):rev=self.currow[treemodel.REVID]statopts={'rev':[str(rev)]}dialog=ChangeSet(self.ui,self.repo,self.cwd,[],statopts)dialog.display()def_copy_hash(self,menuitem):rev=self.currow[treemodel.REVID]node=self.repo[rev].node()sel=(os.name=='nt')and'CLIPBOARD'or'PRIMARY'clipboard=gtk.Clipboard(selection=sel)clipboard.set_text(hex(node))def_export_patch(self,menuitem):rev=self.currow[treemodel.REVID]filename="%s_rev%s.patch"%(os.path.basename(self.repo.root),rev)fd=NativeSaveFileDialogWrapper(Title=_('Save patch to'),InitialDir=self.repo.root,FileName=filename)result=fd.run()ifresult:ifos.path.exists(result):os.remove(result)# In case new export args are added in the future, merge the# hg defaultsexportOpts=self.merge_opts(commands.table['^export'][1],())exportOpts['output']=resultdefdohgexport():commands.export(self.ui,self.repo,str(rev),**exportOpts)success,outtext=self._hg_call_wrapper("Export",dohgexport,False)def_bundle_rev_to_tip(self,menuitem):try:rev=int(self.currow[treemodel.REVID])parent=self.repo[rev].parents()[0].rev()# Special case for revision 0's parent.ifparent==-1:parent='null'except(ValueError,hglib.LookupError):returnfilename="%s_rev%d_to_tip.hg"%(os.path.basename(self.repo.root),rev)result=NativeSaveFileDialogWrapper(Title=_('Write bundle to'), InitialDir=self.repo.root,
FileName=filename).run()
if result:
- from hgcmd import CmdDialog cmdline = ['hg', 'bundle', '--base', str(parent), result]
- dlg = CmdDialog(cmdline)
+ dlg = hgcmd.CmdDialog(cmdline)
dlg.show_all()
dlg.run()
dlg.hide()
def _email_patch(self, menuitem):
- from hgemail import EmailDialog rev = self.currow[treemodel.REVID]
- dlg = EmailDialog(self.repo.root, ['--rev', str(rev)])
+ dlg = hgemail.EmailDialog(self.repo.root, ['--rev', str(rev)])
dlg.set_transient_for(self)
dlg.show_all()
dlg.present()
dlg.set_transient_for(None)
def _checkout(self, menuitem):
- from update import UpdateDialog rev = self.currow[treemodel.REVID]
parents = [x.node() for x in self.repo.changectx(None).parents()]
- dialog = UpdateDialog(rev)
+ dialog = update.UpdateDialog(rev)
dialog.set_transient_for(self)
dialog.show_all()
dialog.set_notify_func(self.checkout_completed, parents)
dialog.present()dialog.set_transient_for(None)defcheckout_completed(self,oldparents):newparents=[x.node()forxinself.repo.changectx(None).parents()]ifnotoldparents==newparents: self.reload_log()
def _merge(self, menuitem):
- from merge import MergeDialog rev = self.currow[treemodel.REVID]
parents = [x.node() for x in self.repo.changectx(None).parents()]
- dialog = MergeDialog(rev)
+ dialog = merge.MergeDialog(rev)
dialog.set_transient_for(self)
dialog.show_all()
dialog.set_notify_func(self.merge_completed, parents)
dialog.present()dialog.set_transient_for(None)defmerge_completed(self,oldparents):newparents=[x.node()forxinself.repo.changectx(None).parents()]ifnotoldparents==newparents:self.reload_log()defselection_changed(self,treeview):self.currow=self.graphview.get_revision()rev=self.currow[treemodel.REVID]ifrev!=self._last_rev:self._last_rev=revself.changeview.opts['rev']=[str(rev)]self.changeview.load_details(rev)returnFalsedefthgrefresh(self,window):self.reload_log()def_refresh_clicked(self,toolbutton,data=None):self.reload_log()returnTruedef_tree_button_release(self,tree,event):ifevent.button==3andnot(event.state&(gtk.gdk.SHIFT_MASK|gtk.gdk.CONTROL_MASK)):self._tree_popup_menu(tree,event.button,event.time)returnFalsedef_tree_button_press(self,tree,event):ifevent.button==3andnot(event.state&(gtk.gdk.SHIFT_MASK|gtk.gdk.CONTROL_MASK)):path=tree.get_path_at_pos(int(event.x),int(event.y))ifnotpath:returnFalsecrow=path[0](model,pathlist)=tree.get_selection().get_selected_rows()ifpathlist==[]:returnFalsesrow=pathlist[0]ifsrow==crow:self._tree_popup_menu(tree,event.button,event.time)else:tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)tree.get_selection().select_path(crow)self._orig_sel=srowself._revs=(int(model[srow][treemodel.REVID]),int(model[crow][treemodel.REVID]))self._tree_popup_menu_diff(tree,event.button,event.time)returnTruereturnFalsedef_tree_popup_menu(self,treeview,button=0,time=0):selrev=self.currow[treemodel.REVID]# disable/enable menus as requiredparents=[self.repo.changelog.rev(x.node())forxinself.repo.changectx(None).parents()]can_merge=selrevnotinparentsandlen(parents)<2self._cmenu_merge.set_sensitive(can_merge)# display the context menuself._menu.popup(None,None,None,button,time)returnTruedef_tree_popup_menu_diff(self,treeview,button=0,time=0):# display the context menuself._menu2.popup(None,None,None,button,time)returnTruedef_tree_row_act(self,tree,path,column):"""Default action is the first entry in the context menu """self._menu.get_children()[0].activate()returnTruedefrun(ui,*pats,**opts):limit=opts.get('limit')cmdoptions={'follow':False,'follow-first':False,'copies':False,'keyword':[],'limit':limit,'rev':[],'removed':False,'no_merges':False,'date':None,'only_merges':None,'prune':[],'git':False,'verbose':False,'include':[],'exclude':[]}root=paths.find_root()canonpats=[]forfinpats:canonpats.append(util.canonpath(root,os.getcwd(),f))returnGLog(ui,None,None,canonpats,cmdoptions)
Attach a Trello Card
Add a tag
Your session has expired
You are no longer logged in. Please log in and try your request again.
Filter RSS Feed
This RSS feed URL allows you to see the contents of your current filter using any feed reader.
This link includes a special authentication token. If you share the URL with anyone else, they can see this RSS feed's activity. You can disable these tokens when needed.
Your current filter is unsaved; changing it won't affect this RSS feed.