xxh/xxhp
2020-03-11 13:47:09 +03:00

103 lines
No EOL
3.8 KiB
Text
Executable file

#!/usr/bin/env xonsh
import os, sys, argparse, re
from sys import exit
class XxhPackage(object):
def __init__(self):
self.local_xxh_home_dir = p'~/.xxh'
self.quiet = False
parser = argparse.ArgumentParser(description='xxhp is xxh package manager.',
usage='xxhp <command>\n\n'
+ ' install i Install xxh plugin or shell from https://github.com/xxh\n'
+ ' list l List of installed packages\n'
+ ' remove r Remove xxh plugin or shell\n\n'
+ 'Try `./xxhp <command> --help` to get more info.\n')
parser.add_argument('command', help='Command to run')
args = parser.parse_args(sys.argv[1:2])
if not hasattr(self, args.command):
print('Unrecognized command\n')
parser.print_help()
sys.exit(1)
mkdir -p @(self.local_xxh_home_dir / 'xxh/shells') @(self.local_xxh_home_dir / 'xxh/plugins')
getattr(self, args.command)()
def eprint(self, *args, **kwargs):
if not self.quiet:
print(*args, file=sys.stderr, **kwargs)
def eeprint(self, *args, **kwargs):
if not self.quiet:
print(*args, file=sys.stderr, **kwargs)
exit(1)
def i(self):
return self.install()
def install(self):
parser = argparse.ArgumentParser(description='')
parser.add_argument('package', help=f"xxh-package")
parser.add_argument('-v', '--verbose', action='store_true', help=f"Verbose mode")
parser.usage = parser.format_usage().replace('usage: xxhp ', 'xxhp install ')
opt = parser.parse_args(sys.argv[2:])
if not re.match('^[a-zA-Z-]+$', opt.package):
self.eeprint(f'Invalid package name: {opt.package}')
subdir = self.package_subdir(opt.package) or self.eeprint(f"Unknown package: {opt.package}")
package_git_url = f'https://github.com/xxh/{opt.package}'
self.eprint(f"Git clone {package_git_url}")
package_dir = self.local_xxh_home_dir/'xxh'/subdir/opt.package
r = ![git clone -q @(package_git_url) @(package_dir) 1>&2]
if r.returncode != 0:
self.eeprint(f'Git clone error')
self.eprint(f"Build {opt.package}")
@(package_dir/'build.xsh') 1>&2
self.eprint(f"Installed {opt.package}")
def r(self):
return self.remove()
def remove(self):
parser = argparse.ArgumentParser(description='')
parser.add_argument('package', help=f"xxh-package")
parser.add_argument('-v', '--verbose', action='store_true', help=f"Verbose mode")
parser.usage = parser.format_usage().replace('usage: xxhp ', 'xxhp remove ')
opt = parser.parse_args(sys.argv[2:])
subdir = self.package_subdir(opt.package) or self.eeprint(f"Unknown package: {opt.package}")
package_dir = self.local_xxh_home_dir / 'xxh' / subdir / opt.package
if package_dir.exists():
rm -rf @(package_dir)
self.eprint(f"Removed {package_dir}")
else:
self.eeprint(f"Package not found: {package_dir}")
def l(self):
return self.list()
def list(self):
parser = argparse.ArgumentParser(description='')
parser.add_argument('-v', '--verbose', action='store_true', help=f"Verbose mode")
parser.usage = parser.format_usage().replace('usage: xxhp ', 'xxhp remove ')
opt = parser.parse_args(sys.argv[2:])
packages_dir = (self.local_xxh_home_dir / 'xxh').glob('**/xxh-*')
for p in sorted(packages_dir):
print(p.name)
def package_subdir(self, name):
if 'xxh-shell' in name:
return 'shells'
elif 'xxh-plugin' in name:
return 'plugins'
return None
if __name__ == '__main__':
XxhPackage()