about summary refs log tree commit homepage
path: root/install/os.perl
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-09-13 09:12:39 +0000
committerEric Wong <e@80x24.org>2023-09-14 10:06:23 +0000
commit7682d7645f579ba531717ba95c8f3d4ff63af53f (patch)
tree6d6bb1b43542627fd01ca35ae681336369c15b24 /install/os.perl
parent50f041f9d2bf4988329787105769b7f04d263873 (diff)
downloadpublic-inbox-7682d7645f579ba531717ba95c8f3d4ff63af53f.tar.gz
deps.perl can be useful for non-CI purposes as long as it's not
blindly removing packages.  Thus, a --allow-remove flag now
exists for CI use and removals are disabled by default.

deps.perl also gets easier-to-use in that now install/os.perl
is split off from from ci/profiles.perl so OS-supplied packaged
manager.
Diffstat (limited to 'install/os.perl')
-rw-r--r--install/os.perl78
1 files changed, 78 insertions, 0 deletions
diff --git a/install/os.perl b/install/os.perl
new file mode 100644
index 00000000..4fcbcbe4
--- /dev/null
+++ b/install/os.perl
@@ -0,0 +1,78 @@
+# Copyright (C) all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# Helper library for detecting distro info and mapping to package manager.
+# This should NOT be installed via `make install'.
+# This is used by install/deps.perl and ci/profiles.perl
+package PublicInbox::InstallOS;
+use v5.12;
+use parent qw(Exporter);
+our ($ID, $PRETTY_NAME, $VERSION_ID); # same vars as os-release(5)
+our @EXPORT = qw($ID $VERSION_ID pkg_fmt);
+
+my ($release, $version); # from uname
+if ($^O eq 'linux') { # try using os-release(5)
+        for my $f (qw(/etc/os-release /usr/lib/os-release)) {
+                next unless -f $f;
+                my @echo = map {
+                        qq{echo "\$"$_" = qq[\$$_];"; }
+                } qw(ID PRETTY_NAME VERSION_ID);
+                # rely on sh(1) to handle interpolation and such:
+                my $vars = `sh -c '. $f; @echo'`;
+                die "sh \$?=$?" if $?;
+                eval $vars;
+                die $@ if $@;
+                $VERSION_ID //= '';
+                $ID //= '';
+                if ($ID eq 'debian' && $VERSION_ID eq '') {
+                        if ($PRETTY_NAME =~ m!/sid\z!) {
+                                $VERSION_ID = 'sid';
+                        } else {
+                                open my $fh, '<', $f or die "open($f): $!";
+                                my $msg = do { local $/; <$fh> };
+                                die <<EOM;
+ID=$ID, but no VERSION_ID
+==> $f <==
+$msg
+EOM
+                        }
+                }
+                last if $ID ne '' && $VERSION_ID ne '';
+        }
+        $ID = 'linux' if $ID eq ''; # cf. os-release(5)
+} elsif ($^O =~ m!\A(?:free|net|open)bsd\z!) { # TODO: net? dragonfly?
+        $ID = $^O;
+        require POSIX;
+        (undef, undef, $release, $version) = POSIX::uname();
+        $VERSION_ID = lc $release;
+        $VERSION_ID =~ s/[^0-9a-z\.\_\-]//sg; # cf. os-release(5)
+} else { # only support POSIX-like and Free systems:
+        die "$^O unsupported";
+}
+$VERSION_ID //= 0; # numeric? could be 'sid', actually...
+my %MIN_VER = (freebsd => v11, openbsd => v7.3, netbsd => v9.3);
+
+if (defined(my $min_ver = $MIN_VER{$^O})) {
+        my $vid = $VERSION_ID;
+        $vid =~ s/-.*\z//s; # no dashes in v-strings
+        my $vstr = eval "v$vid";
+        die "can't convert VERSION_ID=$VERSION_ID to v-string" if $@;
+        die <<EOM if $vstr lt $min_ver;
+ID=$ID VERSION_ID=$VERSION_ID release=$release ($version) too old to support
+EOM
+}
+
+sub pkg_fmt () {
+        if ($ID eq 'freebsd') { 'pkg' }
+        # *shrug*, as long as the (Net|Open)BSD names don't conflict w/ FreeBSD
+        elsif ($ID eq 'netbsd') { 'pkgin' }
+        elsif ($ID eq 'openbsd') { 'pkg_add' }
+        elsif ($ID =~ m!\A(?:debian|ubuntu)\z!) { 'deb' }
+        elsif ($ID =~ m!\A(?:centos|redhat|fedora)\z!) { 'rpm' }
+        else { warn "PKG_FMT undefined for ID=$ID"; undef }
+}
+
+package main;
+PublicInbox::InstallOS->import;
+
+1;