From owner-freebsd-bugs Wed Mar 5 13:20:19 2003 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1650637B401 for ; Wed, 5 Mar 2003 13:20:11 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id E790B43FB1 for ; Wed, 5 Mar 2003 13:20:09 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.6/8.12.6) with ESMTP id h25LK9NS068923 for ; Wed, 5 Mar 2003 13:20:09 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.6/8.12.6/Submit) id h25LK9vt068922; Wed, 5 Mar 2003 13:20:09 -0800 (PST) Date: Wed, 5 Mar 2003 13:20:09 -0800 (PST) Message-Id: <200303052120.h25LK9vt068922@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Sergey Matveychuk Subject: Re: bin/47145: Port conflict Checking for PKG_INSTALL tools (for 5.0) Reply-To: Sergey Matveychuk Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org The following reply was made to PR bin/47145; it has been noted by GNATS. From: Sergey Matveychuk To: freebsd-gnats-submit@FreeBSD.org, sem@ciam.ru Cc: Subject: Re: bin/47145: Port conflict Checking for PKG_INSTALL tools (for 5.0) Date: Thu, 06 Mar 2003 00:12:05 +0300 This is a multi-part message in MIME format. --------------060609060001020003050808 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Here is a new version of patch modified in according with remarks of Kris Kennaway. --------------060609060001020003050808 Content-Type: text/plain; name="pkg_install.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="pkg_install.patch" diff -ruN /usr/src/usr.sbin/pkg_install/add/perform.c pkg_install/add/perform.c --- /usr/src/usr.sbin/pkg_install/add/perform.c Mon Feb 17 01:10:13 2003 +++ pkg_install/add/perform.c Mon Feb 17 00:27:04 2003 @@ -77,6 +77,11 @@ char pre_script[FILENAME_MAX] = INSTALL_FNAME; char post_script[FILENAME_MAX]; char pre_arg[FILENAME_MAX], post_arg[FILENAME_MAX]; + int conflictsfound=0; + char *conflict[2]; + char **matched; + int i,errcode; + code = 0; zapLogDir = 0; @@ -246,6 +251,33 @@ Plist.name); code = 1; goto success; /* close enough for government work */ + } + + /* Now check the packing list for conflicts */ + for (p = Plist.head; p ; p = p->next) { + if (p->type == PLIST_CONFLICTS) { + conflict[0]=strdup(p->name); + conflict[1]=NULL; + matched = matchinstalled(MATCH_GLOB,conflict,&errcode); + free(conflict[0]); + if(errcode == 0 && matched != NULL) + for(i=0; matched[i] != NULL; i++) + if(isinstalledpkg(matched[i])) { + warnx("Package '%s' conflicts with %s", Plist.name, + matched[i]); + conflictsfound=1; + } + + continue; + } + } + if(conflictsfound) { + if(!Force) { + warnx("please use pkg_delete first to remove it (them)"); + code = 1; + goto bomb; + } else + warnx("proceeding anyway"); } /* Now check the packing list for dependencies */ diff -ruN /usr/src/usr.sbin/pkg_install/add/pkg_add.1 pkg_install/add/pkg_add.1 --- /usr/src/usr.sbin/pkg_install/add/pkg_add.1 Mon Feb 17 01:10:13 2003 +++ pkg_install/add/pkg_add.1 Mon Feb 17 00:24:34 2003 @@ -208,20 +208,29 @@ .Sh TECHNICAL DETAILS The .Nm -utility is fairly simple. It extracts each package's "packing list" -into a special staging directory, parses it, -and then runs through the following sequence to fully extract the contents: +utility extracts each package's "packing list" into a special staging +directory in /tmp (or $PKG_TMPDIR if set), parses it, and then runs +through the following sequence to fully extract the contents of the package: .Bl -enum .It -Check if the package is already recorded as installed. If so, -terminate installation. +A check is made to determine if the package is already recorded as installed. +If it is, installation is terminated. +.It +A check is made to determine if the package conflicts (from +.Cm @conflicts +directives, see +.Xr pkg_create 1 ) +with an already recorded as installed package. If it is, +installation is terminated. .It Scan all the package dependencies (from .Cm @pkgdep directives, see .Xr pkg_create 1 ) -and make sure each one is met. If not, try and find the missing -dependencies' packages and auto-install them; if they can't be found +are read from the packing list. +If any of these required packages is not currently installed, +an attempt is made to find and install it; +if the missing package cannot be found or installed, the installation is terminated. .It Search for any @@ -384,11 +393,14 @@ consists of a directory name. The current directory may be indicated implicitly by an empty directory name, or explicitly by a single -period. +period. It is usually set to +.Pa /usr/ports/packages/All . .Pp The environment variable .Ev PKG_DBDIR -specifies an alternative location for the installed package database. +specifies an alternative location for the installed package database, +default location is +.Pa /var/db/pkg . .Pp The environment variables .Ev PKG_TMPDIR diff -ruN /usr/src/usr.sbin/pkg_install/create/create.h pkg_install/create/create.h --- /usr/src/usr.sbin/pkg_install/create/create.h Mon Feb 17 01:10:13 2003 +++ pkg_install/create/create.h Mon Feb 17 00:24:34 2003 @@ -37,6 +37,7 @@ extern char *ExcludeFrom; extern char *Mtree; extern char *Pkgdeps; +extern char *Conflicts; extern char *Origin; extern char *InstalledPkg; extern char PlayPen[]; diff -ruN /usr/src/usr.sbin/pkg_install/create/main.c pkg_install/create/main.c --- /usr/src/usr.sbin/pkg_install/create/main.c Mon Feb 17 01:10:13 2003 +++ pkg_install/create/main.c Mon Feb 17 00:29:14 2003 @@ -16,7 +16,7 @@ #include "lib.h" #include "create.h" -static char Options[] = "YNOhjvyzf:p:P:c:d:i:I:k:K:r:t:X:D:m:s:o:b:"; +static char Options[] = "YNOhjvyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:o:b:"; char *Prefix = NULL; char *Comment = NULL; @@ -32,6 +32,7 @@ char *ExcludeFrom = NULL; char *Mtree = NULL; char *Pkgdeps = NULL; +char *Conflicts = NULL; char *Origin = NULL; char *InstalledPkg = NULL; char PlayPen[FILENAME_MAX]; @@ -78,6 +79,10 @@ Contents = optarg; break; + case 'C': + Conflicts = optarg; + break; + case 'c': Comment = optarg; break; @@ -195,11 +200,11 @@ usage() { fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n", -"usage: pkg_create [-YNOhvy] [-P pkgs] [-p prefix] [-f contents] [-i iscript]", -" [-I piscript] [-k dscript] [-K pdscript] [-r rscript] ", -" [-t template] [-X excludefile] [-D displayfile] ", -" [-m mtreefile] [-o origin] -c comment -d description ", -" -f packlist pkg-filename", +"usage: pkg_create [-YNOhvy] [-P pkgs] [-C cpkgs] [-p prefix] [-f contents] ", +" [-i iscript] [-I piscript] [-k dscript] [-K pdscript] ", +" [-r rscript] [-t template] [-X excludefile] ", +" [-D displayfile] [-m mtreefile] [-o origin] ", +" -c comment -d description -f packlist pkg-filename", " pkg_create [-YNhvy] -b pkg-name [pkg-filename]"); exit(1); } diff -ruN /usr/src/usr.sbin/pkg_install/create/perform.c pkg_install/create/perform.c --- /usr/src/usr.sbin/pkg_install/create/perform.c Mon Feb 17 01:10:13 2003 +++ pkg_install/create/perform.c Mon Feb 17 00:24:34 2003 @@ -145,6 +145,22 @@ printf(".\n"); } + /* Put the conflicts directly after the dependencies, if any */ + if (Conflicts) { + if (Verbose && !PlistOnly) + printf("Registering conflicts:"); + while (Conflicts) { + cp = strsep(&Conflicts, " \t\n"); + if (*cp) { + add_plist(&plist, PLIST_CONFLICTS, cp); + if (Verbose && !PlistOnly) + printf(" %s", cp); + } + } + if (Verbose && !PlistOnly) + printf(".\n"); + } + /* If a SrcDir override is set, add it now */ if (SrcDir) { if (Verbose && !PlistOnly) diff -ruN /usr/src/usr.sbin/pkg_install/create/pkg_create.1 pkg_install/create/pkg_create.1 --- /usr/src/usr.sbin/pkg_install/create/pkg_create.1 Mon Feb 17 01:10:13 2003 +++ pkg_install/create/pkg_create.1 Mon Feb 17 00:24:34 2003 @@ -32,6 +32,7 @@ .Sh SYNOPSIS .Nm .Op Fl YNOhjvyz +.Op Fl C Ar cpkgs .Op Fl P Ar pkgs .Op Fl p Ar prefix .Op Fl f Ar contents @@ -142,6 +143,13 @@ when the package is later installed. It will be passed the package's name as the first argument. +.It Fl C Ar cpkgs +Set the initial package conflict list to +.Ar cpkgs . +This is assumed to be a whitespace separated list of package names +and is meant as a convenient shorthand for specifying multiple +.Cm @conflicts +directives in the packing list (see PACKING LIST DETAILS section below). .It Fl P Ar pkgs Set the initial package dependency list to .Ar pkgs . @@ -482,6 +490,11 @@ package is deinstalled. Multiple .Cm @pkgdep directives may be used if the package depends on multiple other packages. +.It Cm @conflicts Ar pkgcflname +Declare a conflict with the +.Ar pkgcflname +package, as the two packages contain references to the same files, +and so cannot co-exist on the same system. .El .Sh ENVIRONMENT The environment variable diff -ruN /usr/src/usr.sbin/pkg_install/info/show.c pkg_install/info/show.c --- /usr/src/usr.sbin/pkg_install/info/show.c Mon Feb 17 01:10:13 2003 +++ pkg_install/info/show.c Mon Feb 17 00:24:34 2003 @@ -158,6 +158,10 @@ "\tdependency origin: %s\n", p->name); break; + case PLIST_CONFLICTS: + printf(Quiet ? "@conflicts %s\n" : "Conflicts: %s\n", p->name); + break; + case PLIST_MTREE: printf(Quiet ? "@mtree %s\n" : "\tPackage mtree file: %s\n", p->name); break; diff -ruN /usr/src/usr.sbin/pkg_install/lib/lib.h pkg_install/lib/lib.h --- /usr/src/usr.sbin/pkg_install/lib/lib.h Mon Feb 17 01:10:13 2003 +++ pkg_install/lib/lib.h Mon Feb 17 01:11:11 2003 @@ -86,7 +86,7 @@ * Version of the package tools - increase only when some * functionality used by bsd.port.mk is changed, added or removed */ -#define PKG_INSTALL_VERSION 20020908 +#define PKG_INSTALL_VERSION 20030217 #define PKG_WRAPCONF_FNAME "/var/db/pkg_install.conf" #define main(argc, argv) real_main(argc, argv) @@ -99,8 +99,8 @@ PLIST_FILE, PLIST_CWD, PLIST_CMD, PLIST_CHMOD, PLIST_CHOWN, PLIST_CHGRP, PLIST_COMMENT, PLIST_IGNORE, PLIST_NAME, PLIST_UNEXEC, PLIST_SRC, PLIST_DISPLAY, - PLIST_PKGDEP, PLIST_MTREE, PLIST_DIR_RM, PLIST_IGNORE_INST, - PLIST_OPTION, PLIST_ORIGIN, PLIST_DEPORIGIN + PLIST_PKGDEP, PLIST_CONFLICTS, PLIST_MTREE, PLIST_DIR_RM, + PLIST_IGNORE_INST, PLIST_OPTION, PLIST_ORIGIN, PLIST_DEPORIGIN }; typedef enum _plist_t plist_t; diff -ruN /usr/src/usr.sbin/pkg_install/lib/plist.c pkg_install/lib/plist.c --- /usr/src/usr.sbin/pkg_install/lib/plist.c Mon Feb 17 01:10:13 2003 +++ pkg_install/lib/plist.c Mon Feb 17 00:24:34 2003 @@ -241,6 +241,8 @@ return PLIST_DISPLAY; else if (!strcmp(cmd, "pkgdep")) return PLIST_PKGDEP; + else if (!strcmp(cmd, "conflicts")) + return PLIST_CONFLICTS; else if (!strcmp(cmd, "mtree")) return PLIST_MTREE; else if (!strcmp(cmd, "dirrm")) @@ -362,6 +364,10 @@ case PLIST_PKGDEP: fprintf(fp, "%cpkgdep %s\n", CMD_CHAR, plist->name); + break; + + case PLIST_CONFLICTS: + fprintf(fp, "%cconflicts %s\n", CMD_CHAR, plist->name); break; case PLIST_MTREE: --------------060609060001020003050808-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message