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

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 !

Reply via email to