Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 56 additions & 9 deletions pacman.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
python-pacman - (c) Jacob Cook 2015
Licensed under GPLv3
"""

import subprocess, os, shutil
import subprocess, os, shutil, re
from urllib import request
from shlex import quote

Expand Down Expand Up @@ -254,15 +253,63 @@ def is_aur(package):
return False


def pacman(flags, pkgs=[], eflgs=[], pacman_bin=__PACMAN_BIN):
def contents_of(packages):
"""Get list of files and directories that are owned by these packages"""
s = pacman("-Ql", packages)
if s["code"] != 0:
raise Exception("Failed to get contents: {0}".format(s["stderr"]))
ret = dict()
for x in s["stdout"].split('\n'):
if not x:
continue
space = x.find(' ')
package = x[:space]
file = x[space + 1:]
if package not in ret:
ret[package] = []
ret[package].append(file)

if type(packages) == str:
return ret[packages] if packages in ret else None
Copy link
Author

@mattalxndr mattalxndr Feb 9, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returns a single file list if passed a single package as a string. If passed a list of packages (even if the list contains just one element), the result will be grouped by package name.

The other new function contains a similar functionality.


return ret


def owner_of(files, include_version=True):
"""Get owner of these files and directories"""
s = pacman("-Qo", files)
if s["code"] != 0:
raise Exception("Failed to get owner: {0}".format(s["stderr"]))
owner_re = re.compile(r'(.+?) is owned by ([^ ]+) (.*)')
ret = dict()
for x in s["stdout"].split('\n'):
if not x:
continue
matches = owner_re.match(x)
if not matches:
continue
file = matches.group(1)
package = matches.group(2)
version = matches.group(3)
ret[file] = (package, version) if include_version else package

if type(files) == str:
return ret[files] if files in ret else None

return ret


def pacman(flags, targets=[], eflgs=[], pacman_bin=__PACMAN_BIN):
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed pkgs parameter to targets, since it also now holds file paths (owner_of())

"""Subprocess wrapper, get all data"""
if not pkgs:
cmd = [pacman_bin, "--noconfirm", flags]
elif type(pkgs) == list:
cmd = [pacman_bin, "--noconfirm", flags]
cmd += [quote(s) for s in pkgs]
if type(flags) != list:
flags = [flags]
flags = ['--noconfirm'] + flags
if not targets:
cmd = [pacman_bin] + flags
elif type(targets) == list:
cmd = [pacman_bin] + flags + [quote(s) for s in targets]
else:
cmd = [pacman_bin, "--noconfirm", flags, pkgs]
cmd = [pacman_bin] + flags + [targets]
if eflgs and any(eflgs):
eflgs = [x for x in eflgs if x]
cmd += eflgs
Expand Down