#!/usr/bin/env python # -*- coding: utf-8 -*- import os.path import utils from metafile import Metafile, MalformedMetafileError, NoPathDefinedError # ----------------------------------------------------------------------------- def init(parser): parser.add_argument( "app", type=str, help="The app to add, or the app to add a conf " \ "file to" ) parser.add_argument( "conf", nargs="?", type=str, help="The conf file or directory to add to the app" ) parser.add_argument( "--confname", type=str, help="A special name to save the conf " \ "file/directory in the persoconf directory" ) # ----------------------------------------------------------------------------- def run(args, persoconf, logger): # Check (and create) the app directory appdir = os.path.join( persoconf.path, args.app ) if os.path.isdir(appdir): if args.conf is None: logger.warning("App '%s' already exists" % args.app) exit() elif os.path.exists(appdir): logger.error( "The name '%s' is already used by a file in the " \ "persoconf directory" % args.app) exit() else: logger.info("Creating app '%s' in persoconf directory..." % args.app) os.mkdir(appdir) print("New app '%s' created in persoconf directory" % args.app) if args.conf is None: exit() # Load app META file try: appmeta = Metafile( json_path = os.path.join( appdir, persoconf.metafile ) ) except FileNotFoundError: logger.info( "Metafile %s does not exist for app %s" % (persoconf.metafile, args.app) ) appmeta = Metafile( name=args.app ) appmeta.json_path = os.path.join( persoconf.path, args.app, persoconf.metafile ) except MalformedMetafileError: logger.error( "Malformed metafile %s in app %s" % (persoconf.metafile, args.app) ) exit(1) # Check that the file is really new absconf = utils.contractuser( os.path.abspath(os.path.expanduser(args.conf)) ) try: dstdic = appmeta.get_files_dst2src() except MalformedMetafileError: logger.error( "Malformed metafile %s in app %s" % (persoconf.metafile, args.app) ) exit(1) if absconf in dstdic: logger.error( "File %s already exists as %s in app %s" % (absconf, dstdic[absconf], args.app) ) exit(1) # Check that the conf file we are saving exists if args.confname: confname = args.confname else: confname = args.conf # We need to remove trailing '/' because 'os.path.basename("toto/")' # returns ''. And that's not cool. while confname[-1] == os.path.sep : confname = confname[:-1] # Remove trailing slashes confname = os.path.basename(confname) # Remove leading dots, so the name under which the conffile is saved is # not hidden. while confname[0] == ".": confname = confname[1:] # Remove leading dots # Check the conf file name if ( confname == persoconf.metafile or confname in appmeta.files ): # If the confanme was user-defined, it's a serious error. if args.confname: logger.error( "Confname '%s' is already taken: try another one" % confname ) exit(1) # Otherwise it's cool, we just have to change the confname by ourselves logger.info( "Confname '%s' is already taken: trying another one" % confname ) ending = 1 while ( confname + "." + str(ending) == persoconf.metafile or confname + "." + str(ending) in appmeta.files ): ending += 1 confname = confname + "." + str(ending) logger.info( "New confname is '%s'" % confname ) # Deduce the path from the conf file name confpath = appdir + "/" + confname # Copy the file (or directory) if utils.copy_file_or_directory( logger, path_dst=confpath, path_src=args.conf, overwrite=False ): logger.info( "New conf file or directory '%s' associated with app '%s'" % (confname, args.app)) else: logger.error( "Failed to copy file or directory %s" % args.conf) exit(1) # Add the file to META: first update META data logger.debug( "adding meta data for %s in %s" % (confname, args.app) ) appmeta.add_file( confname, dest=absconf ) # Then write to the metafile try: logger.debug("Writing to metafile") appmeta.save() except NoPathDefinedError: logger.error( "Unable to save json Metafile for app %s : no path " \ "defined" % appmeta.name ) exit(1) # TODO Add or update the app METAFILE in a 'persoconf' special app.