This is what I'm currently running.
It appears to be doing the right thing.
The ${_PBUILD} tee ${WRKDIR}/hints >/dev/null
is because the "hints" script does create the *.mk files as well,
so needs to run as ports user.
This does expose TWO internal variables from the ports tree, for now.
Adds two options (-h/-H and -t) to update-plist.
I haven't made up my mind whether both -h need to exist. There is a little
bit of boilerplate code if so...
It seems to be decently good at recreating the tex packing-lists more
or less, with some changes in directories, which is what I wanted to
fix in the first place.
The fullname/fullstring I also sent as a separate smaller patch that could
be committed now.
With this, a large chunk of Edd's update_plist_hints can go, namely all
the stuff that avoids all the -t paths to other ports.
Corraling texlive into the fold also means being able to run pkglocate
regularly, which will help into finding further conflicts in future versions
and thus finding some more -t if we want to move other parts to other packages.
Index: infrastructure/bin/update-plist
===================================================================
RCS file: /build/data/openbsd/cvs/ports/infrastructure/bin/update-plist,v
diff -u -p -r1.216 update-plist
--- infrastructure/bin/update-plist 18 Jan 2026 10:02:28 -0000 1.216
+++ infrastructure/bin/update-plist 6 Jul 2026 07:57:14 -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
@@ -644,10 +648,15 @@ sub known_directory($self, $o, $plist)
sub show_unknown($self)
{
if (!$self->{found}) {
- print "Not found: ", $self->fullname, " (in ", $self->{file},
")\n";
+ print "Not found: ", $self->fullstring, " (in ", $self->{file},
")\n";
}
}
+sub exclude_files($self, $state, $base)
+{
+ $state->{ignored}{$base.$self->fullname} = 1;
+}
+
package OpenBSD::PackingElement::FileBase;
sub bookmark($self, $plist)
{
@@ -853,19 +862,25 @@ sub handle_options($state)
'S' => sub($var) {
push(@{$state->{suffix_only}}, $var);
},
- 'H' => sub($hints) {
- $state->parse_hints_file($hints);
- },
'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,7 +901,20 @@ sub handle_options($state)
}
}
-sub parse_hints_file($state, $fname)
+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 read_hints_file($state, $fname, $mandatory)
{
open(my $f, '<', $fname) or
$state->fatal("Can't read hints file #1: #2", $fname, $!);
@@ -894,11 +922,19 @@ sub parse_hints_file($state, $fname)
chomp;
if (m/^\#(\S+)\s+(\-\S+)$/) {
my ($filename, $subpackage) = ($1, $2);
+ $state->{ignored_hints}{$filename} = $subpackage;
+ } elsif (m/^(\S+)\s+(\-\S+)$/) {
+ my ($filename, $subpackage) = ($1, $2);
+ $state->{hints}{$filename} = $subpackage;
} else {
$state->fatal("Bad hints file at line #1: #2",
$., $_);
}
}
+ # XXX edd's script mentions the same files several tims
+ for my $filename (keys %{$state->{hints}}) {
+ delete $state->{ignored_hints}{$filename};
+ }
}
package UpdatePlist;
@@ -1061,6 +1097,24 @@ sub walk_up_directory($self, $path, $c)
return 0;
}
+sub copy_hints($self, $path, $c)
+{
+ return unless exists $self->{hints}{$path};
+ my $s = $self->{hints}{$path};
+ my $p2 = $s->strip_prefix($path);
+ if ($p2 =~ m/^\// && !$c->absolute_okay) {
+ # this will get caught as new element
+ # TODO list of data to build inside
+ # its own cwd
+ last;
+ }
+ $self->{state}->say("Adding #1 to #2", $p2,
+ $s->olist->fullpkgpath2->{subpackage});
+ my $a = $c->add($s->nlist, $p2);
+ $a->notice_new_file($self);
+ $a->{file} = $s->{file};
+}
+
sub last_resort($self, $path, $c)
{
# try all lists in order, until we find one with
@@ -1094,9 +1148,11 @@ sub is_a_sample($self, $path)
sub copy_object($self, $path)
{
my $o = $self->{objects}{$path};
+ my $c = $o->element_class;
return if $self->copy_existing($path, $o);
- my $c = $o->element_class;
+
+ return if $self->copy_hints($path, $c);
return if $self->walk_up_directory($path, $c);
return if $self->last_resort($path, $c);
@@ -1377,8 +1433,48 @@ 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};
+}
+
+sub handle_hints($self, $base)
+{
+ my $state = $self->{state};
+ # first make a hash of subpackages
+ my $h = {};
+ for my $p (@{$self->{lists}}) {
+ my $subpackage = $p->olist->fullpkgpath2->{subpackage};
+ $h->{$subpackage} = $p;
+ }
+ # now we can match the entries to the plist
+ while (my ($filename, $sub) = each %{$state->{ignored_hints}}) {
+ if (!exists $h->{$sub}) {
+ $state->fatal("Error: bad subpackage #1", $sub);
+ }
+ my $fullname = $base.$h->{$sub}{state}{prefix}.'/'.$filename;
+ $state->{ignored}{$fullname} = 1;
+ }
+ delete $state->{ignored_hints};
+
+ while (my ($filename, $sub) = each %{$state->{hints}}) {
+ if (!exists $h->{$sub}) {
+ $state->fatal("Error: bad subpackage #1", $sub);
+ }
+ $self->{hints}{$h->{$sub}{state}{prefix}.'/'.$filename} =
$h->{$sub};
+ }
+ delete $state->{hints};
+}
+
my $self = UpdatePlist->new;
my $base = OpenBSD::UpdatePlistFactory->parse_args($self);
+$self->handle_hints($base);
+$self->ignore_excluded_plists($base);
$self->known_objects;
$self->scan_fake_dir($base);
$self->zap_debug_files;
Index: infrastructure/lib/OpenBSD/FS2.pm
===================================================================
RCS file: /build/data/openbsd/cvs/ports/infrastructure/lib/OpenBSD/FS2.pm,v
diff -u -p -r1.43 FS2.pm
--- infrastructure/lib/OpenBSD/FS2.pm 4 Dec 2025 17:56:14 -0000 1.43
+++ infrastructure/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: print/texlive/texmf/Makefile
===================================================================
RCS file: /build/data/openbsd/cvs/ports/print/texlive/texmf/Makefile,v
diff -u -p -r1.77 Makefile
--- print/texlive/texmf/Makefile 4 Jun 2026 22:39:53 -0000 1.77
+++ print/texlive/texmf/Makefile 6 Jul 2026 06:31:16 -0000
@@ -186,16 +186,19 @@ post-install:
# The following targets are for development only and require Python3.
-# Generating PLISTs is special for TeX Live.
-update-plist: plist
- @true
+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_ARGS += -h ${WRKDIR}/hints
+
-plist: fake
- env WRKINST=${WRKINST} TRUEPREFIX=${TRUEPREFIX} \
- python${MODPY_DEFAULT_VERSION_3} \
- ${FILESDIR}/update_plist_hints.py \
- ${WRKDIR}/texlive-${DIST_V}-extra/tlpkg/texlive.tlpdb | \
- python${MODPY_DEFAULT_VERSION_3} ${FILESDIR}/write_plists.py
# Regenerate adj.mk.
adj: patch
@@ -208,3 +211,12 @@ man_symlinks: patch
${WRKSRC}/texmf-dist/doc/man > man_symlinks.mk
.include <bsd.port.mk>
+
+${WRKDIR}/hints: ${_FAKE_COOKIE}
+ env WRKINST=${WRKINST} TRUEPREFIX=${TRUEPREFIX} \
+ python${MODPY_DEFAULT_VERSION_3} \
+ ${FILESDIR}/update_plist_hints.py \
+ ${WRKDIR}/texlive-${DIST_V}-extra/tlpkg/texlive.tlpdb \
+ |${_PBUILD} tee $@ >/dev/null
+
+update-plist: ${WRKDIR}/hints