PERFORCE change 144088 for review

Anders Nore andenore at FreeBSD.org
Wed Jun 25 12:09:32 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=144088

Change 144088 by andenore at andenore_laptop on 2008/06/25 12:09:02

	pkg_create's -O option have been modified to register the port to be
	installed in cache.

Affected files ...

.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/CHANGES#2 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/perform.c#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/perform.c#2 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/pl.c#2 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/database.c#4 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#5 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/version/perform.c#4 edit

Differences ...

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

@@ -1,5 +1,5 @@
-Changes made to pkg_install during SoC2008 by Anders Nore ( andenore at FreeBSD.org )
-Last modified: 2008 06 17
+Changes made to pkg_install during SoC2008 by Anders Nore (andenore at FreeBSD.org)
+Last modified: 2008 06 25
 
 
 Converter: 
@@ -20,4 +20,9 @@
 Lib:
 	- Changed methods in match.c to use cache if available
 	- Added global variable 'database' of type DB* (the database object)
-	- Added database helper functions+	- Added database helper functions
+	- Added function to cache a Packagelist (cache_plist())
+
+Create:
+	- The -O option has been modified to cache information when installing ports
+	  from /usr/ports/
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/perform.c#3 (text+ko) ====

@@ -60,45 +60,48 @@
 		return 1;
 	}
 
-	key.size = strlen(pkg.name) + 1;
-	key.data = pkg.name;
-	data.size = strlen(pkg.origin) + 1;
-	data.data = pkg.origin;
+	return cache_plist(&pkg, Verbose);
 
-	if(!Quiet)
-		printf("Saving package: %s\n", key.data);
-	dbsave(&key, &data);
-
-	for (itr = pkg.head; itr != pkg.tail; itr = itr->next) {
-		if (itr->type == PLIST_CWD && skip == FALSE) {
-			cwd = itr->name;
-		} 
-		else if (itr->type == PLIST_IGNORE) {
-			skip = TRUE;
-			if(Verbose && itr->next)
-				printf("\tIgnored: %s\n", itr->next->name);
-
-			continue;
-		} 
-		else if (itr->type == PLIST_FILE && skip == FALSE) {
-			/* Save abspath of file installed in key, and pkgname in data */
-			char *entry = NULL;
-			asprintf(&entry, "%s/%s", cwd, itr->name);
-			
-			key.size = strlen(entry) + 1;
-			key.data = entry;
-			data.size = strlen(pkgname) + 1;
-			data.data = pkgname;
-
-			if(Verbose)
-				printf("\tSaving entry %s -> %s\n", key.data, data.data);
-			dbsave(&key, &data);
-			free(entry);
-		}
-		skip = FALSE;
-	}
-	free_plist(&pkg);
-
+	
+// 	key.size = strlen(pkg.name) + 1;
+// 	key.data = pkg.name;
+// 	data.size = strlen(pkg.origin) + 1;
+// 	data.data = pkg.origin;
+// 
+// 	if(!Quiet)
+// 		printf("Saving package: %s\n", key.data);
+// 	dbsave(&key, &data);
+// 
+// 	for (itr = pkg.head; itr != pkg.tail; itr = itr->next) {
+// 		if (itr->type == PLIST_CWD && skip == FALSE) {
+// 			cwd = itr->name;
+// 		} 
+// 		else if (itr->type == PLIST_IGNORE) {
+// 			skip = TRUE;
+// 			if(Verbose && itr->next)
+// 				printf("\tIgnored: %s\n", itr->next->name);
+// 
+// 			continue;
+// 		} 
+// 		else if (itr->type == PLIST_FILE && skip == FALSE) {
+// 			/* Save abspath of file installed in key, and pkgname in data */
+// 			char *entry = NULL;
+// 			asprintf(&entry, "%s/%s", cwd, itr->name);
+// 			
+// 			key.size = strlen(entry) + 1;
+// 			key.data = entry;
+// 			data.size = strlen(pkgname) + 1;
+// 			data.data = pkgname;
+// 
+// 			if(Verbose)
+// 				printf("\tSaving entry %s -> %s\n", key.data, data.data);
+// 			dbsave(&key, &data);
+// 			free(entry);
+// 		}
+// 		skip = FALSE;
+// 	}
+// 	free_plist(&pkg);
+	
 	return 0;
 }
 

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

@@ -94,7 +94,7 @@
 	    		errx(1, "no packages match pattern");
 	}
 	/*
-	 * Is there is only one installed package matching the pattern,
+	 * If there is only one installed package matching the pattern,
 	 * we need to respect the optional pkg-filename parameter.  If,
 	 * however, the pattern matches several packages, this parameter
 	 * makes no sense and is ignored.
@@ -196,47 +196,59 @@
 	    printf(".\n");
     }
 
-    /* If a SrcDir override is set, add it now */
-    if (SrcDir) {
-	if (Verbose && !PlistOnly)
-	    printf("Using SrcDir value of %s\n", SrcDir);
-	add_plist(&plist, PLIST_SRC, SrcDir);
-    }
+	/* If a SrcDir override is set, add it now */
+	if (SrcDir) {
+		if (Verbose && !PlistOnly)
+			printf("Using SrcDir value of %s\n", SrcDir);
+		add_plist(&plist, PLIST_SRC, SrcDir);
+	}
 
-    /* Slurp in the packing list */
-    read_plist(&plist, pkg_in);
+	/* Slurp in the packing list */
+	read_plist(&plist, pkg_in);
 
     /* Prefix should add an @cwd to the packing list */
-    if (Prefix)
-	add_plist_top(&plist, PLIST_CWD, Prefix);
+	if (Prefix)
+		add_plist_top(&plist, PLIST_CWD, Prefix);
 
     /* Add the origin if asked, at the top */
-    if (Origin)
-	add_plist_top(&plist, PLIST_ORIGIN, Origin);
+	if (Origin) {
+		add_plist_top(&plist, PLIST_ORIGIN, Origin);
+		plist.origin = Origin;
+	}
 
     /*
      * Run down the list and see if we've named it, if not stick in a name
      * at the top.
      */
-    if (find_plist(&plist, PLIST_NAME) == NULL)
-	add_plist_top(&plist, PLIST_NAME, basename(pkg));
+	if (find_plist(&plist, PLIST_NAME) == NULL) {
+		add_plist_top(&plist, PLIST_NAME, basename(pkg));
+		plist.name = basename(pkg);
+	}
 
     if (asprintf(&cp, "PKG_FORMAT_REVISION:%d.%d", PLIST_FMT_VER_MAJOR,
 		 PLIST_FMT_VER_MINOR) == -1) {
-	errx(2, "%s: asprintf() failed", __func__);
-    }
-    add_plist_top(&plist, PLIST_COMMENT, cp);
-    free(cp);
+			errx(2, "%s: asprintf() failed", __func__);
+	}
+	add_plist_top(&plist, PLIST_COMMENT, cp);
+	free(cp);
+
+	/*
+	 * We're just here for to dump out a revised plist for the FreeBSD ports
+	 * hack.  It's not a real create in progress.
+	 * Ports uses this to fake a pkg_add installation so that we can call 
+	 * pkg_delete later.
+	 * See /usr/ports/Mk/bsd.port.mk (in the fake-pkg target)
+	 */
+	if (PlistOnly) {
+		openDatabase(PKG_DBCACHE_FILE);
+	
+		check_list(home, &plist);
+		int retval = cache_plist(&plist, FALSE);
+		write_plist(&plist, stdout);
 
-    /*
-     * We're just here for to dump out a revised plist for the FreeBSD ports
-     * hack.  It's not a real create in progress.
-     */
-    if (PlistOnly) {
-	check_list(home, &plist);
-	write_plist(&plist, stdout);
-	exit(0);
-    }
+		closeDatabase();
+		exit(retval);
+	}
 
     /* Make a directory to stomp around in */
     home = make_playpen(PlayPen, 0);

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

@@ -31,69 +31,71 @@
 void
 add_cksum(Package *pkg, PackingList p, const char *fname)
 {
-    char *cp = NULL, buf[33];
+	char *cp = NULL, buf[33];
+
+	if (issymlink(fname)) {
+		int len;
+		char lnk[FILENAME_MAX];
 
-    if (issymlink(fname)) {
-	int len;
-	char lnk[FILENAME_MAX];
+		if ((len = readlink(fname, lnk, FILENAME_MAX)) > 0)
+			cp = MD5Data((unsigned char *)lnk, len, buf);
 
-	if ((len = readlink(fname, lnk, FILENAME_MAX)) > 0)
-	    cp = MD5Data((unsigned char *)lnk, len, buf);
-    } else if (isfile(fname)) {
-	/* Don't record MD5 checksum for device nodes and such */
-	cp = MD5File(fname, buf);
-    }
+	} else if (isfile(fname)) {
+		/* Don't record MD5 checksum for device nodes and such */
+		cp = MD5File(fname, buf);
+	}
 
-    if (cp != NULL) {
-	PackingList tmp = new_plist_entry();
+	if (cp != NULL) {
+		PackingList tmp = new_plist_entry();
 
-	tmp->name = copy_string(strconcat("MD5:", cp));
-	tmp->type = PLIST_COMMENT;
-	tmp->next = p->next;
-	tmp->prev = p;
-	p->next = tmp;
-	if (pkg->tail == p)
-	    pkg->tail = tmp;
-    }
+		tmp->name = copy_string(strconcat("MD5:", cp));
+		tmp->type = PLIST_COMMENT;
+		tmp->next = p->next;
+		tmp->prev = p;
+		p->next = tmp;
+		
+		if (pkg->tail == p)
+			pkg->tail = tmp;
+	}
 }
 
 /* Check a list for files that require preconversion */
 void
 check_list(const char *home, Package *pkg)
 {
-    const char *where = home;
-    const char *there = NULL;
-    char name[FILENAME_MAX];
-    char *prefix = NULL;
-    PackingList p;
+	const char *where = home;
+	const char *there = NULL;
+	char name[FILENAME_MAX];
+	char *prefix = NULL;
+	PackingList p;
 
-    for (p = pkg->head; p != NULL; p = p->next)
+	for (p = pkg->head; p != NULL; p = p->next)
 	switch (p->type) {
 	case PLIST_CWD:
-	    if (!prefix)
-		prefix = p->name;
-	    where = (p->name == NULL) ? prefix : p->name;
-	    break;
+		if (!prefix)
+			prefix = p->name;
+		where = (p->name == NULL) ? prefix : p->name;
+		break;
 
 	case PLIST_IGNORE:
-	    p = p->next;
-	    break;
+		p = p->next;
+		break;
 
 	case PLIST_SRC:
-	    there = p->name;
-	    break;
+		there = p->name;
+		break;
 
 	case PLIST_FILE:
-	    if (there)
-		snprintf(name, sizeof(name), "%s/%s", there, p->name);
-	    else
-		snprintf(name, sizeof(name), "%s%s/%s",
-		    BaseDir && where && where[0] == '/' ? BaseDir : "", where, p->name);
+		if (there)
+			snprintf(name, sizeof(name), "%s/%s", there, p->name);
+		else
+			snprintf(name, sizeof(name), "%s%s/%s",
+			BaseDir && where && where[0] == '/' ? BaseDir : "", where, p->name);
 
-	    add_cksum(pkg, p, name);
-	    break;
+		add_cksum(pkg, p, name);
+		break;
 	default:
-	    break;
+		break;
 	}
 }
 

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

@@ -2,6 +2,9 @@
 #include <assert.h>
 
 int compare_func(const DBT *, const DBT *);
+int closedb(DB *db);
+int dbput(const DB *db, DBT *key, DBT *data);
+
 
 /*
  * Btree information structure 
@@ -49,7 +52,7 @@
  * TODO: Add warnings, verbose check and such
  */
 void openDatabase(const char *filename) {
-	DEBUG("openDatabase()\n");
+// 	DEBUG("openDatabase()\n");
 	if(database == NULL)
 		database = opendb(filename);
 	else
@@ -66,7 +69,7 @@
 int dbsave(const DBT *key, const DBT *data) {
 	assert(database != NULL);
 
-	return dbput(database, key, data);
+	return dbput(database, (DBT *)key, (DBT *)data);
 }
 
 int dbAddPackage(const char *pkgname, const char *pkgdata) {
@@ -78,7 +81,7 @@
 	key.data = tmp;
 
 	data.size = strlen(pkgdata) + 1;
-	data.data = pkgdata;
+	data.data = (char *)pkgdata;
 
 	int retval = dbsave(&key, &data);
 	free(tmp);
@@ -105,14 +108,14 @@
 	DBT data, key;
 
 	key.size = strlen(aKey) + 1;
-	key.data = aKey;
+	key.data = (char *)aKey;
 
 	if(database->get(database, &key, &data, 0) != 0)
 		return NULL;
 // 	result = malloc(data.size);
-	strlcpy(&result, data.data, data.size);	
+	strlcpy((char *)&result, (char *)data.data, data.size);	
 
-	return &result;
+	return (char **)&result;
 }
 
 /*
@@ -126,7 +129,7 @@
 
 	DBT key;
 	key.size = strlen(aKey) + 1;
-	key.data = aKey;
+	key.data = (char *)aKey;
 	return database->del(database, &key, 0);
 }
 
@@ -139,7 +142,7 @@
 
 	DBT key;
 	key.size = strlen(aKey) + 1;
-	key.data = aKey;
+	key.data = (char *)aKey;
 
 	if(database->get(database, &key, data, 0) == 0)
 		return TRUE;
@@ -157,7 +160,7 @@
 	int retval;	
 
 	key.size = strlen(pkgname) + 1;
-	key.data = pkgname;
+	key.data = (char *)pkgname;
 	
 	if ((retval = database->get(database, &key, &data, 0)) == 0) {
 		return TRUE;
@@ -169,12 +172,12 @@
 }
 
 
-
 /*
  * Scans the database, returning a new key/data pair for each call
  * Returns 1 when finished
  */
-int dbscan(const DB *db, DBT *key, DBT *data) {
+int
+dbscan(const DB *db, DBT *key, DBT *data) {
 	return db->seq(db, key, data, R_NEXT);
 }
 
@@ -182,13 +185,74 @@
 /*
  * Close the database file
  */
-int closedb(DB *db) {
+int
+closedb(DB *db)
+{
 	return db->close(db);
 }
 
-void closeDatabase() {
+void
+closeDatabase()
+{
 	assert(database != NULL);	
-	DEBUG("closeDatabase()\n");
+// 	DEBUG("closeDatabase()\n");
 		closedb(database);
 }
 
+
+/*
+ * cache_plist
+ */
+int
+cache_plist(Package *pkg, Boolean showmsg)
+{
+	PackingList itr = NULL;
+	Boolean skip = FALSE;
+	char *cwd;
+	DBT key, data;
+
+	if (pkg->name == NULL || pkg->origin == NULL) {
+		if(showmsg)
+			warnx("%s does not appear to be a valid package!", pkg->name);
+		return 1;
+	}
+
+	key.size = strlen(pkg->name) + 1;
+	key.data = (char *)pkg->name;
+	data.size = strlen(pkg->origin) + 1;
+	data.data = (char *)pkg->origin;
+
+	if(showmsg)
+		printf("Saving package: %s\n", (char *)key.data);
+	dbsave(&key, &data);
+
+	for (itr = pkg->head; itr != pkg->tail; itr = itr->next) {
+		if (itr->type == PLIST_CWD && skip == FALSE) {
+			cwd = itr->name;
+		} 
+		else if (itr->type == PLIST_IGNORE) {
+			skip = TRUE;
+			if(Verbose && showmsg && itr->next)
+				printf("\tIgnored: %s\n", (char *)itr->next->name);
+
+			continue;
+		} 
+		else if (itr->type == PLIST_FILE && skip == FALSE) {
+			/* Save abspath of file installed in key, and pkgname in data */
+			char *entry = NULL;
+			asprintf(&entry, "%s/%s", cwd, (char *)itr->name);
+			
+			key.size = strlen(entry) + 1;
+			key.data = entry;
+			data.size = strlen(pkg->name) + 1;
+			data.data = (char *)pkg->name;
+
+			if(Verbose && showmsg)
+				printf("\tSaving entry %s -> %s\n", (char *)key.data, (char *)data.data);
+			dbsave(&key, &data);
+			free(entry);
+		}
+		skip = FALSE;
+	}
+	return 0;
+}
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#5 (text+ko) ====

@@ -258,6 +258,7 @@
 Boolean dbPackageExists(const char *portname);
 void 	closeDatabase(void);
 int		dbscan(const DB *db, DBT *key, DBT *data);
+int		cache_plist(Package *pkg, Boolean showmsg);
 
 /* Externs */
 extern Boolean	Quiet;

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

@@ -431,7 +431,7 @@
 getPkgName(const char *makefile)
 {
 	FILE *fp;
-	fp = fopen(tmp, "r");
+	fp = fopen(makefile, "r");
 	if (!fp) {
 		warnx("Could not open %s, trying make -V PKGNAME", makefile);
 		return NULL;


More information about the p4-projects mailing list