about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--README2
-rwxr-xr-xxlocate51
2 files changed, 45 insertions, 8 deletions
diff --git a/README b/README
index ed21973..89925d4 100644
--- a/README
+++ b/README
@@ -19,7 +19,7 @@ https://github.com/voidlinux/xbps
   xilog [PATTERN] - list installed packages by install-date
   xlg PKG - open short commit log for XBPS template
   xlint TEMPLATE - scan XBPS template for common mistakes
-  xlocate [-u | PATTERN] - locate files in all XBPS packages
+  xlocate [-u | -g | PATTERN] - locate files in all XBPS packages
   xlog PKG - open commit log for XBPS template
   xls PKGS... - list files contained in PKGS (including binpkgs)
   xmandoc MANPAGE - read manpage of possibly not installed package
diff --git a/xlocate b/xlocate
index 472045f..2db7d72 100755
--- a/xlocate
+++ b/xlocate
@@ -1,14 +1,16 @@
 #!/bin/sh
-# xlocate [-u | PATTERN] - locate files in all XBPS packages
+# xlocate [-u | -g | PATTERN] - locate files in all XBPS packages
 
 : ${XLOCATE_DB:=~/.cache/xlocate.db}
+: ${XLOCATE_GIT:=~/.cache/xlocate.git}
+
+if command -v pv >/dev/null; then
+	PROGRESS="pv -l"
+else
+	PROGRESS=cat
+fi
 
 xupdatedb() {
-	if command -v pv >/dev/null; then
-		PROGRESS="pv -l"
-	else
-		PROGRESS=cat
-	fi
 	echo "xlocate: reindexing database..." 1>&2
 	xbps-query -Ro '*' |
 		$PROGRESS |
@@ -16,12 +18,47 @@ xupdatedb() {
 		/usr/libexec/frcode >"$XLOCATE_DB"
 }
 
+xupdategit() {
+	set -e
+	DIR=$(mktemp -dt xlocate.XXXXXX)
+	DIR=$(realpath -e "$DIR")
+	git init -q $DIR
+	cd $DIR
+	xbps-query -M -Ro '*' | $PROGRESS | awk '
+		$0 ~ ": " {
+			s = index($0, ": ")
+			pkg = substr($0, 1, s-1)
+			file = substr($0, s+2)
+			sub(" *\\([^)]*\\)$", "", file)
+			print file >>pkg
+	       	}'
+	printf '%s\n' ./* |
+		LC_ALL= xargs -d'\n' -I'{}' -n1 -P "$(nproc)" -r -- \
+			sort -o {} {}
+	git add ./*
+	git commit -q -m 'xupdategit'
+	git repack -ad
+	rm -rf "$XLOCATE_GIT" .git/COMMIT_EDITMSG .git/description \
+		.git/index .git/hooks .git/logs
+	mv .git "$XLOCATE_GIT"
+	rm -rf "$DIR"
+}
+
 if [ "$1" = -u ]; then
 	xupdatedb
 	exit $?
+elif [ "$1" = -g ]; then
+	xupdategit
+	exit $?
 fi
 
-if [ -e "$XLOCATE_DB" ]; then
+if [ -d "$XLOCATE_GIT" ]; then
+	if find /var/db/xbps/ -name '*repodata' -newer "$XLOCATE_GIT/HEAD" | grep -q .; then
+		echo "xlocate: database outdated, please run xlocate -g." 1>&2
+	fi
+	git --git-dir="$XLOCATE_GIT" grep "$@" @ |
+		sed 's/^@://; s/:/\t/' | grep .
+elif [ -e "$XLOCATE_DB" ]; then
 	if find /var/db/xbps/ -name '*repodata' -newer "$XLOCATE_DB" | grep -q .; then
 		echo "xlocate: database outdated, please run xlocate -u." 1>&2
 	fi