Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.4rc3, 0.4rc4, and 0.4

hgcmd: fix UTF-8 encoding error

Changeset e8d2c1d675eb

Parent 68a01cdebb39

by TK Soh

Changes to one file · Browse files at e8d2c1d675eb Showing diff from parent 68a01cdebb39 Diff from another changeset...

Change 1 of 1 Show Changes Only hggtk/​hgcmd.py Stacked
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
 #  # A simple dialog to execute random command for TortoiseHg  #  # Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>  #    import pygtk  pygtk.require("2.0")    import gtk  import gobject  import pango  import os  import threading  import Queue  from hglib import HgThread, hgcmd_toq, toutf  from shlib import set_tortoise_icon, get_system_times    class CmdDialog(gtk.Dialog):   def __init__(self, cmdline, progressbar=True, width=520, height=400):   title = 'hg ' + ' '.join(cmdline[1:])   gtk.Dialog.__init__(self,   title=title,   flags=gtk.DIALOG_MODAL,   #buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)   )     set_tortoise_icon(self, 'hg.ico')   self.cmdline = cmdline   self.returncode = None     # construct dialog   self.set_default_size(width, height)     self._button_stop = gtk.Button("Stop")   self._button_stop.connect('clicked', self._on_stop_clicked)   self.action_area.pack_start(self._button_stop)     self._button_ok = gtk.Button("Close")   self._button_ok.connect('clicked', self._on_ok_clicked)   self.action_area.pack_start(self._button_ok)     self.connect('delete-event', self._delete)   self.connect('response', self._response)     self.pbar = None   if progressbar:   self.last_pbar_update = 0     hbox = gtk.HBox()     self.status_text = gtk.Label() - self.status_text.set_text(" ".join(cmdline).replace("\n", " ")) + self.status_text.set_text(toutf(" ".join(cmdline).replace("\n", " ")))   self.status_text.set_alignment(0, 0.5)   self.status_text.set_ellipsize(pango.ELLIPSIZE_END)   hbox.pack_start(self.status_text, True, True, 3)     # Create a centering alignment object   align = gtk.Alignment(0.0, 0.0, 1, 0)   hbox.pack_end(align, False, False, 3)   align.show()     # create the progress bar   self.pbar = gtk.ProgressBar()   align.add(self.pbar)   self.pbar.pulse()   self.pbar.show()     self.vbox.pack_start(hbox, False, False, 3)     scrolledwindow = gtk.ScrolledWindow()   scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN)   scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)   self.textview = gtk.TextView(buffer=None)   self.textview.set_editable(False)   self.textview.modify_font(pango.FontDescription("Monospace"))   scrolledwindow.add(self.textview)   self.textbuffer = self.textview.get_buffer()     self.vbox.pack_start(scrolledwindow, True, True)   self.connect('map_event', self._on_window_map_event)     self.show_all()     def _on_ok_clicked(self, button):   """ Ok button clicked handler. """   self.response(gtk.RESPONSE_ACCEPT)     def _on_stop_clicked(self, button):   self.hgthread.terminate()     def _delete(self, widget, event):   return True     def _response(self, widget, response_id):   if self.hgthread.isAlive():   widget.emit_stop_by_name('response')     def _on_window_map_event(self, event, param):   self.hgthread = HgThread(self.cmdline[1:])   self.hgthread.start()   self._button_ok.set_sensitive(False)   self._button_stop.set_sensitive(True)   gobject.timeout_add(10, self.process_queue)     def write(self, msg, append=True):   msg = toutf(msg)   if append:   enditer = self.textbuffer.get_end_iter()   self.textbuffer.insert(enditer, msg)   else:   self.textbuffer.set_text(msg)     def process_queue(self):   """   Handle all the messages currently in the queue (if any).   """   self.hgthread.process_dialogs()   enditer = self.textbuffer.get_end_iter()   while self.hgthread.getqueue().qsize():   try:   msg = self.hgthread.getqueue().get(0)   self.textbuffer.insert(enditer, toutf(msg))   self.textview.scroll_to_mark(self.textbuffer.get_insert(), 0)   except Queue.Empty:   pass   self.update_progress()   if not self.hgthread.isAlive():   self._button_ok.set_sensitive(True)   self._button_stop.set_sensitive(False)   self.returncode = self.hgthread.return_code()   if self.returncode is None:   self.write("[command interrupted]")   return False # Stop polling this function   else:   return True     def update_progress(self):   if not self.pbar:   return # progress bar not enabled     if not self.hgthread.isAlive():   self.pbar.unmap()   else:   # pulse the progress bar every ~100ms   tm = get_system_times()[4]   if tm - self.last_pbar_update < 0.100:   return   self.last_pbar_update = tm   self.pbar.pulse()    def run(cmdline=[], gui=True, **opts):   if not gui:   q = Queue.Queue()   hgcmd_toq(None, q, *cmdline[1:])   return     dlg = CmdDialog(cmdline)   dlg.connect('response', gtk.main_quit)   dlg.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave()    if __name__ == "__main__":   import sys   run(sys.argv)