View previous topic :: View next topic |
Author |
Message |
haceye Apprentice
Joined: 22 May 2003 Posts: 187 Location: Stuttgart, Germany
|
Posted: Tue Jul 08, 2003 9:05 pm Post subject: |
|
|
Hi,
Pietschy wrote: | Ich denke aber das es im Portage einiges an geschwindigkeit zu verbessern gibt, zB das Script 5 Posts oben drüber. Hey man ich liebe es. |
Danke für das Lob. Ich werde das Script noch ein wenig weiterentwickeln:
* "emerge -s" - kompatibilität
* Suche auch in Description (wie emerge -S)
* Index schneller erstellen?
* 2 Bugs entfernen
werde es dann irgendwann hier posten.
David _________________ faster 'emerge -s'? emerge esearch |
|
Back to top |
|
|
Genone Retired Dev
Joined: 14 Mar 2003 Posts: 9555 Location: beyond the rim
|
Posted: Wed Jul 09, 2003 2:24 am Post subject: |
|
|
Ok, wie der Zufall so will hab ich gestern auch grade an einem Suchskript gebastelt. Die Ausgabe ist zwar primitiv (enthält u.a. keine Versionsnummern, da nur die letzte Version indiziert wird), versteht keine eclasses, das Updaten der Indexdatei dauert zu lange und es könnte noch Probleme mit bestimmten Zeichen in DESCRIPTION geben, die dann meine grep Expressions verwirren, dafür ist es extrem schnell (die meiste Zeit geht für die Ausgabe drauf ), reiner Bash Code, fehlertolerant (ich benutz z.B. RSYNC_EXCLUDE), per Patch integriert in emerge und IMO benutzerfreundlich.
Der integriert die --fastsearch Option in emerge um das Skript zu benutzen und das feastsearch Feature in make.conf um den Index bei jedem emerge sync upzudaten (nicht zu empfehlen wenn man emerge sync immer manuell macht). Um den Patch zu benutzen muss das Skript als /usr/lib/portage/bin/fastsearch abgespeichert sein (oder man ändert den Patch um), die Option taucht aber nicht bei emerge --help auf, dafür müsste man noch emergehelp.py ändern.
Skript und Patch gibts unter http://gentoo.devel-net.org/download/, ich poste die auch mal hier (s.u.), der Patch könnte aber bei copy+paste Probleme mit den Tabs machen.
Was die Performanceprobleme von portage angeht, ein grosses Problem ist die Startzeit. Ich hab mal Messungen angestellt mit meinem Skript in emerge und der normalen Suche von portage, der Unterschied ist ca. 2 Sekunden. allerdings macht es ca. 5 Sekunden Unterschied zwischen meinem Skript standalone und in emerge integriert (alle Messungen auf meinem P2 233 Server). Bei einer Suche in DESCRIPTION macht sich das Fehlen eines Indexes stärker bemerkbar, da braucht portage 1-2 Minuten, mein Skript ca. 1 Sekunde. Diese Probleme sind bekannt und carpaski (der portage Maintainer) arbeitet auch dadran, der Metadaten Cache wird z.B. bald in einer DB abgelegt (nix SQL, Berkley DB oder so). Es gibt IIRC auf http://breakmygentoo.net ein Projekt um PostgreSQL als portage backend zu benutzen, könnte interessant sein das mal mit dem aktuellen Portage zu vergleichen (Performance mässig).
Langfristig denke ich wird man nicht um um ein Rewrite von portage herumkommen (ob jetzt in Python oder sonst irgendeiner Sparche), da der
aktuelle Ansatz IMO zu monolitisch ist um in Zukunft wartbar zu sein (das verursacht u.a. auch die langen Startzeiten von emerge). Meine Idee ist ein Kern, der verschiedene Front- und Backends als Module realisiert, so dass der User sich aussuchen kann, ob er eine schnelle SQL Datenbank oder z.B. das jetzige (langsame) System als Backend haben will. Wenn man noch weiter geht könnte man sogar verschiedene Backends für Unterschiedliche Daten benutzen, z.B. Ebuilds im Dateisystem und Metadaten (Name, Description, Maintainer, ...) in einer DB, aber bis dahin muss noch sehr viel Code geschrieben werden.
Ok, hier jetzt das Suchskript:
fastsearch:
Code: | #!/bin/bash
# a lightning fast search script for the portage tree
# (C) 2003 Marius Mauch
source /etc/make.conf # to get PORTDIR and PORTDIR_OVERLAY
SEARCH_DB=/var/cache/edb/fastsearch_db # the name of the database file
PROG_NAME=$(basename $0) # the name of this script for use in help messages
# print a usage message
print_help()
{
echo "Usage:"
echo "${PROG_NAME} -h | --help | -u | --update | <mode-option> <pattern> <grep-options>"
echo -e "\t-h | --help: print this usage message"
echo -e "\t-u | --update: (re-)create the search database"
echo "mode-option is one of:"
echo -e "\t-d | --description: search in descriptions"
echo -e "\t-n | --name: search in package names"
echo -e "\t-l | --long-desc: search in long descriptions"
echo -e "\t-a | --all: search in all fields"
echo 'pattern is a grep regular expression to search for (^ and $ might not work as expected)'
echo "grep-option is one or more options for grep to manipulate the search"
}
# imports the names and descriptions of all packages in the given directory
# into the database.
#
# $1: directory to import
import_category()
{
if [ -d "${1}" ]; then
echo " reading category ${1} ..."
for P in "${1}"/*; do
EBUILD=$(ls -v ${P}/*.ebuild 2> /dev/null | tail -1)
if [ ${EBUILD} ]; then
# get only the variable assignment and strip the quotes,
# might cause problems if the description itself contains quotes
DESCRIPTION=$(grep DESCRIPTION\= ${EBUILD} | cut -d\= -f 2 | cut -d\" -f 2)
printf "%-30s%s\n" "${P}::" "${DESCRIPTION}" >> "${SEARCH_DB}.new"
else
echo " No ebuilds for package ${P}, skipping"
fi
done
else
# some categories might have entries in the categories file
# but no corresponding directory caused by RSYNC_EXCLUDE or other
# user modifications
echo " No directory for category ${1}, skipping"
fi
}
# the main script starts here
case "$1" in
-h | --help)
print_help
exit 0
;;
-n | --name)
MODE=SEARCH
FIELD=NAME
;;
-d | --description)
MODE=SEARCH
FIELD=DESC
;;
-s | --search)
MODE=SEARCH
FIELD=ALL
;;
-l | --long)
# reserved for future versions
echo "not implemented yet"
exit 3
;;
-u | --update)
MODE=UPDATE
;;
-*)
echo "I don't know this option: $1"
print_help
exit 1
;;
*)
if [ -z "${1}" ]; then
echo "I need at least one option"
print_help
exit 1
else
echo "No mode option given, assuming name search"
MODE=SEARCH
FIELD=NAME
set - "${1}" "${1}" # set $2=$1
fi
;;
esac
if [ "$MODE" == "SEARCH" -a -z "$2" ]; then
echo "I need a pattern to search for"
print_help
exit 1
fi
if [ "${MODE}" == "UPDATE" ]; then
[ -d $(dirname "${SEARCH_DB}") ] || mkdir -p $(dirname "${SEARCH_DB}")
echo "Updating database ..."
rm -f "${SEARCH_DB}.new"
echo "importing packages from ${PORTDIR} ..."
cd "${PORTDIR}"
for C in $(grep -v packages profiles/categories); do
import_category "${C}"
done
echo "importing packages from ${PORTDIR_OVERLAY} ..."
cd "${PORTDIR_OVERLAY}"
for C in *; do
import_category "${C}"
done
mv -f "${SEARCH_DB}.new" "${SEARCH_DB}"
echo "Finished updating"
exit
fi
if [ ! -f "${SEARCH_DB}" ]; then
echo "no search database found, you should create it with \"${PROG_NAME} --update\""
echo "see \"${PROG_NAME} --help\" for a description of all options"
exit 2
fi
PATTERN=$2
shift
shift
GREP_OPTIONS="${GREP_OPTIONS} $*"
case "${FIELD}" in
NAME)
grep ${GREP_OPTIONS} "${PATTERN/^//}.*::" "${SEARCH_DB}"
;;
DESC)
grep ${GREP_OPTIONS} "::.*${PATTERN}" "${SEARCH_DB}"
;;
ALL)
grep ${GREP_OPTIONS} "${PATTERN}" "${SEARCH_DB}"
;;
esac
[ "$?" != "0" ] && echo "no matching entries found" |
emerge Patch für portage 2.0.48-r1:
Code: | --- emerge.old 2003-06-08 13:20:46.000000000 +0200
+++ emerge.new 2003-07-08 23:24:32.000000000 +0200
@@ -40,6 +40,7 @@
"--onlydeps", "--pretend",
"--quiet", "--resume",
"--searchdesc", "--selective",
+"--fastsearch",
"--skipfirst",
"--update", "--upgradeonly",
"--usepkg", "--usepkgonly",
@@ -156,6 +157,9 @@
# Also allow -S to invoke search action (-sS)
if ("--searchdesc" in myopts) and (not myaction):
myaction = "search"
+# --fastsearch also implies search
+if ("--searchdesc" in myopts) and (not myaction):
+ myaction = "search"
# Also allow -K to apply --usepkg/-k
if ("--usepkgonly" in myopts) and not ("--usepkg" in myopts):
@@ -1683,6 +1687,9 @@
portage.spawn("chmod -R g+rw "+portage.dbcachedir, free=1)
sys.stdout.write("\b\b ...done!\n\n")
sys.stdout.flush()
+ if "fastsearch" in portage.features:
+ print "\n>>> Building fastsearch database ..."
+ portage.spawn("/usr/lib/portage/bin/fastsearch -u", free=1)
portage.portageexit()
reload(portage)
@@ -1739,15 +1746,22 @@
if not myfiles:
print "emerge: no search terms provided."
else:
-
- searchinstance = search()
- for mysearch in myfiles:
- try:
- searchinstance.execute(mysearch)
- except re.error, comment:
- print "\n!!! Regular expression error in \"%s\": %s" % ( mysearch, comment )
- sys.exit(1)
- searchinstance.output()
+ if "--fastsearch" in myopts or "fastsearch" in portage.features:
+ for mysearch in myfiles:
+ if "--searchdesc" in myopts:
+ mymode = "-d "
+ else:
+ mymode = "-n "
+ portage.spawn("/usr/lib/portage/bin/fastsearch " + mymode + mysearch + " -i")
+ else:
+ searchinstance = search()
+ for mysearch in myfiles:
+ try:
+ searchinstance.execute(mysearch)
+ except re.error, comment:
+ print "\n!!! Regular expression error in \"%s\": %s" % ( mysearch, comment )
+ sys.exit(1)
+ searchinstance.output()
elif "inject"==myaction:
if not myfiles:
print "emerge: please specify at least one cat/pkg-ver to inject." |
So, auch das längste Posting muss mal zu Ende sein. |
|
Back to top |
|
|
aias n00b
Joined: 02 Apr 2003 Posts: 41
|
Posted: Thu Jul 10, 2003 7:47 am Post subject: |
|
|
kennt einer das programm kdeportage?
funktioniert das vom ansatz her genauso wie die obigen suchscripte? |
|
Back to top |
|
|
dertobi123 Retired Dev
Joined: 19 Nov 2002 Posts: 2679 Location: Oberhausen, Germany
|
Posted: Thu Jul 10, 2003 8:30 am Post subject: |
|
|
Nö, ist "nur" nen grafischer Aufsatz für's Portage, aber wer braucht sowas schon ....
Gruß Tobias |
|
Back to top |
|
|
CHerzog Tux's lil' helper
Joined: 13 Jul 2002 Posts: 108 Location: Germany
|
Posted: Thu Jul 10, 2003 9:02 am Post subject: |
|
|
dertobi123 wrote: | Nö, ist "nur" nen grafischer Aufsatz für's Portage, aber wer braucht sowas schon .... |
Ich nutze das um einfach mal den Portagetree zu durchstöbern.
Vorteile:
KDEPortage ist nett, da es den Baum anzeigt und mir sofort alle wichtigen Informationen zum Paket anzeigt.
Ein Klick und ich kann mir gleich die Homepage ansehen.
Ich sehe die Histori, das Changelog, etc - wie gesagt: Alles auf einen Blick.
Um Programme zu installieren nutze ich dann aber wieder die Shell. Ist mir einfach sicherer.
Christian |
|
Back to top |
|
|
dertobi123 Retired Dev
Joined: 19 Nov 2002 Posts: 2679 Location: Oberhausen, Germany
|
Posted: Thu Jul 10, 2003 9:42 am Post subject: |
|
|
Quote: | Um Programme zu installieren nutze ich dann aber wieder die Shell. Ist mir einfach sicherer. |
Genau das ist das Problem; zumindest bei meinen bisherigen Versuchen gewesen (Sind schon ne Weile her) ... Das Ding läuft einfach nicht stabil.
Gruß Tobias |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|