Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.8, 0.8.1, and 0.8.2

merge with crew

Changeset c2d6a90e94e4

Parents fafbf685a635

Parents c1232aee254b

by Adrian Buehlmann

Changes to 10 files · Browse files at c2d6a90e94e4 Showing diff from parent fafbf685a635 c1232aee254b Diff from another changeset...

 
44
45
46
47
 
 
48
49
50
 
54
55
56
 
57
58
59
 
44
45
46
 
47
48
49
50
51
 
55
56
57
58
59
60
61
@@ -44,7 +44,8 @@
  close.connect('clicked', gtk.main_quit)   hbbox.add(close)   - text = _('\n** Please report this bug to' + text = '\n{{{\n' # Wrap in Bitbucket wiki preformat markers + text += _('** Please report this bug to'   ' tortoisehg-discuss@lists.sourceforge.net or'   ' http://bitbucket.org/tortoisehg/stable/issues\n')   text += _('** Mercurial version (%s). TortoiseHg version (%s)\n') % ( @@ -54,6 +55,7 @@
  extlist = [x[0] for x in extensions.extensions()]   text += _('** Extensions loaded: %s\n') % ', '.join(extlist)   text += self.opts['error'] + text += '\n}}}\n'   textview.get_buffer().set_text(text)   return vbox  
 
489
490
491
492
 
493
494
495
 
505
506
507
508
 
509
510
511
 
489
490
491
 
492
493
494
495
 
505
506
507
 
508
509
510
511
@@ -489,7 +489,7 @@
  def diff_to_local(self, menuitem):   if not self.curfile:   return - self.opts['rev'] = [str(self.currev), '.'] + self.opts['rev'] = [str(self.currev)]   self._diff_file('M', self.curfile)     def diff_file_rev(self, menuitem): @@ -505,7 +505,7 @@
  if not self.curfile:   return   rev = self.currev - parents = self.parents + parents = [x.rev() for x in self.repo[rev].parents()]   if len(parents) == 0:   parent = rev-1   else:
Change 1 of 2 Show Entire File hggtk/​gtklib.py Stacked
 
186
187
188
189
 
190
191
192
193
194
195
 
196
197
198
 
205
206
207
208
 
209
210
211
 
186
187
188
 
189
190
191
192
193
194
 
195
196
197
198
 
205
206
207
 
208
209
210
211
@@ -186,13 +186,13 @@
  """run the file dialog, either return a file name, or False if   the user aborted the dialog"""   try: - import win32gui, win32con + import win32gui, win32con, pywintypes   return self.runWindows()   except ImportError:   return self.runCompatible()     def runWindows(self): - import win32gui, win32con + import win32gui, win32con, pywintypes   try:   fname, customfilter, flags=win32gui.GetSaveFileNameW(   InitialDir=self.InitialDir, @@ -205,7 +205,7 @@
  FilterIndex=1)   if fname:   return fname - except: + except pywintypes.error:   pass   return False  
Change 1 of 1 Show Entire File hggtk/​history.py Stacked
 
560
561
562
563
 
564
565
566
 
560
561
562
 
563
564
565
566
@@ -560,7 +560,7 @@
    def vdiff_local(self, menuitem, pats=[]):   rev = self.currow[treemodel.REVID] - opts = {'rev' : ["%s:." % rev]} + opts = {'rev' : ["%s" % rev]}   self._do_diff(pats, opts, modal=True)     def diff_revs(self, menuitem):
Change 1 of 1 Show Entire File hggtk/​recovery.py Stacked
 
81
82
83
84
85
86
87
 
81
82
83
 
84
85
86
@@ -81,7 +81,6 @@
  self.textview.set_editable(False)   self.textview.modify_font(pango.FontDescription('Monospace'))   scrolledwindow.add(self.textview) - self.textview.set_editable(False)   self.textbuffer = self.textview.get_buffer()   self.textbuffer.create_tag('error', weight=pango.WEIGHT_HEAVY,   foreground='#900000')
Change 1 of 3 Show Entire File hggtk/​serve.py Stacked
 
103
104
105
106
107
108
109
 
211
212
213
 
 
 
 
 
 
214
215
216
 
229
230
231
232
 
 
233
234
235
 
236
 
 
 
 
 
237
238
239
 
103
104
105
 
106
107
108
 
210
211
212
213
214
215
216
217
218
219
220
221
 
234
235
236
 
237
238
239
240
 
241
242
243
244
245
246
247
248
249
250
@@ -103,7 +103,6 @@
  self.textview.set_editable(False)   self.textview.modify_font(pango.FontDescription('Monospace'))   scrolledwindow.add(self.textview) - self.textview.set_editable(False)   self.textbuffer = self.textview.get_buffer()   vbox.pack_start(scrolledwindow, True, True)   self._set_button_states() @@ -211,6 +210,12 @@
  self._get_config()     def _start_server(self): + def threadfunc(path, q, *args): + try: + hglib.hgcmd_toq(path, q, *args) + except util.Abort, e: + self._write(_('Abort: %s\n') % str(e)) +   # gather input data   try:   port = int(self._port_input.get_text()) @@ -229,11 +234,17 @@
  else:   args.append('--name')   args.append(self.webname) - thread = threading.Thread(target=hglib.hgcmd_toq, args=args) + + thread = threading.Thread(target=threadfunc, args=args)   thread.start()   - while not gservice or not hasattr(gservice, 'httpd'): + while True:   time.sleep(0.1) + if gservice and hasattr(gservice, 'httpd'): + break + if not thread.isAlive(): + return +   # gservice.httpd.fqaddr turned out to be unreliable, so use   # loopback addr directly   self._url = 'http://127.0.0.1:%d/' % (port)
Change 1 of 1 Show Entire File hggtk/​synch.py Stacked
 
226
227
228
229
230
231
232
 
226
227
228
 
229
230
231
@@ -226,7 +226,6 @@
  self.textview.set_editable(False)   self.textview.modify_font(pango.FontDescription('Monospace'))   scrolledwindow.add(self.textview) - self.textview.set_editable(False)   self.textview.connect('populate-popup', self.add_to_popup)   self.textbuffer = self.textview.get_buffer()   self.textbuffer.create_tag('error', weight=pango.WEIGHT_HEAVY,
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
 #  # thgshelve.py - commit dialog for TortoiseHg  #  # Copyright 2007 Brad Schick, brad at gmail . com  # Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>  # Copyright (C) 2009 Steve Borho <steve@borho.org>  #    import os  import gtk    from mercurial import util    from thgutil.i18n import _  from thgutil import hglib    from hggtk.status import GStatus, FM_STATUS, FM_CHECKED  from hggtk import hgshelve, gdialog, gtklib    class GShelve(GStatus):   """GTK+ based dialog for displaying repository status and shelving changes.     Also provides related operations like add, delete, remove, revert, refresh,   ignore, diff, and edit.   """     ### Overrides of base class methods ###     def init(self):   GStatus.init(self)   self.mode = 'shelve'     def parse_opts(self):   GStatus.parse_opts(self)   if not self.test_opt('rev'):   self.opts['rev'] = ''     def get_title(self):   root = hglib.toutf(os.path.basename(self.repo.root))   return ' '.join([root, 'shelve'])     def get_icon(self):   return 'shelve.ico'     def auto_check(self):   if self.test_opt('check'):   for entry in self.filemodel:   if entry[FM_STATUS] in 'MAR':   entry[FM_CHECKED] = True   self.update_check_count()       def save_settings(self):   settings = GStatus.save_settings(self)   settings['gshelve'] = self.vpaned.get_position()   return settings       def load_settings(self, settings):   GStatus.load_settings(self, settings)   if settings:   self._setting_vpos = settings['gshelve']   else:   self._setting_vpos = -1       def get_tbbuttons(self):   tbbuttons = GStatus.get_tbbuttons(self)   tbbuttons.insert(2, gtk.SeparatorToolItem())   self.shelve_btn = self.make_toolbutton(gtk.STOCK_FILE, _('Shelve'),   self.shelve_clicked, tip=_('set aside selected changes'))   self.unshelve_btn = self.make_toolbutton(gtk.STOCK_EDIT, _('Unshelve'),   self.unshelve_clicked, tip=_('restore shelved changes'))   tbbuttons.insert(2, self.unshelve_btn)   tbbuttons.insert(2, self.shelve_btn)   return tbbuttons     def get_body(self):   status_body = GStatus.get_body(self)   vbox = gtk.VBox() # For named shelf collection   self.vpaned = gtk.VPaned()   self.vpaned.add1(vbox)   self.vpaned.add2(status_body)   self.vpaned.set_position(self._setting_vpos)   self.activate_shelve_buttons(True)   return self.vpaned       def get_menu_info(self):   """   Returns menu info in this order:   merge, addrem, unknown, clean, ignored, deleted   """   merge, addrem, unknown, clean, ignored, deleted, unresolved, resolved \   = GStatus.get_menu_info(self)   return (merge + ((_('_shelve'), self.shelve_file),),   addrem + ((_('_shelve'), self.shelve_file),),   unknown + ((_('_shelve'), self.shelve_file),),   clean,   ignored,   deleted + ((_('_shelve'), self.shelve_file),),   unresolved,   resolved,   )       def should_live(self, widget=None, event=None):   return False       def reload_status(self):   if not self.ready: return False   success = GStatus.reload_status(self)   return success     ### End of overridable methods ###     def has_shelve_file(self):   return os.path.exists(self.repo.join('shelve'))     def activate_shelve_buttons(self, status):   if status:   self.shelve_btn.set_sensitive(True)   self.unshelve_btn.set_sensitive(self.has_shelve_file())   else:   self.shelve_btn.set_sensitive(False)   self.unshelve_btn.set_sensitive(False)     def shelve_selected(self, file=None):   wfiles = file and [file] or self.relevant_files('MAR')   if not wfiles:   gdialog.Prompt(_('Shelve'),   _('Please select diff chunks to shelve'), self).run()   return     doforce = False   doappend = False   if self.has_shelve_file():   dialog = gtklib.MessageDialog(flags=gtk.DIALOG_MODAL)   dialog.set_title(_('Shelve'))   dialog.set_markup(_('<b>Shelve file exists!</b>'))   dialog.add_buttons(_('Overwrite'), 1,   _('Append'), 2,   _('Cancel'), -1)   dialog.set_transient_for(self)   rval = dialog.run()   dialog.destroy()   if rval == 1:   doforce = True   elif rval == 2:   doappend = True   else:   return     def filter_patch(ui, chunks):   accepted = []   for chunk in chunks: - file = util.pconvert(chunk.files()[0]) + file = util.pconvert(chunk.filename())   if file not in wfiles:   # file was not selected for inclusion   continue   if file not in self.filechunks:   # file was never filtered, accept all chunks   accepted.append(chunk)   continue   schunks = self.filechunks[file]   for i, c in enumerate(schunks):   if chunk != c:   continue   if i == 0 or c.active:   # take header and active chunks   accepted.append(chunk)   break   return accepted     # hgshelve only works 'interactively'   self.ui.setconfig('ui', 'interactive', 'on')   opts = {'addremove': None, 'include': [], 'force': doforce,   'append': doappend, 'exclude': []}   hgshelve.filterpatch = filter_patch   # shelve them!   hgshelve.shelve(self.ui, self.repo, **opts)   self.reload_status()     def unshelve(self):   opts = {'addremove': None, 'include': [], 'force': None,   'append': None, 'exclude': [], 'inspect': None}   try:   self.ui.quiet = True   hgshelve.unshelve(self.ui, self.repo, **opts)   self.ui.quiet = False   self.reload_status()   except:   pass     def shelve_clicked(self, toolbutton, data=None):   self.shelve_selected()   self.activate_shelve_buttons(True)     def unshelve_clicked(self, toolbutton, data=None):   self.unshelve()   self.activate_shelve_buttons(True)     def shelve_file(self, stat, file):   self.shelve_selected(file)   self.activate_shelve_buttons(True)   return True    def run(_ui, *pats, **opts):   cmdoptions = {   'user':opts.get('user', ''), 'date':opts.get('date', ''),   'modified':True, 'added':True, 'removed':True, 'deleted':True,   'unknown':True, 'ignored':False,   'exclude':[], 'include':[],   'check': True, 'git':False, 'addremove':False,   }   return GShelve(_ui, None, None, pats, cmdoptions)
 
94
95
96
97
 
 
 
 
98
99
100
 
94
95
96
 
97
98
99
100
101
102
103
@@ -94,7 +94,10 @@
  s = cPickle.dumps(data)   f = util.atomictempfile(appname, 'wb', None)   f.write(s) - f.rename() + try: + f.rename() + except WindowsError: + pass # silently ignore these errors     def _get_path(self, appname):   if os.name == 'nt':
 
71
72
73
 
 
 
74
75
76
 
82
83
84
85
 
86
87
88
89
90
91
 
92
93
94
 
97
98
99
100
 
101
102
103
 
71
72
73
74
75
76
77
78
79
 
85
86
87
 
88
89
90
91
92
93
 
94
95
96
97
 
100
101
102
 
103
104
105
106
@@ -71,6 +71,9 @@
  {"datamine", "Annotate Files",   "Show changeset information per file line",   "menublame.ico", 0}, + {"vdiff", "Visual Diff", + "View changes using GUI diff tool", + "TortoiseMerge.ico", 0},     /* Add new items here */   @@ -82,13 +85,13 @@
 enum menuDescListEntries {   Commit, Init, Clone, Status, Shelve, Add, Revert, Remove, Rename,   Log, Synch, Serve, Update, Recover, Thgstatus, Userconf, Repoconf, - About, Datamine, + About, Datamine, VDiff,   /* Add new items here */   Separator, EndOfList  };    menuDescListEntries RepoNoFilesMenu[] = { - Commit, Status, Shelve, Separator, + Commit, Status, Shelve, VDiff, Separator,   Log, Separator,   Update, Separator,   Synch, Clone, Recover, Serve, Thgstatus, Separator, @@ -97,7 +100,7 @@
 };    menuDescListEntries RepoFilesMenu[] = { - Commit, Status, Add, Revert, Rename, Remove, Separator, + Commit, Status, VDiff, Add, Revert, Rename, Remove, Separator,   Log, Datamine, Separator,   About, EndOfList  };