From 33b0d49970a6655e9c6a3f8ebd25040c8466caa3 Mon Sep 17 00:00:00 2001 From: Lertsenem Date: Thu, 20 Aug 2015 01:07:17 +0200 Subject: [PATCH] Adding copy function --- persoconf/main.py | 170 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 131 insertions(+), 39 deletions(-) diff --git a/persoconf/main.py b/persoconf/main.py index 700ab3b..f17e54b 100755 --- a/persoconf/main.py +++ b/persoconf/main.py @@ -40,6 +40,127 @@ def contractuser(path): else: return path +def copy_file_or_directory(logger, path_dst, path_src, overwrite=True): + + # Expand '~' as user's home dir + dst = os.path.expanduser(path_dst) + src = os.path.expanduser(path_src) + + if overwrite: + + # -------------------------------------- + def replace_backup(): + try: + logger.info("Putting backup back in place") + shutil.move(dst + ".bak", dst) + + except FileNotFoundError: + logger.error("No backup of %s found. Oops" % dst) + return False + + except PermissionError: + logger.error("Cannot replace backup %s because of permissions" % (dst + ".bak")) + return False + + except FileExistsError: + logger.error("%s has been created, you need to chose manually to keep it or to use the backup %s" % (dst, dst + ".bak")) + return False + + return True + # -------------------------------------- + + + try: + logger.info("Moving old directory %s" % dst) + shutil.move(dst, dst + ".bak") + + except FileNotFoundError: + logger.info("No file %s exists yet" % dst) + + except PermissionError: + logger.error("Unable to write %s, please check permissions" % (dst + ".bak")) + return False + + except FileExistsError: + logger.error("%s already exists" % (dst + ".bak")) + return False + + + # No overwrite ? No problem. + else: + + def replace_backup(): + return True + + + # Copy the conf dir + # -------------------------------------- + try: + logger.info("Copying directory %s" % src) + shutil.copytree(src, dst) + + except FileNotFoundError: + logger.error("%s does not seem to exist" % src) + replace_backup() + return False + + except PermissionError: + logger.error("Unable to write %s, please check permissions" % dst) + replace_backup() + return False + + except FileExistsError: + logger.error("The directory '%s' already exists" % dst) + replace_backup() + return False + + # It's not a dir, it's a file ! + # -------------------------------------- + except NotADirectoryError: + + # Try not to overwrite an existing file. + # Note that if 'overwrite' was set to True, any existing file would + # have been moved at this point. + if os.path.exists(dst): + logger.error("The file %s already exists" % dst) + replace_backup() + return False + + try: + logger.info("Copying file %s" % src) + shutil.copyfile(src, dst) + + except PermissionError: + logger.error("Unable to write %s, please check permissions" % dst) + replace_backup() + return False + + # Everything went well, time to remove the backup + # -------------------------------------- + if overwrite: + # As before, try it as a dir first + try: + logger.info("Removing backup directory %s" % (dst + ".bak")) + shutil.rmtree(dst + ".bak") + + except FileNotFoundError: + logger.warning("Backup file %s seems to be already gone" % (dst + ".bak")) + except PermissionError: + logger.warning("Cannot remove backup dir %s, you will have to do it manually" % (dst + ".bak")) + + # If not, try it as a file + except NotADirectoryError: + try: + logger.info("Removing backup file %s" % (dst + ".bak")) + os.remove(dst + ".bak") + + except PermissionError: + logger.warning("Cannot remove backup file %s, you will have to do it manually" % (dst + ".bak")) + + + # The End. + return True + # ARGPARSE ######################################## # Argument parsing using argparse @@ -143,7 +264,7 @@ if args.command == "add": if args.conf is None: exit() - # Check (and create) the conf file + # Check that the conf file we are saving exists if args.confname: confname = args.confname else: @@ -160,6 +281,7 @@ if args.command == "add": except FileNotFoundError: log.info("Metafile %s does not exist for app %s" % (args.metafile, args.app)) appmeta = Metafile( name=args.app ) + appmeta.json_path = "/".join( [args.rootdir, args.app, args.metafile] ) except MalformedMetafileError: log.error("Malformed metafile %s in app %s" % (args.metafile, args.app) ) @@ -179,48 +301,18 @@ if args.command == "add": log.error("File %s already exists as %s in app %s" % (absconf, dstdic[absconf], args.app)) exit(1) - # Copy the conf dir - try: - log.info("Copying conf directory") - shutil.copytree(args.conf, confpath) + # Copy the file (or directory) + if copy_file_or_directory(log, path_dst=confpath, path_src=args.conf, overwrite=False): + log.info("New conf dir '%s' associated with app '%s'" % confname, args.app) + else: + log.error("Failed to copy file or directory %s" % args.conf) + exit(1) - print("New conf dir '%s' associated with app '%s'" % confname, args.app) - - except FileNotFoundError: - log.error("The conf file '%s' does not seem to exist" % args.conf) - exit() - - except PermissionError: - log.error("Unable to write on '%s', please check permissions" % confpath) - exit() - - except FileExistsError: - log.error("The conf dir '%s' already exists in '%s', please choose another --confname." % (confname, appdir)) - exit() - - # It's not a dir, it's a file ! - except NotADirectoryError: - - # Try not to overwrite an existing file - if os.path.exists(confpath): - log.error("The conf file '%s' already exists in '%s', please choose another --confname." % (confname, appdir)) - exit() - - try: - log.info("Copying conf file") - shutil.copyfile(args.conf, confpath) - log.info("New conf file '%s' associated with app '%s'" % (confname, args.app)) - - except PermissionError: - log.error("Unable to write on '%s', please check permissions" % confpath) - exit() - - # Add the file to META - # Update META data + # Add the file to META: first update META data log.debug("adding meta data for %s in %s" % (confname, args.app)) appmeta.add_file( confname, dest=absconf ) - # Write to the metafile + # Then write to the metafile try: log.debug("Writing to metafile") appmeta.save()