Exemple #1
0
    def _proc_cleanup(self):
        if self._no_cleanup:
            return

        text = 'Pruning caches and archives'
        print_info(text, self._file, redirect=self._qflag)

        argv = ['pip', 'cleanup']
        if self._verbose:
            argv.append('--verbose')
        if self._quiet:
            argv.append('--quiet')
        print_scpt(' '.join(argv), self._file, redirect=self._qflag)

        argv = ['rm', '-rf']
        if self._verbose:
            argv.append('-v')
        argv.append('')
        for path in [
                '/var/root/Library/Caches/pip/http/',
                '/var/root/Library/Caches/pip/wheels/',
                os.path.expanduser('~/Library/Caches/pip/http/'),
                os.path.expanduser('~/Library/Caches/pip/wheels/')
        ]:
            argv[-1] = path
            print_scpt(' '.join(argv), self._file, redirect=self._qflag)
            sudo(argv,
                 self._file,
                 self._password,
                 redirect=self._qflag,
                 verbose=self._vflag)
Exemple #2
0
 def _cleanup(argv):
     if self._verbose:
         argv.append('--verbose')
     if self._quiet:
         argv.append('--quiet')
     args = ' '.join(argv)
     print_scpt(args, self._file, redirect=self._qflag)
     sudo(argv, self._file, self._password,
          redirect=self._qflag, verbose=self._vflag)
Exemple #3
0
    def _check_list(self, path):
        text = 'Updating RubyGems database'
        print_info(text, self._file, redirect=self._qflag)

        argv = [path, 'update', '--system']
        if self._quiet:
            argv.append('--quiet')
        if self._verbose:
            argv.append('--verbose')
        args = ' '.join(argv)
        print_scpt(args, self._file, redirect=self._qflag)
        sudo(argv,
             self._file,
             self._password,
             redirect=self._qflag,
             verbose=self._vflag)

        text = f'Checking outdated {self.desc[1]}'
        print_info(text, self._file, redirect=self._vflag)

        argv = [path, 'outdated']
        if self._quiet:
            argv.append('--quiet')
        if self._verbose:
            argv.append('--verbose')
        argv.extend(self._logging_opts)

        args = ' '.join(argv)
        print_scpt(args, self._file, redirect=self._vflag)
        with open(self._file, 'a') as file:
            file.write(f'Script started on {date()}\n')
            file.write(f'command: {args!r}\n')

        try:
            proc = subprocess.check_output(argv,
                                           stderr=make_stderr(self._vflag))
        except subprocess.SubprocessError:
            print_text(traceback.format_exc(),
                       self._file,
                       redirect=self._vflag)
            self._var__temp_pkgs = set()  # pylint: disable=attribute-defined-outside-init
        else:
            context = proc.decode()
            print_text(context, self._file, redirect=self._vflag)

            _temp_pkgs = list()
            for item in filter(lambda s: re.match(r'\w* \(.*\)', s),
                               context.strip().splitlines()):
                _temp_pkgs.append(item.split()[0])
            self._var__temp_pkgs = set(_temp_pkgs)  # pylint: disable=attribute-defined-outside-init
            # self._var__temp_pkgs = set(map(lambda s: s.split()[0], filter(None, context.strip().splitlines())))
        finally:
            with open(self._file, 'a') as file:
                file.write(f'Script done on {date()}\n')
Exemple #4
0
    def _proc_install(self, path):
        text = f'Installing specified {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        argv = [path, '-m', 'pip', 'install']
        if self._pre:
            argv.append('--pre')
        if self._user:
            argv.append('--user')
        if self._quiet:
            argv.append('--quiet')
        if self._verbose:
            argv.append('--verbose')
        argv.extend(self._install_opts)
        argv.append('')

        for package in self._var__temp_pkgs:
            argv[-1] = package
            print_scpt(argv, self._file, redirect=self._qflag)
            if sudo(argv,
                    self._file,
                    self._password,
                    timeout=self._timeout,
                    redirect=self._qflag,
                    verbose=self._vflag,
                    sethome=True):
                self._fail.append(package)
            else:
                self._pkgs.append(package)
        del self._var__temp_pkgs
Exemple #5
0
    def _proc_update(self, path):
        text = f'Upgrading outdated {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        argv = [path, 'update']
        if self._quiet:
            argv.append('--quiet')
        if self._verbose:
            argv.append('--verbose')
        argv.extend(self._update_opts)

        argc = ' '.join(argv)
        for package in self._var__temp_pkgs:
            args = f'{argc} {package}'
            print_scpt(args, self._file, redirect=self._qflag)
            yes = 'y' if self._yes else None
            if sudo(argv,
                    self._file,
                    self._password,
                    timeout=self._timeout,
                    redirect=self._qflag,
                    verbose=self._vflag,
                    yes=yes):
                self._fail.append(package)
            else:
                self._pkgs.append(package)
        del self._var__temp_pkgs
Exemple #6
0
    def _proc_install(self, path):
        text = f'Installing specified {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        argv = [path, 'install']
        if self._force:
            argv.append('--force')
        argv.extend(self._install_opts)
        argv.append('')

        for package in self._var__temp_pkgs:
            if re.match(r'\d{10}', package) is None:
                argv[1] = 'lucky'
            argv[-1] = package
            print_scpt(' '.join(argv), self._file, redirect=self._qflag)
            if sudo(argv,
                    self._file,
                    self._password,
                    timeout=self._timeout,
                    redirect=self._qflag,
                    verbose=self._vflag):
                self._fail.append(package)
            else:
                self._pkgs.append(package)
        del self._var__temp_pkgs
Exemple #7
0
    def _proc_install(self, path):
        text = f'Installing specified {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        argv = [path, '--install']
        if self._restart:
            argv.append('--restart')
        if self._quiet:
            argv.append('--quiet')
        if self._verbose:
            argv.append('--verbose')
        argv.extend(self._install_opts)

        argc = ' '.join(argv)
        for package in self._var__temp_pkgs:
            args = f'{argc} {package!r}'
            print_scpt(args, self._file, redirect=self._qflag)
            if sudo(args,
                    self._file,
                    self._password,
                    timeout=self._timeout,
                    redirect=self._qflag,
                    verbose=self._vflag):
                self._fail.append(package)
            else:
                self._pkgs.append(package)
        del self._var__temp_pkgs
Exemple #8
0
    def _proc_update(self, path):
        text = f'Upgrading outdated {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        argv = [path, '-m', 'pip', 'install', '--upgrade']
        if self._pre:
            argv.append('--pre')
        if self._user:
            argv.append('--user')
        if self._quiet:
            argv.append('--quiet')
        if self._verbose:
            argv.append('--verbose')
        argv.extend(self._update_opts)

        argc = ' '.join(argv)
        for package in self._var__temp_pkgs:
            args = f'{argc} {package}'
            print_scpt(args, self._file, redirect=self._qflag)
            if sudo(args, self._file, self._password, timeout=self._timeout,
                    redirect=self._qflag, verbose=self._vflag, sethome=True):
                self._fail.append(package)
            else:
                self._pkgs.append(package)
        del self._var__temp_pkgs
Exemple #9
0
    def _proc_update(self, path):
        text = f'Upgrading outdated {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        if self._recommend:
            _temp_pkgs = self._var__rcmd_pkgs
        else:
            _temp_pkgs = self._var__rcmd_pkgs | self._var__norm_pkgs

        argv = [path, '--install', '--no-scan']
        if self._restart:
            argv.append('--restart')
        if self._quiet:
            argv.append('--quiet')
        argv.extend(self._update_opts)

        argc = ' '.join(argv)
        for package in _temp_pkgs:
            args = f'{argc} {package!r}'
            print_scpt(args, self._file, redirect=self._qflag)
            if sudo(args,
                    self._file,
                    self._password,
                    timeout=self._timeout,
                    redirect=self._qflag,
                    verbose=self._vflag):
                self._fail.append(package)
            else:
                self._pkgs.append(package)
        del self._var__rcmd_pkgs
        del self._var__norm_pkgs
        del self._var__temp_pkgs
Exemple #10
0
    def _proc_update(self, path):
        text = f'Upgrading outdated {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        argv = [path, 'upgrade']
        argv.extend(self._update_opts)

        argc = ' '.join(argv)
        for package in self._var__temp_pkgs:
            code = self._var__dict_pkgs[package]
            print_scpt(f'{argc} {package} [{code}]',
                       self._file,
                       redirect=self._qflag)
            if sudo(f'{argc} {code}',
                    self._file,
                    self._password,
                    timeout=self._timeout,
                    redirect=self._qflag,
                    verbose=self._vflag):
                self._fail.append(package)
            else:
                self._pkgs.append(package)
        del self._var__temp_pkgs
Exemple #11
0
    def _proc_fixmissing(self, path):
        text = f'Checking broken {self.desc[0]} dependencies'
        print_info(text, self._file, redirect=self._qflag)

        def _proc_check():
            argv = [path, '-m', 'pip', 'check']
            args = ' '.join(argv)
            print_scpt(args, self._file, redirect=self._vflag)
            with open(self._file, 'a') as file:
                file.write(f'Script started on {date()}\n')
                file.write(f'command: {args!r}\n')

            _deps_pkgs = list()
            try:  # pip check exits with a non-zero status if any packages are missing dependencies
                proc = subprocess.run(argv,
                                      stdout=subprocess.PIPE,
                                      stderr=make_stderr(self._vflag))
            except subprocess.SubprocessError:
                print_text(traceback.format_exc(),
                           self._file,
                           redirect=self._vflag)
            else:
                context = proc.stdout.decode()
                print_text(context, self._file, redirect=self._vflag)

                for line in filter(None, context.strip().splitlines()):
                    if line == 'No broken requirements found.':
                        return set()
                    if 'which is not installed' in line:
                        _deps_pkgs.append(line.split()[3][:-1])
                    else:
                        _deps_pkgs.append(line.split()[4][:-1])
            finally:
                with open(self._file, 'a') as file:
                    file.write(f'Script done on {date()}\n')
            return set(_deps_pkgs)

        def _proc_confirm():
            pkgs = f'{reset}, {bold}'.join(_deps_pkgs)
            text = f'macdaily-{self.cmd}: {yellow}pip{reset}: found broken dependencies: {bold}{pkgs}{reset}'
            print_term(text, self._file, redirect=self._qflag)
            if self._yes or self._quiet:
                return True
            while True:
                ans = get_input(
                    self._confirm,
                    'Would you like to reinstall?',
                    prefix=
                    f'Found broken dependencies: {", ".join(_deps_pkgs)}.\n\n',
                    suffix=f' ({green}y{reset}/{red}N{reset}) ')
                if re.match(r'[yY]', ans):
                    return True
                if re.match(r'[nN]', ans):
                    return False
                print('Invalid input.', file=sys.stderr)

        _deps_pkgs = _proc_check() - self._ignore
        if not _deps_pkgs:
            text = f'macdaily-{self.cmd}: {green}pip{reset}: no broken dependencies'
            print_term(text, self._file, redirect=self._qflag)
            return

        text = f'Fixing broken {self.desc[0]} dependencies'
        print_info(text, self._file, redirect=self._qflag)

        if _proc_confirm():
            argv = [path, '-m', 'pip', 'reinstall']
            if self._quiet:
                argv.append('--quiet')
            if self._verbose:
                argv.append('--verbose')
            args = ' '.join(argv)

            _done_pkgs = set()
            while _deps_pkgs:
                for package in _deps_pkgs:
                    real_name = re.split(r'[<>=!]', package, maxsplit=1)[0]
                    print_scpt(f'{args} {package}',
                               self._file,
                               redirect=self._qflag)

                    temp = copy.copy(argv)
                    temp[3] = 'uninstall'
                    print_scpt(f'{" ".join(temp)} {real_name}',
                               self._file,
                               redirect=self._qflag)
                    sudo(f'{path} -m pip uninstall {real_name} --yes',
                         self._file,
                         self._password,
                         redirect=self._qflag,
                         verbose=self._vflag,
                         sethome=True,
                         timeout=self._timeout)

                    temp = copy.copy(argv)
                    temp[3] = 'install'
                    print_scpt(f'{" ".join(temp)} {package}',
                               self._file,
                               redirect=self._qflag)
                    if not sudo(f'{path} -m pip install {package}',
                                self._file,
                                self._password,
                                redirect=self._qflag,
                                verbose=self._vflag,
                                sethome=True,
                                timeout=self._timeout):
                        with contextlib.suppress(ValueError):
                            self._pkgs.remove(real_name)
                _done_pkgs |= _deps_pkgs
                _deps_pkgs = _proc_check() - _done_pkgs - self._ignore
            text = f'macdaily-{self.cmd}: {green}pip{reset}: all broken dependencies fixed'
        else:
            text = f'macdaily-{self.cmd}: {red}pip{reset}: all broken dependencies remain'
        print_term(text, self._file, redirect=self._qflag)
Exemple #12
0
    def _proc_cleanup(self):
        if self._no_cleanup:
            return

        text = 'Pruning caches and archives'
        print_info(text, self._file, redirect=self._qflag)

        argv = ['brew', 'cleanup']
        if self._verbose:
            argv.append('--verbose')
        if self._quiet:
            argv.append('--quiet')
        args = ' '.join(argv)
        print_scpt(args, self._file, redirect=self._qflag)

        flag = (not os.path.isdir(self._disk_dir))
        for path in self._exec:
            logs = os.path.expanduser('~/Library/Logs/Homebrew/')
            if os.path.isdir(logs):
                argv = [path, 'logs', 'cleanup']
                if self._verbose:
                    argv.append('--verbose')
                if self._quiet:
                    argv.append('--quiet')
                args = ' '.join(argv)
                print_scpt(args, self._file, redirect=self._vflag)

                argv = ['rm', '-rf']
                if self._verbose:
                    argv.append('-v')
                argv.append(logs)
                sudo(argv,
                     self._file,
                     self._password,
                     redirect=self._qflag,
                     verbose=self._vflag)

            # if external disk not attached
            if flag:
                continue

            argv = [path, '--cache']
            args = ' '.join(argv)
            print_scpt(args, self._file, redirect=self._vflag)
            with open(self._file, 'a') as file:
                file.write(f'Script started on {date()}\n')
                file.write(f'command: {args!r}\n')

            fail = False
            try:
                proc = subprocess.check_output(argv,
                                               stderr=make_stderr(self._vflag))
            except subprocess.CalledProcessError:
                print_text(traceback.format_exc(),
                           self._file,
                           redirect=self._vflag)
                fail = True
            else:
                context = proc.decode()
                print_text(context, self._file, redirect=self._vflag)
            finally:
                with open(self._file, 'a') as file:
                    file.write(f'Script done on {date()}\n')
            if fail:
                continue

            cache = context.strip()
            if os.path.isdir(cache):
                argv = [path, 'caches', 'archive']
                if self._verbose:
                    argv.append('--verbose')
                if self._quiet:
                    argv.append('--quiet')
                args = ' '.join(argv)
                print_scpt(args, self._file, redirect=self._qflag)

                def _move(root, stem):
                    arch = os.path.join(self._disk_dir, stem)
                    pathlib.Path(arch).mkdir(parents=True, exist_ok=True)

                    file_list = list()
                    for name in os.listdir(root):
                        path = os.path.join(root, name)
                        if os.path.isdir(path):
                            if name != 'Cask':
                                file_list.extend(
                                    _move(path, os.path.join(stem, name)))
                        elif os.path.splitext(name)[
                                1] != '.incomplete' and path not in cask_list:  # pylint: disable=cell-var-from-loop
                            try:
                                shutil.move(path, os.path.join(arch, name))
                            except (shutil.Error, FileExistsError):
                                os.remove(path)
                            # with contextlib.suppress(shutil.Error, FileExistsError):
                            #     shutil.move(path, os.path.join(arch, name))
                            file_list.append(path)
                    return file_list

                cask_list = [
                    os.path.realpath(name)
                    for name in glob.glob(os.path.join(cache, 'Cask/*'))
                ]
                file_list = _move(cache, 'Homebrew')
                print_text(os.linesep.join(sorted(file_list)),
                           self._file,
                           redirect=self._vflag)

        if flag:
            text = (
                f'macdaily-{self.cmd}: {yellow}brew{reset}: '
                f'archive directory {bold}{self._disk_dir}{reset} not found')
            print_term(text, self._file, redirect=self._vflag)
Exemple #13
0
    def _proc_uninstall(self, path):
        text = f'Uninstalling specified {self.desc[1]}'
        print_info(text, self._file, redirect=self._qflag)

        def _proc_dependency(package, _know_pkgs):
            _deps_pkgs = {package}
            if self._ignore_deps:
                return _deps_pkgs

            text = f'Searching dependencies of {self.desc[0]} {under}{package}{reset}'
            print_info(text, self._file, redirect=self._vflag)

            argv = [path, '-m', 'pip', 'show', package]
            args = ' '.join(argv)
            print_scpt(args, self._file, redirect=self._vflag)
            with open(self._file, 'a') as file:
                file.write(f'Script started on {date()}\n')
                file.write(f'command: {args!r}\n')

            _temp_pkgs = set()
            try:
                proc = subprocess.check_output(argv,
                                               stderr=make_stderr(self._vflag))
            except subprocess.CalledProcessError:
                print_text(traceback.format_exc(),
                           self._file,
                           redirect=self._vflag)
            else:
                context = proc.decode()
                print_text(context, self._file, redirect=self._vflag)

                for line in filter(lambda s: s.startswith('Requires: '),
                                   context.strip().splitlines()):
                    _temp_pkgs = set(
                        map(lambda s: s.rstrip(','),
                            line.split()[1:])) - _know_pkgs
                    _deps_pkgs |= _temp_pkgs
                    break
            finally:
                with open(self._file, 'a') as file:
                    file.write(f'Script done on {date()}\n')

            for pkg in _temp_pkgs:
                _temp_pkgs = _proc_dependency(pkg, _know_pkgs)
                _deps_pkgs |= _temp_pkgs
                _know_pkgs |= _temp_pkgs
            return _deps_pkgs

        argv = [path, '-m', 'pip', 'uninstall', '--yes']
        if self._quiet:
            argv.append('--quiet')
        if self._verbose:
            argv.append('--verbose')
        if self._dry_run:
            argv.append('--dry-run')
        argv.extend(self._uninstall_opts)

        argv.append('')
        _done_pkgs = set()
        _know_pkgs = self._ignore | {'pip', 'wheel', 'setuptools'}
        for item in self._var__temp_pkgs:
            _deps_pkgs = _proc_dependency(item, _know_pkgs)
            _know_pkgs |= _deps_pkgs
            for package in (_deps_pkgs - _done_pkgs):  # pylint: disable=superfluous-parens
                argv[-1] = package
                print_scpt(' '.join(argv), self._file, redirect=self._qflag)
                if self._dry_run:
                    continue
                if sudo(argv,
                        self._file,
                        self._password,
                        sethome=True,
                        timeout=self._timeout,
                        redirect=self._qflag,
                        verbose=self._vflag):
                    self._fail.append(package)
                else:
                    self._pkgs.append(package)
            _done_pkgs |= _deps_pkgs
        del self._var__temp_pkgs