Use-case: some people want to branch automated installs based on whether
pkg_add -u (or some other variation) actually did something.

As usual we ignore quirks. This adds a flag (-DSYSPATCH_LIKE)
which governs the behavior. Code is fairly self-explanatory.

I had no better idea for the flag name so far, suggestions welcome.

Index: OpenBSD/PkgAdd.pm
===================================================================
RCS file: /cvs/src/usr.sbin/pkg_add/OpenBSD/PkgAdd.pm,v
retrieving revision 1.142
diff -u -p -r1.142 PkgAdd.pm
--- OpenBSD/PkgAdd.pm   27 Jun 2023 11:11:46 -0000      1.142
+++ OpenBSD/PkgAdd.pm   2 Jul 2023 13:49:03 -0000
@@ -861,6 +861,9 @@ sub really_add($set, $state)
        if ($state->{received}) {
                die "interrupted";
        }
+       if (!$set->{quirks}) {
+               $state->{did_something} = 1;
+       }
 }
 
 sub newer_has_errors($set, $state)
@@ -1163,6 +1166,8 @@ sub process_parameters($self, $state)
 {
        my $add_hints = $state->{fuzzy} ? "add_hints" : "add_hints2";
 
+       $state->{did_something} = 0;
+
        # match against a list
        if ($state->{pkglist}) {
                open my $f, '<', $state->{pkglist} or
@@ -1178,7 +1183,6 @@ sub process_parameters($self, $state)
 
        # update existing stuff
        if ($state->{update}) {
-
                if (@ARGV == 0) {
                        @ARGV = sort(installed_packages());
                }
@@ -1239,6 +1243,16 @@ sub main($self, $state)
        $self->process_setlist($state);
 }
 
+sub exit_code($self, $state)
+{
+       my $rc = $self->SUPER::exit_code($state);
+       if ($rc == 0 && $state->defines("SYSPATCH_LIKE")) {
+               if (!$state->{did_something}) {
+                       $rc = 2;
+               }
+       }
+       return $rc;
+}
 
 sub new_state($self, $cmd)
 {

Reply via email to