From 260645e9d817fde40147ab838d0d4f12e3a002c4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 31 Jul 2011 10:26:03 -0600 Subject: [PATCH] Clean up tempfile generation to remove redundant information and handle unicode better --- src/calibre/ptempfile.py | 61 ++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/src/calibre/ptempfile.py b/src/calibre/ptempfile.py index 00e415ec74..34df148f15 100644 --- a/src/calibre/ptempfile.py +++ b/src/calibre/ptempfile.py @@ -27,6 +27,9 @@ def remove_dir(x): except: pass +def app_prefix(prefix): + return '%s_%s_%s'%(__appname__, __version__, prefix) + def base_dir(): global _base_dir if _base_dir is not None and not os.path.exists(_base_dir): @@ -44,7 +47,7 @@ def base_dir(): _base_dir = td else: base = os.environ.get('CALIBRE_TEMP_DIR', None) - prefix = u'%s_%s_tmp_'%(__appname__, __version__) + prefix = app_prefix(u'tmp_') try: # First try an ascii path as that is what was done historically # and we dont want to break working code @@ -60,6 +63,32 @@ def base_dir(): atexit.register(remove_dir, _base_dir) return _base_dir +def _make_file(suffix, prefix, base): + try: + fd, name = tempfile.mkstemp(suffix, prefix, dir=base) + except UnicodeDecodeError: + global _base_dir + from calibre.constants import filesystem_encoding + base_dir() + if not isinstance(_base_dir, unicode): + _base_dir = _base_dir.decode(filesystem_encoding) + base = base.decode(filesystem_encoding) + fd, name = tempfile.mkstemp(suffix, prefix, dir=dir) + return fd, name + +def _make_dir(suffix, prefix, base): + try: + tdir = tempfile.mkdtemp(suffix, prefix, base) + except ValueError: + global _base_dir + from calibre.constants import filesystem_encoding + base_dir() + if not isinstance(_base_dir, unicode): + _base_dir = _base_dir.decode(filesystem_encoding) + base = base.decode(filesystem_encoding) + tdir = tempfile.mkdtemp(suffix, prefix, base) + return tdir + class PersistentTemporaryFile(object): """ A file-like object that is a temporary file that is available even after being closed on @@ -72,18 +101,7 @@ class PersistentTemporaryFile(object): prefix = "" if dir is None: dir = base_dir() - try: - fd, name = tempfile.mkstemp(suffix, __appname__+"_"+ __version__+"_" + prefix, - dir=dir) - except UnicodeDecodeError: - global _base_dir - from calibre.constants import filesystem_encoding - base_dir() - if not isinstance(_base_dir, unicode): - _base_dir = _base_dir.decode(filesystem_encoding) - dir = dir.decode(filesystem_encoding) - fd, name = tempfile.mkstemp(suffix, __appname__+"_"+ __version__+"_" + prefix, - dir=dir) + fd, name = _make_file(suffix, prefix, dir) self._file = os.fdopen(fd, mode) self._name = name @@ -114,16 +132,7 @@ def PersistentTemporaryDirectory(suffix='', prefix='', dir=None): ''' if dir is None: dir = base_dir() - try: - tdir = tempfile.mkdtemp(suffix, __appname__+"_"+ __version__+"_" +prefix, dir) - except ValueError: - global _base_dir - from calibre.constants import filesystem_encoding - base_dir() - if not isinstance(_base_dir, unicode): - _base_dir = _base_dir.decode(filesystem_encoding) - dir = dir.decode(filesystem_encoding) - tdir = tempfile.mkdtemp(suffix, __appname__+"_"+ __version__+"_" +prefix, dir) + tdir = _make_dir(suffix, prefix, dir) atexit.register(remove_dir, tdir) return tdir @@ -141,7 +150,7 @@ class TemporaryDirectory(object): self.keep = keep def __enter__(self): - self.tdir = tempfile.mkdtemp(self.suffix, __appname__+"_"+ __version__+"_" +self.prefix, self.dir) + self.tdir = _make_dir(self.suffix, self.prefix, self.dir) return self.tdir def __exit__(self, *args): @@ -161,9 +170,7 @@ class TemporaryFile(object): self._file = None def __enter__(self): - fd, name = tempfile.mkstemp(self.suffix, - __appname__+"_"+ __version__+"_" + self.prefix, - dir=self.dir) + fd, name = _make_file(self.suffix, self.prefix, self.dir) self._file = os.fdopen(fd, self.mode) self._name = name self._file.close()