##// END OF EJS Templates
Make event triggering robust to (un)registration....
Make event triggering robust to (un)registration. Event callbacks can register or unregister new callbacks for the same event while executing, and the previous triggering implementation allowed for event callbacks to be inadvertently skipped. The fix is to make a copy of the list of callbacks before executing any of them. With this change, the resulting semantics are simple: any callbacks registered before triggering are executed, and any new callbacks registered are only visible at the next triggering of the event. Note that this could potentially break existing callers who expected newly-appended callbacks were immediately executed. Fixes #9447. Originally based on a patch by @marksandler2.

File last commit:

r22041:892b1c49
r22317:68860ee5
Show More
update_whatsnew.py
82 lines | 2.6 KiB | text/x-python | PythonLexer
/ tools / update_whatsnew.py
Min RK
make update_whatsnew script executable...
r20268 #!/usr/bin/env python
Thomas Kluyver
Add script to update whatsnew file from PR snippets
r12901 """Update the What's New doc (development version)
This collects the snippets from whatsnew/pr/, moves their content into
whatsnew/development.rst (chronologically ordered), and deletes the snippets.
"""
import io
Matthias Bussonnier
Tell if no automatic update possible
r22041 import sys
Matthias Bussonnier
add do_where
r21970 from glob import glob
Thomas Kluyver
Add script to update whatsnew file from PR snippets
r12901 from os.path import dirname, basename, abspath, join as pjoin
from subprocess import check_call, check_output
repo_root = dirname(dirname(abspath(__file__)))
whatsnew_dir = pjoin(repo_root, 'docs', 'source', 'whatsnew')
pr_dir = pjoin(whatsnew_dir, 'pr')
target = pjoin(whatsnew_dir, 'development.rst')
FEATURE_MARK = ".. DO NOT EDIT THIS LINE BEFORE RELEASE. FEATURE INSERTION POINT."
INCOMPAT_MARK = ".. DO NOT EDIT THIS LINE BEFORE RELEASE. INCOMPAT INSERTION POINT."
# 1. Collect the whatsnew snippet files ---------------------------------------
Matthias Bussonnier
Take Thomas comments into account
r21974 files = set(glob(pjoin(pr_dir, '*.rst')))
Thomas Kluyver
Add script to update whatsnew file from PR snippets
r12901 # Ignore explanatory and example files
Matthias Bussonnier
Take Thomas comments into account
r21974 files.difference_update({pjoin(pr_dir, f) for f in {
Thomas Kluyver
Add script to update whatsnew file from PR snippets
r12901 'incompat-switching-to-perl.rst',
'antigravity-feature.rst'}
Matthias Bussonnier
add do_where
r21970 })
Thomas Kluyver
Add script to update whatsnew file from PR snippets
r12901
Matthias Bussonnier
Tell if no automatic update possible
r22041 if not files:
print("No automatic update available for what's new")
sys.exit(0)
Thomas Kluyver
Add script to update whatsnew file from PR snippets
r12901
def getmtime(f):
return check_output(['git', 'log', '-1', '--format="%ai"', '--', f])
files = sorted(files, key=getmtime)
features, incompats = [], []
for path in files:
with io.open(path, encoding='utf-8') as f:
Matthias Bussonnier
add do_where
r21970 try:
content = f.read().rstrip()
except Exception as e:
Matthias Bussonnier
Take Thomas comments into account
r21974 raise Exception('Error reading "{}"'.format(f)) from e
Matthias Bussonnier
add do_where
r21970
Thomas Kluyver
Add script to update whatsnew file from PR snippets
r12901 if basename(path).startswith('incompat-'):
incompats.append(content)
else:
features.append(content)
# Put the insertion markers back on the end, so they're ready for next time.
feature_block = '\n\n'.join(features + [FEATURE_MARK])
incompat_block = '\n\n'.join(incompats + [INCOMPAT_MARK])
# 2. Update the target file ---------------------------------------------------
with io.open(target, encoding='utf-8') as f:
content = f.read()
assert content.count(FEATURE_MARK) == 1
assert content.count(INCOMPAT_MARK) == 1
content = content.replace(FEATURE_MARK, feature_block)
content = content.replace(INCOMPAT_MARK, incompat_block)
# Clean trailing whitespace
content = '\n'.join(l.rstrip() for l in content.splitlines())
with io.open(target, 'w', encoding='utf-8') as f:
f.write(content)
# 3. Stage the changes in git -------------------------------------------------
for file in files:
check_call(['git', 'rm', file])
check_call(['git', 'add', target])
Matthias Bussonnier
add do_where
r21970 print("Merged what's new changes. Check the diff and commit the change.")