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)
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)
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')
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
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
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
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
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
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
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
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)
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)
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