Changeset 258 in tailor for vcpx/svn.py


Ignore:
Timestamp:
04/18/05 17:22:05 (8 years ago)
Author:
zooko@…
Hash name:
20050418152205-92b7f-0e54d3d8f512f84d4520a227a8a0f26317601825
Message:

new tempfile idiom
advantages:

  1. secure in all cases (previously there was one use of insecure mktemp)
  2. automatically cleans up tempfiles when things are garbage collected
  3. doesn't attempt to open a tempfile more than once at a time, which the python docs say won't work on some kinds of Windows.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • vcpx/svn.py

    r253 r258  
    4545    COMMAND = "svn propset --quiet %(property)s %(value)s %(entry)s" 
    4646 
     47import shutil, tempfile 
     48 
     49class ReopeableNamedTemporaryFile: 
     50    """ 
     51    This uses tempfile.mkstemp() to generate a secure temp file.  It then closes 
     52    the file, leaving a zero-length file as a placeholder.  You can get the 
     53    filename with ReopenableNamedTemporaryFile.name.  When the 
     54    ReopenableNamedTemporaryFile instance is garbage collected or its shutdown() 
     55    method is called, it deletes the file. 
     56 
     57    Copied from Zooko's pyutil.fileutil, http://zooko.com/repos/pyutil 
     58    """ 
     59    def __init__(self, suffix=None, prefix=None, dir=None, text=None): 
     60        self.name = mkstemp(suffix, prefix, dir, text)[1] 
     61       
     62    def __del__(self): 
     63        self.shutdown() 
     64        
     65    def shutdown(self): 
     66        os.remove(self.name) 
    4767 
    4868class SvnLog(SystemCommand): 
     
    5171    def __call__(self, output=None, dry_run=False, **kwargs): 
    5272        from tempfile import mktemp 
    53         from os import remove 
    5473         
    5574        quiet = kwargs.get('quiet', True) 
     
    7493            kwargs['endrev'] = 'HEAD' 
    7594 
    76         logfn = kwargs['tempfilename'] = mktemp('svn', 'tailor') 
     95        rontf = ReopenableNamedTemporaryFile('svn', 'tailor') 
     96        logfn = kwargs['tempfilename'] = rontf.name 
    7797         
    7898        SystemCommand.__call__(self, output=False, dry_run=dry_run, **kwargs) 
    7999 
    80         log = open(logfn) 
    81         if not SystemCommand.VERBOSE: 
    82             remove(logfn) 
    83              
    84         return log 
     100        return open(logfn) 
    85101 
    86102 
     
    90106    def __call__(self, output=None, dry_run=False, **kwargs): 
    91107        logfile = kwargs.get('logfile') 
     108        rontf = ReopenableNamedTemporaryFile('svn', 'tailor') 
    92109        if not logfile: 
    93             from tempfile import NamedTemporaryFile 
    94  
    95             log = NamedTemporaryFile(bufsize=0) 
    96110            logmessage = kwargs.get('logmessage') 
    97111            if logmessage: 
     112                log = open(rontf.name, "w") 
    98113                log.write(logmessage) 
    99              
    100             kwargs['logfile'] = log.name 
     114                log.close() 
     115             
     116            kwargs['logfile'] = rontf.name 
    101117         
    102118        return SystemCommand.__call__(self, output=output, 
Note: See TracChangeset for help on using the changeset viewer.