Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.7, 0.7.1, and 0.7.2

rename: most rename/copy functionality implemented

* Need to add diff generation/viewing
* Search function needs to be threaded w/ stop feature

Changeset c1bcddedc2fe

Parent 51fd1adb08d1

by Steve Borho

Changes to 2 files · Browse files at c1bcddedc2fe Showing diff from parent 51fd1adb08d1 Diff from another changeset...

Change 1 of 6 Show Entire File hggtk/​rename.py Stacked
 
17
18
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
21
22
 
40
41
42
 
43
44
45
 
86
87
88
 
89
90
91
92
93
94
 
 
 
95
96
97
 
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
 
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
 
203
204
205
206
 
207
208
209
 
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
55
56
57
58
59
60
61
 
102
103
104
105
106
107
108
 
 
 
109
110
111
112
113
114
 
143
144
145
 
146
147
148
149
 
 
150
151
152
 
 
 
 
 
 
153
154
155
156
 
157
158
 
159
160
 
 
 
161
162
163
164
165
166
 
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
218
219
 
220
221
222
223
224
225
226
227
228
 
 
 
229
230
231
232
233
234
235
 
 
 
 
 
236
237
238
239
 
240
241
242
243
 
247
248
249
 
250
251
252
253
@@ -17,6 +17,21 @@
 except ImportError:   from mercurial.error import RepoError   +# This function and some key bits below borrowed ruthelessly from +# Peter Arrenbrecht <peter.arrenbrecht@gmail.com> +# Thanks! +def findmoves(repo, added, removed, threshold): + '''find renamed files -- yields (before, after, score) tuples''' + ctx = repo['.'] + for r in removed: + rr = ctx.filectx(r).data() + bestname, bestscore = None, threshold + for a in added: + aa = repo.wread(a) + if aa == rr: + yield r, a, 1.0 + break +  class DetectRenameDialog(gtk.Window):   'Detect renames after they occur'   def __init__(self, root=''): @@ -40,6 +55,7 @@
    unkmodel = gtk.ListStore(str)   unknowntree = gtk.TreeView(unkmodel) + unknowntree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)   col = gtk.TreeViewColumn('File', gtk.CellRendererText(), text=0)   unknowntree.append_column(col)   unknowntree.set_enable_search(True) @@ -86,12 +102,13 @@
  scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)   scroller.add(ctree)   + args = (unknowntree, ctree, adjustment)   vbox = gtk.VBox()   vbox.pack_start(scroller, True, True, 2)   ac = gtk.Button('Accept Match') - fc.connect('pressed', self.find_copies, unknowntree, ctree) - fr.connect('pressed', self.find_renames, unknowntree, ctree) - ac.connect('pressed', self.accept_match, unknowntree, ctree) + fc.connect('pressed', self.find_copies, *args) + fr.connect('pressed', self.find_renames, *args) + ac.connect('pressed', self.accept_match, *args)   hbox = gtk.HBox()   hbox.pack_start(ac, False, False, 2)   vbox.pack_start(hbox, False, False, 2) @@ -126,27 +143,24 @@
  if pos: vpaned.set_position(pos)     self.add(vpaned) - self.connect('map_event', self.on_window_map_event, unkmodel, cmodel) + self.connect('map_event', self.on_window_map_event, unkmodel)   self.connect('delete-event', self.save_settings,   hpaned, vpaned, adjustment)   - def on_window_map_event(self, event, param, unkmodel, cmodel): - self.refresh(unkmodel, cmodel) + def on_window_map_event(self, event, param, unkmodel): + self.refresh(unkmodel)   - def refresh(self, unkmodel, cmodel): - try: - repo = hg.repository(ui.ui(), self.root) - except RepoError: - return - + def refresh(self, unkmodel): + try: repo = hg.repository(ui.ui(), self.root) + except RepoError: return   matcher = match.always(repo.root, repo.root) - self.status = repo.status(node1=repo.dirstate.parents()[0], node2=None, + status = repo.status(node1=repo.dirstate.parents()[0], node2=None,   match=matcher, ignored=False, clean=False, unknown=True) - #(modified, added, removed, deleted, unknown, ignored, clean) = status + (modified, added, removed, deleted, unknown, ignored, clean) = status   unkmodel.clear() - for u in self.status[4]: - unkmodel.append( [u] ) - cmodel.clear() + for u in unknown: unkmodel.append( [u] ) + for u in added: unkmodel.append( [u] ) + self.deleted = deleted     def save_settings(self, widget, event, hpaned, vpaned, adjustment):   self.settings.set_value('vpaned', vpaned.get_position()) @@ -156,44 +170,74 @@
  self.settings.set_value('dims', (rect.width, rect.height))   self.settings.write()   - def find_renames(self, widget, unktree, ctree): + def find_renames(self, widget, unktree, ctree, adj):   'User pressed "find renames" button' - # Fake a rename find operation   cmodel = ctree.get_model()   cmodel.clear()   umodel, paths = unktree.get_selection().get_selected_rows() - if not paths: return - u = umodel[paths[0]][0] - for d in self.status[3]: - cmodel.append( [d, u, '10', True] ) + if not paths: + return + tgts = [ umodel[p][0] for p in paths ] + try: + repo = hg.repository(ui.ui(), self.root) + except RepoError: + return   - def find_copies(self, widget, unktree, ctree): + srcs = [] + audit_path = util.path_auditor(repo.root) + m = cmdutil.match(repo) + for abs in repo.walk(m): + target = repo.wjoin(abs) + good = True + try: + audit_path(abs) + except: + good = False + status = repo.dirstate[abs] + if status != 'r' and (not good or not util.lexists(target) + or (os.path.isdir(target) and not os.path.islink(target))): + srcs.append(abs) + elif not adj and status == 'n': + # looking for copies, so any revisioned file is a + # potential source (yes, this will be expensive) + # Added and removed files are not considered as copy + # sources. + srcs.append(abs) + if adj: + simularity = adj.get_value() / 100.0; + gen = findmoves + else: + simularity = 1.0 + gen = cmdutil.findrenames + for old, new, score in gen(repo, tgts, srcs, simularity): + cmodel.append( [old, new, score*100, True] ) + + def find_copies(self, widget, unktree, ctree, adj):   'User pressed "find copies" button' - pass + # call rename function with simularity = 100% + self.find_renames(widget, unktree, ctree, None)   - def accept_match(self, widget, unktree, ctree): + def accept_match(self, widget, unktree, ctree, adj):   'User pressed "accept match" button' + try: repo = hg.repository(ui.ui(), self.root) + except RepoError: return   cmodel, paths = ctree.get_selection().get_selected_rows()   for path in paths:   row = cmodel[path]   src, dest, percent, sensitive = row   if not sensitive: continue - print 'hg copy --after', src, dest - if src in self.status[3]: - print 'hg rm', src + repo.copy(src, dest) + if src in self.deleted: + repo.remove([src])   # Mark all rows with this target file as non-sensitive   for row in cmodel:   if row[1] == dest:   row[3] = False - # Remove destination file from unknown list - unkmodel = unktree.get_model() - for i, row in enumerate(unkmodel): - if row[0] == dest: - del unkmodel[i] + self.refresh(unktree.get_model())     def candidate_row_act(self, ctree, path, column, unktree):   'User activated row of candidate list' - self.accept_match(ctree, unktree, ctree) + self.accept_match(ctree, unktree, ctree, None)     def show_diff(self, tree):   'User selected a row in the candidate tree' @@ -203,7 +247,7 @@
  src, dest, percent, sensitive = row   if sensitive:   print 'show diffs from', src, 'to', dest - if src in self.status[3]: + if src in self.deleted:   print src, 'must be resurrected'    
Change 1 of 1 Show Entire File hggtk/​status.py Stacked
 
523
524
525
526
527
 
 
528
529
530
 
523
524
525
 
 
526
527
528
529
530
@@ -523,8 +523,8 @@
  (modified, added, removed, deleted, unknown, ignored, clean) = status   self.modified = modified   - if not self.opts.get('rev') and deleted and unknown: - print "Suggest to detect renames" + if not self.opts.get('rev') and (deleted or removed) and (unknown or added): + print "Suggest to detect copies or renames"     changetypes = (('modified', 'M', modified),   ('added', 'A', added),