summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xfix-offsets99
1 files changed, 65 insertions, 34 deletions
diff --git a/fix-offsets b/fix-offsets
index d9417b5..da4ea42 100755
--- a/fix-offsets
+++ b/fix-offsets
@@ -25,11 +25,12 @@ re_h = re.compile(
)
use_threading = True
+#use_threading = False
def adjustment(ret, stderrdata):
- #print >>sys.stderr, "ret = {0}\nstderrdata = {1}".format(ret, stderrdata)
+ print >>sys.stderr, "ret = {0}\nstderrdata = {1}".format(ret, stderrdata)
for match in re_h.finditer(stderrdata):
- #print >>sys.stderr, match.groups()
+ print >>sys.stderr, match.groups()
ret = int(match.groups()[3])
break
else:
@@ -37,18 +38,13 @@ def adjustment(ret, stderrdata):
return ret
-def hunk_worker(hunk, header, tres, cmd, **kwargs):
+def hunk_worker(hunk, header, tres, i, cmd, **kwargs):
proc = Popen(cmd, **kwargs)
str_hunk = str(hunk)
partial_patch = header + '\n' + str_hunk
_, stderrdata = proc.communicate(partial_patch)
delta = adjustment(proc.wait(), stderrdata)
- if delta:
- hunk.startsrc += delta
- hunk.starttgt += delta
- str_hunk = str(hunk)
- tres[hunk] = str_hunk
-
+ tres[i] = delta
def proceed(opts, args):
if not args:
@@ -74,32 +70,67 @@ def proceed(opts, args):
header = '{0}--- {1}\n+++ {2}'.format('\n'.join(p.header),
p.source, p.target)
print header
- tres = dict()
- ts = set()
+ tres = [0 for hunk in p.hunks]
+ ts = [True for hunk in p.hunks]
tmax = 10
- for hunk in p.hunks:
- if not use_threading:
- hunk_worker(hunk, header, tres, cmd, **kwargs)
- continue
- if len(ts) >= tmax:
- while True:
- for t in ts:
- t.join(0.001)
- if not t.is_alive():
- ts.remove(t)
- break
- else:
- continue
- break
- t = Thread(target=hunk_worker, args=(hunk, header, tres, cmd),
- kwargs=kwargs)
- t.start()
- ts.add(t)
- if use_threading:
- for t in ts:
- t.join()
- for hunk in p.hunks:
- print tres[hunk],
+ avg = 0.0
+ cnt = 0
+ avg_limit = 50.0
+ len_ts = len(ts)
+ while any(ts):
+ # ts[i] = False if not to continue with that or bool(x) == True
+ # otherwise (None is a temporary local state!)
+ for i in xrange(len_ts):
+ if not ts[i]:
+ continue
+ if not use_threading:
+ hunk_worker(p.hunks[i], header, tres, i, cmd, **kwargs)
+ ts[i] = None
+ continue
+ if i >= tmax:
+ blockers = filter(lambda (x, y): bool(y), enumerate(ts[:i]))
+ while len(blockers) >= tmax:
+ for ii, it in blockers:
+ it.join(0.001)
+ if not it.is_alive():
+ ts[ii] = None
+ break
+ else:
+ continue
+ break
+ t = Thread(target=hunk_worker, args=(p.hunks[i], header, tres, i, cmd),
+ kwargs=kwargs)
+ ts[i] = t
+ t.start()
+ for i in xrange(len_ts):
+ t = ts[i]
+ if t and use_threading:
+ t.join()
+ ts[i] = None
+ if ts[i] is None:
+ avg = (avg * cnt + tres[i])
+ cnt += 1
+ avg /= cnt
+ ts[i] = False
+ for i in xrange(len_ts):
+ ts[i] = ts[i] or abs(tres[i] - avg) > avg_limit
+ if i > 0:
+ ts[i] = ts[i] or abs(tres[i] - tres[i-1]) > (avg_limit/2)
+ if i < len_ts - 1:
+ ts[i] = ts[i] or abs(tres[i] - tres[i+1]) > (avg_limit/2)
+ if ts[i]:
+ hunk = p.hunks[i]
+ delta = int(tres[i] + (tres[i] - avg) / 1.25)
+ hunk.startsrc += delta
+ hunk.starttgt += delta
+ avg_limit *= 1.25
+ for i in xrange(len_ts):
+ delta = tres[i]
+ hunk = p.hunks[i]
+ if delta:
+ hunk.startsrc += delta
+ hunk.starttgt += delta
+ print str(hunk)
null.close()