Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Jul 2008 11:35:41 GMT
From:      Anders Nore <andenore@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 145423 for review
Message-ID:  <200807181135.m6IBZf8r051105@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=145423

Change 145423 by andenore@andenore_laptop on 2008/07/18 11:35:39

	Made function fix_dependencies(pkgname) in lib/deps.c and pkg_create -O
	now fixes dependencies. 

Affected files ...

.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/perform.c#6 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/perform.c#7 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/Makefile#2 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/deps.c#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#10 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/plist.c#6 edit

Differences ...

==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/perform.c#6 (text+ko) ====

@@ -492,47 +492,7 @@
 	 * Reconstructs +REQUIRED_BY file for the package to be installed in
 	 * case it has been removed earlier (e.g. pkg_delete -f)
 	 */ 
-	if (Verbose)
-	    printf("Recording existing dependency's on %s\n", Plist.name);
-	int errcode;
-	matched = matchinstalled(MATCH_ALL, NULL, &errcode);
-	for (i = 0; matched[i] != NULL; i++) {
-	    FILE *fp;
-	    Package nplist;
-	    char path[PATH_MAX];
-
-	    /* Skip this package */
-	    if (strcmp(matched[i], Plist.name) == 0)
-		continue;
-
-	    snprintf(path, sizeof(path), "%s/%s/%s", LOG_DIR, matched[i], CONTENTS_FNAME);
-	    if ((fp = fopen(path, "r")) == NULL) {
-		warn("Could not open %s for reading", path);
-		continue;
-	    }
-	    read_plist(&nplist, fp);
-	    fclose(fp);
-
-	    for (p = nplist.head; p != nplist.tail; p = p->next) {
-		if (p->type != PLIST_PKGDEP)
-		    continue;
-		if (strcmp(p->name, Plist.name) == 0) {
-		    /* Register this package in REQUIRED_BY_FNAME */
-		    snprintf(path, sizeof(path), "%s/%s/%s", LOG_DIR, Plist.name, REQUIRED_BY_FNAME);
-		    if ((fp = fopen(path, "a")) == NULL) {
-			warn("Could not open %s", path);
-			continue;
-		    }
-		    fprintf(fp, "%s\n", nplist.name);
-		    fclose(fp);
-		    if (Verbose)
-			printf("\t %s depends on %s (REGISTERED)\n", p->name, Plist.name);
-		}
-	    }
-	    free_plist(&nplist);
-	    free(matched[i]);
-	}
-	free(matched);
+	fix_dependencies(Plist.name);
 
 
 	/* Make sure pkg_info can read the entry */

==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/perform.c#7 (text+ko) ====

@@ -244,9 +244,13 @@
     if (PlistOnly) {
 	if (openDatabase(O_CREAT | O_RDWR))
 	    err("Could not open database: %s", DBCACHE_FILE);
-	
-	plist_add_installtime(&plist);
-	check_list(home, &plist);	
+	Boolean v = Verbose;
+	Verbose = FALSE;	
+	fix_dependencies(plist.name);
+	Verbose = v;
+
+	plist_add_installtime(&plist);	
+	check_list(home, &plist);
 	write_plist(&plist, stdout);
 	int retval = cache_plist(&plist, FALSE);
 

==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/Makefile#2 (text+ko) ====

@@ -2,8 +2,9 @@
 
 LIB=	install
 INTERNALLIB=
-SRCS=	file.c msg.c plist.c str.c exec.c global.c pen.c match.c \
-	deps.c version.c pkgwrap.c url.c
+SRCS=	file.c msg.c plist.c str.c exec.c global.c pen.c database.c match.c \
+	deps.c version.c pkgwrap.c url.c 
+CFLAGS=	-g
 
 WARNS?=	3
 WFORMAT?=	1

==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/deps.c#3 (text+ko) ====

@@ -244,3 +244,59 @@
 
 	return retval;
 }
+
+/*
+ * Fixes dependencies on the package with name pkgname.
+ * It scans the installed packages, searches for @pkgdep in the +CONTENS file
+ * and see if that matches the given pkgname, if it does then register the
+ * installed package in pkgname's +REQUIRED_BY file.
+ */
+void
+fix_dependencies(char *pkgname) 
+{
+    int i;
+    char **matched;
+    PackingList p = NULL;
+    if (Verbose)
+	printf("Recording existing dependency's on %s\n", pkgname);
+    int errcode;
+    matched = matchinstalled(MATCH_ALL, NULL, &errcode);
+    for (i = 0; matched[i] != NULL; i++) {
+	FILE *fp;
+	Package nplist;
+	char path[PATH_MAX];
+
+	bzero(&nplist, sizeof(nplist));
+	/* Skip this package */
+	if (strcmp(matched[i], pkgname) == 0)
+	    continue;
+
+	snprintf(path, sizeof(path), "%s/%s/%s", LOG_DIR, matched[i], CONTENTS_FNAME);
+	if ((fp = fopen(path, "r")) == NULL) {
+	    warn("fix_dependencies: Could not open %s for reading", path);
+	    continue;
+	}
+	read_plist(&nplist, fp);
+	fclose(fp);
+
+	for (p = nplist.head; p != nplist.tail; p = p->next) {
+	    if (p->type != PLIST_PKGDEP)
+		continue;
+	    if (strcmp(p->name, pkgname) == 0) {
+		/* Register this package in REQUIRED_BY_FNAME */
+		snprintf(path, sizeof(path), "%s/%s/%s", LOG_DIR, pkgname, REQUIRED_BY_FNAME);
+		if ((fp = fopen(path, "a")) == NULL) {
+		    warn("fix_dependencies: Could not open %s", path);
+		    continue;
+		}
+		fprintf(fp, "%s\n", nplist.name);
+		fclose(fp);
+		if (Verbose)
+		    printf("\t %s depends on %s\n", nplist.name, pkgname);
+	    }
+	}
+	free_plist(&nplist);
+	free(matched[i]);
+    }
+    free(matched);
+}

==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#10 (text+ko) ====

@@ -246,6 +246,7 @@
 int		sortdeps(char **);
 int		chkifdepends(const char *, const char *);
 int		requiredby(const char *, struct reqr_by_head **, Boolean, Boolean);
+void		fix_dependencies(char *pkgname);
 
 /* Version */
 int		verscmp(Package *, int, int);

==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/plist.c#6 (text+ko) ====

@@ -310,10 +310,11 @@
 	}
 	if (cmd == PLIST_COMMENT && sscanf(cp, "DATE:%d\n", &date) == 1) {
 	    pkg->datetime = date;
+	    goto bottom;	
 	}
 	
 	bottom:
-		add_plist(pkg, cmd, cp);
+	    add_plist(pkg, cmd, cp);
     }
 }
 
@@ -437,7 +438,7 @@
 	switch (p->type)  {
 	case PLIST_NAME:
 	    name = p->name;
-	    if (dbRemove(name) != 0)
+	    if (dbRemove(name) == -1)
 		warnx("%s: Failed to remove entry %s from db\n", __func__, name);
 	    break;
 



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