hggtk/recovery.py
author Germán Póo-Caamaño <gpoo@calcifer.org>
Mon, 21 Jul 2008 11:51:12 -0400
changeset 1182 cbe418752174
parent 1140 d24c108f6ae0
permissions -rw-r--r--
hggtk: get rid of close buttons
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     1
#
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     2
# Repository recovery dialog for TortoiseHg
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     3
#
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     4
# Copyright (C) 2007 Steve Borho <steve@borho.org>
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     5
# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     6
#
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     7
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     8
try:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     9
    import pygtk
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    10
    pygtk.require("2.0")
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    11
except:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    12
    pass
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    13
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    14
import gtk
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    15
import gobject
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    16
import pango
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    17
import Queue
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    18
import os
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    19
import threading
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    20
from mercurial import hg, ui, util 
1091
e8e11990a43e hggtk: RepoError is no longer in mercurial.hg as of Mercurial 1.0
TK Soh <teekaysoh@yahoo.com>
parents: 854
diff changeset
    21
from mercurial.repo import RepoError
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    22
from mercurial.node import *
554
9f3cd7a31060 hggtk/recovery: prompt user to confirm rollback
TK Soh <teekaysoh@yahoo.com>
parents: 552
diff changeset
    23
from dialog import error_dialog, question_dialog
1130
8a56ab916e0a hggtk: generic fix on encoding issues
TK Soh <teekaysoh@yahoo.com>
parents: 1120
diff changeset
    24
from hglib import HgThread, toutf
543
4f9af463138d hggtk/recovery: refresh icons in folder after rollback
TK Soh <teekaysoh@yahoo.com>
parents: 540
diff changeset
    25
from shlib import set_tortoise_icon, shell_notify
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    26
import gtklib
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    27
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    28
class RecoveryDialog(gtk.Window):
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    29
    def __init__(self, cwd='', root=''):
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    30
        """ Initialize the Dialog. """
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    31
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    32
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    33
        set_tortoise_icon(self, 'general.ico')
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    34
        self.root = root
543
4f9af463138d hggtk/recovery: refresh icons in folder after rollback
TK Soh <teekaysoh@yahoo.com>
parents: 540
diff changeset
    35
        self.cwd = cwd
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    36
        self.selected_path = None
1140
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
    37
        self.hgthread = None
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    38
        self.connect('delete-event', self._delete)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    39
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    40
        self.set_default_size(600, 400)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    41
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    42
        name = os.path.basename(os.path.abspath(root))
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    43
        self.set_title("TortoiseHg Recovery - " + name)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    44
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    45
        # toolbar
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    46
        self.tbar = gtk.Toolbar()
547
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
    47
        self.tips = gtk.Tooltips()
1138
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
    48
        self._stop_button = self._toolbutton(gtk.STOCK_STOP,
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
    49
                'Stop', self._stop_clicked, tip='Stop the hg operation')
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
    50
        self._stop_button.set_sensitive(False)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    51
        tbuttons = [
595
9d462d719761 hggtk/recovery: change icon for 'clean' toolbutton
TK Soh <teekaysoh@yahoo.com>
parents: 582
diff changeset
    52
                self._toolbutton(gtk.STOCK_CLEAR,
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
    53
                                 'clean', 
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
    54
                                 self._clean_clicked,
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
    55
                                 tip='Clean checkout, undo all changes'),
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
    56
                gtk.SeparatorToolItem(),
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    57
                self._toolbutton(gtk.STOCK_UNDO,
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    58
                                 'rollback', 
547
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
    59
                                 self._rollback_clicked,
552
adc323db1f05 hggtk/recovery: revise tooltips of tool buttons
TK Soh <teekaysoh@yahoo.com>
parents: 551
diff changeset
    60
                                 tip='Rollback (undo) last transaction to'
adc323db1f05 hggtk/recovery: revise tooltips of tool buttons
TK Soh <teekaysoh@yahoo.com>
parents: 551
diff changeset
    61
                                     ' repository (pull, commit, etc)'),
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    62
                gtk.SeparatorToolItem(),
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    63
                self._toolbutton(gtk.STOCK_CLEAR,
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    64
                                 'recover',
547
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
    65
                                 self._recover_clicked,
552
adc323db1f05 hggtk/recovery: revise tooltips of tool buttons
TK Soh <teekaysoh@yahoo.com>
parents: 551
diff changeset
    66
                                 tip='Recover from interrupted operation'),
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    67
                gtk.SeparatorToolItem(),
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    68
                self._toolbutton(gtk.STOCK_APPLY,
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    69
                                 'verify',
547
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
    70
                                 self._verify_clicked,
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
    71
                                 tip='Validate repository consistency'),
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    72
                gtk.SeparatorToolItem(),
1138
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
    73
                self._stop_button,
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
    74
                gtk.SeparatorToolItem(),
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    75
            ]
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    76
        for btn in tbuttons:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    77
            self.tbar.insert(btn, -1)
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    78
        vbox = gtk.VBox()
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    79
        self.add(vbox)
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    80
        vbox.pack_start(self.tbar, False, False, 2)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    81
        
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    82
        # hg output window
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    83
        scrolledwindow = gtk.ScrolledWindow()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    84
        scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    85
        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    86
        self.textview = gtk.TextView(buffer=None)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    87
        self.textview.set_editable(False)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    88
        self.textview.modify_font(pango.FontDescription("Monospace"))
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    89
        scrolledwindow.add(self.textview)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    90
        self.textview.set_editable(False)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    91
        self.textbuffer = self.textview.get_buffer()
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    92
        vbox.pack_start(scrolledwindow, True, True)
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    93
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    94
        self.stbar = gtklib.StatusBar()
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
    95
        vbox.pack_start(self.stbar, False, False, 2)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    96
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    97
    def _delete(self, widget, event):
1140
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
    98
        self._do_close()
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
    99
        return True
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   100
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   101
    def _do_close(self):
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   102
        if self._cmd_running():
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   103
            error_dialog(self, "Can't close now", "command is running")
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   104
        else:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   105
            gtk.main_quit()
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
   106
        
547
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
   107
    def _toolbutton(self, stock, label, handler,
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
   108
                    menu=None, userdata=None, tip=None):
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   109
        if menu:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   110
            tbutton = gtk.MenuToolButton(stock)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   111
            tbutton.set_menu(menu)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   112
        else:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   113
            tbutton = gtk.ToolButton(stock)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   114
            
551
df0a9df8e598 hggtk: fix toolbar tooltips on Windows
Steve Borho <steve@borho.org>
parents: 548
diff changeset
   115
        tbutton.set_label(label)
547
107e8c6e83d5 hggtk/recovery: add tooltips to recovery dialog
Steve Borho <steve@borho.org>
parents: 545
diff changeset
   116
        if tip:
551
df0a9df8e598 hggtk: fix toolbar tooltips on Windows
Steve Borho <steve@borho.org>
parents: 548
diff changeset
   117
            tbutton.set_tooltip(self.tips, tip)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   118
        tbutton.connect('clicked', handler, userdata)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   119
        return tbutton
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   120
        
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   121
    def _clean_clicked(self, toolbutton, data=None):
1120
08eca2607f01 hggtk/dialog: set transient parent for all message dialogs
TK Soh <teekaysoh@yahoo.com>
parents: 1091
diff changeset
   122
        response = question_dialog(self, "Clean repository",
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   123
                "%s ?" % os.path.basename(self.root))
554
9f3cd7a31060 hggtk/recovery: prompt user to confirm rollback
TK Soh <teekaysoh@yahoo.com>
parents: 552
diff changeset
   124
        if not response == gtk.RESPONSE_YES:
9f3cd7a31060 hggtk/recovery: prompt user to confirm rollback
TK Soh <teekaysoh@yahoo.com>
parents: 552
diff changeset
   125
            return
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   126
        try:
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   127
            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: 854
diff changeset
   128
        except RepoError:
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   129
            self.write("Unable to find repo at %s\n" % (self.root), False)
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   130
            return
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   131
        pl = repo.workingctx().parents()
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   132
        cmd = ['update', '--clean', '--rev', str(pl[0].rev())]
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   133
        self._exec_cmd(cmd, postfunc=self._notify)
554
9f3cd7a31060 hggtk/recovery: prompt user to confirm rollback
TK Soh <teekaysoh@yahoo.com>
parents: 552
diff changeset
   134
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   135
    def _notify(self, ret, *args):
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   136
        import time
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   137
        time.sleep(0.5)     # give fs some time to pick up changes
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   138
        shell_notify([self.cwd])
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   139
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   140
    def _rollback_clicked(self, toolbutton, data=None):
1120
08eca2607f01 hggtk/dialog: set transient parent for all message dialogs
TK Soh <teekaysoh@yahoo.com>
parents: 1091
diff changeset
   141
        response = question_dialog(self, "Rollback repository",
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   142
                "%s ?" % os.path.basename(self.root))
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   143
        if not response == gtk.RESPONSE_YES:
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   144
            return
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   145
        cmd = ['rollback']
582
994701dbddbe hggtk/recovery: add 'clean' toobar button
Steve Borho <steve@borho.org>
parents: 554
diff changeset
   146
        self._exec_cmd(cmd, postfunc=self._notify)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   147
        
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   148
    def _recover_clicked(self, toolbutton, data=None):
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   149
        cmd = ['recover']
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   150
        self._exec_cmd(cmd)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   151
        
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   152
    def _verify_clicked(self, toolbutton, data=None):
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   153
        cmd = ['verify']
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   154
        self._exec_cmd(cmd)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   155
    
1138
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   156
    def _stop_clicked(self, toolbutton, data=None):
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   157
        if self.hgthread and self.hgthread.isAlive():
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   158
            self.hgthread.terminate()
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   159
            self._stop_button.set_sensitive(False)
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   160
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   161
    def _exec_cmd(self, cmd, postfunc=None):
1140
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   162
        if self._cmd_running():
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   163
            error_dialog(self, "Can't run now",
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   164
                "Pleas try again after the previous command is completed")
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   165
            return
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   166
1138
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   167
        self._stop_button.set_sensitive(True)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   168
        cmdline = cmd
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   169
        cmdline.append('--verbose')
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   170
        cmdline.append('--repository')
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   171
        cmdline.append(self.root)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   172
        
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   173
        # show command to be executed
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   174
        self.write("", False)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   175
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   176
        # execute command and show output on text widget
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   177
        gobject.timeout_add(10, self.process_queue)
545
f6a68ae266b9 hggtk/hglib: add postfunc to HgThread
Steve Borho <steve@borho.org>
parents: 543
diff changeset
   178
        self.hgthread = HgThread(cmdline, postfunc)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   179
        self.hgthread.start()
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
   180
        self.stbar.begin()
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
   181
        self.stbar.set_status_text('hg ' + ' '.join(cmdline))
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   182
        
1140
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   183
    def _cmd_running(self):
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   184
        if self.hgthread and self.hgthread.isAlive():
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   185
            return True
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   186
        else:
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   187
            return False
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   188
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   189
    def write(self, msg, append=True):
1130
8a56ab916e0a hggtk: generic fix on encoding issues
TK Soh <teekaysoh@yahoo.com>
parents: 1120
diff changeset
   190
        msg = toutf(msg)
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   191
        if append:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   192
            enditer = self.textbuffer.get_end_iter()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   193
            self.textbuffer.insert(enditer, msg)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   194
        else:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   195
            self.textbuffer.set_text(msg)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   196
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   197
    def process_queue(self):
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   198
        """
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   199
        Handle all the messages currently in the queue (if any).
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   200
        """
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   201
        self.hgthread.process_dialogs()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   202
        while self.hgthread.getqueue().qsize():
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   203
            try:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   204
                msg = self.hgthread.getqueue().get(0)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   205
                self.write(msg)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   206
            except Queue.Empty:
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   207
                pass
1140
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   208
        if self._cmd_running():
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   209
            return True
d24c108f6ae0 hggtk/recovery: do not start command while one still running
TK Soh <teekaysoh@yahoo.com>
parents: 1138
diff changeset
   210
        else:
854
9f51e380f2e4 hggtk/recovery: new window layout
Steve Borho <steve@borho.org>
parents: 595
diff changeset
   211
            self.stbar.end()
1138
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   212
            self._stop_button.set_sensitive(False)
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   213
            if self.hgthread.return_code() is None:
5ec68ec91303 hggtk/recovery: add button to stop command execution
TK Soh <teekaysoh@yahoo.com>
parents: 1130
diff changeset
   214
                self.write("[command interrupted]")
540
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   215
            return False # Stop polling this function
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   216
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   217
def run(cwd='', root='', **opts):
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   218
    dialog = RecoveryDialog(cwd, root)
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   219
    dialog.show_all()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   220
    gtk.gdk.threads_init()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   221
    gtk.gdk.threads_enter()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   222
    gtk.main()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   223
    gtk.gdk.threads_leave()
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   224
    
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   225
if __name__ == "__main__":
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   226
    import sys
c4e76dfd7f48 hggtk: add recovery dialog to handle rollback et al
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   227
    run(*sys.argv[1:])