switch CLI import to TEMP_DIR location; see new Utils functs

svn: r9409
This commit is contained in:
James G Sack 2007-11-26 05:41:04 +00:00
parent 97a720945f
commit 63a3f8479b
4 changed files with 47 additions and 49 deletions

View File

@ -1,3 +1,13 @@
2007-11-25 Jim Sack <jgsack@san.rr.com>
* src/Utils.py : add get_empty_tempdir() and rm_tempdir()
* src/ArgHandler.py : use get_empty_tempdir, etc
* src/test/gramps_cli_test.py : update test for new import dir
- Note get_empty_tempdir forces location in (new) const.TEMP_DIR.
- Note rm_tempdir is paranoid in only removing subdirs under
TEMP_DIR -- if needed callers can code shutil.rmtree themselves.
- Also added FIXME comment in AH - about a prior comment and
code change that I feel needs re-examination.
2007-11-25 Jim Sack <jgsack@san.rr.com> 2007-11-25 Jim Sack <jgsack@san.rr.com>
* src/gramps_main.py : remove trial code left in on last commit * src/gramps_main.py : remove trial code left in on last commit
the r9407 trial code may be of interest as it demos how I avoid the r9407 trial code may be of interest as it demos how I avoid

View File

@ -64,16 +64,6 @@ from PluginUtils import Tool, cl_list, cli_tool_list
from ReportBase import CATEGORY_BOOK, CATEGORY_CODE, CATEGORY_WEB, cl_report from ReportBase import CATEGORY_BOOK, CATEGORY_CODE, CATEGORY_WEB, cl_report
def _rm_files(dirpath, pattern="*"):
""" Remove files in a directory which match the pattern
The optional pattern can use shell-style wildcards
"""
for fpath in glob.glob(os.path.join(dirpath, pattern)):
if os.path.isfile(fpath):
os.remove(fpath)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# ArgHandler # ArgHandler
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -406,23 +396,8 @@ class ArgHandler:
if self.imports: if self.imports:
self.cl = bool(self.exports or self.actions or self.cl) self.cl = bool(self.exports or self.actions or self.cl)
# Create dir for imported database(s) # Create empty dir for imported database(s)
self.impdir_path = os.path.join(const.HOME_DIR,"import") self.imp_db_path = Utils.get_empty_tempdir("import_dbdir")
self.imp_db_path = os.path.join(self.impdir_path,"import_db.grdb")
if not os.path.isdir(self.impdir_path):
try:
os.mkdir(self.impdir_path,0700)
except:
print "Could not create import directory %s. Exiting." \
% self.impdir_path
sys.exit(1)
elif not os.access(self.impdir_path,os.W_OK):
print "Import directory %s is not writable. Exiting." \
% self.impdir_path
sys.exit(1)
# and clean it up before use
_rm_files(self.impdir_path)
_rm_files(self.imp_db_path)
self.vm.db_loader.read_file(self.imp_db_path,const.APP_GRAMPS) self.vm.db_loader.read_file(self.imp_db_path,const.APP_GRAMPS)
@ -450,8 +425,8 @@ class ArgHandler:
print "Cleaning up." print "Cleaning up."
# remove files in import db subdir after use # remove files in import db subdir after use
self.state.db.close() self.state.db.close()
if self.imports: if self.imp_db_path:
_rm_files(self.imp_db_path) Utils.rm_tempdir(self.imp_db_path)
print "Exiting." print "Exiting."
sys.exit(0) sys.exit(0)
@ -513,23 +488,7 @@ class ArgHandler:
print "Error importing %s" % filename print "Error importing %s" % filename
sys.exit(1) sys.exit(1)
elif format == 'gramps-pkg': elif format == 'gramps-pkg':
# Create tempdir, if it does not exist, then check for writability tmpdir_path = Utils.get_empty_tempdir("imp_gpkgdir")
tmpdir_path = os.path.join(const.HOME_DIR,"tmp")
if not os.path.isdir(tmpdir_path):
try:
os.mkdir(tmpdir_path,0700)
except:
print "Could not create temporary directory %s" \
% tmpdir_path
sys.exit(1)
elif not os.access(tmpdir_path,os.W_OK):
print "Temporary directory %s is not writable" % tmpdir_path
sys.exit(1)
else: # tempdir exists and writable -- clean it up if not empty
files = os.listdir(tmpdir_path) ;
for fn in files:
os.remove( os.path.join(tmpdir_path,fn) )
try: try:
import tarfile import tarfile
archive = tarfile.open(filename) archive = tarfile.open(filename)
@ -557,6 +516,14 @@ class ArgHandler:
# Clean up tempdir after ourselves # Clean up tempdir after ourselves
# THIS HAS BEEN CHANGED, because now we want to keep images # THIS HAS BEEN CHANGED, because now we want to keep images
# stay after the import is over. Just delete the XML file. # stay after the import is over. Just delete the XML file.
##jgs:FIXME for how long? just for debug? or this session?
## must not be forever, since re-exec of this routine
## clears dirfiles without asking
## & expands nre tarball possibly overwriting subdirs
##
## if only debugging, could do Utils.rm_tempdir here
## in any case, no real harm (exc. space) to leave stuff here
## until next exec of this, which will discard all old stuff
os.remove(dbname) os.remove(dbname)
## files = os.listdir(tmpdir_path) ## files = os.listdir(tmpdir_path)
## for fn in files: ## for fn in files:

View File

@ -51,6 +51,8 @@ import gen.lib
import Errors import Errors
from QuestionDialog import WarningDialog from QuestionDialog import WarningDialog
from const import TEMP_DIR
import shutil
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -862,6 +864,25 @@ def get_new_filename(ext, folder='~/'):
ix = ix + 1 ix = ix + 1
return os.path.expanduser(_NEW_NAME_PATTERN % (folder, os.path.sep, ix, ext)) return os.path.expanduser(_NEW_NAME_PATTERN % (folder, os.path.sep, ix, ext))
def get_empty_tempdir(dirname):
""" Return path to TEMP_DIR/dirname, a guaranteed empty directory
makes intervening directories if required
fails if _file_ by that name already exists,
or for inadequate permissions to delete dir/files or create dir(s)
"""
dirpath = os.path.join(TEMP_DIR,dirname)
if os.path.isdir(dirpath):
shutil.rmtree(dirpath)
os.makedirs(dirpath)
return dirpath
def rm_tempdir(path):
"""Remove a tempdir created with get_empty_tempdir"""
if path.startswith(TEMP_DIR) and os.path.isdir(path):
shutil.rmtree(path)
def cast_to_bool(val): def cast_to_bool(val):
if val == str(True): if val == str(True):
return True return True

View File

@ -51,13 +51,13 @@ class Test(unittest.TestCase):
g = re.search("INDI", content) g = re.search("INDI", content)
s.assertTrue(g, "found 'INDI' in output file") s.assertTrue(g, "found 'INDI' in output file")
# this verifies that files in the "import dir" # this verifies that files in the temporary "import dir"
# get cleaned before (and after) running a CLI # get cleaned before (and after) running a CLI
# (eg cleanout stale files from prior crash-runs) # (eg cleanout stale files from prior crash-runs)
def test3_files_in_import_dir(s): def test3_files_in_import_dir(s):
import const import const
idir = os.path.join(const.HOME_DIR,"import") ddir = os.path.join(const.TEMP_DIR,"import_dbdir")
ddir = os.path.join(idir, "import_db.grdb") os.makedirs(ddir)
bogofiles = [os.path.join(ddir,fn) bogofiles = [os.path.join(ddir,fn)
for fn in ("family.db", "lock")] for fn in ("family.db", "lock")]
for fn in bogofiles: for fn in bogofiles: