The branch main has been updated by kevans:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=40b9f924b189ce8fa871db600b4abc99b03c6a65

commit 40b9f924b189ce8fa871db600b4abc99b03c6a65
Author:     Kyle Evans <kev...@freebsd.org>
AuthorDate: 2021-02-18 03:41:53 +0000
Commit:     Kyle Evans <kev...@freebsd.org>
CommitDate: 2021-08-06 19:25:07 +0000

    pkg: allow multiple add arguments again
    
    While pkg(7) add only handles a single 'add' argument, pkg-add(8) fully
    handles multiple arguments.
    
    Stop rejecting it, just turn off local-bootstrap mode and proceed to
    remote bootstrap if we need it.
    
    While we're here, check if the first argument to pkg add is even a pkg
    package. If it's not, also do remote bootstrap instead. Future work
    could improve this altogether by picking out a pkg package out of many
    and local bootstrap then pass the rest through to the newly installed
    pkg.
    
    Reviewed by:    bapt, manu (earlier version)
    MFC after:      3 days
    Differential Revision:  https://reviews.freebsd.org/D28766
---
 usr.sbin/pkg/pkg.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 50 insertions(+), 4 deletions(-)

diff --git a/usr.sbin/pkg/pkg.c b/usr.sbin/pkg/pkg.c
index 8193dc79a430..1196c78e5cc9 100644
--- a/usr.sbin/pkg/pkg.c
+++ b/usr.sbin/pkg/pkg.c
@@ -1056,6 +1056,40 @@ cleanup:
        return (ret);
 }
 
+#define        PKG_NAME        "pkg"
+#define        PKG_DEVEL_NAME  PKG_NAME "-devel"
+#define        PKG_PKG         PKG_NAME "."
+
+static bool
+pkg_is_pkg_pkg(const char *pkg)
+{
+       char *vstart;
+       size_t namelen;
+
+       /*
+        * Chop off the final "-" (version delimiter) and check the name that
+        * precedes it.  If we didn't have a version delimiter, it must be the
+        * pkg.$archive short form but we'll check it anyways.  pkg-devel short
+        * form will look like a pkg archive with 'devel' version, but that's
+        * OK.  We otherwise assumed that non-pkg packages will always have a
+        * version component.
+        */
+       vstart = strrchr(pkg, '-');
+       if (vstart == NULL) {
+               return (strlen(pkg) > sizeof(PKG_PKG) - 1 &&
+                   strncmp(pkg, PKG_PKG, sizeof(PKG_PKG) - 1) == 0);
+       }
+
+       namelen = vstart - pkg;
+       if (namelen == sizeof(PKG_NAME) - 1 &&
+           strncmp(pkg, PKG_NAME, sizeof(PKG_NAME) - 1) == 0)
+               return (true);
+       if (namelen == sizeof(PKG_DEVEL_NAME) - 1 &&
+           strncmp(pkg, PKG_DEVEL_NAME, sizeof(PKG_DEVEL_NAME) - 1) == 0)
+               return (true);
+       return (false);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -1159,13 +1193,25 @@ main(int argc, char *argv[])
                                fprintf(stderr, args_bootstrap_message);
                                exit(EXIT_FAILURE);
                        }
-                       // For add, we accept exactly one further argument
                        else if (add_pkg && pkgarg != NULL) {
-                               fprintf(stderr, args_add_message);
-                               exit(EXIT_FAILURE);
+                               /*
+                                * Additional arguments also means it's not a
+                                * local bootstrap request.
+                                */
+                               add_pkg = false;
                        }
                        else if (add_pkg) {
-                               pkgarg = argv[optind-1];
+                               /*
+                                * If it's not a request for pkg or pkg-devel,
+                                * then we must assume they were trying to
+                                * install some other local package and we
+                                * should try to bootstrap from the repo.
+                                */
+                               if (!pkg_is_pkg_pkg(argv[optind-1])) {
+                                       add_pkg = false;
+                               } else {
+                                       pkgarg = argv[optind-1];
+                               }
                        }
                        break;
                default:
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to