Hilfe - Namensgebung

Wow, distviper ist ein echt cooler Vorschlag. Wenn ich nicht bis morgen etwas besseres höre bleibe ich dabei.
 
mir gefällt auch noch distex (in unterschiedlichen Formen mit jeweils ex, etwa auch distsex oder mit - oder _). Eine Abart mit Anspielung auf Deutsch wäre dann distwex. Und leicht anders angespielt mit disthex (hex ist auch der Name, nunja, für das Pendant des Computers auf der Discworld in der unsichtbaren Universität).
EDIT: Da sehe ich gerade, distshex mit dem sh als Hinweis af ein script und shex als lautspiel zu check's und last, habe ich irgendwie auch wieder meinen sex drinnen!

Aber am stylichsten (oh Gott, die Kinder sagen das dauernd, wie schreibt sich denn das?) finde ich noch immer distviper.
 
Ich habe mich jetzt auf distviper festgelegt, das hat's mir einfach angetan.

@pita234a
Willst du deinen richtigen Namen, deinen Forenaccount oder beides in der THANKS-Datei haben?

So, jetzt ist Beta-Zeit. Wer das Ding testen will weiß hoffentlich was damit anzufangen ist:

Code:
DISTVIPER(1)            FreeBSD General Commands Manual           DISTVIPER(1)

NAME
     distviper — wipe outdated files from the FreeBSD ports distdir

SYNOPSIS
     distviper [−dhiqv] [mode]

DESCRIPTION
     The distviper script removes outdated files in %%DISTDIR%%. To achieve
     this it reads all files named distinfo from %%PORTSDIR%% and creates a
     list of files to keep if they should be encountered. Every file not in
     this list is deleted.

     The creation of the list of files to keep can take very long, if the
     ports tree is not cached in memory. Because of this there is a fast mode
     that will only use distinfo files from installed ports.

OPTIONS
     The following options are available:

     −d −−demo
             The program is run in demo mode. The program acts as if it would
             operate normally, but does not remove any files.

     −h −−help
             Displays the available options.

     −i −−interactvie
             This option prompts for confirmation before deleting a file.  It
             is ignored in demo mode.

     −q −−quiet
             Supresses delete messages.

     −v −−verbose
             Makes the script talkative about what is currently going on.

     mode    There are currently two modes available. By default the thorough
             mode is selected, which scans all distinfo files. The fast mode
             only scans distinfo files for installed ports.

NOTES
     The fast mode is often sufficient. There are two cases when this does not
     apply.

     If one intends to keep distfiles for ports that are not currently
     installed, like on a dedicated build machine, the (default) thorough mode
     is the mode of choice.

     The other case is, when a port fetches its files by having a dependency
     on the fetch target of another port and this other port is not installed.
     This is a very rare case, though.

EXAMPLES
     To run the script in thorough mode use the following command line.

          distviper

     The demo mode can be used to check which files would be removed in fast
     mode.

          distviper ‐d fast

     To be prompted for confirmation and using fast mode the following line
     can be used.

          distviper ‐i fast

EXIT CODES
     1       An unknown parameter has been supplied.

     2       An unknown mode command has been supplied.

     3       More than one mode commands have been supplied.

COMPATIBILITY
     The script has been tested on FreeBSD 7.1‐STABLE

SEE ALSO
     bsdadminscripts(1)

HISTORY
     The distviper script first appeared in the bsdadminscripts‐5.0 collec‐
     tion.

AUTHOR
     Dominic Fandrey <kamikaze@bsdforen.de>

FreeBSD 7.1                    January 27, 2009                    FreeBSD 7.1

Code:
#!/bin/sh
#
# Copyright (c) 2009
# Dominic Fandrey <kamikaze@bsdforen.de>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

version=0.99

name=distviper

verbose=
demo=
quiet=
interactive=

# Determine portsdir
portsdir=$(make -V PORTSDIR -f /usr/share/mk/bsd.port.mk)
if [ ! -d $portsdir ]; then
        echo "The PORTSDIR '$portsdir' is missing."
        exit 1
fi

# Determine distdir
distdir=$(make -V DISTDIR -f /usr/share/mk/bsd.port.mk)
if [ ! -d $portsdir ]; then
        echo "The DISTDIR '$distdir' is missing."
        exit 2
fi

# Extract file from distinfo.
extractFileCmd="sed -E -e 's/^[^(]*\(//1' -e 's/\)[^)]*$//1'"

# Display help.
printHelp() {
	echo "$name v$version
usage:	$name [-d] [-h] [-i] [-q] [-v] [fast|thorough]"
}

#
# Handle parameters.
#
# @param $1
#	The parameter to handle.
# @param $verbose
#	Is set to create verbose output.
# @param $demo
#	Is set to only print the output that would occur.
# @param $quiet
#	Is set to act without creating any output.
# @return
#	Returns 0 if the processed parameter was a valid parameter,
#	returns 1 if not.
#
readParams() {
	case "$1" in
		"-d" | "--demo")
			demo=1
			return 0
		;;
		"-h" | "--help")
			printHelp
			return 0
		;;
		"-i" | "--interactive")
			interactive=-i
			return 0
		;;
		"-q" | "--quiet")
			quiet=1
			return 0
		;;
		"-v" | "--verbose")
			verbose=1
			return 0
		;;
		-? | --*)
			return 1
		;;
		-*)
			# Split parameters.
			# first parameter
			readParams "${1%${1#-?}}" || return $?
			# remaining parameters
			readParams "-${1#-?}" || return $?
		;;
		*)
			return 1
		;;
	esac
}

#
# This algorithm outputs the distfiles of installed ports. If a port downloads
# a distfile through depending on the fetch target of another port, it
# is missed, in case that other port is not installed as well.
#
# @param $portsdir
#	The direcotry holding the ports tree.
#
getDistFiles_fast() {
	for port in $(pkg_info -qoa); {
		if [ -e "$portsdir/$port/distinfo" ]; then
			eval "$extractFileCmd '$portsdir/$port/distinfo'" | uniq
		fi
	}
}

#
# This algorithm outputs the distfiles of all ports.
#
# @param $portsdir
#	The direcotry holding the ports tree.
#
getDistFiles_thorough() {
	find "$portsdir" -type f -name distinfo | \
		eval "xargs $extractFileCmd" | uniq
}

# The current parameter processing stage.
stage=params

# The selected algorithm for finding distfiles to keep.
algorithm=thorough

# Parse the command line parameters.
for command; {
	# Read parameters until an unknown one is encountered.
	# In that case switch into command stage.
	if [ "$stage" = "params" ]; then
		if ! readParams "$command"; then
			stage=command
		fi
	fi

	# All parameters have been read, now either nothing or a mode
	# command should occur.
	if [ "$stage" = "command" ]; then
		stage=end
		case "$command" in
			thorough | fast)
				algorithm="$command"
			;;
			-*)
				echo "$name: Unknown parameter '$command'" \
					"encountered, exiting." 1>&2
				return 1
			;;
			*)
				echo "$name: Unknown command '$command'" \
					"encountered, exiting." 1>&2
				return 2
			;;
		esac
		# Skip everything following and continue with the next
		# argument.
		continue
	fi

	# Still being in the loop at this stage means unexpected parameters
	# have been encountered.
	if [ "$stage" = "end" ]; then
		echo "$name: The command '$command' is not allowed here, only" \
			"one command at a time is permitted." 1>&2
		return 3
	fi
}

# Check for inprobable options.
if [ -n "$interactive" -a -n "$demo" ]; then
	echo "$name: Interactive mode is ignored in demo mode." 1>&2
fi

test -n "$verbose" && echo "Create a list of up to distfiles to keep using a" \
	"$algorithm algorithm:"

# Create the list of files to keep, using the selected algorithm.
keepFiles="$(eval "getDistFiles_$algorithm")"
if [ -n "$verbose" ]; then
	echo "$(($(echo "$keepFiles" | wc -l))) files recorded for keeping."
	echo "Search and delete outdated distfiles:"
fi

# A counter for deleted files.
deleted=0

# Seek and destroy files not in the $keepFiles list.
for file in $(find "$distdir" -type f); {
	file="${file#$distdir/}"

	if (echo "$keepFiles" | grep -qx "$file"); then
		test -n "$verbose" && echo "keep $file"
	else
		test -z "$quiet" && echo "delete $file"
		test -z "$demo" && rm $interactive "$distdir/$file"
		deleted=$(($deleted + 1))
	fi
}

test -z "$demo" && find -d "$distdir" -type d -exec rmdir \{} \; 2> /dev/null

test -n "$verbose" && echo "$deleted files have been removed."
 
oh, der eigentliche Vorschlag kam ja von *Sheep und da solltest du den lieber fragen.
Meinetwegen käme als Dank am ehesten der Hinweis auf die Namenssuche in der Öffentlichkeit in Frage, das hat doch was.
Aber es ist ja dein Ding und du mußt wissen, wem du danken möchtest und wie.
Die Auswahl hast ja letztlich du getroffen und dadurch werden die nicht erwählten Beiträge ja nicht geringer, nur weil dein Geschmack nun mal so ist, wie er ist. Schon deshalb kann ich selbst mich hier nicht mit einem Eintrag in Thanks identifizieren, aber getreu deiner Ankündigung, hat eben *Sheep den erwählten Namen als erster geliefert und wäre dran.
 
Naja, da hast du wohl recht. Aber du hast den Sprung von wiper zu viper gemacht. Das war quasi das Kritische Element. Ich werde Sheep noch hinzufügen, aber er steht dann erst im nächsten Release mit drin.
 
Ich habe mich jetzt auf distviper festgelegt, das hat's mir einfach angetan.


So, jetzt ist Beta-Zeit. Wer das Ding testen will weiß hoffentlich was damit anzufangen ist:

läuft sehr schnell und wie ich finde, extrem schnell im fast Modus und mit den Stichproben, die ich machte, tadellos.
Um noch eine Spur sicherer zu sein, ließ ich das erst in verschiedenen Versionen mal als normaler user laufen und wunderte mich dann zunächst, als dann dies kam:
Code:
pit@syo ~/bsd7:-> sh distviper fast
delete xorg/lib/libXfont-1.3.1.tar.bz2
override rw-r--r--  root/wheel for /usr/ports/distfiles/xorg/lib/libXfont-1.3.1.tar.bz2?
Das ist kein Problem, aber ein kurzer check zu begin, a la:
Code:
#"are we root?"
whoami=$(whoami)
if [ $whoami != "root" ]
then 
echo "we are not root!"
exit 0
fi
könnte hier eine kleine Verbesserung sein?
(ich will mich hier nicht als Meister der scripte outen, das wisst ihr alle sehr wohl und ich weiß auch, daß sowas auch schneller gehen kann und daß es auch User geben kann, die nicht root sind und es trotzdem vielleicht dürfen. Ich glaube nur, so versteht jeder am schnellsten, was ich da sagen will.)
 
Zuletzt bearbeitet:
bin immer zu schnell, kaum zu glauben, wo ich immer so viel schreibe.

Du gehst ja, wenn ich das verstehe, die installierten ports durch und da wäre es vielleicht nur eine kleine Mühe, auch die Zahlen zu bestimmen und auszugeben (eine weitere sed Anweisung oder wc stelle ich mir vor, nichts Komplexes) um so einen Report zu liefern, über die Anzahl der behaltenen Files und der installierten Ports. Du zählst ja und gibst aus, wieviele gelöscht werden. Die beiden anderen Nummern könnten die Ausgabe vervollständigen.
 
schon gut.
Habe es gesehen, also im script. Auf der Shell ist die Meldung so schnell weg, daß ich sie nicht sehen konnte.

Code:
test -n "$verbose" && echo "$(($(echo "$keepFiles" | wc -l))) files recorded for keeping."
als letzte Zeile macht dann genau den Vorschlag, die keep-records anzugeben, nur eben dann am Schluss und das würde mir besser gefallen, weil wie gesagt, die anderen Zeilen sind zu schnell weg.

Das mit der Zahl der Installierten Ports, sehe ich heute nicht mehr hin, wahrscheinlich würde ich das eh nicht verstehen.
Aber ich denke, du siehst, was ich sagen will?
 
Die Sache ist die, das keepFiles im thorough-Modus die Zahl der distfiles aller Ports ist, also ca. ~20000. Es hat nichts mit den tatsächlich vorhandenen Dateien zu tun, sondern ist einer Liste von Dateien, die man behält, sollte man auf sie treffen.

Aber Du hast Recht, ich kann auch noch ausgeben, wie viele Dateien nicht gelöscht wurden. So was kommt dann in der nächsten Version, da ich so ungeduldig war, dass ich das Release schon gemacht habe.

Genau so einen Test habe ich nicht, damit ich das Skript risikolos als normaler Benutzer testen kann.

Natürlich muss das Skript mit -v gestartet werden, damit man die ganzen zusätzlichen Ausgaben bekommt.
 
Zuletzt bearbeitet:
Irgendwie fehlt mir folgende Funktion:

Von allen installierten Ports das neuste Distfile behalten, den Rest löschen. Oder anders formuliert: Alte Versionen von Distfiles und Distfiles von nicht installierten Ports löschen.
Wenn ich genau überlege, ist es sehr ähnlich, da ja die alte Versionen von Port auch nicht mehr installiert sind.

Gibst dazu ein Möglichkeit?

mousaka
 
Dies würde aber Distfiles von nicht installierten Ports nicht löschen, oder?
Kann es zur Zeit nicht ausprobieren.
Because of this there is a fast mode that will only use distinfo files from installed ports.
Mindestens verstehe ich obige Aussage so.

Stimmt, das wäre eine Variante. Es ging mir aber primär um eine Rückfrage/Feedback zu distviper.

mousaka
 
Dies würde aber Distfiles von nicht installierten Ports nicht löschen, oder?
Kann es zur Zeit nicht ausprobieren.
Du reißt die Aussage aus dem Kontext. distviper erstellt eine Liste von Dateien die es behält. Im fast Modus wird dazu nur die distinfo installierter Ports verwendet, also werden die distfiles von nicht installierten Ports gelöscht.
 
Code:
# Determine portsdir
portsdir=$(make -V PORTSDIR -f /usr/share/mk/bsd.port.mk)
if [ ! -d $portsdir ]; then
        echo "The PORTSDIR '$portsdir' is missing."
        exit 1
fi

# Determine distdir
[COLOR="Red"]distdir[/COLOR]=$(make -V DISTDIR -f /usr/share/mk/bsd.port.mk)
if [ ! -d [COLOR="Red"]$portsdir[/COLOR] ]; then
        echo "The DISTDIR '$distdir' is missing."
        exit 2
fi
Ist das gemeint?

Ich sehe mir dieses Script gerne an, es ist so übersichtlich und erbaulich. Ich verstehe allerdings nur teilweise, was du da machst. Dazu kenne ich mich eben doch zu wenig aus. Vor allem die Konstruktion mit sed:
Code:
extractFileCmd="sed -E -e 's/^[^(]*\(//1' -e 's/\)[^)]*$//1'"
die bricht mir doch ein wenig meinen ungeübten Verstand, da gebe ich vorzeitig auf!
Also, das da oben ist vermutlich noch so in etwa die letzte Stufe der Erkenntnis, die für mich noch in Frage kommt und weil das so geschrieben ist und weil make -V DISTDIR -f /usr/share/mk/bsd.port.mk bei mir auch /usr/ports/distfiles ausgibt, denke ich, daß das auch so gemeint ist und dafür auch eine separate Prüfung gemacht wird, weil es eben doch unabhängig vom PORTSDIR ein DISTDIR geben kann.
Dann wäre die Abfrage aber:
Code:
# Determine distdir
[COLOR="SeaGreen"]distdir[/COLOR]=$(make -V DISTDIR -f /usr/share/mk/bsd.port.mk)
if [ ! -d [COLOR="#2e8b57"]$distdir[/COLOR] ]; then
        echo "The DISTDIR '$distdir' is missing."
        exit 2
fi
 
Danke erst mal für den Post, da habe ich tatsächlich einen Fehler gemacht. Der ist zum Glück nicht besonders schlimm, deshalb mache ich nicht extra ein neues Release.

Das sed Kommando erkläre ich dir gerne.
Code:
sed -E -e 's/^[^(]*\(//1' -e 's/\)[^)]*$//1'
-E aktiviert erweiterte reguläre Ausdrücke, das heißt man kann Zeilenanfang, Zeilenende und dergleichen in seinen Ausdrücken verwenden.
-e steht jeweils für einen Ausdruck den sed auf eine Zeile anwenden soll. Hier führt sed also jeweils 2 Operationen durch.

's/^[^(]*\(//1' -e 's/\)[^)]*$//1'
s steht für substitute
Ersetzungsausdruck: ^[^(]*\(
^: Das ist das Zeichen für den Zeilenanfang.
[^(]*: Alle Zeichen die nicht ( sind.
\(: Die geöffnete Klammer
Ersetzt wird mit einem leeren Ausdruck
Die 1 am Schluss steht dafür, dass das 1. Match ersetzt wird.

vorher: "MD5 (firefox-3.0.5-source.tar.bz2) = 19d09b2554976e207d37a164bcf43547"
nachher: "firefox-3.0.5-source.tar.bz2) = 19d09b2554976e207d37a164bcf43547"

Die zweite Operation macht das gleiche, bloß von hinten. Also alles ab der geschlossenen Klammer entfernen.
 
Zurück
Oben