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