Skip to content

Commit d13eae3

Browse files
committed
Adapt SchedulerBase to explicitly support iterables as tasks
This change deals with the fact that it's unpleasant to compatibly pass a generator's next()/__next__() method for Python 2/3. Instead, we allow iterables to be passed in as-is, and adapt the task runner to call next() itself where appropriate.
1 parent 177a2d3 commit d13eae3

4 files changed

Lines changed: 27 additions & 40 deletions

File tree

meld/dirdiff.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ def recursively_update( self, path ):
505505
self.model.remove(child)
506506
child = self.model.iter_children( it )
507507
self._update_item_state(it)
508-
self.scheduler.add_task( self._search_recursively_iter( path ).next )
508+
self.scheduler.add_task(self._search_recursively_iter(path))
509509

510510
def _search_recursively_iter(self, rootpath):
511511
self.actiongroup.get_action("Hide").set_sensitive(False)

meld/filediff.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -965,7 +965,7 @@ def set_files(self, files):
965965
self.recompute_label()
966966
self.textview[len(files) >= 2].grab_focus()
967967
self._connect_buffer_handlers()
968-
self.scheduler.add_task( self._set_files_internal(files).next )
968+
self.scheduler.add_task(self._set_files_internal(files))
969969

970970
def _load_files(self, files, textbuffers):
971971
self.undosequence.clear()
@@ -1101,7 +1101,7 @@ def refresh_comparison(self):
11011101
self._disconnect_buffer_handlers()
11021102
self.linediffer.clear()
11031103
self.queue_draw()
1104-
self.scheduler.add_task(self._diff_files().next)
1104+
self.scheduler.add_task(self._diff_files())
11051105

11061106
def _set_merge_action_sensitivity(self):
11071107
pane = self._get_focused_pane()

meld/task.py

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ def iteration(self):
128128
except StopIteration:
129129
return 0
130130
try:
131-
ret = task()
131+
if hasattr(task, "__iter__"):
132+
ret = next(task)
133+
else:
134+
ret = task()
132135
except StopIteration:
133136
pass
134137
except Exception:
@@ -177,47 +180,30 @@ def get_current_task(self):
177180
raise StopIteration
178181

179182

180-
181-
if __name__=="__main__":
183+
if __name__ == "__main__":
182184
import time
183185
import random
184186
m = LifoScheduler()
187+
185188
def timetask(t):
186189
while time.time() - t < 1:
187190
print "***"
188191
time.sleep(0.1)
189192
print "!!!"
193+
190194
def sayhello(x):
191-
for i in range(random.randint(2,8)):
195+
for i in range(random.randint(2, 8)):
192196
print "hello", x
193197
time.sleep(0.1)
194198
yield 1
195199
print "end", x
200+
196201
s = RoundRobinScheduler()
197202
m.add_task(s)
198-
h = sayhello(10).next
199-
#m.add_task(h)
200-
#m.add_task(h)
201-
s.add_task( sayhello(10).next )
202-
s.add_task( sayhello(20).next )
203-
s.add_task( sayhello(30).next )
204-
#s.add_task( sayhello(40).next )
205-
#s.add_task( sayhello(50).next )
206-
#s.add_task( sayhello(60).next )
207-
#m.add_task( s )
208-
#time.sleep(.71)
209-
#m.add_task( s )#sayhello(2).next )
210-
#m.add_task( sayhello(3).next )
211-
#m.add_task( lambda t=time.time() : timetask(t) )
212-
#m.add_task( sayhello(4).next )
213-
#m.add_task( sayhello(5).next )
214-
#m.mainloop()
215-
while s.tasks_pending(): s.iteration()
203+
s.add_task(sayhello(10))
204+
s.add_task(sayhello(20))
205+
s.add_task(sayhello(30))
206+
while s.tasks_pending():
207+
s.iteration()
216208
time.sleep(2)
217209
print "***"
218-
#print "***"
219-
#m.add_task( sayhello(20).next )
220-
#m.add_task( s )
221-
#s.complete_tasks()
222-
#time.sleep(3)
223-

meld/vcview.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ def _set_location(self, location):
314314
# If the user is just diffing a file (ie not a directory), there's no
315315
# need to scan the rest of the repository
316316
if os.path.isdir(self.vc.location):
317-
self.scheduler.add_task(self._search_recursively_iter(self.model.get_iter_root()).next)
317+
root = self.model.get_iter_root()
318+
self.scheduler.add_task(self._search_recursively_iter(root))
318319
self.scheduler.add_task(self.on_treeview_cursor_changed)
319320

320321
def recompute_label(self):
@@ -403,11 +404,10 @@ def run_diff_iter(self, path_list):
403404
retry_diff = False
404405

405406
yield _("[%s] Fetching differences") % self.label_text
406-
difffunc = self._command_iter(self.vc.diff_command(),
407-
path_list, 0).next
407+
diffiter = self._command_iter(self.vc.diff_command(), path_list, 0)
408408
diff = None
409409
while type(diff) != type(()):
410-
diff = difffunc()
410+
diff = next(diffiter)
411411
yield 1
412412
prefix, patch = diff[0], diff[1]
413413

@@ -429,7 +429,7 @@ def run_diff_iter(self, path_list):
429429

430430
def run_diff(self, path_list):
431431
for path in path_list:
432-
self.scheduler.add_task(self.run_diff_iter([path]).next, atfront=1)
432+
self.scheduler.add_task(self.run_diff_iter([path]), atfront=1)
433433

434434
def on_treeview_popup_menu(self, treeview):
435435
time = gtk.get_current_event_time()
@@ -497,10 +497,11 @@ def relpath(pbase, p):
497497
files = [ relpath(workdir, f) for f in files ]
498498
r = None
499499
self.consolestream.write( misc.shelljoin(command+files) + " (in %s)\n" % workdir)
500-
readfunc = misc.read_pipe_iter(command + files, self.consolestream, workdir=workdir).next
500+
readiter = misc.read_pipe_iter(command + files, self.consolestream,
501+
workdir=workdir)
501502
try:
502503
while r is None:
503-
r = readfunc()
504+
r = next(readiter)
504505
self.consolestream.write(r)
505506
yield 1
506507
except IOError as e:
@@ -513,7 +514,7 @@ def relpath(pbase, p):
513514
def _command(self, command, files, refresh=1):
514515
"""Run 'command' on 'files'.
515516
"""
516-
self.scheduler.add_task( self._command_iter(command, files, refresh).next )
517+
self.scheduler.add_task(self._command_iter(command, files, refresh))
517518

518519
def _command_on_selected(self, command, refresh=1):
519520
files = self._get_selected_files()
@@ -639,7 +640,7 @@ def refresh_partial(self, where):
639640
self.model.set_value(newiter, self.model.column_index( tree.COL_PATH, 0), where)
640641
self.model.set_path_state(newiter, 0, tree.STATE_NORMAL, True)
641642
self.model.remove(it)
642-
self.scheduler.add_task( self._search_recursively_iter(newiter).next )
643+
self.scheduler.add_task(self._search_recursively_iter(newiter))
643644
else: # XXX fixme
644645
self.refresh()
645646

0 commit comments

Comments
 (0)