diff -Nur pacman-2.7.9/src/db.c pacman-2.7.9-ore3/src/db.c --- pacman-2.7.9/src/db.c 2004-07-13 11:46:09.000000000 +0200 +++ pacman-2.7.9-ore3/src/db.c 2004-07-13 12:14:27.000000000 +0200 @@ -162,9 +162,6 @@ return(NULL); } - /* we always load DESC */ - inforeq |= INFRQ_DESC; - snprintf(path, PATH_MAX, "%s/%s", db->path, ent->d_name); if(stat(path, &buf)) { /* directory doesn't exist or can't be opened */ @@ -173,6 +170,12 @@ info = newpkg(); + /* get package name and version directly from the directory name */ + if(split_pkgname(ent->d_name, (char *)&info->name, (char *)&info->version) == -1) { + FREEPKG(info); + return(NULL); + } + /* DESC */ if(inforeq & INFRQ_DESC) { snprintf(path, PATH_MAX, "%s/%s/desc", db->path, ent->d_name); @@ -187,7 +190,7 @@ break; } trim(line); - if(!strcmp(line, "%NAME%")) { + /*if(!strcmp(line, "%NAME%")) { if(fgets(info->name, sizeof(info->name), fp) == NULL) { FREEPKG(info); return(NULL); @@ -199,7 +202,7 @@ return(NULL); } trim(info->version); - } else if(!strcmp(line, "%DESC%")) { + } else */if(!strcmp(line, "%DESC%")) { if(fgets(info->desc, sizeof(info->desc), fp) == NULL) { FREEPKG(info); return(NULL); @@ -339,15 +342,17 @@ } /* INSTALL */ - snprintf(path, PATH_MAX, "%s/%s/install", db->path, ent->d_name); - if(!stat(path, &buf)) { - info->scriptlet = 1; + if(inforeq & INFRQ_ALL) { + snprintf(path, PATH_MAX, "%s/%s/install", db->path, ent->d_name); + if(!stat(path, &buf)) { + info->scriptlet = 1; + } } return(info); } -int db_write(pacdb_t *db, pkginfo_t *info) +int db_write(pacdb_t *db, pkginfo_t *info, unsigned int inforeq) { char topdir[PATH_MAX]; FILE *fp = NULL; @@ -367,87 +372,93 @@ umask(0022); /* DESC */ - snprintf(path, PATH_MAX, "%s/desc", topdir); - fp = fopen(path, "w"); - if(fp == NULL) { - perror("db_write"); - umask(oldmask); - return(1); + if(inforeq & INFRQ_DESC) { + snprintf(path, PATH_MAX, "%s/desc", topdir); + fp = fopen(path, "w"); + if(fp == NULL) { + perror("db_write"); + umask(oldmask); + return(1); + } + fputs("%NAME%\n", fp); + fprintf(fp, "%s\n\n", info->name); + fputs("%VERSION%\n", fp); + fprintf(fp, "%s\n\n", info->version); + fputs("%DESC%\n", fp); + fprintf(fp, "%s\n\n", info->desc); + fputs("%GROUPS%\n", fp); + for(lp = info->groups; lp; lp = lp->next) { + fprintf(fp, "%s\n", (char*)lp->data); + } + fprintf(fp, "\n"); + fputs("%URL%\n", fp); + fprintf(fp, "%s\n\n", info->url); + fputs("%LICENSE%\n", fp); + fprintf(fp, "%s\n\n", info->license); + fputs("%BUILDDATE%\n", fp); + fprintf(fp, "%s\n\n", info->builddate); + fputs("%INSTALLDATE%\n", fp); + fprintf(fp, "%s\n\n", info->installdate); + fputs("%PACKAGER%\n", fp); + fprintf(fp, "%s\n\n", info->packager); + fputs("%SIZE%\n", fp); + fprintf(fp, "%ld\n\n", info->size); + fclose(fp); } - fputs("%NAME%\n", fp); - fprintf(fp, "%s\n\n", info->name); - fputs("%VERSION%\n", fp); - fprintf(fp, "%s\n\n", info->version); - fputs("%DESC%\n", fp); - fprintf(fp, "%s\n\n", info->desc); - fputs("%GROUPS%\n", fp); - for(lp = info->groups; lp; lp = lp->next) { - fprintf(fp, "%s\n", (char*)lp->data); - } - fprintf(fp, "\n"); - fputs("%URL%\n", fp); - fprintf(fp, "%s\n\n", info->url); - fputs("%LICENSE%\n", fp); - fprintf(fp, "%s\n\n", info->license); - fputs("%BUILDDATE%\n", fp); - fprintf(fp, "%s\n\n", info->builddate); - fputs("%INSTALLDATE%\n", fp); - fprintf(fp, "%s\n\n", info->installdate); - fputs("%PACKAGER%\n", fp); - fprintf(fp, "%s\n\n", info->packager); - fputs("%SIZE%\n", fp); - fprintf(fp, "%ld\n\n", info->size); - fclose(fp); /* FILES */ - snprintf(path, PATH_MAX, "%s/files", topdir); - fp = fopen(path, "w"); - if(fp == NULL) { - perror("db_write"); - umask(oldmask); - return(1); - } - fputs("%FILES%\n", fp); - for(lp = info->files; lp; lp = lp->next) { - fprintf(fp, "%s\n", (char*)lp->data); - } - fprintf(fp, "\n"); - fputs("%BACKUP%\n", fp); - for(lp = info->backup; lp; lp = lp->next) { - fprintf(fp, "%s\n", (char*)lp->data); + if(inforeq & INFRQ_FILES) { + snprintf(path, PATH_MAX, "%s/files", topdir); + fp = fopen(path, "w"); + if(fp == NULL) { + perror("db_write"); + umask(oldmask); + return(1); + } + fputs("%FILES%\n", fp); + for(lp = info->files; lp; lp = lp->next) { + fprintf(fp, "%s\n", (char*)lp->data); + } + fprintf(fp, "\n"); + fputs("%BACKUP%\n", fp); + for(lp = info->backup; lp; lp = lp->next) { + fprintf(fp, "%s\n", (char*)lp->data); + } + fprintf(fp, "\n"); + fclose(fp); } - fprintf(fp, "\n"); - fclose(fp); /* DEPENDS */ - snprintf(path, PATH_MAX, "%s/depends", topdir); - fp = fopen(path, "w"); - if(fp == NULL) { - perror("db_write"); - umask(oldmask); - return(1); - } - fputs("%DEPENDS%\n", fp); - for(lp = info->depends; lp; lp = lp->next) { - fprintf(fp, "%s\n", (char*)lp->data); - } - fprintf(fp, "\n"); - fputs("%REQUIREDBY%\n", fp); - for(lp = info->requiredby; lp; lp = lp->next) { - fprintf(fp, "%s\n", (char*)lp->data); - } - fprintf(fp, "\n"); - fputs("%CONFLICTS%\n", fp); - for(lp = info->conflicts; lp; lp = lp->next) { - fprintf(fp, "%s\n", (char*)lp->data); - } - fprintf(fp, "\n"); - fputs("%PROVIDES%\n", fp); - for(lp = info->provides; lp; lp = lp->next) { - fprintf(fp, "%s\n", (char*)lp->data); + if(inforeq & INFRQ_DEPENDS) { + snprintf(path, PATH_MAX, "%s/depends", topdir); + fp = fopen(path, "w"); + if(fp == NULL) { + perror("db_write"); + umask(oldmask); + return(1); + } + fputs("%DEPENDS%\n", fp); + for(lp = info->depends; lp; lp = lp->next) { + fprintf(fp, "%s\n", (char*)lp->data); + } + fprintf(fp, "\n"); + fputs("%REQUIREDBY%\n", fp); + for(lp = info->requiredby; lp; lp = lp->next) { + fprintf(fp, "%s\n", (char*)lp->data); + } + fprintf(fp, "\n"); + fputs("%CONFLICTS%\n", fp); + for(lp = info->conflicts; lp; lp = lp->next) { + fprintf(fp, "%s\n", (char*)lp->data); + } + fprintf(fp, "\n"); + fputs("%PROVIDES%\n", fp); + for(lp = info->provides; lp; lp = lp->next) { + fprintf(fp, "%s\n", (char*)lp->data); + } + fprintf(fp, "\n"); + fclose(fp); } - fprintf(fp, "\n"); - fclose(fp); /* INSTALL */ /* nothing needed here (script is automatically extracted) */ diff -Nur pacman-2.7.9/src/db.h pacman-2.7.9-ore3/src/db.h --- pacman-2.7.9/src/db.h 2004-07-13 11:46:09.000000000 +0200 +++ pacman-2.7.9-ore3/src/db.h 2004-07-13 12:14:27.000000000 +0200 @@ -40,7 +40,7 @@ PMList* db_loadpkgs(pacdb_t *db); pkginfo_t* db_scan(pacdb_t *db, char *target, unsigned int inforeq); pkginfo_t* db_read(pacdb_t *db, struct dirent *ent, unsigned int inforeq); -int db_write(pacdb_t *db, pkginfo_t *info); +int db_write(pacdb_t *db, pkginfo_t *info, unsigned int inforeq); void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles); PMList* db_find_conflicts(pacdb_t *db, PMList* targets, char *root); PMList *whatprovides(pacdb_t *db, char* package); diff -Nur pacman-2.7.9/src/package.c pacman-2.7.9-ore3/src/package.c --- pacman-2.7.9/src/package.c 2004-07-13 11:46:09.000000000 +0200 +++ pacman-2.7.9-ore3/src/package.c 2004-07-13 12:14:27.000000000 +0200 @@ -47,10 +47,16 @@ (writefunc_t)gzwrite }; + if(tar_open(&tar, pkgfile, &gztype, O_RDONLY, 0, TAR_GNU) == -1) { + perror("could not open package"); + return(NULL); + } + info = newpkg(); - if(tar_open(&tar, pkgfile, &gztype, O_RDONLY, 0, TAR_GNU) == -1) { - perror("could not open package"); + if(split_pkgname(pkgfile, (char *)&info->name, (char *)&info->version) == -1) { + fprintf(stderr, "load_pkg: wrong package name %s.\n", pkgfile); + FREEPKG(info); return(NULL); } for(i = 0; !th_read(tar); i++) { @@ -180,9 +186,9 @@ key = strtoupper(key); trim(ptr); if(!strcmp(key, "PKGNAME")) { - strncpy(info->name, ptr, sizeof(info->name)); + /*strncpy(info->name, ptr, sizeof(info->name));*/ } else if(!strcmp(key, "PKGVER")) { - strncpy(info->version, ptr, sizeof(info->version)); + /*strncpy(info->version, ptr, sizeof(info->version));*/ } else if(!strcmp(key, "PKGDESC")) { strncpy(info->desc, ptr, sizeof(info->desc)); } else if(!strcmp(key, "GROUP")) { @@ -380,18 +386,23 @@ printf("\nMD5 Sum : %s\n", info->md5sum); } -int split_pkgname(char *pkg, char **name, char **version) +int split_pkgname(char *pkgfile, char *name, char *version) { - char tmp[256]; + char tmp[512]; char *p, *q; - strncpy(tmp, pkg, 256); - - p = strstr(tmp, ".pkg.tar.gz"); - if(p == NULL) { - return(-1); + /* trim path name (if any) */ + if((p = strrchr(pkgfile, '/')) == NULL) { + p = pkgfile; + } else { + p++; + } + strncpy(tmp, p, 512); + /* trim file extension (if any) */ + if((p = strstr(tmp, ".pkg.tar.gz"))) { + *p = 0; } - *p = 0; + p = tmp+strlen(tmp); for(q = --p; *q && *q != '-'; q--); if(*q != '-' || q == tmp) { @@ -401,10 +412,10 @@ if(*p != '-' || p == tmp) { return(-1); } - *version = strdup(p+1); + strncpy(version, p+1, 64); *p = 0; - *name = strdup(tmp); + strncpy(name, tmp, 256); return(0); } diff -Nur pacman-2.7.9/src/package.h pacman-2.7.9-ore3/src/package.h --- pacman-2.7.9/src/package.h 2004-07-13 11:46:09.000000000 +0200 +++ pacman-2.7.9-ore3/src/package.h 2004-07-13 12:14:27.000000000 +0200 @@ -84,7 +84,7 @@ int is_pkgin(pkginfo_t *needle, PMList *haystack); void dump_pkg_full(pkginfo_t *info); void dump_pkg_sync(pkginfo_t *info); -int split_pkgname(char *pkg, char **name, char **version); +int split_pkgname(char *pkgfile, char *name, char *version); #endif /* vim: set ts=2 sw=2 noet: */ diff -Nur pacman-2.7.9/src/pacman.c pacman-2.7.9-ore3/src/pacman.c --- pacman-2.7.9/src/pacman.c 2004-07-13 11:46:09.000000000 +0200 +++ pacman-2.7.9-ore3/src/pacman.c 2004-07-13 12:18:31.000000000 +0200 @@ -349,23 +349,31 @@ for(i = cache; i; i = i->next) { char *str = (char *)i->data; - char *name, *version; + char name[256], version[64]; - if(split_pkgname(str, &name, &version) != 0) { + if(strstr(str, ".pkg.tar.gz") == NULL) { clean = list_add(clean, strdup(str)); continue; } /* we keep partially downloaded files */ if(strstr(str, ".pkg.tar.gz.part")) { - FREE(name); - FREE(version); + continue; + } + if(split_pkgname(str, (char *)&name, (char *)&version) != 0) { + clean = list_add(clean, strdup(str)); continue; } for(j = i->next; j; j = j->next) { char *s = (char *)j->data; - char *n, *v; + char n[256], v[64]; - if(split_pkgname(s, &n, &v) != 0) { + if(strstr(s, ".pkg.tar.gz") == NULL) { + continue; + } + if(strstr(s, ".pkg.tar.gz.part")) { + continue; + } + if(split_pkgname(s, (char *)&n, (char *)&v) != 0) { continue; } if(!strcmp(name, n)) { @@ -379,11 +387,7 @@ clean = list_add(clean, strdup(ptr)); } } - FREE(n); - FREE(v); } - FREE(name); - FREE(version); } FREELIST(cache); @@ -780,13 +784,13 @@ if(k != NULL) { printf(":: group %s:\n", targ); list_display(" ", k); - if(yesno(" Install whole content? [Y/n] ")) { + if(yesno(" %s whole content? [Y/n] ", (pmo_s_downloadonly) ? "Download" : "Install")) { targets = list_merge(targets, k); FREELIST(k); } else { PMList *l; for(l = k; l; l = l->next) { - if(yesno(":: Install %s from group %s? [Y/n] ", (char*)l->data, targ)) { + if(yesno(":: %s %s from group %s? [Y/n] ", (pmo_s_downloadonly) ? "Download" : "Install", (char*)l->data, targ)) { targets = list_add(targets, strdup((char*)l->data)); } } @@ -1282,7 +1286,7 @@ for(i = final; i; i = i->next) { syncpkg_t *sync = (syncpkg_t*)i->data; if(sync->replaces) { - pkginfo_t *new = db_scan(db, sync->pkg->name, INFRQ_ALL); + pkginfo_t *new = db_scan(db, sync->pkg->name, INFRQ_DEPENDS); for(j = sync->replaces; j; j = j->next) { pkginfo_t *old = (pkginfo_t*)j->data; /* merge lists */ @@ -1290,21 +1294,21 @@ if(!is_in(k->data, new->requiredby)) { /* replace old's name with new's name in the requiredby's dependency list */ PMList *m; - pkginfo_t *depender = db_scan(db, k->data, INFRQ_ALL); + pkginfo_t *depender = db_scan(db, k->data, INFRQ_DEPENDS); for(m = depender->depends; m; m = m->next) { if(!strcmp(m->data, old->name)) { FREE(m->data); m->data = strdup(new->name); } } - db_write(db, depender); + db_write(db, depender, INFRQ_DEPENDS); /* add the new requiredby */ new->requiredby = list_add(new->requiredby, strdup(k->data)); } } } - db_write(db, new); + db_write(db, new, INFRQ_DEPENDS); FREEPKG(new); } } @@ -1821,7 +1825,7 @@ pkginfo_t *tmpp = NULL; PMList *tmppm = NULL; - tmpp = db_scan(db, ((pkginfo_t*)lp->data)->name, INFRQ_DEPENDS); + tmpp = db_scan(db, ((pkginfo_t*)lp->data)->name, INFRQ_DESC | INFRQ_DEPENDS); if(tmpp == NULL) { continue; } @@ -1840,7 +1844,7 @@ vprint("Updating database..."); /* make an install date (in UTC) */ strncpy(info->installdate, asctime(gmtime(&t)), sizeof(info->installdate)); - if(db_write(db, info)) { + if(db_write(db, info, INFRQ_ALL)) { logaction(stderr, "error updating database for %s!", info->name); return(1); } @@ -1860,13 +1864,13 @@ if(splitdep(lp->data, &depend)) { continue; } - depinfo = db_scan(db, depend.name, INFRQ_ALL); + depinfo = db_scan(db, depend.name, INFRQ_DEPENDS); if(depinfo == NULL) { /* look for a provides package */ PMList *provides = whatprovides(db, depend.name); if(provides) { /* use the first one */ - depinfo = db_scan(db, provides->data, INFRQ_ALL); + depinfo = db_scan(db, provides->data, INFRQ_DEPENDS); if(depinfo == NULL) { /* wtf */ continue; @@ -1876,7 +1880,7 @@ } } depinfo->requiredby = list_add(depinfo->requiredby, strdup(info->name)); - db_write(db, depinfo); + db_write(db, depinfo, INFRQ_DEPENDS); freepkg(depinfo); } printf("done.\n"); fflush(stdout); @@ -2119,7 +2123,7 @@ if(splitdep((char*)lp->data, &depend)) { continue; } - depinfo = db_scan(db, depend.name, INFRQ_ALL); + depinfo = db_scan(db, depend.name, INFRQ_DEPENDS); if(depinfo == NULL) { /* look for a provides package */ PMList *provides = whatprovides(db, depend.name); @@ -2128,7 +2132,7 @@ * the first one. */ /* use the first one */ - depinfo = db_scan(db, provides->data, INFRQ_ALL); + depinfo = db_scan(db, provides->data, INFRQ_DEPENDS); list_free(provides); if(depinfo == NULL) { /* wtf */ @@ -2154,7 +2158,7 @@ break; } } - db_write(db, depinfo); + db_write(db, depinfo, INFRQ_DEPENDS); freepkg(depinfo); } if(!pmo_upgrade) { @@ -2266,7 +2270,7 @@ if(realpath(package, rpath)) { int gotcha = 0; rewinddir(db->dir); - while((info = db_scan(db, NULL, INFRQ_DESC | INFRQ_FILES)) != NULL && !gotcha) { + while((info = db_scan(db, NULL, INFRQ_FILES)) != NULL && !gotcha) { for(lp = info->files; lp && !gotcha; lp = lp->next) { sprintf(path, "%s%s", pmo_root, (char*)lp->data); if(!strcmp(path, rpath)) { @@ -2292,7 +2296,7 @@ for(lp = pm_packages; lp; lp = lp->next) { pkginfo_t *tmpp = (pkginfo_t*)lp->data; if(pmo_q_list) { - info = db_scan(db, tmpp->name, INFRQ_DESC | INFRQ_FILES); + info = db_scan(db, tmpp->name, INFRQ_FILES); if(info == NULL) { /* something weird happened */ return(1); @@ -2358,7 +2362,7 @@ } printf("\n"); } else if(pmo_q_list) { - info = db_scan(db, package, INFRQ_DESC | INFRQ_FILES); + info = db_scan(db, package, INFRQ_FILES); if(info == NULL) { fprintf(stderr, "Package \"%s\" was not found.\n", package); return(2);