Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Aug 2010 23:43:30 GMT
From:      Ivan Voras <ivoras@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 181920 for review
Message-ID:  <201008052343.o75NhU6Y073243@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@181920?ac=10

Change 181920 by ivoras@ursaminor on 2010/08/05 23:42:41

	Write real man page, add more dependancy checking.

Affected files ...

.. //depot/projects/soc2010/pkg_patch/src/patch/Makefile#30 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#20 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#20 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#29 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#29 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/main.c#30 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#28 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#28 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.c#13 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.h#12 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.1#3 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#28 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/support.c#27 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/updateweb.c#8 edit
.. //depot/projects/soc2010/pkg_patch/src/patch/updateweb.h#8 edit

Differences ...

==== //depot/projects/soc2010/pkg_patch/src/patch/Makefile#30 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#20 (text+ko) ====

@@ -270,8 +270,9 @@
 	char backup_pkg[PATH_MAX];
 	struct pkgxjob xpatch;
 	struct pkg_patch pp;
+	struct pplist *pl;
 	Package pkg_live, pkg_new;
-	struct pplist *pl;
+	enum CMP_NAME depcheck;
 	FILE **fpvect;
 	unsigned int err_count, n_patched_files, i;
 	
@@ -380,6 +381,26 @@
 			err_count++;
 		}
 	}
+	/* Check dependancies of the new package */
+	depcheck = check_dependencies(&pkg_new, NULL);
+	if (depcheck == CMP_NO_MATCH || depcheck == CMP_BASE_MATCH)
+		printf("Dependancy error processing %s:\n", file_patch);
+	if (depcheck == CMP_NO_MATCH) {
+		if (!Force)
+			errx(1, "New package dependancies not satisfied");
+		else
+			warnx("New package dependancies not satisfied"
+			    " -- forced continue");
+	}
+	if (depcheck == CMP_BASE_MATCH) {
+		printf("New package dependancies weakly matched - version "
+		    "mismatch.\n");
+		if (!Force) {
+			if (!y_or_n(0, "Continue?"))
+				errx(1, "Aborted.");
+		} else
+			printf("Forced continue.\n");
+	}
 	if (err_count != 0)
 		errx(1, "Found %u errors. Cannot continue.", err_count);
 	
@@ -483,7 +504,7 @@
 			goto error_cleanup;
 		}
 	}
-	/* Step 6 - apply other classes - files to add, remove, dirs to rmdir */
+	/* Step 6 - apply other cases - files to add, remove, dirs to rmdir */
 	STAILQ_FOREACH(pl, &pp.pp_add, linkage) {
 		char livefile[PATH_MAX];
 		

==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#20 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#29 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#29 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/main.c#30 (text+ko) ====

@@ -14,7 +14,7 @@
  * FreeBSD install - a package for the installation and maintainance
  * of non-core utilities.
  *
- * This is the "binary patch"  module.
+ * This is the "binary patch" utility main module.
  */
 
 #include <sys/cdefs.h>
@@ -117,7 +117,7 @@
 	asprintf(&my_tmp, "%spkg_patch.%d.%d", _PATH_TMP, getpid(), time(NULL));
 	if (mkdir(my_tmp, 0700) != 0)
 		errx(1, "Cannot create working directory: %s", my_tmp);
-	if (Verbose)
+	if (Verbose > 1)
 		printf("Using temporary directory: %s\n", my_tmp);
 }
 

==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#28 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#28 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.c#13 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.h#12 (text+ko) ====


==== //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.1#3 (text+ko) ====

@@ -20,557 +20,71 @@
 .Os
 .Sh NAME
 .Nm pkg_patch
-.Nd a utility for managing binary package patches. THIS MANUAL PAGE IS NOT COMPLETED YET AND IS ONLY COPIED FROM pkg_add !!!
+.Nd a utility for managing binary package patches.
 .Sh SYNOPSIS
 .Nm
+.Op Fl f
+.Op Fl v
+.Fl a Ar patchfile
+.Nm
+.Op Fl b
+.Op Fl v
+.Fl c Ar source_package target_package patch_file
+.Nm
 .Op Fl b
-.Op Fl a Ar patchfile
-.Op Fl c Ar package1 package2 patchfile
+.Op Fl v
+.Fl m Ar source_dir target_dir patch_dir
+.Nm
+.Op Fl v
+.Fl u Ar patch_url
+.Nm
+.Fl h
 .Sh DESCRIPTION
 The
 .Nm
 command is used to work with patches to binary packages - creating
 them from existing binary packages and applying them to live systems.
-THE REST OF THIS PAGE IS BOGUS.
-.Sh WARNING
-.Bf -emphasis
-Since the
-.Nm
-command may execute scripts or programs contained within a package file,
-your system may be susceptible to
-.Dq Em trojan horses
-or other subtle
-attacks from miscreants who create dangerous package files.
-.Pp
-You are advised to verify the competence and identity of those who
-provide installable package files.
-For extra protection, use the
-.Fl M
-flag to extract the package file, and inspect its contents and scripts to
-ensure it poses no danger to your system's integrity.
-Pay particular
-attention to any +INSTALL, +POST-INSTALL, +DEINSTALL, +POST-DEINSTALL,
-+REQUIRE or +MTREE_DIRS files, and inspect the +CONTENTS file for
-.Cm @cwd ,
-.Cm @mode
-(check for setuid),
-.Cm @dirrm ,
-.Cm @exec ,
-and
-.Cm @unexec
-directives, and/or use the
-.Xr pkg_info 1
-command to examine the package file.
-.Ef
+It implements infrastructure for mass package creation and distribution
+over the web.
 .Sh OPTIONS
 The following command line arguments are supported:
 .Bl -tag -width indent
-.It Ar pkg-name Op Ar pkg-name ...
-The named packages are installed.
-A package name of
-.Fl
-will cause
-.Nm
-to read from stdin.
-If the packages are not found in the current
-working directory,
-.Nm
-will search them in each directory named by
-.Ev PKG_PATH .
-.It Fl v , -verbose
+.It Fl v
 Turn on verbose output.
-.It Fl K , -keep
-Keep any downloaded package in
-.Ev PKGDIR
-if it is defined or in current directory by default.
-.It Fl i , -no-deps
-Install the package without fetching and installing
-dependencies.
-.It Fl I , -no-script
-If any installation scripts (pre-install or post-install) exist for a given
-package, do not execute them.
-.It Fl n , -dry-run
-Do not actually install a package, just report the steps that
-would be taken if it was.
-.It Fl R , -no-record
-Do not record the installation of a package.
-This means
-that you cannot deinstall it later, so only use this option if
-you know what you are doing!
-.It Fl r , -remote
-Use the remote fetching feature.
-This will determine the appropriate
-objformat and release and then fetch and install the package.
-.It Fl f , -force
-Force installation to proceed even if prerequisite packages are not
-installed or the requirements script fails.
-Although
+.It Fl f
+Force continuing operation even if non-critical errors are encountered,
+such as error in installed package state or unsatisfied dependancies.
+.It Fl a
+Apply the specified package patch to the current live system.
+The currently installed package must match the source package from which
+the patch was generated.
+.It Fl c
+Create a package patch from two specified binary package files.
+.It Fl m
+Mass-create package patches from two directories of packages.
+The
 .Nm
-will still try to find and auto-install missing prerequisite packages,
-a failure to find one will not be fatal.
-.It Fl F
-Already installed packages are not an error.
-.It Fl p , -prefix Ar prefix
-Set
-.Ar prefix
-as the directory in which to extract files from a package.
-If a package has set its default directory, it will be overridden
-by this flag.
-Note that only the first
-.Cm @cwd
-directive will be replaced, since
-.Nm
-has no way of knowing which directory settings are relative and
-which are absolute.
-It is rare in any case to see more than one
-directory transition made, but when such does happen and you wish
-to have control over *all* directory transitions, then you
-may then wish to look into the use of
-.Cm MASTER
-and
-.Cm SLAVE
-modes (see the
-.Fl M
-and
-.Fl S
-options).
-If the
-.Fl p
-flag appears after any
-.Fl P
-flag on the command line, it overrides its effect, causing
-.Nm
-not to use the given
-.Ar prefix
-recursively.
-.It Fl P Ar prefix
-Does the same as the
-.Fl p
-option, except that the given
-.Ar prefix
-is also used recursively for the dependency packages, if any.
-If the
-.Fl P
-flag appears after any
-.Fl p
-flag on the command line, it overrides its effect, causing
-.Nm
-to use the given
-.Ar prefix
-recursively.
-.It Fl t , -template Ar template
-Use
-.Ar template
-as the input to
-.Xr mktemp 3
-when creating a
-.Dq staging area .
-By default, this is the string
-.Pa /var/tmp/instmp.XXXXXX ,
-but it may be necessary to override it in the situation where
-space in your
-.Pa /var/tmp
-directory is limited.
-Be sure to leave some number of `X' characters
-for
-.Xr mktemp 3
-to fill in with a unique ID.
-.Pp
-You can get a performance boost by setting the staging area
-.Ar template
-to reside on the same disk partition as target directories for package
-file installation; often this is
-.Pa /usr .
-.It Fl M , -master
-Run in
-.Cm MASTER
-mode.
-This is a very specialized mode for running
-.Nm
-and is meant to be run in conjunction with
-.Cm SLAVE
-mode.
-When run in this mode,
-.Nm
-does no work beyond extracting the package into a temporary staging
-area (see the
-.Fl t
-option), reading in the packing list, and then dumping it (prefaced by
-the current staging area) to stdout where it may be filtered by a
-program such as
-.Xr sed 1 .
-When used in conjunction with
-.Cm SLAVE
-mode, it allows you to make radical changes to the package structure
-before acting on its contents.
-.It Fl S , -slave
-Run in
-.Cm SLAVE
-mode.
-This is a very specialized mode for running
-.Nm
-and is meant to be run in conjunction with
-.Cm MASTER
-mode.
-When run in this mode,
-.Nm
-expects the release contents to be already extracted and waiting
-in the staging area, the location of which is read as a string
-from stdin.
-The complete packing list is also read from stdin,
-and the contents then acted on as normal.
-.It Fl C , -chroot Ar chrootdir
-Before doing any operations,
-.Xr chroot 2
-to the
-.Ar chrootdir
-directory so that all package files, and the package database, are
-installed to
-.Ar chrootdir .
-Note that
-.Ar chrootdir
-needs to be a fairly complete file system, including everything normally
-needed by
-.Nm
-to run.
-This flag was added to help support operations done by
-.Xr sysinstall 8
-and is not expected to be useful for much else.
-Be careful that
-.Ar chrootdir
-is properly configured and cannot be modified by normal users,
-versions of commands like
-.Xr fetch 1
-may be run inside
-.Ar chrootdir
-as a side effect.
-.El
-.Pp
-One or more
-.Ar pkg-name
-arguments may be specified, each being either a file containing the
-package (these usually end with a
-.Dq .tbz
-suffix) or a
-URL pointing at a file available on an ftp site.
-Thus you may
-extract files directly from their anonymous ftp locations (e.g.\&
-.Nm
-.Li ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/shells/bash-1.14.7.tbz ) .
-Note: If you wish to use
-.Bf -emphasis
-passive mode
-.Ef
-ftp in such transfers, set
-the variable
-.Bf -emphasis
-FTP_PASSIVE_MODE
-.Ef
-to some value in your environment.
-Otherwise, the more standard
-ACTIVE mode may be used.
-If
-.Nm
-consistently fails to fetch a package from a site known to work,
-it may be because you have a firewall that demands the usage of
-.Bf -emphasis
-passive mode
-.Ef
-ftp.
+will attempt to match each package from the source directory to exactly
+one package in the target directory and produce both patches and the
+index file in the specified patch directory.
+The resulting directory will be called the "package patch repository."
+.It Fl u
+Compare the current system state with the package patch repository and
+update any packages found to need updating.
 .Sh TECHNICAL DETAILS
 The
 .Nm
-utility extracts each package's
-.Dq "packing list"
-into a special staging directory (see
-.Sx ENVIRONMENT ) ,
-parses it, and then runs
-through the following sequence to fully extract the contents of the package:
-.Bl -enum
-.It
-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
-.Ic @conflicts
-directives, see
-.Xr pkg_create 1 )
-with an already installed package.
-If it is, installation is terminated.
-.It
-Scan all the package dependencies (from
-.Ic @pkgdep
-directives, see
-.Xr pkg_create 1 )
-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
-.Ic @option
-directives which control how the package is added to the system.
-At the time of this writing, the only currently implemented option is
-.Ic @option Cm extract-in-place
-which will cause the package to be extracted directly into its
-prefix directory without moving through a staging area.
-.It
-If
-.Ic @option Cm extract-in-place
-is enabled, the package is now extracted directly into its
-final location, otherwise it is extracted into the staging area.
-.It
-If a requirements script
-.Pa +REQUIRE
-exists for the package (see the
-.Fl r
-flag of
-.Xr pkg_create 1 ) ,
-then execute it with the following arguments:
-.Pp
-.D1 Ar pkg-name Li INSTALL
-.Pp
-where
-.Ar pkg-name
-is the name of the package in question and the
-.Dq Li INSTALL
-keyword denotes this as an installation requirements check (useful if
-you want to have one script serving multiple functions).
-.It
-If a pre-install script
-.Pa +INSTALL
-exists for the package,
-it is then executed with the following arguments:
-.Pp
-.D1 Ar pkg-name Li PRE-INSTALL
-.Pp
-where
-.Ar pkg-name
-is the name of the package in question and
-.Dq Li PRE-INSTALL
-is a keyword denoting this as the preinstallation phase.
-.Pp
-.Sy Note :
-The
-.Dq Li PRE-INSTALL
-keyword will not appear if separate scripts for pre-install and post-install
-are given during package creation time (using the
-.Fl i
-and
-.Fl I
-flags to
-.Xr pkg_create 1 ) .
-.It
-If
-.Cm @option Cm extract-in-place
-is not used, then the packing list (this is the
-.Pa +CONTENTS
-file) is now used as a guide for moving (or copying, as necessary) files from
-the staging area into their final locations.
-.It
-If an mtree file
-.Pa +MTREE_DIRS
-exists for the package (see the
-.Fl m
-flag of
-.Xr pkg_create 1 ) ,
-then
-.Xr mtree 8
-is invoked as:
-.Pp
-.D1 Nm mtree Fl U f Pa +MTREE_DIRS Fl d e p Ar prefix
-.Pp
-where
-.Ar prefix
-is either the prefix specified with the
-.Fl p
-or
-.Fl P
-flag or,
-if neither flag was specified, the name of the first directory named by a
-.Ic @cwd
-directive within this package.
-.It
-If a post-install script
-.Pa +POST-INSTALL
-exists for the package,
-it is then executed with the following arguments:
-.Pp
-.D1 Ar pkg-name Li POST-INSTALL
-.Pp
-where
-.Ar pkg-name
-is the name of the package in question and
-.Dq Li POST-INSTALL
-is a keyword denoting this as the post-installation phase.
-.Pp
-.Sy Note :
-The
-.Dq Li POST-INSTALL
-keyword will not appear if separate scripts for pre-install and post-install
-are given during package creation time (using the
-.Fl i
-and
-.Fl I
-flags to
-.Xr pkg_create 1 ) .
-.Pp
-Reasoning behind passing keywords such as
-.Dq Li POST-INSTALL
-and
-.Dq Li PRE-INSTALL
-is that this allows you to write a single
-install
-script that does both
-.Dq before
-and
-.Dq after
-actions.
-But, separating the
-functionality is more advantageous and easier from a maintenance viewpoint.
-.It
-After installation is complete, a copy of the
-description
-.Pq Pa +DESC ,
-comment
-.Pq Pa +COMMENT ,
-pre-install script
-.Pq Pa +INSTALL ,
-post-install script
-.Pq Pa +POST-INSTALL ,
-deinstall script
-.Pq Pa +DEINSTALL ,
-post-deinstall script
-.Pq Pa +POST-DEINSTALL ,
-requirements script
-.Pq Pa +REQUIRE ,
-display
-.Pq Pa +DISPLAY ,
-mtree
-.Pq Pa +MTREE_DIRS ,
-and packing list
-.Pq Pa +CONTENTS
-files are copied into
-.Pa /var/db/pkg/ Ns Aq Ar pkg-name
-for subsequent possible use by
-.Xr pkg_delete 1 .
-Any package dependencies are recorded in the other packages'
-.Pa /var/db/pkg/ Ns Ao Ar other-pkg Ac Ns Pa /+REQUIRED_BY
-file
-(if the environment variable
-.Ev PKG_DBDIR
-is set, this overrides the
-.Pa /var/db/pkg/
-path shown above).
-.It
-Finally, the staging area is deleted and the program terminates.
-.El
-.Pp
-All the scripts are called with the environment variable
-.Ev PKG_PREFIX
-set to the installation prefix (see the
-.Fl p
-and
-.Fl P
-options above).
-This allows a package author to write a script
-that reliably performs some action on the directory where the package
-is installed, even if the user might change it with the
-.Fl p
-or
-.Fl P
-flags to
-.Nm .
-.Sh ENVIRONMENT
-The value of the
-.Ev PKG_PATH
-is used if a given package cannot be found.
-The environment variable
-should be a series of entries separated by colons.
-Each entry
-consists of a directory name.
-The current directory may be indicated
-implicitly by an empty directory name, or explicitly by a single
-period.
-.Pp
-The environment variable
-.Ev PKG_DBDIR
-specifies an alternative location for the installed package database,
-default location is
+utility operates on binary package files and on the live system, including
+the package database in
 .Pa /var/db/pkg .
-.Pp
-The environment variables
-.Ev PKG_TMPDIR
-and
-.Ev TMPDIR ,
-in that order, are taken to name temporary directories where
+All modes of operation require
 .Nm
-will attempt to create its staging area in.
-If these variables are not present or if the directories named lack
-sufficient space, then
+to be run as the superuser.
+Currently,
 .Nm
-will use the first of
-.Pa /var/tmp ,
-.Pa /tmp
-or
-.Pa /usr/tmp
-with sufficient space.
-.Pp
-The environment variable
-.Ev PACKAGEROOT
-specifies an alternate location for
-.Nm
-to fetch from.
-The fetch URL is built using this environment variable and the automatic
-directory logic that
-.Nm
-uses when the
-.Fl r
-option is invoked.
-An example setting would be
-.Qq Li ftp://ftp3.FreeBSD.org .
-.Pp
-The environment variable
-.Ev PACKAGESITE
-specifies an alternate location for
-.Nm
-to fetch from.
-This variable subverts the automatic directory logic
-that
-.Nm
-uses when the
-.Fl r
-option is invoked.
-Thus it should be a complete URL to the remote package file(s).
-.Pp
-The environment variable
-.Ev PKGDIR
-specifies an alternative location to save downloaded packages to when
-.Fl K
-option is used.
-.Sh FILES
-.Bl -tag -width /var/db/pkg -compact
-.It Pa /var/tmp
-Temporary directory for creating the staging area, if environmental variables
-.Ev PKG_TMPDIR
-or
-.Ev TMPDIR
-do not point to a suitable directory.
-.It Pa /tmp
-Next choice if
-.Pa /var/tmp
-does not exist or has insufficient space.
-.It Pa /usr/tmp
-Last choice if
-.Pa /var/tmp
-and
-.Pa /tmp
-are not suitable for creating the staging area.
-.It Pa /var/db/pkg
-Default location of the installed package database.
-.El
+does not invoke any scripts specified in the package files.
 .Sh SEE ALSO
+.Xr pkg_add 1 ,
 .Xr pkg_create 1 ,
 .Xr pkg_delete 1 ,
 .Xr pkg_info 1 ,
@@ -579,21 +93,14 @@
 .Xr sysconf 3 ,
 .Xr mtree 8
 .Sh AUTHORS
-.An Jordan Hubbard
-.Sh CONTRIBUTORS
-.An John Kohl Aq jtk@rational.com
+.An Ivan Voras Aq ivoras@freebsd.org
 .Sh BUGS
-Hard links between files in a distribution are only preserved if either
-(1) the staging area is on the same file system as the target directory of
-all the links to the file, or (2) all the links to the file are bracketed by
-.Cm @cwd
-directives in the contents file,
-.Em and
-the link names are extracted with a single
-.Cm tar
-command (not split between
-invocations due to exec argument-space limitations--this depends on the
-value returned by
-.Fn sysconf _SC_ARG_MAX ) .
-.Pp
-Sure to be others.
+Many low-level details of
+.Nm
+(such as hard link handling, etc) depend on the behaviour of the
+.Xr tar 1
+utility.
+This is also the reason why
+.Nm
+needs superuser privileges while running in all modes of operation.
+

==== //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#28 (text+ko) ====

@@ -72,6 +72,8 @@
 
 enum PP_OP { PP_NONE, PP_MKPATCH, PP_APPLY, PP_MKPATCHDIR, PP_UPDATEWEB };
 
+enum CMP_NAME { CMP_FULL_MATCH, CMP_BASE_MATCH, CMP_NO_MATCH, CMP_ERROR };
+
 struct pkgxjob {
 	char 	*filename;
 	FILE 	*fp;
@@ -156,5 +158,7 @@
 void baton_twirl(void);
 Package *pkg_read_plist(char *pfilename);
 int check_conflicts(Package *pnew, char **pkglist);
+enum CMP_NAME compare_package_names(char *pkg1, char *pkg2);
+enum CMP_NAME check_dependencies(Package *pnew, char **pkglist);
 
 #endif

==== //depot/projects/soc2010/pkg_patch/src/patch/support.c#27 (text+ko) ====

@@ -691,7 +691,7 @@
 /*
  * Check for conflicts from metadata in the new package to recorded packages.
  * Returns (i+1) if the given package pnew conflicts on the i'th element
- * in pkglist.
+ * in pkglist. Returns 0 if no conflict detected.
  */
 int
 check_conflicts(Package *pnew, char **pkglist)
@@ -722,3 +722,79 @@
 	 * if needed. */
 	return (0);
 }
+
+
+/*
+ * Compare two package names based on their individual components. Returns
+ * the amount of similarity between the names.
+ */
+enum CMP_NAME
+compare_package_names(char *pkg1, char *pkg2)
+{
+	char base1[PKGNAME_MAX], ver1[PKGNAME_MAX];
+	char base2[PKGNAME_MAX], ver2[PKGNAME_MAX];
+	
+	if (pkg1 == NULL || pkg2 == NULL)
+		return (CMP_NO_MATCH);
+	parse_package_name(pkg1, base1, ver1, NULL);
+	parse_package_name(pkg2, base2, ver2, NULL);
+	if (strncmp(base1, base2, PKGNAME_MAX) != 0)
+		return (CMP_NO_MATCH);
+	if (strncmp(ver1, ver2, PKGNAME_MAX) != 0)
+		return (CMP_BASE_MATCH);
+	return (CMP_FULL_MATCH);
+}
+
+
+/*
+ * Check package dependencies on the given pkglist or the currently installed
+ * packages.
+ */
+enum CMP_NAME
+check_dependencies(Package *pnew, char **pkglist)
+{
+	int er, i;
+	PackingList pl;
+	enum CMP_NAME best;
+	
+	best = CMP_FULL_MATCH;
+	if (pkglist == NULL) {
+		pkglist = matchinstalled(MATCH_ALL, NULL, &er);
+		if (pkglist == NULL || er != 0) {
+			warnx("Cannot fetch a list of installed packages "
+			    "(matchinstalled(MATCH_ALL...))");
+			return (-1);
+		}
+	}
+	pl = pnew->head;
+	while (pl != NULL) {
+		if (pl->type == PLIST_PKGDEP) {
+			enum CMP_NAME match;
+			int found = 0;
+			
+			for (i = 0; pkglist[i] != NULL; i++) {
+				match = compare_package_names(pl->name,
+				    pkglist[i]);
+				if (match == CMP_BASE_MATCH) {
+					if (best == CMP_FULL_MATCH)
+						best = CMP_BASE_MATCH;
+					found = 1;
+					break;
+				} else if (match == CMP_FULL_MATCH) {
+					found = 1;
+					break;
+				}
+			}
+			if (!found) {
+				warnx("Dependancy not found: %s",
+				    pl->name);
+				best = CMP_NO_MATCH;
+				break;
+			}
+		}
+		pl = pl->next;
+	}
+	/* XXX: When libpkg grows a storefree() API, use it to free pkglist
+	 * if needed. */
+	return (best);
+}

==== //depot/projects/soc2010/pkg_patch/src/patch/updateweb.c#8 (text+ko) ====

@@ -117,7 +117,7 @@
 
 
 static void
-split_filename(char *path, char *fname, int len)
+extract_filename(char *path, char *fname, int len)
 {
 	strncpy(fname, strrchr(path, '/')+1, len);
 }
@@ -188,7 +188,7 @@
 	if (Verbose > 1)
 		printf("Patching from %s (index file: %s)\n", url_base, url_index);
 	
-	split_filename(url_index, index_fname, PATH_MAX);
+	extract_filename(url_index, index_fname, PATH_MAX);
 	snprintf(local_index, PATH_MAX, "%s/%s", my_tmp, index_fname);
 	if (Verbose > 2)
 		printf("Downloading pkgpatchindex to %s\n", local_index);
@@ -292,7 +292,6 @@
 		}
 	}
 	
-	
 	scount = 1;
 	while (scount != 0) {
 		int ndeps = 0, ndeps_found = 0;

==== //depot/projects/soc2010/pkg_patch/src/patch/updateweb.h#8 (text+ko) ====




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008052343.o75NhU6Y073243>