Move package command in commands module
parent
1749d0706d
commit
eab5121d97
|
@ -0,0 +1,90 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import time
|
||||||
|
import tarfile
|
||||||
|
|
||||||
|
from metafile import Metafile, MalformedMetafileError
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
def init(parser):
|
||||||
|
|
||||||
|
parser.add_argument( "apps" ,
|
||||||
|
type=str ,
|
||||||
|
nargs="*" ,
|
||||||
|
default=[] ,
|
||||||
|
help="The apps to package ; defaults to all " \
|
||||||
|
"apps" )
|
||||||
|
|
||||||
|
parser.add_argument( "--pkgtype", "-t" ,
|
||||||
|
type=str ,
|
||||||
|
nargs="?" ,
|
||||||
|
default="tgz" ,
|
||||||
|
choices = [ "tgz" ] ,
|
||||||
|
help="The type of package to use" )
|
||||||
|
|
||||||
|
parser.add_argument( "--pkgname", "-p" ,
|
||||||
|
type=str ,
|
||||||
|
nargs="?" ,
|
||||||
|
default="persoconf." + (time.strftime("%Y%m%d")) ,
|
||||||
|
help="The name of the package to create" )
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
def run(args, persoconf, logger):
|
||||||
|
|
||||||
|
pkgname = args.pkgname
|
||||||
|
|
||||||
|
# If no app is given: package all apps
|
||||||
|
if args.apps == []:
|
||||||
|
logger.info("Packaging all apps")
|
||||||
|
args.apps = persoconf.list_apps(logger=logger)
|
||||||
|
|
||||||
|
# Some apps were specified, so we list them with their files
|
||||||
|
appmetas = []
|
||||||
|
for app in args.apps :
|
||||||
|
# Load app META file
|
||||||
|
try:
|
||||||
|
appmetas.append( Metafile(json_path = "/".join([persoconf.path, app, persoconf.metafile])) )
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
logger.warning("Metafile %s does not exist for app %s; ignoring" % (persoconf.metafile, app))
|
||||||
|
continue
|
||||||
|
|
||||||
|
except MalformedMetafileError:
|
||||||
|
logger.warning("Malformed metafile %s in app %s; ignoring" % (persoconf.metafile, app) )
|
||||||
|
continue
|
||||||
|
|
||||||
|
# TODO check that the app exists
|
||||||
|
|
||||||
|
# Adds the app name if there is only one packaged
|
||||||
|
if len(appmetas) == 1:
|
||||||
|
pkgname += ("." + appmetas[0].name)
|
||||||
|
|
||||||
|
# Switch according to the pkgtype
|
||||||
|
if args.pkgtype == "tgz":
|
||||||
|
|
||||||
|
pkgname += ".tgz"
|
||||||
|
|
||||||
|
# Create a tar containing the files in the right place
|
||||||
|
pkg = tarfile.open(pkgname, "w:gz")
|
||||||
|
|
||||||
|
for appmeta in appmetas:
|
||||||
|
for f in appmeta.files:
|
||||||
|
filename = persoconf.path +"/"+ appmeta.name +"/"+ f
|
||||||
|
filedest = appmeta.files[f]["dest"]
|
||||||
|
|
||||||
|
# Remove possible 'home'. The final targz should be extracted
|
||||||
|
# at 'home.
|
||||||
|
if filedest.startswith("~/"):
|
||||||
|
filedest = filedest[2:]
|
||||||
|
|
||||||
|
# TODO save and restore owners and permissions
|
||||||
|
try:
|
||||||
|
pkg.add(filename, arcname=filedest)
|
||||||
|
logger.info("Adding %s to package" % f)
|
||||||
|
except:
|
||||||
|
logger.warning("Failed to add %s to tar package %s" % (f, pkgname))
|
||||||
|
|
||||||
|
|
||||||
|
pkg.close()
|
||||||
|
|
|
@ -15,7 +15,7 @@ from metafile import Metafile, MalformedMetafileError, NoPathDefinedError
|
||||||
from persoconf import Persoconf, FileInsteadOfDirError, \
|
from persoconf import Persoconf, FileInsteadOfDirError, \
|
||||||
PersoconfRootDoesNotExistError
|
PersoconfRootDoesNotExistError
|
||||||
|
|
||||||
import commands.list
|
import commands.list, commands.package
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,26 +54,7 @@ commands.list.init(parser_list)
|
||||||
# Package
|
# Package
|
||||||
parser_package = subparsers.add_parser( "package" ,
|
parser_package = subparsers.add_parser( "package" ,
|
||||||
help="Package a persoconf repository" )
|
help="Package a persoconf repository" )
|
||||||
|
commands.package.init(parser_package)
|
||||||
parser_package.add_argument( "apps" ,
|
|
||||||
type=str ,
|
|
||||||
nargs="*" ,
|
|
||||||
default=[] ,
|
|
||||||
help="The apps to package ; defaults to all " \
|
|
||||||
"apps" )
|
|
||||||
|
|
||||||
parser_package.add_argument( "--pkgtype", "-t" ,
|
|
||||||
type=str ,
|
|
||||||
nargs="?" ,
|
|
||||||
default="tgz" ,
|
|
||||||
choices = [ "tgz" ] ,
|
|
||||||
help="The type of package to use" )
|
|
||||||
|
|
||||||
parser_package.add_argument( "--pkgname", "-p" ,
|
|
||||||
type=str ,
|
|
||||||
nargs="?" ,
|
|
||||||
default="persoconf." + (time.strftime("%Y%m%d")) ,
|
|
||||||
help="The name of the package to create" )
|
|
||||||
|
|
||||||
# Update
|
# Update
|
||||||
parser_update = subparsers.add_parser( "update" ,
|
parser_update = subparsers.add_parser( "update" ,
|
||||||
|
@ -503,62 +484,7 @@ if args.command == "update":
|
||||||
# PACKAGE COMMAND
|
# PACKAGE COMMAND
|
||||||
########################################
|
########################################
|
||||||
if args.command == "package":
|
if args.command == "package":
|
||||||
|
commands.package.run(args, persoconf, log)
|
||||||
pkgname = args.pkgname
|
|
||||||
|
|
||||||
# If no app is given: package all apps
|
|
||||||
if args.apps == []:
|
|
||||||
log.info("Packaging all apps")
|
|
||||||
args.apps = persoconf.list_apps(logger=log)
|
|
||||||
|
|
||||||
# Some apps were specified, so we list them with their files
|
|
||||||
appmetas = []
|
|
||||||
for app in args.apps :
|
|
||||||
# Load app META file
|
|
||||||
try:
|
|
||||||
appmetas.append( Metafile(json_path = "/".join([persoconf.path, app, persoconf.metafile])) )
|
|
||||||
|
|
||||||
except FileNotFoundError:
|
|
||||||
log.warning("Metafile %s does not exist for app %s; ignoring" % (persoconf.metafile, app))
|
|
||||||
continue
|
|
||||||
|
|
||||||
except MalformedMetafileError:
|
|
||||||
log.warning("Malformed metafile %s in app %s; ignoring" % (persoconf.metafile, app) )
|
|
||||||
continue
|
|
||||||
|
|
||||||
# TODO check that the app exists
|
|
||||||
|
|
||||||
# Adds the app name if there is only one packaged
|
|
||||||
if len(appmetas) == 1:
|
|
||||||
pkgname += ("." + appmeta[0].name)
|
|
||||||
|
|
||||||
# Switch according to the pkgtype
|
|
||||||
if args.pkgtype == "tgz":
|
|
||||||
|
|
||||||
pkgname += ".tgz"
|
|
||||||
|
|
||||||
# Create a tar containing the files in the right place
|
|
||||||
pkg = tarfile.open(pkgname, "w:gz")
|
|
||||||
|
|
||||||
for appmeta in appmetas:
|
|
||||||
for f in appmeta.files:
|
|
||||||
filename = persoconf.path +"/"+ appmeta.name +"/"+ f
|
|
||||||
filedest = appmeta.files[f]["dest"]
|
|
||||||
|
|
||||||
# Remove possible 'home'. The final targz should be extracted
|
|
||||||
# at 'home.
|
|
||||||
if filedest.startswith("~/"):
|
|
||||||
filedest = filedest[2:]
|
|
||||||
|
|
||||||
# TODO save and restore owners and permissions
|
|
||||||
try:
|
|
||||||
pkg.add(filename, arcname=filedest)
|
|
||||||
log.info("Adding %s to package" % f)
|
|
||||||
except:
|
|
||||||
log.warning("Failed to add %s to tar package %s" % (f, pkgname))
|
|
||||||
|
|
||||||
|
|
||||||
pkg.close()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue