mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-12-17 23:52:46 +01:00
Update to use temporary directory.
This commit is contained in:
parent
197238efa0
commit
5a6cd1efa3
58
src/conf.py
58
src/conf.py
@ -523,29 +523,59 @@ registerGlobalValue(supybot.drivers, 'module',
|
||||
###
|
||||
# supybot.directories, for stuff relating to directories.
|
||||
###
|
||||
registerGroup(supybot, 'directories')
|
||||
registerGlobalValue(supybot.directories, 'conf',
|
||||
registry.String('conf', """Determines what directory configuration data is
|
||||
put into."""))
|
||||
registerGlobalValue(supybot.directories, 'data',
|
||||
registry.String('data', """Determines what directory data is put into."""))
|
||||
registerGlobalValue(supybot.directories, 'plugins',
|
||||
registry.CommaSeparatedListOfStrings([_srcDir, _pluginsDir], """Determines
|
||||
what directories the bot will look for plugins in. Accepts a
|
||||
comma-separated list of strings. This means that to add another directory,
|
||||
you can nest the former value and add a new one. E.g. you can say: bot:
|
||||
'config supybot.directories.plugins [config supybot.directories.plugins],
|
||||
newPluginDirectory'."""))
|
||||
|
||||
class Directory(registry.String):
|
||||
def __call__(self):
|
||||
v = super(Directory, self).__call__()
|
||||
if not os.path.exists(v):
|
||||
os.mkdir(v)
|
||||
return v
|
||||
|
||||
class DataFilename(registry.String):
|
||||
def __call__(self):
|
||||
v = registry.String.__call__(self)
|
||||
v = super(DataFilename, self).__call__()
|
||||
dataDir = supybot.directories.data()
|
||||
if not v.startswith(dataDir):
|
||||
v = os.path.basename(v)
|
||||
v = os.path.join(dataDir, v)
|
||||
self.setValue(v)
|
||||
return v
|
||||
|
||||
class DataFilenameDirectory(DataFilename, Directory):
|
||||
def __call__(self):
|
||||
v = DataFilename.__call__(self)
|
||||
v = Directory.__call__(self)
|
||||
return v
|
||||
|
||||
registerGroup(supybot, 'directories')
|
||||
registerGlobalValue(supybot.directories, 'conf',
|
||||
Directory('conf', """Determines what directory configuration data is
|
||||
put into."""))
|
||||
registerGlobalValue(supybot.directories, 'data',
|
||||
Directory('data', """Determines what directory data is put into."""))
|
||||
registerGlobalValue(supybot.directories.data, 'tmp',
|
||||
DataFilenameDirectory('tmp', """Determines what directory temporary files
|
||||
are put into."""))
|
||||
|
||||
# This is a hack, but it should work.
|
||||
utils._AtomicFile = utils.AtomicFile
|
||||
def AtomicFile(*args, **kwargs):
|
||||
kwargs['tmpDir'] = supybot.directories.data.tmp()
|
||||
return utils._AtomicFile(*args, **kwargs)
|
||||
utils.AtomicFile = AtomicFile
|
||||
|
||||
class PluginDirectories(registry.CommaSeparatedListOfStrings):
|
||||
def __call__(self):
|
||||
v = registry.CommaSeparatedListOfStrings.__call__(self)
|
||||
return v + [_srcDir, _pluginsDir]
|
||||
|
||||
registerGlobalValue(supybot.directories, 'plugins',
|
||||
PluginDirectories(['plugins'], """Determines what directories the bot will
|
||||
look for plugins in. Accepts a comma-separated list of strings. This
|
||||
means that to add another directory, you can nest the former value and add
|
||||
a new one. E.g. you can say: bot: 'config supybot.directories.plugins
|
||||
[config supybot.directories.plugins], newPluginDirectory'."""))
|
||||
|
||||
registerGroup(supybot, 'plugins') # This will be used by plugins, but not here.
|
||||
|
||||
###
|
||||
|
16
src/utils.py
16
src/utils.py
@ -676,17 +676,21 @@ class AtomicFile(file):
|
||||
failure, the original file remains, unmodified.
|
||||
|
||||
Opens the file in 'w' mode."""
|
||||
def __init__(self, filename, allowEmptyOverwrite=False):
|
||||
def __init__(self, filename, allowEmptyOverwrite=False, tmpDir=None):
|
||||
self.filename = filename
|
||||
self.rolledback = False
|
||||
self.allowEmptyOverwrite = allowEmptyOverwrite
|
||||
self.tempFilename = '%s.%s' % (filename, mktemp())
|
||||
super(AtomicFile, self).__init__(self.tempFilename, 'w')
|
||||
if tmpDir is not None:
|
||||
dir = os.path.dirname(self.tempFilename)
|
||||
dir = os.path.join(dir, tmpDir)
|
||||
self.tempFilename = os.path.join(dir, self.tempFilename)
|
||||
super(self.__class__, self).__init__(self.tempFilename, 'w')
|
||||
|
||||
def rollback(self):
|
||||
#print 'AtomicFile.rollback'
|
||||
if not self.closed:
|
||||
super(AtomicFile, self).close()
|
||||
super(self.__class__, self).close()
|
||||
if os.path.exists(self.tempFilename):
|
||||
#print 'AtomicFile: Removing %s.' % self.tempFilename
|
||||
os.remove(self.tempFilename)
|
||||
@ -696,10 +700,14 @@ class AtomicFile(file):
|
||||
#print 'AtomicFile.close'
|
||||
if not self.rolledback:
|
||||
#print 'AtomicFile.close: actually closing.'
|
||||
super(AtomicFile, self).close()
|
||||
super(self.__class__, self).close()
|
||||
size = os.stat(self.tempFilename).st_size
|
||||
if size or self.allowEmptyOverwrite:
|
||||
if os.path.exists(self.tempFilename):
|
||||
# We use shutil.move here instead of os.rename because
|
||||
# the latter doesn't work on Windows when self.filename
|
||||
# (the target) already exists. shutil.move handles those
|
||||
# intricacies for us.
|
||||
shutil.move(self.tempFilename, self.filename)
|
||||
|
||||
def __del__(self):
|
||||
|
Loading…
Reference in New Issue
Block a user