[Python-checkins] cpython (merge 3.3 -> default): Merge 3.3

martin.v.loewis python-checkins at python.org
Mon Sep 30 16:10:23 CEST 2013


http://hg.python.org/cpython/rev/a9a413c42180
changeset: 85881:a9a413c42180
parent: 85879:220b34cbd711
parent: 85880:477246839224
user: Martin v. Löwis <martin at v.loewis.de>
date: Mon Sep 30 16:10:05 2013 +0200
summary:
 Merge 3.3
files:
 Tools/hg/hgtouch.py | 37 +++++++++++++++++++++++---------
 1 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/Tools/hg/hgtouch.py b/Tools/hg/hgtouch.py
--- a/Tools/hg/hgtouch.py
+++ b/Tools/hg/hgtouch.py
@@ -10,6 +10,7 @@
 from __future__ import with_statement
 import errno
 import os
+import time
 
 def parse_config(repo):
 try:
@@ -36,13 +37,17 @@
 return result
 
 def check_rule(ui, repo, modified, output, inputs):
+ """Verify that the output is newer than any of the inputs.
+ Return (status, stamp), where status is True if the update succeeded,
+ and stamp is the newest time stamp assigned to any file (might be in
+ the future)."""
 f_output = repo.wjoin(output)
 try:
 o_time = os.stat(f_output).st_mtime
 except OSError:
 ui.warn("Generated file %s does not exist\n" % output)
- return False
- need_touch = False
+ return False, 0
+ youngest = 0 # youngest dependency
 backdate = None
 backdate_source = None
 for i in inputs:
@@ -51,31 +56,34 @@
 i_time = os.stat(f_i).st_mtime
 except OSError:
 ui.warn(".hgtouch input file %s does not exist\n" % i)
- return False
+ return False, 0
 if i in modified:
 # input is modified. Need to backdate at least to i_time
 if backdate is None or backdate > i_time:
 backdate = i_time
 backdate_source = i
 continue
- if o_time <= i_time:
- # generated file is older, touch
- need_touch = True
+ youngest = max(i_time, youngest)
 if backdate is not None:
 ui.warn("Input %s for file %s locally modified\n" % (backdate_source, output))
 # set to 1s before oldest modified input
 backdate -= 1
 os.utime(f_output, (backdate, backdate))
- return False
- if need_touch:
+ return False, 0
+ if youngest >= o_time:
 ui.note("Touching %s\n" % output)
- os.utime(f_output, None)
- return True
+ youngest += 1
+ os.utime(f_output, (youngest, youngest))
+ return True, youngest
+ else:
+ # Nothing to update
+ return True, 0
 
 def do_touch(ui, repo):
 modified = repo.status()[0]
 dependencies = parse_config(repo)
 success = True
+ tstamp = 0 # newest time stamp assigned
 # try processing all rules in topological order
 hold_back = {}
 while dependencies:
@@ -85,10 +93,17 @@
 if i in dependencies:
 hold_back[output] = inputs
 continue
- success = check_rule(ui, repo, modified, output, inputs)
+ _success, _tstamp = check_rule(ui, repo, modified, output, inputs)
+ sucess = success and _success
+ tstamp = max(tstamp, _tstamp)
 # put back held back rules
 dependencies.update(hold_back)
 hold_back = {}
+ now = time.time()
+ if tstamp > now:
+ # wait until real time has passed the newest time stamp, to
+ # avoid having files dated in the future
+ time.sleep(tstamp-now)
 if hold_back:
 ui.warn("Cyclic dependency involving %s\n" % (' '.join(hold_back.keys())))
 return False
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /