Commit f383fbc5 authored by Bernhard Link's avatar Bernhard Link

store preprocessed filelists in config.cache.db instead of redundant data

parent 2da7b719
2007-09-21 Bernhard R. Link <brlink@debian.org>
* save cached filelists of packages for Contents files
in a preprocessed form, needing only about half the disk
space and only half the time when generating the Contents file.
* new translatefilelists command to translate old to new format
* filelists reading no longer available without libarchive
2007-09-19 Bernhard R. Link <brlink@debian.org>
* files.c uses database.c instead of accessing libdb directly
* release.c uses database.c instead of accessing libdb directly
......
......@@ -25,6 +25,9 @@ Updates between 2.2.4 and 3.0.0:
* clearvanished removes tracking data from vanished distributions.
- make update's ListHook relative to confdir (unless absolute)
- added removesrc and removefilter
- new format for contents.cache.db. Only needs half of the disk space and runtime
to generate Contents files, but you need to run translatefilelists to translate
the cached items.
Updates between 2.2.3 and 2.2.4:
- [SECURITY] fix bug causing a Release.gpg with only
......
......@@ -112,7 +112,6 @@ struct addcontentsdata {
static retvalue addpackagetocontents(struct database *database, UNUSED(struct distribution *di), UNUSED(struct target *ta), const char *packagename, const char *chunk, void *data) {
struct addcontentsdata *d = data;
const struct filelist_package *package;
retvalue r;
char *section, *filekey;
......@@ -126,25 +125,8 @@ static retvalue addpackagetocontents(struct database *database, UNUSED(struct di
free(section);
return r;
}
r = filelist_newpackage(d->contents, packagename, section, &package);
assert( r != RET_NOTHING );
if( RET_WAS_ERROR(r) )
return r;
r = files_getfilelist(database, filekey, package, d->contents);
if( r == RET_NOTHING ) {
if( d->rate <= 1 || d->work <= d->leisure/(d->rate-1) ) {
if( verbose > 3 )
printf("Reading filelist for %s\n", filekey);
r = files_genfilelist(database, filekey, package, d->contents);
if( RET_IS_OK(r) )
d->work++;
} else {
d->leisure++;
if( verbose > 3 )
fprintf(stderr, "Missing filelist for %s\n", filekey);
}
} else if( RET_IS_OK(r) )
d->leisure++;
r = filelist_addpackage(d->contents, database,
packagename, section, filekey);
free(filekey);
free(section);
......
......@@ -1048,7 +1048,7 @@ bool cursor_nexttemp(struct table *table, struct cursor *cursor, const char **ke
return true;
}
bool cursor_nexttempdata(struct table *table, struct cursor *cursor, const char **data, size_t *len_p) {
bool cursor_nexttempdata(struct table *table, struct cursor *cursor, const char **key, const char **data, size_t *len_p) {
DBT Key, Data;
int dbret;
......@@ -1081,6 +1081,8 @@ bool cursor_nexttempdata(struct table *table, struct cursor *cursor, const char
cursor->r = RET_ERROR;
return false;
}
if( key != NULL )
*key = Key.data;
*data = Data.data;
*len_p = Data.size-1;
return true;
......@@ -1238,10 +1240,25 @@ retvalue database_droppackages(struct database *database, const char *identifier
retvalue database_openfiles(struct database *db, const char *mirrordir) {
retvalue r;
struct strlist identifiers;
assert( db->files == NULL && db->contents == NULL );
assert( db->mirrordir == NULL );
r = database_listsubtables(db, "contents.cache.db", &identifiers);
if( RET_IS_OK(r) ) {
if( strlist_in(&identifiers, "filelists") ) {
fprintf(stderr,
"Your %s/contents.cache.db file still contains a table of cached filelists\n"
"in the old (pre 3.0.0) format. You have to either delete that file (and loose\n"
"all caches of filelists) or run reprepro with argument translatefilelists\n"
"to translate the old caches into the new format.\n", db->directory);
strlist_done(&identifiers);
return RET_ERROR;
}
strlist_done(&identifiers);
}
db->mirrordir = strdup(mirrordir);
if( db->mirrordir == NULL )
return RET_ERROR_OOM;
......@@ -1254,7 +1271,7 @@ retvalue database_openfiles(struct database *db, const char *mirrordir) {
db->files = NULL;
return r;
}
r = database_table(db, "contents.cache.db", "filelists",
r = database_table(db, "contents.cache.db", "compressedfilelists",
DB_BTREE, 0, NULL, READWRITE, &db->contents);
assert( r != RET_NOTHING );
if( RET_WAS_ERROR(r) ) {
......@@ -1274,3 +1291,90 @@ retvalue database_openreleasecache(struct database *database, const char *codena
(*cachedb_p)->verbose = false;
return r;
}
/* concat mirrordir. return NULL if OutOfMemory */
char *files_calcfullfilename(const struct database *database,const char *filekey) {
return calc_dirconcat(database->mirrordir, filekey);
}
retvalue database_translate_filelists(struct database *database) {
char *dbname, *tmpdbname;
struct table *oldtable, *newtable;
struct strlist identifiers;
int ret;
retvalue r;
r = database_listsubtables(database, "contents.cache.db",
&identifiers);
if( RET_IS_OK(r) ) {
if( strlist_in(&identifiers, "compressedfilelists") ) {
fprintf(stderr,
"Your %s/contents.cache.db file already contains a new style database!\n",
database->directory);
strlist_done(&identifiers);
return RET_NOTHING;
}
strlist_done(&identifiers);
}
dbname = calc_dirconcat(database->directory, "contents.cache.db");
if( dbname == NULL )
return RET_ERROR_OOM;
tmpdbname = calc_dirconcat(database->directory, "old.contents.cache.db");
if( tmpdbname == NULL ) {
free(dbname);
return RET_ERROR_OOM;
}
// TODO: check first if there is already a compressed database in there?
ret = rename(dbname, tmpdbname);
if( ret != 0 ) {
int e = errno;
fprintf(stderr, "Could not rename '%s' into '%s': %s(%d)\n",
dbname, tmpdbname, strerror(e), e);
return RET_ERRNO(e);
}
r = database_table(database, "old.contents.cache.db", "filelists",
DB_BTREE, 0, NULL, READONLY, &oldtable);
if( r == RET_NOTHING ) {
fprintf(stderr, "Could not find old-style database!\n");
r = RET_ERROR;
}
if( RET_IS_OK(r) )
r = database_table(database, "contents.cache.db",
"compressedfilelists",
DB_BTREE, 0, NULL, READWRITE, &newtable);
else
oldtable = NULL;
assert( r != RET_NOTHING );
if( RET_IS_OK(r) ) {
r = filelists_translate(oldtable, newtable);
if( r == RET_NOTHING )
r = RET_OK;
}
if( RET_IS_OK(r) ) {
r = table_close(newtable);
if( r == RET_NOTHING )
r = RET_OK;
}
(void)table_close(oldtable);
if( RET_IS_OK(r) )
unlink(tmpdbname);
if( RET_WAS_ERROR(r) ) {
ret = rename(tmpdbname, dbname);
if( ret != 0 ) {
int e = errno;
fprintf(stderr, "Could not rename '%s' back into '%s': %s(%d)\n",
dbname, tmpdbname, strerror(e), e);
free(tmpdbname);
free(dbname);
return RET_ERRNO(e);
}
free(tmpdbname);
free(dbname);
return r;
}
free(tmpdbname);
free(dbname);
return RET_OK;
}
......@@ -27,6 +27,7 @@ retvalue database_listpackages(struct database *, /*@out@*/struct strlist *);
retvalue database_droppackages(struct database *, const char *);
retvalue database_openpackages(struct database *, const char *identifier, bool readonly, /*@out@*/struct table **);
retvalue database_openreleasecache(struct database *, const char *codename, /*@out@*/struct table **);
retvalue database_translate_filelists(struct database *);
retvalue table_close(/*@only@*/struct table *);
......@@ -46,9 +47,12 @@ retvalue table_checkkey(struct table *, const char *key);
retvalue table_newglobaluniqcursor(struct table *, /*@out@*/struct cursor **);
retvalue table_newduplicatecursor(struct table *, const char *key, /*@out@*/struct cursor **);
bool cursor_nexttemp(struct table *, struct cursor *, /*@out@*/const char **, /*@out@*/const char **);
bool cursor_nexttempdata(struct table *, struct cursor *, /*@out@*/const char **, /*@out@*/size_t *);
bool cursor_nexttempdata(struct table *, struct cursor *, /*@out@*/const char **, /*@out@*/const char **, /*@out@*/size_t *);
retvalue cursor_replace(struct table *, struct cursor *, const char *);
retvalue cursor_delete(struct table *, struct cursor *, const char *);
retvalue cursor_close(struct table *, /*@only@*/struct cursor *);
/* concat mirrordir. return NULL if OutOfMemory */
char *files_calcfullfilename(const struct database *,const char *filekey);
#endif
......@@ -11,6 +11,6 @@
retvalue extractcontrol(/*@out@*/char **control,const char *debfile);
/* Read a list of files of <debfile> */
retvalue getfilelist(/*@out@*/char **filelist, const char *debfile);
retvalue getfilelist(/*@out@*/char **filelist, /*@out@*/ size_t *size, const char *debfile);
#endif
......@@ -35,7 +35,7 @@
#error Why did this file got compiled?
#endif
static retvalue read_data_tar(/*@out@*/char **list, const char *debfile, struct ar_archive *ar, struct archive *tar) {
static retvalue read_data_tar(/*@out@*/char **list, /*@out@*/size_t *size, const char *debfile, struct ar_archive *ar, struct archive *tar) {
struct archive_entry *entry;
struct filelistcompressor c;
retvalue r;
......@@ -99,11 +99,11 @@ static retvalue read_data_tar(/*@out@*/char **list, const char *debfile, struct
filelistcompressor_cancel(&c);
return (e!=0)?(RET_ERRNO(e)):RET_ERROR;
}
return filelistcompressor_finish(&c, list);
return filelistcompressor_finish(&c, list, size);
}
retvalue getfilelist(/*@out@*/char **filelist, const char *debfile) {
retvalue getfilelist(/*@out@*/char **filelist, size_t *size, const char *debfile) {
struct ar_archive *ar;
retvalue r;
......@@ -121,7 +121,8 @@ retvalue getfilelist(/*@out@*/char **filelist, const char *debfile) {
tar = archive_read_new();
archive_read_support_compression_gzip(tar);
r = read_data_tar(filelist, debfile, ar, tar);
r = read_data_tar(filelist, size,
debfile, ar, tar);
archive_read_finish(tar);
if( r != RET_NOTHING ) {
ar_close(ar);
......@@ -143,7 +144,8 @@ retvalue getfilelist(/*@out@*/char **filelist, const char *debfile) {
tar = archive_read_new();
archive_read_support_compression_gzip(tar);
archive_read_support_compression_bzip2(tar);
r = read_data_tar(filelist, debfile, ar, tar);
r = read_data_tar(filelist, size,
debfile, ar, tar);
archive_read_finish(tar);
if( r != RET_NOTHING ) {
ar_close(ar);
......
......@@ -7,8 +7,9 @@ reprepro (3.0.0-0) UNRELEASED; urgency=low
- fix grammar error in manpage (Closes: 441300)
- warn about unused tracking data (Closes: 426596)
- add removesrc (Closes: 440101)
- contents.cache.db file format changed
-- Bernhard R. Link <brlink@debian.org> Sun, 16 Sep 2007 14:53:31 +0200
-- Bernhard R. Link <brlink@debian.org> Fri, 21 Sep 2007 18:02:18 +0200
reprepro (2.2.4-1) unstable; urgency=high
......
......@@ -481,6 +481,15 @@ your sources.list file:
.BR rerunnotifiers " [ " \fIcodenames\fP " ]"
Run all external scripts specified in the \fBLog:\fP options of the
specified distributions.
.TP
.B translatefilelists
Translate the file list chache within
.IB db /contents.cache.db
into the new format used since reprepro 3.0.0.
Make sure you have at least half of the space of the current
.IB db /contents.cache.db
file size available in that partition.
.SS internal commands
These are hopefully never needed, but allow manual intervention.
.B WARNING:
......@@ -534,8 +543,6 @@ of the specified .deb-file.
.BI _fakeemptyfilelist filekey
Insert an empty filelist for \fIfilekey\fP. This is a evil
hack around broken .deb files that cannot be read by reprepro.
.B control
file of the specified .deb-file.
.SH "CONFIG FILES"
.B reprepo
uses three config files, which are searched in
......
......@@ -186,6 +186,7 @@ _reprepro()
dumpunreferenced deleteunreferenced retrack dumptracks\
tidytracks removealltracks removetrack update checkupdate predelete pull\
checkpull includedeb includeudeb includedsc include\
translatefilelists\
generatefilelists clearvanished copy processincoming gensnapshot'
hiddencommands='__d __extractcontrol __extractfilelist _detect _forget\
_listmd5sums _addmd5sums _dumpcontents\
......
......@@ -215,6 +215,8 @@ commands=( export:"export index files"
clearvanished:"remove empty databases"
gensnapshot:"generate a snapshot"
rerunnotifiers:"call notificators as if all packages were just included"
generatefilelists:"pre-prepare filelist caches for all binary packages"
translatefilelists:"translate pre-3.0.0 contents.cache.db into new format"
)
hiddencommands=(
_detect:"look if the file belonging to a filekey exists and add to the database."
......
......@@ -426,7 +426,7 @@ retvalue export_target(const char *confdir, const char *relativedir, struct tabl
free(relfilename);
return r;
}
while( cursor_nexttempdata(packages, cursor,
while( cursor_nexttempdata(packages, cursor, NULL,
&chunk, &chunk_len) ) {
if( chunk_len == 0 )
continue;
......
This diff is collapsed.
......@@ -5,26 +5,28 @@
#include "release.h"
#endif
struct filelist_package;
struct filelist_list;
retvalue filelist_init(struct filelist_list **list);
retvalue filelist_newpackage(struct filelist_list *filelist, const char *name, const char *section, const struct filelist_package **pkg);
retvalue filelist_add(struct filelist_list *,const struct filelist_package *,const char *);
retvalue filelist_addpackage(struct filelist_list *, struct database *, const char *package, const char *section, const char *filekey);
retvalue filelist_write(struct filelist_list *list, struct filetorelease *file);
void filelist_free(/*@only@*/struct filelist_list *);
retvalue fakefilelist(struct database *, const char *filekey);
retvalue filelists_translate(struct table *, struct table *);
/* for use in routines reading the data: */
struct filelistcompressor {
unsigned int offsets[256];
size_t size, len, dirdept;
size_t size, len;
unsigned int dirdepth;
char *filelist;
};
retvalue filelistcompressor_setup(/*@out@*/struct filelistcompressor *);
retvalue filelistcompressor_add(struct filelistcompressor *, const char *, size_t);
retvalue filelistcompressor_finish(struct filelistcompressor *, /*@out@*/char **);
retvalue filelistcompressor_finish(struct filelistcompressor *, /*@out@*/char **, /*@out@*/size_t *);
void filelistcompressor_cancel(struct filelistcompressor *);
#endif
/* This file is part of "reprepro"
* Copyright (C) 2003,2004,2005,2006 Bernhard R. Link
* Copyright (C) 2003,2004,2005,2006,2007 Bernhard R. Link
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
......@@ -40,11 +40,6 @@
extern int verbose;
/* concat mirrordir. return NULL if OutOfMemory */
inline char *files_calcfullfilename(const struct database *database,const char *filekey) {
return calc_dirconcat(database->mirrordir, filekey);
}
/* Add file's md5sum to database */
retvalue files_add(struct database *database,const char *filekey,const char *md5sum) {
return table_adduniqrecord(database->files, filekey, md5sum);
......@@ -535,66 +530,6 @@ retvalue files_includefile(struct database *database,const char *sourcedir,const
}
retvalue files_addfilelist(struct database *database,const char *filekey,const char *filelist) {
const char *e;
e = filelist;
while( *e != '\0' ) {
while( *e != '\0' )
e++;
e++;
}
e++;
return table_adduniqlenrecord(database->contents, filekey,
filelist, e-filelist, true);
}
retvalue files_getfilelist(struct database *database,const char *filekey,const struct filelist_package *package, struct filelist_list *filelist) {
retvalue r;
const char *p;
size_t size;
r = table_gettemprecord(database->contents, filekey, &p, &size);
if( !RET_IS_OK(r) )
return r;
while( size > 0 && *p != '\0' ) {
size_t len = strlen(p);
filelist_add(filelist, package, p);
p += len + 1;
size -= len + 1;
}
if( size != 1 || *p != '\0' ) {
fprintf(stderr,"Corrupt filelist for %s in contents.cache.db!\n",
filekey);
return RET_ERROR;
}
return RET_OK;
}
retvalue files_genfilelist(struct database *database,const char *filekey,const struct filelist_package *package, struct filelist_list *filelist) {
char *debfilename = files_calcfullfilename(database, filekey);
char *contents;
const char *p;
retvalue result,r;
if( debfilename == NULL ) {
return RET_ERROR_OOM;
}
r = getfilelist(&contents, debfilename);
free(debfilename);
if( !RET_IS_OK(r) )
return r;
result = files_addfilelist(database, filekey, contents);
for( p = contents; *p != '\0'; p += strlen(p)+1 ) {
r = filelist_add(filelist, package, p);
RET_UPDATE(result,r);
}
free(contents);
return result;
}
retvalue files_regenerate_filelist(struct database *database, bool reread) {
struct cursor *cursor;
retvalue result,r;
......@@ -615,6 +550,7 @@ retvalue files_regenerate_filelist(struct database *database, bool reread) {
database->contents, filekey) ) {
char *debfilename;
char *filelist;
size_t fls;
debfilename = files_calcfullfilename(database,
filekey);
......@@ -623,7 +559,7 @@ retvalue files_regenerate_filelist(struct database *database, bool reread) {
break;
}
r = getfilelist(&filelist, debfilename);
r = getfilelist(&filelist, &fls, debfilename);
free(debfilename);
if( RET_IS_OK(r) ) {
if( verbose > 0 )
......@@ -636,8 +572,10 @@ retvalue files_regenerate_filelist(struct database *database, bool reread) {
p += strlen(p)+1;
}
}
r = files_addfilelist(database,
filekey, filelist);
r = table_adduniqlenrecord(
database->contents,
filekey, filelist, fls,
true);
free(filelist);
}
RET_UPDATE(result,r);
......
......@@ -73,16 +73,10 @@ retvalue files_checkpool(struct database *, bool fast);
/* dump out all information */
retvalue files_printmd5sums(struct database *);
/* concat mirrordir. return NULL if OutOfMemory */
char *files_calcfullfilename(const struct database *,const char *filekey);
/* look for the given filekey and add it into the filesdatabase */
retvalue files_detect(struct database *,const char *filekey);
retvalue files_getfilelist(struct database *,const char *filekey,const struct filelist_package *package, struct filelist_list *filelist);
retvalue files_genfilelist(struct database *,const char *filekey,const struct filelist_package *package, struct filelist_list *filelist);
retvalue files_regenerate_filelist(struct database *, bool redo);
retvalue files_addfilelist(struct database *,const char *filekey,const char *filelist);
/* hardlink file with known md5sum and add it to database */
retvalue files_hardlink(struct database *,const char *tempfile, const char *filekey,const char *md5sum);
......
......@@ -202,6 +202,12 @@ static inline retvalue removeunreferencedfiles(struct database *database,struct
UNUSED(struct strlist* dummy3), \
int argc,const char *argv[])
#define ACTION_T(name) static retvalue action_t_ ## name ( \
UNUSED(struct distribution *ddummy), \
struct database *database, \
UNUSED(struct strlist* dummy3), \
UNUSED(int argc), UNUSED(const char *dummy4[]))
#define ACTION_U_F(name) static retvalue action_f_ ## name ( \
UNUSED(struct distribution *ddummy), \
struct database *database, \
......@@ -265,19 +271,56 @@ ACTION_N(extractcontrol) {
printf("%s\n",control);
return result;
}
ACTION_N(extractfilelist) {
retvalue result;
char *filelist;
size_t fls, len;
size_t lengths[256];
const unsigned char *dirs[256];
int depth = 0, i, j;
assert( argc == 2 );
result = getfilelist(&filelist,argv[1]);
result = getfilelist(&filelist, &fls, argv[1]);
if( RET_IS_OK(result) ) {
const char *p = filelist;
const unsigned char *p = (unsigned char*)filelist;
while( *p != '\0' ) {
puts(p);
p += strlen(p)+1;
unsigned char c = *(p++);
if( c > 2 ) {
if( depth >= c )
depth -= c;
else
depth = 0;
} else if( c == 2 ) {
len = 0;
while( *p == 255 ) {
len +=255;
p++;
}
len += *(p++);
lengths[depth] = len;
dirs[depth++] = p;
p += len;
} else {
len = 0;
while( *p == 255 ) {
len +=255;
p++;
}
len += *(p++);
putchar('/');
for( i = 0 ; i < depth ; i++ ) {
const unsigned char *n = dirs[i];
j = lengths[i];
while( j-- > 0 )
putchar(*(n++));
putchar('/');
}
while( len-- > 0 )
putchar(*(p++));
putchar('\n');
}
}
free(filelist);
}
......@@ -286,19 +329,25 @@ ACTION_N(extractfilelist) {
ACTION_u_F(fakeemptyfilelist) {
assert( argc == 2 );
return files_addfilelist(database, argv[1], "");
return fakefilelist(database, argv[1]);
}
ACTION_u_F(generatefilelists) {
assert( argc == 2 || argc == 3 );
if( argc == 2 && strcmp(argv[1],"reread") != 0 ) {
fprintf(stderr,"Error: Unrecognized second argument '%s'\n"
"Syntax: reprepro generatefilelists [reread]\n",
if( argc == 2 )
return files_regenerate_filelist(database, false);
if( strcmp(argv[1], "reread") == 0 )
return files_regenerate_filelist(database, true);
fprintf(stderr,"Error: Unrecognized second argument '%s'\n"
"Syntax: reprepro generatefilelists [reread]\n",
argv[1]);
return RET_ERROR;
}
return files_regenerate_filelist(database, argc == 2);
return RET_ERROR;
}
ACTION_T(translatefilelists) {
return database_translate_filelists(database);
}
......@@ -2127,6 +2176,7 @@ ACTION_B(rerunnotifiers) {
#define A_R(w) action_r_ ## w, NEED_DATABASE|NEED_REFERENCES
#define A__F(w) action_f_ ## w, NEED_DATABASE|NEED_FILESDB|NEED_NO_PACKAGES
#define A__R(w) action_r_ ## w, NEED_DATABASE|NEED_REFERENCES|NEED_NO_PACKAGES
#define A__T(w) action_t_ ## w, NEED_DATABASE|NEED_NO_PACKAGES|MAY_UNUSED
#define A_RF(w) action_rf_ ## w, NEED_DATABASE|NEED_FILESDB|NEED_REFERENCES
/* to dereference files, one needs files and references database: */
#define A_D(w) action_d_ ## w, NEED_DATABASE|NEED_FILESDB|NEED_REFERENCES|NEED_DEREF
......@@ -2228,6 +2278,8 @@ static const struct action {
2, 2, "[--delete] include <distribution> <.changes-file>"},
{"generatefilelists", A_F(generatefilelists),
0, 1, "generatefilelists [reread]"},
{"translatefilelists", A__T(translatefilelists),
0, 0, "translatefilelists"},
{"clearvanished", A_D(clearvanished)|MAY_UNUSED,
0, 0, "[--delete] clearvanished"},
{"processincoming", A_D(processincoming),
......@@ -2246,6 +2298,7 @@ static const struct action {
#undef A_R
#undef A_RF
#undef A_F
#undef A__T
static retvalue callaction(const struct action *action, int argc, const char *argv[]) {
retvalue result, r;
......
......@@ -532,9 +532,9 @@ stdout
-v6*= looking for changes in 'B|cat|source'...
-v1*= generating Contents-${FAKEARCHITECTURE}...
-v4*=Reading filelist for pool/dog/b/bird/bird_1_${FAKEARCHITECTURE}.deb
-d1*=db: 'pool/dog/b/bird/bird_1_${FAKEARCHITECTURE}.deb' added to contents.cache.db(filelists).
-d1*=db: 'pool/dog/b/bird/bird_1_${FAKEARCHITECTURE}.deb' added to contents.cache.db(compressedfilelists).
-v4*=Reading filelist for pool/dog/b/bird/bird-addons_1_all.deb
-d1*=db: 'pool/dog/b/bird/bird-addons_1_all.deb' added to contents.cache.db(filelists).
-d1*=db: 'pool/dog/b/bird/bird-addons_1_all.deb' added to contents.cache.db(compressedfilelists).
EOF
LOGDATE="$(date +'%Y-%m-%d %H:')"
echo normalizing logfile: DATESTR is "$LOGDATE??:??"
......@@ -625,9 +625,9 @@ stdout
-v6*= replacing './dists/B/cat/source/Sources' (gzipped)
-v1*= generating Contents-${FAKEARCHITECTURE}...
-v4*=Reading filelist for pool/cat/b/bird/bird_1_${FAKEARCHITECTURE}.deb
-d1*=db: 'pool/cat/b/bird/bird_1_${FAKEARCHITECTURE}.deb' added to contents.cache.db(filelists).
-d1*=db: 'pool/cat/b/bird/bird_1_${FAKEARCHITECTURE}.deb' added to contents.cache.db(compressedfilelists).
-v4*=Reading filelist for pool/cat/b/bird/bird-addons_1_all.deb
-d1*=db: 'pool/cat/b/bird/bird-addons_1_all.deb' added to contents.cache.db(filelists).
-d1*=db: 'pool/cat/b/bird/bird-addons_1_all.deb' added to contents.cache.db(compressedfilelists).
EOF
function checklog() {
cat > results.log.expected
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment