Chocolatey: Ersatz für choco list mit lokalem Cache

Freitag, 15. August, 2014

Ich habe mich mit Chocolatey angefreundet, verfluche aber die langsame Paketsuche.
Was man da machen kann? Nun, eine Batch-Datei schreiben, die die Paketliste lokal speichern kann und diesen Cache durchsucht.

Die Funktion ist nicht mit choco list [Suchbegriff] identisch, da hier auch Metainformationen gesucht werden - die Suche in meinem Skript geht rein auf Paketnamen, ist dafür aber wirklich massiv schneller!!

Der Cache wird 1 x pro Tag erneuert - oder bei manuellem Aufruf mit Parameter -u (=update).
Die Hilfe erscheint bei Aufruf ohne einen Parameter:


===== CHOCO PACKAGE SEARCH WITH LOCAL CACHE =====

DESCRIPTION:
clist2 is a choco list to search public packages that uses a local cache

SYNTAX:

  clist2 [searchstring]
     searchstring: part of a package, case insensitive,
     regex allowed i.e. "^fire" to find the firefox
     clist2 "^fire"

  clist2 -i
     infos about cachefile

  clist2 -u
     force update of local package list (it takes a while)


Das Grundprinzip ist wie folgt:

(1) Die Ausgabe der normalen Paket-Auflistung wird in einer Textdatei lokal gespeichert:

choco list >[Dateiname]

(2) Wenn man ein Paket sucht, dann wird in dieser Textdatei gesucht. Dabei ist findstr hilfreich - man kann so auch Regex als Suchbegriff verwenden. Der Parameter /i sorgt für caseinsensitive Suche.

type [Dateiname] | findstr /i %1 %2 %3 %4 %5 %6 %7 %8 %9

Der Rest ist etwas mehr Comfort und sinnvolle Ausgabe drumherum.

Der komplette Quellcode meiner Bastelstunde (Inhalt als clist2.bat speichern und in C:\ProgramData\chocolatey\bin\ ablegen):

@echo off
rem ======================================================================
::
::  CHOCO PACKAGE SEARCH WITH LOCAL CACHE
::
rem ----------------------------------------------------------------------
::  2014-08-15  axel-hahn.de  first lines
rem ======================================================================

rem ----------------------------------------------------------------------
::  config
rem ----------------------------------------------------------------------
	set pkglistPrefix=%temp%chocopackages_
	set pkglist="%pkglistPrefix%%DATE%.txt"
	set pkgwork="%pkglistPrefix%%DATE%.tmp"

rem ----------------------------------------------------------------------
::  main
rem ----------------------------------------------------------------------

	if "%1" EQU "" goto help
	if "%1" EQU "-i" goto cacheinfo
	if "%1" EQU "-u" goto update
	if not exist %pkglist% goto update

rem ----------------------------------------------------------------------
::  subroutines
rem ----------------------------------------------------------------------

	rem ----- search
	type %pkglist%  | findstr /v "META:" | findstr /i %1 %2 %3 %4 %5 %6 %7 %8 %9
	goto END

rem ----------------------------------------------------------------------
::  subroutines
rem ----------------------------------------------------------------------

	rem ----- show help
	:help
	echo.
	echo ===== CHOCO PACKAGE SEARCH WITH LOCAL CACHE =====
	echo.
	echo DESCRIPTION:
	echo %~n0 is a choco list to search public packages that uses a local cache
	echo.
	echo SYNTAX:
	echo.
	echo   %~n0 [searchstring]
	echo      searchstring: part of a package, case insensitive, 
	echo      regex allowed i.e. "^fire" to find the firefox
	echo      %~n0 "^fire"
	echo.
	echo   %~n0 -i
	echo      infos about cachefile
	echo.
	echo   %~n0 -u
	echo      force update of local package list (it takes a while)
	echo.
	goto END

	rem ----- show infos about cache
	:cacheinfo
	echo Cachefile is %pkglist%
	rem dir %pkglist% | findstr "^[0-9]"
	type %pkglist%  | findstr "META:"
	echo.
	goto END

	rem ----- update local cache file
	:update
	call :cacheinfo
	echo INFO: refreshing local package list ...
	choco list >%pkgwork%
	echo META:LAST_UPDATE_OF_CACHE:%DATE% %TIME% >>%pkgwork%
	del %pkglistPrefix%*.txt 2>nul
	move %pkgwork% %pkglist% >nul
	echo.
	call :cacheinfo
	goto END

	:END

Updates:

  • 18.08.2014: Fix line 24 to: if not exist %pkglist% goto update