예제 #1
0
def uninstall(targets):

    for target in targets:
        if target not in PACKAGES:
            print("Error: Package not found -- %s" % target)
            return

    to_check = []
    for target in targets:
        if check_installed(target):
            to_check.append(target)
        else:
            print("%s isn't installed." % target)

    if not to_check:
        return

    s = settings.load()
    # map a package to all those that depend on it
    dependency_mapping = defaultdict(set)
    for p in s['installed']:
        for dep in PACKAGES[p]['dependencies']:
            dependency_mapping[dep].add(p)

    # compute all the packages that will be removed
    to_remove = set()
    while to_check:
        check = to_check.pop(0)
        to_remove.add(check)
        to_check.extend(list(dependency_mapping[check]))

    print("\nAbout to remove the following packages: %s" % ', '.join(to_remove))
    if input("  Proceed? [y/N] ").lower() in ['y', 'yes']:
        for package in to_remove:
            print ("Uninstalling %s..." % package)
            subprocess.call('./uninstall', cwd=os.path.join(CUR_DIR, 'packages', package))
            print ("Finished uninstalling %s" % package)
            s['installed'].remove(package)

    # Search for any packages that may be no longer required
    dependency_mapping = defaultdict(set)
    for p in PACKAGES:
        for dep in PACKAGES[p]['dependencies']:
            dependency_mapping[dep].add(p)

    possible_deletions = [d for p in to_remove for d in PACKAGES[p]['dependencies']]
    while possible_deletions:
        package = possible_deletions.pop(0)
        # Consider removing if (1) it's installed; and (2) nothing that requires this is installed
        if (package in s['installed']) and (not any([p in s['installed'] for p in dependency_mapping[package]])):
            print("\nPackage may no longer be required: %s" % package)
            if input("  Remove? [y/N] ").lower() in ['y', 'yes']:
                print ("Uninstalling %s..." % package)
                subprocess.call('./uninstall', cwd=os.path.join(CUR_DIR, 'packages', package))
                print ("Finished uninstalling %s" % package)
                s['installed'].remove(package)
                possible_deletions.extend(PACKAGES[package]['dependencies'])

    settings.save(s)
예제 #2
0
def upgrade():
    s = settings.load()
    for package in s['installed']:
        print("Upgrading %s..." % package)
        subprocess.call('./uninstall',
                        cwd=os.path.join(CUR_DIR, 'packages', package))
        subprocess.call('./install',
                        cwd=os.path.join(CUR_DIR, 'packages', package))
예제 #3
0
def package_list():
    print("\nInstalled:")
    installed = set(settings.load()['installed'])
    for p in installed:
        print("  %s: %s" % (p, PACKAGES[p]['name']))

    print("\nAvailable:")
    for p in PACKAGES:
        if p not in installed:
            print("  %s: %s" % (p, PACKAGES[p]['name']))
    print()
예제 #4
0
def get_available_package():
    all_packages = copy.deepcopy(PACKAGES)
    installed_package = settings.load()['installed']
    for package in all_packages:
        all_packages[package]["package_name"] = package

    # Return the manifest of installed package
    insterested_package = [
        all_packages[package] for package in all_packages
        if package in installed_package
        if "solve" in all_packages[package].get("endpoint", {}).get(
            "services", {})
    ]
    return jsonify(insterested_package)
예제 #5
0
def check_installed(target):
    return target in settings.load()['installed']
예제 #6
0
def install(targets, forced=False):
    for target in targets:
        if target not in PACKAGES:
            print("Error: Package not found -- %s" % target)
            return False

    # Compute all those that will need to be installed
    to_check = []
    for target in targets:
        if check_installed(target):
            print("%s is already installed." % target)
        else:
            to_check.append(target)

    done = set()
    to_install = []
    while to_check:
        check = to_check.pop(0)
        if check not in done:
            done.add(check)
            if not check_installed(check):
                to_install.append(check)
                to_check.extend(PACKAGES[check]['dependencies'])

    to_install.reverse()

    if to_install:
        to_install_desc = ["%s (%s)" % (pkg, PACKAGES[pkg]['install-size']) for pkg in to_install]
        print("\nAbout to install the following packages: %s" % ', '.join(to_install_desc))

        if forced:
            user_response = True
        else:
            user_response = input("  Proceed? [Y/n] ").lower() in ['', 'y', 'yes']

        if user_response:
            installed = []
            for package in to_install:
                package_path = os.path.join(CUR_DIR, 'packages', package)
                print("Installing %s..." % package)
                try:
                    installed.append(package)
                    subprocess.check_call('./install', cwd=package_path, shell=True)
                    size = subprocess.check_output('du -sh .',
                                                   cwd=package_path,
                                                   shell=True,
                                                   encoding='utf-8').split('\t')[0]
                    print("Finished installing %s (size: %s)" % (package, size))
                except subprocess.CalledProcessError:
                    print("\nError installing %s. Rolling back changes..." % package)
                    for p in installed:
                        subprocess.call('./uninstall', cwd=os.path.join(CUR_DIR, 'packages', p))
                    return False

            s = settings.load()
            s['installed'].extend(installed)
            settings.save(s)
            return True
        else:
            print("Aborting installation.")
    else:
        print("Nothing left to install.")

    return False