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.
# merge.py - TortoiseHg's dialog for merging revisions## Copyright 2007 TK Soh <teekaysoh@gmail.com># Copyright 2007 Steve Borho <steve@borho.org>## This software may be used and distributed according to the terms of the# GNU General Public License version 2, incorporated herein by reference.importosimportgtkimportgobjectfrommercurialimportui,commandsfromtortoisehg.util.i18nimport_fromtortoisehg.utilimporthglibfromtortoisehg.hgtkimportcsinfo,gtklib,gdialogRESPONSE_MERGE=1RESPONSE_COMMIT=2RESPONSE_UNDO=3classMergeDialog(gdialog.GDialog):""" Dialog to merge revisions of a Mercurial repo """def__init__(self,rev0,rev1):gdialog.GDialog.__init__(self)self.revs=(rev0,rev1)self.set_notify_func(None)self.set_after_done(False)### Start of Overriding Section ###defget_title(self,reponame):return_('Merging in %s')%reponamedefget_icon(self):return'menumerge.ico'defget_body(self,vbox):rev0,rev1=self.revsprevs=[ctx.rev()forctxinself.repo.parents()]iflen(prevs)>1:rev0,rev1=prevselifnotrev1:gdialog.Prompt(_('Unable to merge'),_('Must supply a target revision'),self).run()gtklib.idle_add_single_call(self.destroy)returnelifnotrev0:rev0=prevs[0]elifrev1==prevs[0]:# selected pair was backwardsrev0,rev1=rev1,rev0elifrev0!=prevs[0]:# working parent not in selected revision pairmodified,added,removed,deleted=self.repo.status()[:4]ifmodifiedoraddedorremovedordeleted:gdialog.Prompt(_('Unable to merge'),_('Outstanding uncommitted changes'),self).run()gtklib.idle_add_single_call(self.destroy)returnself.repo.ui.quiet=Truecommands.update(self.repo.ui,self.repo,rev=rev0,check=True)self.repo.ui.quiet=False# changeset infostyle=csinfo.panelstyle(contents=csinfo.PANEL_DEFAULT+('ishead',),margin=5,padding=2)defmarkup_func(widget,item,value):ifitem=='ishead'andvalueisFalse:text=_('Not a head revision!')returngtklib.markup(text,weight='bold')raisecsinfo.UnknownItem(item)custom=csinfo.custom(markup=markup_func)factory=csinfo.factory(self.repo,custom,style,withupdate=True)info=factory(rev1,style={'label':_('Merge target (other)')})self.vbox.pack_start(info,False,False)self.otherframe=infoself.otherrev=str(info.get_data('revnum'))info=factory(rev0,style={'label':_('Current revision (local)')})self.vbox.pack_start(info,False,False) self.localframe = info
self.localrev = str(info.get_data('revnum'))
+ discard = gtk.CheckButton(_('Discard all changes from merge target '+ '(other) revision'))+ self.discard = discard+ self.vbox.pack_start(discard, False, False)+ vlist = gtk.ListStore(str, # tool name
bool) # separator
combo = gtk.ComboBoxEntry(vlist, 0)
self.mergetool=combocombo.set_row_separator_func(lambdamodel,path:model[path][1])combo.child.set_width_chars(8)lbl=gtk.Label(_('Merge tools:'))lbl.set_alignment(1,0.5)self.mergelabel=lblself.action_area.add(lbl)self.action_area.add(combo)prev=Falsefortoolinhglib.mergetools(self.repo.ui):cur=tool.startswith('internal:')vlist.append((hglib.toutf(tool),prev!=cur))prev=curmtool=self.repo.ui.config('ui','merge',None)ifmtool:combo.child.set_text(hglib.toutf(mtool))else:combo.child.set_text('')# prepare to show if len(self.repo.parents()) == 2:
self.mergetool.set_sensitive(False)
self.mergelabel.set_sensitive(False)
+ self.discard.set_sensitive(False) self.buttons['merge'].set_sensitive(False)
self.buttons['commit'].set_sensitive(True)
self.buttons['undo'].set_sensitive(True)
else:self.buttons['commit'].set_sensitive(False)self.buttons['undo'].set_sensitive(False)defget_buttons(self):return[('merge',_('Merge'),RESPONSE_MERGE),('commit',_('Commit'),RESPONSE_COMMIT),('undo',_('Undo'),RESPONSE_UNDO),('close',gtk.STOCK_CLOSE,gtk.RESPONSE_CLOSE)]defget_default_button(self):return'merge'defget_action_map(self):return{RESPONSE_MERGE:self.domerge,RESPONSE_COMMIT:self.docommit,RESPONSE_UNDO:self.doundo}defswitch_to(self,normal,working,cmd): self.otherframe.set_sensitive(normal)
self.localframe.set_sensitive(normal)
self.mergetool.set_property('visible', normal)
+ self.discard.set_property('visible', normal) self.mergelabel.set_property('visible', normal)
self.buttons['merge'].set_property('visible', normal)
self.buttons['commit'].set_property('visible',normal)self.buttons['undo'].set_property('visible',normal)self.buttons['close'].set_property('visible',normal)defcommand_done(self,returncode,useraborted,type):hglib.invalidaterepo(self.repo)merged=undo=Trueiftype=='merge':ifreturncode==0:self.cmd.set_result(_('Merged successfully'),style='ok')elifuseraborted:self.cmd.set_result(_('Canceled merging'),style='error')else:self.cmd.set_result(_('Failed to merge'),style='error')iflen(self.repo.parents())==1:returnmerged=Falsefocus='commit'eliftype=='undo':ifreturncode==0:self.cmd.set_result(_('Undo successfully'),style='ok')elifuseraborted:self.cmd.set_result(_('Canceled undo'),style='error')else:self.cmd.set_result(_('Failed to undo'),style='error')undo=Falsefocus='merge' else:
raise _('unexpected type: %s') % type
+ self.discard.set_sensitive(merged) self.mergetool.set_sensitive(merged)
self.mergelabel.set_sensitive(merged)
self.buttons['merge'].set_sensitive(merged)
self.buttons['undo'].set_sensitive(undo)self.buttons['commit'].set_sensitive(undo)self.buttons[focus].grab_focus()defbefore_close(self):iflen(self.repo.parents())==2:ret=gdialog.Confirm(_('Confirm Exit'),[],self,_('To complete merging, you need to commit'' merged files in working directory.\n\n''Do you want to exit?')).run()ifret!=gtk.RESPONSE_YES:returnFalsereturnTrue ### End of Overriding Section ###
def domerge(self):
-tool = hglib.fromutf(self.mergetool.child.get_text())- if tool:
- cmdline = ['hg', '--config', 'ui.merge=%s' % tool]
+if self.discard.get_active():+ c = self.repo[None]+ if c.modified() or c.added() or c.removed():
+ gdialog.Prompt(_('Cannot merge'),+ _('Uncommitted local changes'), self).run()+ return+ # '.' is safer than self.localrev, in case the user has+ # pulled a fast one on us and updated from the CLI+cmdline = ['hg', 'debugsetparents', '.', self.otherrev]
else:
- cmdline = ['hg']
- cmdline.extend(['merge', '--rev', self.otherrev])
+ tool = hglib.fromutf(self.mergetool.child.get_text())+ if tool:+ cmdline = ['hg', '--config', 'ui.merge=%s' % tool]+ else:+ cmdline = ['hg']
+ cmdline.extend(['merge', '--rev', self.otherrev])
self.execute_command(cmdline, 'merge')
def docommit(self):
defcommit_notify():# refresh changelogifhasattr(self,'notify_func')andself.notify_func:self.notify_func(*self.notify_args)# hide merge dialogself.hide()# hide commit tooldlg.ready=False# disables refreshdlg.hide()# close selfself.response(gdialog.RESPONSE_FORCE_CLOSE)fromtortoisehg.hgtkimportcommitdlg=commit.run(ui.ui())dlg.set_transient_for(self)dlg.set_modal(True)dlg.set_notify_func(commit_notify)dlg.display()defdoundo(self):res=gdialog.Confirm(_('Confirm undo merge'),[],self,_('Clean checkout of original revision?')).run()ifres!=gtk.RESPONSE_YES:returncmdline=['hg','update','--rev',self.localrev,'--clean']self.execute_command(cmdline,'undo')defrun(ui,*pats,**opts):returnMergeDialog(None,opts.get('rev'))
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.