Move delete command to commands module

master
Lertsenem 2015-12-07 18:11:35 +01:00
parent 6206c015a2
commit 9feddf8011
2 changed files with 132 additions and 106 deletions

View File

@ -0,0 +1,128 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os.path
import shutil
import utils
from metafile import Metafile, MalformedMetafileError
# --------------------------------------
def init(parser):
parser.add_argument( "app" ,
type=str ,
help="The app to delete, or the app to delete a " \
"conf file from" )
parser.add_argument( "files" ,
nargs="*" ,
type=str ,
help="The conf files or directories to delete from " \
"the app" )
parser.add_argument( "--force-yes", "-y" ,
action="store_true" ,
help="Don't ask silly questions" )
# --------------------------------------
def run(args, persoconf, logger):
# Does this app really exists ?
try:
appmeta = Metafile( json_path = os.path.join( persoconf.path ,
args.app ,
persoconf.metafile ) )
except FileNotFoundError:
logger.error( "App %s does not seem to exist" % args.app )
exit(1)
except MalformedMetafileError:
logger.error( "Failed to load metafile from app %s" % args.app )
exit(1)
# Does the user want to remove files or the entire app ?
if args.files == []:
# Delete the entire app
if ( args.force_yes
or utils.yes_no_question("Really delete app '%s'?" % appmeta.name)
):
shutil.rmtree( os.path.join(persoconf.path, appmeta.name) )
logger.warning("App %s was deleted" % appmeta.name)
else:
logger.warning("Nothing was deleted")
exit(0)
else:
# Delete all required files (or directories)
if ( not args.force_yes
and not utils.yes_no_question(
"Delete all files from following list: %s from app %s?"
% (str(args.files),appmeta.name)
)
):
logger.warning("Nothing was deleted")
exit(0)
# The filenames can be confnames or real files names. For each we'll
# assume first that it's a confname, then that it's a file name if that
# fails.
dstdic = appmeta.get_files_dst2src() # Get that here for optimization
for f in args.files:
# 1) It's probably a confname
if f in appmeta.files:
if utils.delete_file_or_dir(
logger = logger ,
path = os.path.join(persoconf.path,
appmeta.name ,
f )
):
# File deleted, let's delete the entry in Metafile
appmeta.del_file(f)
appmeta.save()
else:
logger.warning( "Something wrong occured while deleting " \
"file %s"
% f )
continue
# 2) If not, it must be a real filename
else:
absf = utils.contractuser(
os.path.abspath(os.path.expanduser(f))
)
if absf in dstdic:
if delete_file_or_dir( logger = logger,
path = os.path.join(
persoconf.path,
appmeta.name ,
dstdir[absf]
)
):
# File deleted, let's delete the entry in Metafile
appmeta.del_file(dstdir[absf])
appmeta.save()
else:
logger.warning( "Something wrong occured while " \
"deleting file %s"
% f )
continue
# 3) Otherwise, no idea what it is
else:
logger.warning( "Cannot find file %s in app %s data; " \
"ignoring it"
% (f, appmeta.name) )
continue

View File

@ -15,7 +15,8 @@ from metafile import Metafile, MalformedMetafileError, NoPathDefinedError
from persoconf import Persoconf, FileInsteadOfDirError, \
PersoconfRootDoesNotExistError
import commands.list, commands.package, commands.update, commands.add
import commands.list, commands.package, commands.update, commands.add, \
commands.delete
@ -75,22 +76,7 @@ parser_del = subparsers.add_parser( "delete" ,
help="Delete an app from the persoconf " \
"directory, or a config file from " \
"an existing app" )
parser_del.add_argument( "app" ,
type=str ,
help="The app to delete, or the app to delete a " \
"conf file from" )
parser_del.add_argument( "files" ,
nargs="*" ,
type=str ,
help="The conf files or directories to delete from " \
"the app" )
parser_del.add_argument( "--force-yes", "-y" ,
action="store_true" ,
help="Don't ask silly questions" )
commands.delete.init(parser_del)
# Parse arguments
args = parser.parse_args()
@ -163,98 +149,10 @@ except PersoconfRootDoesNotExistError:
if args.command == "list":
commands.list.run(args, persoconf, log)
# DELETE COMMAND
########################################
if args.command == "delete":
# Does this app really exists ?
try:
appmeta = Metafile( json_path = persoconf.path
+"/"+ args.app
+"/"+ persoconf.metafile )
except FileNotFoundError:
log.error( "App %s does not seem to exist" % args.app )
exit(1)
except MalformedMetafileError:
log.error( "Failed to load metafile from app %s" % args.app )
exit(1)
# Does the user want to remove files or the entire app ?
if args.files == []:
# Delete the entire app
if ( args.force_yes
or yes_no_question("Really delete app '%s'?" % appmeta.name )
):
shutil.rmtree( persoconf.path +"/"+ appmeta.name )
log.warning("App %s was deleted" % appmeta.name)
else:
log.warning("Nothing was deleted")
exit(0)
else:
# Delete all required files (or directories)
if ( not args.force_yes
and not yes_no_question( "Delete all files from following list: " \
"%s from app %s?"
% (str(args.files),appmeta.name))
):
log.warning("Nothing was deleted")
exit(0)
# The filenames can be confnames or real files names. For each we'll
# assume first that it's a confname, then that it's a file name if that
# fails.
dstdic = appmeta.get_files_dst2src() # Get that here for optimization
for f in args.files:
# 1) It's probably a confname
if f in appmeta.files:
if delete_file_or_dir( logger = log ,
path = persoconf.path
+"/"+ appmeta.name
+"/"+ f ):
# File deleted, let's delete the entry in Metafile
appmeta.del_file(f)
appmeta.save()
else:
log.warning( "Something wrong occured while deleting " \
"file %s"
% f )
continue
# 2) If not, it must be a real filename
else:
absf = contractuser(os.path.abspath(os.path.expanduser(f)))
if absf in dstdic:
if delete_file_or_dir( logger = log ,
path = persoconf.path
+"/"+ appmeta.name
+"/"+ dstdir[absf] ):
# File deleted, let's delete the entry in Metafile
appmeta.del_file(dstdir[absf])
appmeta.save()
else:
log.warning( "Something wrong occured while " \
"deleting file %s"
% f )
continue
# 3) Otherwise, no idea what it is
else:
log.warning( "Cannot find file %s in app %s data; " \
"ignoring it"
% (f, appmeta.name) )
continue
commands.delete.run(args, persoconf, log)
# ADD COMMAND
########################################