diff --git a/pkgs/development/interpreters/python/cpython/2.7/atomic_pyc.patch b/pkgs/development/interpreters/python/cpython/2.7/atomic_pyc.patch new file mode 100644 index 00000000000..56c75cbdeea --- /dev/null +++ b/pkgs/development/interpreters/python/cpython/2.7/atomic_pyc.patch @@ -0,0 +1,41 @@ +diff --git a/Lib/py_compile.py b/Lib/py_compile.py +index 978da73..3559eb9 100644 +--- a/Lib/py_compile.py ++++ b/Lib/py_compile.py +@@ -120,16 +120,27 @@ def compile(file, cfile=None, dfile=None, doraise=False): + return + if cfile is None: + cfile = file + (__debug__ and 'c' or 'o') +- with open(cfile, 'wb') as fc: +- fc.write('\0\0\0\0') +- if "DETERMINISTIC_BUILD" in os.environ: ++ # Atomically write the pyc/pyo file. Issue #13146. ++ # id() is used to generate a pseudo-random filename. ++ path_tmp = '{}.{}'.format(cfile, id(cfile)) ++ try: ++ with open(path_tmp, 'wb') as fc: + fc.write('\0\0\0\0') +- else: +- wr_long(fc, timestamp) +- marshal.dump(codeobject, fc) +- fc.flush() +- fc.seek(0, 0) +- fc.write(MAGIC) ++ if "DETERMINISTIC_BUILD" in os.environ: ++ fc.write('\0\0\0\0') ++ else: ++ wr_long(fc, timestamp) ++ marshal.dump(codeobject, fc) ++ fc.flush() ++ fc.seek(0, 0) ++ fc.write(MAGIC) ++ os.rename(path_tmp, cfile) ++ except OSError: ++ try: ++ os.unlink(path_tmp) ++ except OSError: ++ pass ++ raise + + def main(args=None): + """Compile several source files. diff --git a/pkgs/development/interpreters/python/cpython/2.7/default.nix b/pkgs/development/interpreters/python/cpython/2.7/default.nix index e7d07b9ad1c..1503c221bdd 100644 --- a/pkgs/development/interpreters/python/cpython/2.7/default.nix +++ b/pkgs/development/interpreters/python/cpython/2.7/default.nix @@ -79,6 +79,12 @@ let sha256 = "0l9rw6r5r90iybdkp3hhl2pf0h0s1izc68h5d3ywrm92pq32wz57"; }) + # Fix race-condition during pyc creation. Has a slight backwards + # incompatible effect: pyc symlinks will now be overridden + # (https://bugs.python.org/issue17222). Included in python >= 3.4, + # backported in debian since 2013. + # https://bugs.python.org/issue13146 + ./atomic_pyc.patch ] ++ optionals (x11Support && stdenv.isDarwin) [ ./use-correct-tcl-tk-on-darwin.patch ] ++ optionals stdenv.isLinux [