diff --git a/man1/prtwash.1 b/man1/prtwash.1 index 4fca1ae..f794546 100644 --- a/man1/prtwash.1 +++ b/man1/prtwash.1 @@ -36,34 +36,28 @@ All items not included in the previous list WILL be deleted You can choose to delete some of the above by passing the proper option: .TP -.B --p -also remove the built package (current version) +.B \-p +remove the built package (current version) .TP -.B --b -also remove other built packages (older versions) +.B \-b +remove older builds (any package tarball that does NOT match +the current version) .TP -.B --d -also remove the add-on files provided by CRUX maintainers +.B \-d +remove add-on files provided by CRUX maintainers (patches and initscripts downloaded with \fBports -u\fP) .TP -.B --s -also remove the upstream sources (those NOT obtained via \fBports -u\fP) +.B \-s +remove upstream sources (those NOT obtained via \fBports -u\fP) .TP -.B --t +.B \-t (test mode) display the target files without deleting .TP -.B --q +.B \-q (quiet mode) suppress messages about files that are kept; basically the same as \fBprtwash [OPTIONS] | grep -v "keeping"\fP .TP -.B --a +.B \-a (automatic mode) take the port collections from the /etc/prt-get.conf file and do a recursive cleaning; if omitted, the command line must contain at least one specifying @@ -71,12 +65,14 @@ a valid port directory .PP Misc options .TP -.B --h +.B \-\-parse\-pkgmk\-conf +Revert to the v0.9 behaviour of parsing /etc/pkgmk.conf to determine the +compression mode of built packages +.TP +.B \-h Display usage information .TP -.B --v +.B \-v Display version .SH ENVIRONMENT In automatic mode, \fBprtwash\fP gets a list of repositories from @@ -93,11 +89,24 @@ Sources under CRUX version control are only deleted if you pass the option \fB\-d\fP. Sources from upstream are only deleted if you pass the option \fB\-s\fP. .PP -The current version of the package is only deleted if you pass the -option \fB\-p\fP. Older versions of the package are only deleted if you -pass the option \fB\-b\fP. Note that if the compression mode defined -in /etc/pkgmk.conf has been changed since you last built the package, -\fBprtwash\fP will not recognize the tarball in its regexp search. +You can also delete the built package (current version) by passing +the option \fB\-p\fP. To select only older versions for deletion, +pass the option \fB\-b\fP instead. These two options operate independently, +allowing you to target four distinct subsets (including the empty set) +for deletion. +.PP +By passing the option \fB\-\-parse\-pkgmk\-conf\fP, you can modify the behaviour +of the pattern matching performed to detect built packages. By default, the +regexp searches are done with the patterns +.B /${name}#${version}.*.pkg.tar.(gz|lz|xz|bz2)/ +and +.B /${name}#.*pkg.tar.(gz|lz|xz|bz2)/ +using the variables defined in the \fBPkgfile\fP(5). Passing the option +.B \-\-parse\-pkgmk\-conf +will result in a more narrow regexp search, allowing the deletion of any package +tarball that uses a different compression algorithm than the one currently defined +in /etc/pkgmk.conf (which is how the v0.9 bash script worked). + .SH COMPARISON WITH OTHER UTILITIES Because \fBprtwash\fP reads the location of port collections from \fB/etc/prt-get.conf\fP(5), you can easily control which collections are cleaned in automatic mode by commenting diff --git a/scripts/prtwash.pl b/scripts/prtwash.pl index a0d3e46..95077bc 100755 --- a/scripts/prtwash.pl +++ b/scripts/prtwash.pl @@ -18,7 +18,7 @@ our @portdirs; our $argports; my $version = 1.2.1; our %options = ( oldver=>0, pkgtoo=>0, srctoo=>0, addons=>0, - dryrun=>0, auto=>0, quiet=>0 ); + dryrun=>0, auto=>0, quiet=>0, parse_pkgmk=>0 ); #################### main routine ################################ parse_args(); @@ -46,9 +46,8 @@ if ($options{auto} == 1) { #################### subroutines ################################# sub parse_args { - while ( my $arg = pop(@ARGV) ) { - next if (-f $arg); # no filenames, only directories and options - if ($arg eq "-b") { + foreach my $arg (@ARGV) { + if ($arg eq "-b") { $options{oldver} = 1; } elsif ($arg eq "-p") { $options{pkgtoo} = 1; @@ -62,11 +61,16 @@ sub parse_args { $options{auto} = 1; } elsif ($arg eq "-q") { $options{quiet} = 1; + } elsif ($arg eq "--parse-pkgmk-conf") { + $options{parse_pkgmk} = 1; } elsif ($arg eq "-v") { print "$version\n"; exit(0); - } elsif (-d $arg) { + } elsif ((-d $arg) || # false for symlink to a portdir, so a + (-f "$arg/Pkgfile")) { # followup test is performed to catch those push (@portdirs, $arg); + } elsif (-f $arg) { + print "WARN: ignoring invalid port directory $arg\n"; } else { print_usage(); } @@ -124,7 +128,7 @@ sub parse_pkgfile { return \$name, \$version, \$release, \@source, \@renames; } -sub keeplist { # remember to pop off the last element for regex purposes +sub keeplist { # remember to pop off the last two elements for regex purposes my $port = shift; my @keepers = ("Pkgfile",".footprint",".signature"); push (@keepers,"pre-install","post-install","README","README.md", @@ -140,7 +144,7 @@ sub keeplist { # remember to pop off the last element for regex purposes my $i; my $si; my $ki; ENTRY: for ($i=0; $i<=$#source; $i++) { $si = $source[$i]; - $ki = ($renames[$i] eq "SKIP" or $renames[$i] eq "") ? basename($si) : + $ki = ("$renames[$i]" eq "SKIP" or "$renames[$i]" eq "") ? basename($si) : $renames[$i]; if ($si =~ /^remote:/) { next ENTRY if ($options{srctoo}==1); @@ -150,21 +154,23 @@ sub keeplist { # remember to pop off the last element for regex purposes push(@keepers, $ki); } } - push (@keepers, $name.'#'.$version.'-'.$release.".pkg.tar.$compression_mode") if $options{pkgtoo}==0; - push (@keepers, $name."#.*pkg.tar.$compression_mode"); + push (@keepers, "$name#$version.*\.pkg\.tar\.$compression_mode"); + push (@keepers, "$name#.*\.pkg\.tar\.$compression_mode"); return @keepers; } sub get_compress { - my $conf = "/etc/pkgmk.conf"; - $compression_mode = "gz"; - open(CONFIG,$conf) or return $compression_mode; - while() { - $compression_mode = $1 if m/^[\t ]*PKGMK_COMPRESSION_MODE=(.*)\n/; + my $suffix = "(gz|lz|xz|bz2)"; + if ($options{parse_pkgmk} == 1) { + my $conf = "/etc/pkgmk.conf"; + open(CONFIG,$conf) or return $suffix; + while() { + $suffix = $1 if m/^[\t ]*PKGMK_COMPRESSION_MODE=(.*)\n/; + } + close(CONFIG); + $suffix =~ s/"//g; # ensure no double-quotes remain (thanks jaeger) } - close(CONFIG); - $compression_mode =~ s/"//g; # ensure no double-quotes remain (thanks jaeger) - return $compression_mode; + return $suffix; } sub do_wash { @@ -174,16 +180,18 @@ sub do_wash { print "WARN: no Pkgfile found in $port. Skipping.\n"; return; } else { - my @keepers = keeplist($port); - my $nevermatch = "ReallyLongStringThatWouldNeverMatchAnyBuiltPackage"; - my $pkgrex = pop(@keepers); - $pkgrex = ($options{oldver} == 1 or $options{pkgtoo} == 1) ? $nevermatch : $pkgrex; + my @keepers = keeplist($port); my $iswanted; + my $allbuilds = pop(@keepers); + my $currbuild = pop(@keepers); opendir (DIR,$port) or return; + print "=====> washing $port\n" unless $options{quiet} == 1; foreach my $f (sort(readdir(DIR))) { next if ($f eq '.' or $f eq '..'); $f =~ s/\+/\\\+/g; # plus sign in filenames interferes with regex search - if ((grep /$f/, @keepers) or ($f =~ /$pkgrex/)) { + $iswanted = ( grep (/$f/, @keepers ) >= 1 ); + if ($iswanted or ($options{pkgtoo}==0)*($f =~ /$currbuild/) + or ($options{oldver}==0)*($f =~ /$allbuilds/)*($f !~ /$currbuild/)) { print "... keeping file $port/$f.\n" unless $options{quiet} == 1; } else { remove ("$port/$f"); @@ -194,8 +202,7 @@ sub do_wash { } sub getportdirs { # returns scalar references to two arrays - my @basedirs; - my @localports; + my @basedirs; my @localports; my $conf = "/etc/prt-get.conf"; open(PORTS, $conf) or die "could not open $conf"; @@ -211,7 +218,7 @@ sub getportdirs { # returns scalar references to two arrays push @basedirs, $line if (-d $line); } else { my @a = split(/:/, $line); - my @b = split(/,/, @a[1]); + my @b = split(/,/, $a[1]); while ( my $c = pop @b ) { my $port = $a[0] . "/" . $c; push @localports, $port if (-d $port);