On Thu, Jul 02, 2026 at 04:38:57PM +0200, Marc Espie wrote:
> Second version, much better (actually works for the most part)
>
> - renamed -x to -t ('trim') because -x is already "used" by the
> progressmeter (rather useless for update-plist)
>
> - added manpage parts.
> - documented that -X uses glob, which makes the fake mtree work
> and will probably also be useful for some files in texlive
Oh and there's also a small change in the @info file recognizer to
just look at actual info contents...
> texlive will need *at least* these to get something useful
>
> UPDATE_PLIST_ARGS += -t print/ps2eps
> UPDATE_PLIST_ARGS += -t print/psutils
> UPDATE_PLIST_ARGS += -t graphics/asymptote
> UPDATE_PLIST_ARGS += -t textproc/latexmk
> UPDATE_PLIST_ARGS += -t print/t1utils
> UPDATE_PLIST_ARGS += -t print/dvi2tty
> UPDATE_PLIST_ARGS += -t print/detex
> UPDATE_PLIST_ARGS += -t print/lcdf-typetools
> UPDATE_PLIST_ARGS += -i MODLUA_DEP_VERSION
> UPDATE_PLIST_ARGS += -i MODRUBY_LIBREV
>
> update-plist patch and manpage patch follow
>
> Index: bin/update-plist
> ===================================================================
> RCS file: /build/data/openbsd/cvs/ports/infrastructure/bin/update-plist,v
> diff -u -p -r1.216 update-plist
> --- bin/update-plist 18 Jan 2026 10:02:28 -0000 1.216
> +++ bin/update-plist 2 Jul 2026 13:19:46 -0000
> @@ -307,6 +307,10 @@ sub write_conflict_info($self, $fh)
> sub is_part_of_conflict_info($)
> { 0 }
>
> +sub exclude_files($, $, $)
> +{
> +}
> +
> package OpenBSD::PackingElement::State;
>
> # that stuff NEVER gets copied over, but interpolated from existing objects
> @@ -648,6 +652,11 @@ sub show_unknown($self)
> }
> }
>
> +sub exclude_files($self, $state, $base)
> +{
> + $state->{ignored}{$base.$self->fullname} = 1;
> +}
> +
> package OpenBSD::PackingElement::FileBase;
> sub bookmark($self, $plist)
> {
> @@ -859,13 +868,22 @@ sub handle_options($state)
> 'V' => sub($var) {
> push(@{$state->{no_version}}, $var);
> },
> + 't' => sub($pkgpath) {
> + $state->exclude_pkgpath($pkgpath);
> + },
> + 'h' => sub($h) {
> + $state->read_hints_file($h, 0);
> + },
> + 'H' => sub($h) {
> + $state->read_hints_file($h, 1);
> + },
>
> };
> - $state->SUPER::handle_options('OrvI:c:qV:fFC:i:j:L:s:S:X:P:w:e:E:H:',
> - '[-FfmnOrvx] [-C dir] [-c comment] [-E ext] [-e ext] [-H hints]',
> - '[-i var] [-I ignored] [-j jobs] [-L logfile] [-P pkgdir]',
> - '[-S var] [-s var] [-V var] [-w suffix] [-X path]',
> - '-- pkg_create_args ...');
> +
> $state->SUPER::handle_options('OrvI:c:qV:fFC:i:j:L:s:S:X:t:P:w:e:E:H:h:',
> + '[-FfmnOrvx] [-C dir] [-c comment] [-E ext] [-e ext]',
> + '[-H hints] [-h hints] [-i var] [-I ignored] [-j jobs]',
> + '[-L logfile] [-P pkgdir] [-S var] [-s var] [-V var]',
> + '[-w suffix] [-X path] [-t pkgpath] -- pkg_create_args ...');
> $state->{pkgdir} = $state->opt('P');
> $state->{scan_as_root} = $state->opt('r');
> $state->{verbose} = $state->opt('v');
> @@ -886,6 +904,19 @@ sub handle_options($state)
> }
> }
>
> +sub exclude_pkgpath($state, $pkgpath)
> +{
> + my $plist = OpenBSD::Dependencies::CreateSolver->ask_tree($state,
> + $pkgpath, $ENV{'PORTSDIR'}, \&OpenBSD::PackingList::FilesOnly,
> + 'print-plist');
> + if (!defined $plist) {
> + $state->fatal("Can't read plist for #1", $pkgpath);
> + }
> + # XXX this is delayed because we need to know WORKINST, and we
> + # only get this from subpackage options
> + $state->{excluded_plists}{$pkgpath} = $plist;
> +}
> +
> sub parse_hints_file($state, $fname)
> {
> open(my $f, '<', $fname) or
> @@ -1377,8 +1408,19 @@ sub try_pkglocate($self)
> }
> }
>
> +sub ignore_excluded_plists($self, $base)
> +{
> + my $state = $self->{state};
> + while (my ($pkgpath, $plist) = each %{$state->{excluded_plists}}) {
> + $state->say("Stripping files from #1", $pkgpath);
> + $plist->exclude_files($state, $base);
> + }
> + delete $state->{excluded_plists};
> +}
> +
> my $self = UpdatePlist->new;
> my $base = OpenBSD::UpdatePlistFactory->parse_args($self);
> +$self->ignore_excluded_plists($base);
> $self->known_objects;
> $self->scan_fake_dir($base);
> $self->zap_debug_files;
> Index: lib/OpenBSD/FS2.pm
> ===================================================================
> RCS file: /build/data/openbsd/cvs/ports/infrastructure/lib/OpenBSD/FS2.pm,v
> diff -u -p -r1.43 FS2.pm
> --- lib/OpenBSD/FS2.pm 4 Dec 2025 17:56:14 -0000 1.43
> +++ lib/OpenBSD/FS2.pm 2 Jul 2026 13:06:58 -0000
> @@ -345,18 +345,11 @@ sub recognize($class, $filename, $fs, $)
> return 0 unless $filename =~ m/\.info$/ or $filename =~
> m/info\/[^\/]+$/;
> $filename = $fs->resolve_link($filename);
> open my $fh, '<', $filename or return 0;
> - my $tag = <$fh>;
> - return 0 unless defined $tag;
> - my $tag2 = <$fh>;
> - $tag .= $tag2 if defined $tag2;
> - close $fh;
> - my $prog = qr{(?:g?[Mm]akeinfo|texi2any)};
> - if ($tag =~
> /^This\sis\s.*,\sproduced\sby\s$prog(?:\sversion\s|\-)?.*[\d\s]from/s ||
> - $tag =~
> /^Dies\sist\s.*,\shergestellt\svon\s$prog(?:\sVersion\s|\-)?.*[\d\s]aus/s) {
> - return 1;
> - } else {
> - return 0;
> + while (<$fh>) {
> + chomp;
> + return 1 if m/^START-INFO-DIR-ENTRY$/;
> }
> + return 0;
> }
>
> sub element_class($)
> @@ -679,6 +672,9 @@ sub mtree($self)
> sub create($self, $filename)
> {
> my $data = {};
> + if ($filename =~ m/\.info$/) {
> + $DB::single = 1;
> + }
> for my $class (OpenBSD::FS::File->classes) {
> if ($class->recognize($filename, $self, $data)) {
> return $class->create($filename, $self);
> Index: update-plist.1
> ===================================================================
> RCS file: /build/data/openbsd/cvs/src/share/man/man1/update-plist.1,v
> diff -u -p -r1.10 update-plist.1
> --- update-plist.1 14 Apr 2024 17:24:15 -0000 1.10
> +++ update-plist.1 2 Jul 2026 14:35:39 -0000
> @@ -29,11 +29,14 @@
> .Op Fl c Ar var
> .Op Fl E Ar ext
> .Op Fl e Ar ext
> +.Op Fl H Ar hints
> +.Op Fl h Ar hints
> .Op Fl I Ar var
> .Op Fl i Ar var
> .Op Fl j Ar jobs
> .Op Fl S Ar var
> .Op Fl s Ar var
> +.Op Fl t Ar pkgpath
> .Op Fl X Ar path
> .Op Fl w Ar suffix
> .Fl -
> @@ -114,6 +117,20 @@ Variable
> may expand to nothing, in which case the variable from
> .Fl c Ar var
> can be used to prevent duplicate entries.
> +.It Fl H Ar hints
> +Add an
> +.Ar hints
> +file, that contains locations of files in the format
> +.Dl path subpackage
> +as used for the texlive packages.
> +Those hints are absolute and will preempt already existing entries.
> +.It Fl h Ar hints
> +Add an
> +.Ar hints
> +file, that contains locations of files in the format
> +.Dl path subpackage
> +as used for the texlive packages.
> +Those hints are indicative and will not preempt already existing entries.
> .It Fl i Ar var
> Ignore variable
> .Ar var
> @@ -152,6 +169,9 @@ e.g., for directories like
> .Pa /etc/rc.d
> or
> .Pa /usr/local .
> +.It Fl t Ar pkgpath
> +Trim files corresponding to another package in the ports tree,
> +by ignoring entries in the corresponding packing-list.
> .It Fl v
> Verbose mode.
> Explain about directories stripped from dependencies.
> @@ -164,6 +184,11 @@ that (usually) should not end into packi
> Exclude file at absolute
> .Ar path
> from the information recorded in the packing-list.
> +The
> +.Ar path
> +goes through glob,
> +as documented in
> +.Xr perlfunc 3p .
> .El
> .Pp
> .Nm
> @@ -321,3 +346,8 @@ is now run as non-root,
> .Nm
> can't figure out users and groups for new files, so these should be
> considered carefully.
> +.Pp
> +.Fl h
> +and
> +.Fl H
> +are not implemented yet !