Date: Wed, 25 Jun 2008 12:09:31 GMT From: Anders Nore <andenore@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 144088 for review Message-ID: <200806251209.m5PC9Vx0083601@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=144088 Change 144088 by andenore@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@FreeBSD.org ) -Last modified: 2008 06 17 +Changes made to pkg_install during SoC2008 by Anders Nore (andenore@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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200806251209.m5PC9Vx0083601>