hggtk/merge.py
author Germán Póo-Caamaño <gpoo@calcifer.org>
Mon, 21 Jul 2008 11:51:12 -0400
changeset 1182 cbe418752174
parent 1120 08eca2607f01
permissions -rw-r--r--
hggtk: get rid of close buttons
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     1
#
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     2
# merge.py - TortoiseHg's dialog for merging revisions
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     3
#
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     4
# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     5
#
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     6
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     7
import pygtk
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     8
pygtk.require("2.0")
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     9
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    10
import sys
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    11
import gtk
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    12
from dialog import *
243
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    13
from mercurial.node import *
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    14
from mercurial import util, hg, ui
590
cd6226675379 hggtk/merge: move all import statements to top of module
TK Soh <teekaysoh@yahoo.com>
parents: 589
diff changeset
    15
from hgcmd import CmdDialog
592
9d8f7f2fa012 hggtk/merge: refresh overlay icons after merge or unmerge
TK Soh <teekaysoh@yahoo.com>
parents: 590
diff changeset
    16
from shlib import set_tortoise_icon, shell_notify
1091
e8e11990a43e hggtk: RepoError is no longer in mercurial.hg as of Mercurial 1.0
TK Soh <teekaysoh@yahoo.com>
parents: 851
diff changeset
    17
from mercurial.repo import RepoError
590
cd6226675379 hggtk/merge: move all import statements to top of module
TK Soh <teekaysoh@yahoo.com>
parents: 589
diff changeset
    18
import histselect
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    19
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    20
class MergeDialog(gtk.Window):
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    21
    """ Dialog to merge revisions of a Mercurial repo """
625
e4550fdcdf25 hggtk/merge: accept rev param to support merging via history dialog
TK Soh <teekaysoh@yahoo.com>
parents: 593
diff changeset
    22
    def __init__(self, root='', cwd='', rev=''):
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    23
        """ Initialize the Dialog """
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    24
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    25
455
1a562f070292 hggtk: set dialog icons
Steve Borho <steve@borho.org>
parents: 409
diff changeset
    26
        set_tortoise_icon(self, 'menumerge.ico')
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    27
        # set dialog title
242
9eb8bacd13a9 hggtk/merge: fix dialog title
TK Soh <teekaysoh@yahoo.com>
parents: 217
diff changeset
    28
        title = "hg merge"
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    29
        if root: title += " - %s" % root
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    30
        self.set_title(title)
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    31
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    32
        self.root = root
592
9d8f7f2fa012 hggtk/merge: refresh overlay icons after merge or unmerge
TK Soh <teekaysoh@yahoo.com>
parents: 590
diff changeset
    33
        self.cwd = cwd or root
625
e4550fdcdf25 hggtk/merge: accept rev param to support merging via history dialog
TK Soh <teekaysoh@yahoo.com>
parents: 593
diff changeset
    34
        self.rev = rev
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    35
        self.repo = None
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    36
        self.notify_func = None
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    37
        self._create()
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    38
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    39
    def set_notify_func(self, func, *args):
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    40
        self.notify_func = func
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    41
        self.notify_args = args
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    42
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    43
    def _create(self):
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    44
        self.set_default_size(350, 120)
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    45
        
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    46
        # add toolbar with tooltips
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    47
        self.tbar = gtk.Toolbar()
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    48
        self.tips = gtk.Tooltips()
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    49
        
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    50
        self._btn_merge = self._toolbutton(
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    51
                gtk.STOCK_CONNECT,
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    52
                'merge', 
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    53
                self._btn_merge_clicked,
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    54
                menu=self._merge_menu(),
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    55
                tip='Merge working revision with selected revision')
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    56
        self._btn_unmerge = self._toolbutton(
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    57
                gtk.STOCK_DISCONNECT,
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    58
                'unmerge', 
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    59
                self._btn_unmerge_clicked,
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    60
                tip='Undo merging and return working directory to'
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    61
                    ' one of it parent revision')
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    62
        tbuttons = [
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    63
                self._btn_merge,
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    64
                gtk.SeparatorToolItem(),
1182
cbe418752174 hggtk: get rid of close buttons
Germán Póo-Caamaño <gpoo@calcifer.org>
parents: 1120
diff changeset
    65
                self._btn_unmerge
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    66
            ]
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    67
        for btn in tbuttons:
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    68
            self.tbar.insert(btn, -1)
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    69
        vbox = gtk.VBox()
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    70
        self.add(vbox)
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    71
        vbox.pack_start(self.tbar, False, False, 2)
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    72
        
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    73
        # repo parent revisions
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    74
        parentbox = gtk.HBox()
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    75
        lbl = gtk.Label("Parent revision(s):")
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    76
        lbl.set_property("width-chars", 18)
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    77
        lbl.set_alignment(0, 0.5)
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    78
        self._parent_revs = gtk.Entry()
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    79
        parentbox.pack_start(lbl, False, False)
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    80
        parentbox.pack_start(self._parent_revs, True, True)
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
    81
        vbox.pack_start(parentbox, False, False, 2)
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    82
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    83
        # revision input
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    84
        revbox = gtk.HBox()
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    85
        self._rev_lbl = gtk.Label("Merge with revision:")
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    86
        self._rev_lbl.set_property("width-chars", 18)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
    87
        self._rev_lbl.set_alignment(0, 0.5)
243
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    88
        
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    89
        # revisions  combo box
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    90
        self._revlist = gtk.ListStore(str, str)
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
    91
        self._revbox = gtk.ComboBoxEntry(self._revlist, 0)
243
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    92
        
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    93
        # add extra column to droplist for type of changeset
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    94
        cell = gtk.CellRendererText()
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    95
        self._revbox.pack_start(cell)
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    96
        self._revbox.add_attribute(cell, 'text', 1)
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    97
        self._rev_input = self._revbox.get_child()
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
    98
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    99
        self._btn_rev_browse = gtk.Button("Browse...")
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   100
        self._btn_rev_browse.connect('clicked', self._btn_rev_clicked)
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   101
        revbox.pack_start(self._rev_lbl, False, False)
243
3ed734b502dc hggtk/merge: provide heads & tip on rev selection
TK Soh <teekaysoh@yahoo.com>
parents: 242
diff changeset
   102
        revbox.pack_start(self._revbox, False, False)
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   103
        revbox.pack_start(self._btn_rev_browse, False, False, 5)
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
   104
        vbox.pack_start(revbox, False, False, 2)
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   105
        
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   106
        # show them all
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   107
        self._refresh()
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   108
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   109
    def _toolbutton(self, stock, label, handler,
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   110
                    menu=None, userdata=None, tip=None):
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   111
        if menu:
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   112
            tbutton = gtk.MenuToolButton(stock)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   113
            tbutton.set_menu(menu)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   114
        else:
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   115
            tbutton = gtk.ToolButton(stock)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   116
            
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   117
        tbutton.set_label(label)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   118
        if tip:
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   119
            tbutton.set_tooltip(self.tips, tip)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   120
        tbutton.connect('clicked', handler, userdata)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   121
        return tbutton
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   122
        
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   123
    def _refresh(self):
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   124
        """ update display on dialog with recent repo data """
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   125
        try:
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   126
            # FIXME: force hg to refresh parents info
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   127
            del self.repo
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   128
            self.repo = hg.repository(ui.ui(), path=self.root)
1091
e8e11990a43e hggtk: RepoError is no longer in mercurial.hg as of Mercurial 1.0
TK Soh <teekaysoh@yahoo.com>
parents: 851
diff changeset
   129
        except RepoError:
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   130
            return None
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   131
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   132
        # populate parent rev data
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   133
        self._parents = [x.node() for x in self.repo.workingctx().parents()]
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   134
        self._parent_revs.set_sensitive(True)
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   135
        self._parent_revs.set_text(", ".join([short(x) for x in self._parents]))
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   136
        self._parent_revs.set_sensitive(False)
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   137
        
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   138
        # condition some widgets per state of working directory
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   139
        is_merged = len(self._parents) > 1
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   140
        if is_merged:
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   141
            self._btn_merge.set_sensitive(False)
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   142
            self._btn_unmerge.set_sensitive(True)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   143
            self._rev_lbl.set_text("Unmerge to revision:")
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   144
            self._btn_rev_browse.set_sensitive(False)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   145
        else:
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   146
            self._btn_merge.set_sensitive(True)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   147
            self._btn_unmerge.set_sensitive(False)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   148
            self._rev_lbl.set_text("Merge with revision:")
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   149
            self._btn_rev_browse.set_sensitive(True)
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   150
            
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   151
        # populate revision data        
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   152
        heads = self.repo.heads()
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   153
        tip = self.repo.changelog.node(nullrev+self.repo.changelog.count())
334
fdaa0907c73f hggtk/merge: clear drop-down list when refreshing
TK Soh <teekaysoh@yahoo.com>
parents: 331
diff changeset
   154
        self._revlist.clear()
363
6c59b89d84f1 hggtk/merge: clear rev input after merging
TK Soh <teekaysoh@yahoo.com>
parents: 334
diff changeset
   155
        self._rev_input.set_text("")
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   156
        for i, node in enumerate(heads):
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   157
            if node in self._parents and not is_merged:
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   158
                continue
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   159
            
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   160
            status = "head %d" % (i+1)
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   161
            if node == tip:
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   162
                status += ", tip"
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   163
            
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   164
            self._revlist.append([short(node), "(%s)" %status])
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   165
            self._rev_input.set_text(short(node))
625
e4550fdcdf25 hggtk/merge: accept rev param to support merging via history dialog
TK Soh <teekaysoh@yahoo.com>
parents: 593
diff changeset
   166
e4550fdcdf25 hggtk/merge: accept rev param to support merging via history dialog
TK Soh <teekaysoh@yahoo.com>
parents: 593
diff changeset
   167
        if self.rev:
e4550fdcdf25 hggtk/merge: accept rev param to support merging via history dialog
TK Soh <teekaysoh@yahoo.com>
parents: 593
diff changeset
   168
            self._rev_input.set_text(str(self.rev))
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   169
        
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   170
    def _merge_menu(self):
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   171
        menu = gtk.Menu()
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   172
        
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   173
        self._chbox_force = gtk.CheckMenuItem("Allow merge with uncommited changes")
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   174
        menu.append(self._chbox_force)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   175
        
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   176
        menu.show_all()
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   177
        return menu
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   178
        
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   179
    def _btn_rev_clicked(self, button):
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   180
        """ select revision from history dialog """
392
21df78721916 hggtk: copy history select code to new file
Steve Borho <steve@borho.org>
parents: 363
diff changeset
   181
        rev = histselect.select(self.root)
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   182
        if rev is not None:
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   183
            self._rev_input.set_text(rev)
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   184
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   185
    def _btn_merge_clicked(self, toolbutton, data=None):
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   186
        self._do_merge()
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   187
        
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   188
    def _btn_unmerge_clicked(self, toolbutton, data=None):
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   189
        self._do_unmerge()
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   190
        
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   191
    def _do_unmerge(self):
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   192
        rev = self._rev_input.get_text()
593
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   193
        
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   194
        if not rev:
1120
08eca2607f01 hggtk/dialog: set transient parent for all message dialogs
TK Soh <teekaysoh@yahoo.com>
parents: 1091
diff changeset
   195
            error_dialog(self, "Can't unmerge", "please select revision to unmerge")
593
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   196
            return
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   197
        
1120
08eca2607f01 hggtk/dialog: set transient parent for all message dialogs
TK Soh <teekaysoh@yahoo.com>
parents: 1091
diff changeset
   198
        response = question_dialog(self, "Undo merge",
593
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   199
                                   "and checkout revision %s?" % rev)
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   200
        if response != gtk.RESPONSE_YES:
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   201
            return
dc7658798b2a hggtk/merge: prompt user to confirm unmerging
TK Soh <teekaysoh@yahoo.com>
parents: 592
diff changeset
   202
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   203
        cmdline = ['hg', 'update', '-R', self.root, '--rev', rev, '--clean', '--verbose']
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   204
        dlg = CmdDialog(cmdline)
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   205
        dlg.run()
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   206
        dlg.hide()
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
   207
        if self.notify_func:
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
   208
            self.notify_func(self.notify_args)
592
9d8f7f2fa012 hggtk/merge: refresh overlay icons after merge or unmerge
TK Soh <teekaysoh@yahoo.com>
parents: 590
diff changeset
   209
        shell_notify([self.cwd])
587
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   210
        self._refresh()
1f3037a3341e hggtk/merge: add toolbar with Unmerge support
TK Soh <teekaysoh@yahoo.com>
parents: 455
diff changeset
   211
        
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   212
    def _do_merge(self):
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   213
        rev = self._rev_input.get_text()
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   214
        force = self._chbox_force.get_active()
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   215
        
331
bde849469c6b hggtk/merge: catch empty revision
TK Soh <teekaysoh@yahoo.com>
parents: 330
diff changeset
   216
        if not rev:
1120
08eca2607f01 hggtk/dialog: set transient parent for all message dialogs
TK Soh <teekaysoh@yahoo.com>
parents: 1091
diff changeset
   217
            error_dialog(self, "Can't merge", "please enter revision to merge")
331
bde849469c6b hggtk/merge: catch empty revision
TK Soh <teekaysoh@yahoo.com>
parents: 330
diff changeset
   218
            return
bde849469c6b hggtk/merge: catch empty revision
TK Soh <teekaysoh@yahoo.com>
parents: 330
diff changeset
   219
        
1120
08eca2607f01 hggtk/dialog: set transient parent for all message dialogs
TK Soh <teekaysoh@yahoo.com>
parents: 1091
diff changeset
   220
        response = question_dialog(self, "Really want to merge?",
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   221
                                   "with revision %s" % rev)
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   222
        if response != gtk.RESPONSE_YES:
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   223
            return
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   224
408
fcfad6e1aa90 hggtk: hgpath obsolete for most dialogs
Steve Borho <steve@borho.org>
parents: 402
diff changeset
   225
        cmdline = ['hg', 'merge', '-R', self.root, '--rev', rev]
402
876a00de6972 hggtk: pass hgpath to dialogs that need it
Steve Borho <steve@borho.org>
parents: 401
diff changeset
   226
        if force:
876a00de6972 hggtk: pass hgpath to dialogs that need it
Steve Borho <steve@borho.org>
parents: 401
diff changeset
   227
            cmdline.append("--force")
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   228
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   229
        dlg = CmdDialog(cmdline)
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   230
        dlg.run()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   231
        dlg.hide()
592
9d8f7f2fa012 hggtk/merge: refresh overlay icons after merge or unmerge
TK Soh <teekaysoh@yahoo.com>
parents: 590
diff changeset
   232
        shell_notify([self.cwd])
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
   233
        if self.notify_func:
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
   234
            self.notify_func(self.notify_args)
330
17573415da91 hggtk: revise merge dialog
TK Soh <teekaysoh@yahoo.com>
parents: 288
diff changeset
   235
        self._refresh()
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   236
625
e4550fdcdf25 hggtk/merge: accept rev param to support merging via history dialog
TK Soh <teekaysoh@yahoo.com>
parents: 593
diff changeset
   237
def run(root='', cwd='', rev='', **opts):
e4550fdcdf25 hggtk/merge: accept rev param to support merging via history dialog
TK Soh <teekaysoh@yahoo.com>
parents: 593
diff changeset
   238
    dialog = MergeDialog(root, cwd, rev)
851
f35c59879183 hggtk/merge: convert from dialog to window app
Steve Borho <steve@borho.org>
parents: 625
diff changeset
   239
    dialog.connect('destroy', gtk.main_quit)
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   240
    dialog.show_all()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   241
    gtk.gdk.threads_init()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   242
    gtk.gdk.threads_enter()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   243
    gtk.main()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   244
    gtk.gdk.threads_leave()
217
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   245
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   246
if __name__ == "__main__":
9ae0120a3bed hggtk: create simple merge dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   247
    import sys
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   248
    opts = {}
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   249
    opts['root'] = len(sys.argv) > 1 and sys.argv[1] or ''
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   250
    run(**opts)