On Sat, May 18, 2019 at 12:49:49PM +0200, Marc Espie wrote:
> On Fri, May 17, 2019 at 02:02:24PM +0200, Marc Espie wrote:
> > Please try this instead.
> > 
<SNIP>
> > 
> > Yes, it's waaay more intricate than what you suggested,
> > but it could be used in other scenarios instead of being
> > python-only.
> > 
> > Of course, this does require testing. I may have made some
> > stupid mistake somewhere.
> 
> And here is the version without stupid mistakes, along with the manpage
> change, explicitly describing what's going on (somewhat long-winded, but
> I think this required an example :)  )
> 
> I intend to commit this unless there are objections.

This seems to work well for me, rather annoying that it's so much code
but I like it a lot better than the dirty hack :-)

Tested updating as well as generating a new PLIST seems to work well and
produce what I expect, although I don't do a lot of python ports.

There is some weird whitespace in the diff, not not just spaces at the
end of the line, but also some spaces before a tab.  Unfortunately I'm
not familiar enough with the datastructures in-use to positively say
nothing is for sure wrong but I didn't spot anything obvious.

OK afresh1@


> Ports diff:
> ----------
> Index: infrastructure/bin/update-plist
> ===================================================================
> RCS file: /cvs/ports/infrastructure/bin/update-plist,v
> retrieving revision 1.173
> diff -u -p -r1.173 update-plist
> --- infrastructure/bin/update-plist   17 May 2019 10:24:18 -0000      1.173
> +++ infrastructure/bin/update-plist   18 May 2019 10:21:46 -0000
> @@ -52,7 +52,7 @@ package TrackedFile;
>  sub new
>  {
>       my ($class, $name, $ext) = @_;
> -     bless {name => $name, ext => $ext, items => []}, $class;
> +     bless {name => $name, ext => $ext, items => [], items2 => []}, $class;
>  }
>  
>  sub add
> @@ -61,6 +61,28 @@ sub add
>       push(@{$self->{items}}, $item);
>  }
>  
> +sub add2
> +{
> +     my ($self, $item, $p) = @_;
> +
> +     if ($item->NoDuplicateNames) {
> +             my $s = $p->subst->remove_ignored_vars($item->{prepared});
> +             my $s2 = $p->subst->do($s);
> +             if (defined (my $k = $item->keyword)) {
> +                     $s2 =~ s/^\@\Q$k\E\s//;
> +             }
> +             $p->{stash}{$s2}++;
> +
> +             my $comment = $p->subst->{maybe_comment};
> +
> +             if ($s ne $item->{prepared} &&
> +                     $item->{prepared} !~ m/^\Q$comment\E/) {
> +                     $item->{candidate_for_comment} = $s2;
> +             }
> +     }
> +     push(@{$self->{items2}}, $item);
> +}
> +
>  sub fh
>  {
>       my $self = shift;
> @@ -87,6 +109,16 @@ sub next_item
>       }
>  }
>  
> +sub next_item2
> +{
> +     my $self = shift;
> +     if (@{$self->{items2}} != 0) {
> +             return shift @{$self->{items2}};
> +     } else {
> +             return undef;
> +     }
> +}
> +
>  package TrackFile;
>  
>  sub new
> @@ -125,6 +157,25 @@ sub write_all
>  
>               while (my $file = pop @stack) {
>                       while (my $j = $file->next_item) {
> +                             my $filename = $j->prepare_restate($file, $p);
> +                             if (defined $filename) {
> +                                     push(@stack, $file);
> +                                     $file = $self->file($filename);
> +                             }
> +                     }
> +             }
> +     }
> +
> +     for my $i (@{$p->{base_plists}}) {
> +             # we mimic the way pkg_create writes files
> +             $p->{restate} = {};
> +
> +             my @stack = ();
> +             push(@stack, $self->file($i));
> +
> +
> +             while (my $file = pop @stack) {
> +                     while (my $j = $file->next_item2) {
>                               my $filename = $j->write_restate($file, $p);
>                               if (defined $filename) {
>                                       push(@stack, $file);
> @@ -390,12 +441,33 @@ sub write_restate
>       return undef;
>  }
>  
> +sub prepare_restate
> +{
> +     my ($o, $file, $p) = @_;
> +     $o->prepare_backsubst($file, $p);
> +     return undef;
> +}
> +
> +sub prepare_backsubst
> +{
> +     my ($o, $file, $p) = @_;
> +     my $s = $p->subst->do_backsubst($o->fullstring, $o->unsubst, $o);
> +     $o->{prepared} = $s;
> +     $file->add2($o, $p);
> +}
> +
>  # default backsubstitution and writing. 
>  sub write_backsubst
>  {
>       my ($o, $file, $p) = @_;
> -     my $s = $p->subst->do_backsubst($o->fullstring, $o->unsubst, $o);
> -     print {$file->fh} $s, "\n";
> +
> +     if (defined (my $s = $o->{candidate_for_comment})) {
> +             if ($p->{stash}{$s} > 1) {
> +                     $o->{prepared} = 
> +                         $p->subst->{maybe_comment}.$o->{prepared};
> +             }
> +     }
> +     print {$file->fh} $o->{prepared}, "\n";
>  }
>  
>  # extra objects that get copied very late (e.g., @extra)
> @@ -665,10 +737,11 @@ sub tie_objects
>  }
>  
>  # we will never do backsubst on CVSTags
> -sub write_backsubst
> +sub prepare_backsubst
>  {
>       my ($o, $file, $p) = @_;
> -     $o->write($file->fh);
> +     $o->{prepared} = $o->fullstring;
> +     $file->add2($o, $p);
>  }
>  
>  # this is extra stuff that PkgCreate  builds but that we don't want to copy
> @@ -694,6 +767,10 @@ sub write_restate
>  {
>  }
>  
> +sub prepare_restate
> +{
> +}
> +
>  package OpenBSD::PackingElement::ExtraInfo;
>  sub copy_annotations
>  {
> @@ -889,6 +966,19 @@ sub write_restate
>       return undef;
>  }
>  
> +sub prepare_restate
> +{
> +     my ($self, $file, $p) = @_;
> +     # don't do backsubst on fragments, pkg_create does not!
> +     $file->add2($self, $p);
> +     my $base = $file->name;
> +     my $frag = $self->frag;
> +     $base =~ s/PFRAG\./PFRAG.$frag-/ or
> +         $base =~ s/PLIST/PFRAG.$frag/;
> +     return $base if $p->{tracker}{known}{$base};
> +     return undef;
> +}
> +
>  sub frag
>  {
>       my $self = shift;
> @@ -1063,7 +1153,7 @@ sub check_lib_version
>       }
>  }
>  
> -sub write_backsubst
> +sub prepare_backsubst
>  {
>       my ($self, $f, $p) = @_;
>       if ($self->name =~ m,^(.*?)lib([^\/]+)\.so\.(\d+\.\d+)$,) {
> @@ -1074,7 +1164,8 @@ sub write_backsubst
>                   "\@lib ${path}lib$name.so.\$\{$k\}", $self->unsubst, $self);
>               $self->check_lib_version($version, $name, 
>                       $p->subst->value($k));
> -             print {$f->fh} "$s\n";
> +             $self->{prepared} = $s;
> +             $f->add2($self, $p);
>       } else {
>               $self->SUPER::write_backsubst($f, $p);
>       }
> @@ -1229,6 +1320,17 @@ sub handle_options
>                       my $var = shift;
>                       push(@{$state->{dont_backsubst}}, $var);
>                   },
> +             'I' => sub {
> +                     my $var = shift;
> +                     push(@{$state->{maybe_ignored}}, $var);
> +                 },
> +             'c' => sub {
> +                     my $var = shift;
> +                     if (exists $state->{maybe_comment}) {
> +                             $state->usage;
> +                     }
> +                     $state->{maybe_comment} = '${'.$var.'}';
> +                 },
>               's' => sub {
>                       my $var = shift;
>                       push(@{$state->{start_only}}, $var);
> @@ -1243,10 +1345,10 @@ sub handle_options
>                   },
>  
>       };
> -     $state->SUPER::handle_options('rvqV:FC:i:j:L:s:S:X:P:w:e:E:', 
> -         '[-Fmnrvx] [-C dir] [-E ext] [-e ext] [-i var] [-j jobs]',
> -         '[-L logfile] [-P pkgdir] [-S var] [-s var] [-V var]',
> -         '[-w suffix] [-X path] -- pkg_create_args ...');
> +     $state->SUPER::handle_options('rvI:c:qV:FC:i:j:L:s:S:X:P:w:e:E:', 
> +         '[-Fmnrvx] [-C dir] [-c comment] [-E ext] [-e ext] [-i var]',
> +         '[-I ignored] [-j jobs] [-L logfile] [-P pkgdir] [-S var]',
> +         '[-s var] [-V var] [-w suffix] [-X path] -- pkg_create_args ...');
>       $state->{pkgdir} = $state->opt('P');
>       $state->{scan_as_root} = $state->opt('r');
>       $state->{verbose} = $state->opt('v');
> @@ -1255,6 +1357,9 @@ sub handle_options
>       $state->{extnew} = $state->opt('E') // ".new";
>       $state->{extorig} = $state->opt('e') // ".orig";
>       $state->{logfile} = $state->opt('L');
> +     if (exists $state->{maybe_ignored} && !exists $state->{maybe_comment}) {
> +             $state->usage;
> +     }
>  }
>  
>  package UpdatePlist;
> Index: infrastructure/lib/OpenBSD/ReverseSubst.pm
> ===================================================================
> RCS file: /cvs/ports/infrastructure/lib/OpenBSD/ReverseSubst.pm,v
> retrieving revision 1.19
> diff -u -p -r1.19 ReverseSubst.pm
> --- infrastructure/lib/OpenBSD/ReverseSubst.pm        17 May 2019 10:04:13 
> -0000      1.19
> +++ infrastructure/lib/OpenBSD/ReverseSubst.pm        18 May 2019 10:21:46 
> -0000
> @@ -175,8 +175,12 @@ sub new
>           isversion => {},
>           # under some cases, some variables are a priority
>           disregard_count => {},
> +         # to be able to inject @comment  conditionally on some other
> +         # variables
> +         maybe_comment => $state->{maybe_comment},
>           }, $class;
> -     for my $k (qw(dont_backsubst start_only suffix_only no_version)) {
> +     for my $k (qw(dont_backsubst start_only suffix_only no_version

weird whitespace here


> +         maybe_ignored)) {
>               if (defined $state->{$k}) {
>                       for my $v (@{$state->{$k}}) {
>                               $o->{$k}{$v} = 1;
> @@ -184,6 +188,16 @@ sub new
>               }
>       }
>       return $o;
> +}
> +
> +sub remove_ignored_vars
> +{
> +     my ($self, $s) = @_;
> +     for my $v (keys %{$self->{maybe_ignored}}) {
> +             while ($s =~ s/\$\{\Q$v\E\}//) {}
> +     }
> +     $s =~ s,//,/,g;
> +     return $s;
>  }
>  
>  # those are actually just passed thru to pkg_create for special
> 
> 
> 
> 
> 
> Source diff:
> -----------
> Index: update-plist.1
> ===================================================================
> RCS file: /cvs/src/share/man/man1/update-plist.1,v
> retrieving revision 1.2
> diff -u -p -r1.2 update-plist.1
> --- update-plist.1    26 Jun 2018 06:56:07 -0000      1.2
> +++ update-plist.1    18 May 2019 10:48:13 -0000
> @@ -26,8 +26,10 @@
>  .Nm
>  .Op Fl Fmnqrvx
>  .Op Fl C Ar dir
> +.Op Fl c Ar var
>  .Op Fl E Ar ext
>  .Op Fl e Ar ext
> +.Op Fl I Ar var
>  .Op Fl i Ar var
>  .Op Fl j Ar jobs
>  .Op Fl S Ar var
> @@ -83,6 +85,12 @@ Beware that this directory should then b
>  dependencies's packing-lists change.
>  But this will speed up packing-list regeneration for ports with
>  lots of dependencies significantly.
> +.It Fl c Ar var
> +Variable
> +.Ar var
> +may be used as a way to insert
> +.Cm \@ Ns comment
> +when other variables vanish.
>  .It Fl E Ar ext
>  Write new files with
>  .Ar ext
> @@ -96,6 +104,12 @@ extension instead of the default
>  .It Fl F
>  Do not try to run
>  .Xr pkg_locate 1 .
> +.It Fl I Ar var
> +Variable
> +.Ar var
> +may expand to nothing, in which case the variable from
> +.Fl c Ar var
> +can be used to prevent duplicate entries.
>  .It Fl i Ar var
>  Ignore variable
>  .Ar var
> @@ -214,6 +228,59 @@ and it currently does not add new substi
>  .Ev ARCH
>  nor
>  .Ev MACHINE_ARCH .
> +.Pp
> +Some packages (notoriously Python packages) create some directories 
> optionally
> +based on flavors.
> +Options
> +.Fl c
> +and
> +.Fl I
> +can be used to avoid duplicate directory definitions.
> +.Pp
> +Specifically, a generated packing-list would contain
> +.Bd -literal -offset indent -compact
> +lib/python${MODPY_VERSION}/site-packages/bpdb/
> +lib/python${MODPY_VERSION}/site-packages/bpdb/${MODPY_PYCACHE}/
> +.Ed
> +which expands to
> +.Bd -literal -offset indent -compact
> +lib/python3.7/site-packages/bpdb/
> +lib/python3.7/site-packages/bpdb/__pycache__/
> +.Ed
> +for python3, which is fine.
> +.Pp
> +But for python2, variable
> +.Sq MODPY_PYCACHE
> +will be empty, resulting in
> +.Bd -literal -offset indent -compact
> +lib/python2.7/site-packages/bpdb/
> +lib/python2.7/site-packages/bpdb/
> +.Ed
> +thus a duplicate directory,
> +.Xr pkg_create 1
> +won't be happy.
> +.Pp
> +Using
> +.Ev UPDATE_PLIST_ARGS = Fl c Ar MODPY_COMMENT Fl I Ar MODPY_PYCACHE
> +will result in injecting
> +.Sq ${MODPY_COMMENT}
> +whereever
> +.Nm
> +finds a duplicate directory by replacing
> +.Sq ${MODPY_PYCACHE}
> +with nothing.
> +.Pp
> +This yields
> +.Bd -literal -offset indent -compact
> +lib/python${MODPY_VERSION}/site-packages/bpdb/
> +${MODPY_COMMENT}lib/python${MODPY_VERSION}/site-packages/bpdb/MODPY_PYCACHE}/
> +.Ed
> +and for python2 this expands to
> +.Bd -literal -offset indent -compact
> +lib/python2.7/site-packages/bpdb/
> +@comment lib/python2.7/site-packages/bpdb/
> +.Ed
> +which is exactly what we want.
>  .Pp
>  Specific items such as shared libraries or binaries will gain annotations
>  and special handling, for instance

-- 
andrew - http://afresh1.com

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots. So far, the Universe is
winning."             -- Rich Cook

Reply via email to