From a4598a30087fe09ea2c7ad42cabb01f33c30a125 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 30 Mar 2014 16:43:11 -0400 Subject: [PATCH] support CDN purging --- Doc/tools/dailybuild.py | 51 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/Doc/tools/dailybuild.py b/Doc/tools/dailybuild.py index 2cc3d8c2a1..786d5ab6b3 100755 --- a/Doc/tools/dailybuild.py +++ b/Doc/tools/dailybuild.py @@ -34,12 +34,29 @@ WWWROOT = '/data/ftp.python.org/pub/docs.python.org' BRANCHES = [ # checkout, target, isdev - (BUILDROOT + '/python33', WWWROOT + '/3.3', False), - (BUILDROOT + '/python34', WWWROOT + '/3.4', True), + (BUILDROOT + '/python34', WWWROOT + '/3.4', False), + (BUILDROOT + '/python35', WWWROOT + '/3.5', True), (BUILDROOT + '/python27', WWWROOT + '/2.7', False), ] +def _files_changed(old, new): + with open(old, 'rb') as fp1, open(new, 'rb') as fp2: + st1 = os.fstat(fp1.fileno()) + st2 = os.fstat(fp2.fileno()) + if st1.st_size != st2.st_size: + return False + if st1.st_mtime >= st2.st_mtime: + return True + while True: + one = fp1.read(4096) + two = fp2.read(4096) + if one != two: + return False + if one == '': + break + return True + def build_one(checkout, target, isdev, quick): print 'Doc autobuild started in %s' % checkout os.chdir(checkout) @@ -51,12 +68,40 @@ def build_one(checkout, target, isdev, quick): if os.WEXITSTATUS(os.system('cd Doc; make SPHINXBUILD=%s %s' % (SPHINXBUILD, maketarget))) == 2: print '*' * 80 return + print('Computing changed files') + changed = [] + for dirpath, dirnames, filenames in os.walk('Doc/build/html/'): + dir_rel = dirpath[len('Doc/build/html/'):] + for fn in filenames: + local_path = os.path.join(dirpath, fn) + rel_path = os.path.join(dir_rel, fn) + target_path = os.path.join(target, rel_path) + if (os.path.exists(target_path) and + not _files_changed(target_path, local_path)): + changed.append(rel_path) print 'Copying HTML files to %s' % target os.system('cp -a Doc/build/html/* %s' % target) if not quick: print 'Copying dist files' os.system('mkdir -p %s/archives' % target) os.system('cp -a Doc/dist/* %s/archives' % target) + changed.append('archives/') + for fn in os.listdir(os.path.join(target, 'archives')): + changed.append('archives/' + fn) + print '%s files changed' % len(changed) + if changed: + target_ino = os.stat(target).st_ino + targets_dir = os.path.dirname(target) + prefixes = [] + for fn in os.listdir(targets_dir): + if os.stat(os.path.join(targets_dir, fn)).st_ino == target_ino: + prefixes.append(fn) + to_purge = [] + for prefix in prefixes: + to_purge.extend(prefix + "/" + p for p in changed) + purge_cmd = 'curl -X PURGE "https://docs.python.org/{%s}"' % ','.join(to_purge) + print("Running CDN purge") + os.system(purge_cmd) print 'Finished' print '=' * 80 @@ -84,7 +129,7 @@ if __name__ == '__main__': if args: if len(args) != 2: usage() - build_one(args[0], args[1], devel, quick) + build_one(os.path.abspath(args[0]), os.path.abspath(args[1]), devel, quick) else: for checkout, dest, devel in BRANCHES: build_one(checkout, dest, devel, quick) -- 2.50.1