When creating or modifying repo tarballs, place a .TIMESTAMP file with seconds since epoch in it. This will be used in the future to enable rejecting databases older that a given threshold. Also skip reading the .TIMESTAMP file in sync_db_populate(). Signed-off-by: Allan McRae <allan@archlinux.org> --- Anyone want to check my logic in the sync_db_populate() populate change? Repo-add puts the .TIMESTAMP file first when calling bsdtar, so if present it will be first in the repo db file. Otherwise the first item read from the tarball will be a directory, which we skip reading anyway. So I just read the header for the first item and discard it. lib/libalpm/be_sync.c | 9 +++++++++ scripts/repo-add.sh.in | 8 +++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 2c76fe83..041b2266 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -506,6 +506,13 @@ static int sync_db_populate(alpm_db_t *db) goto cleanup; } + /* the .TIMESTAMP file will be first entry in the repo archive if present. + * If not, the first entry will be a directory and can be skipped too */ + if((archive_ret = archive_read_next_header(archive, &entry)) != ARCHIVE_OK) { + ret = -1; + goto readfail; + } + while((archive_ret = archive_read_next_header(archive, &entry)) == ARCHIVE_OK) { mode_t mode = archive_entry_mode(entry); if(!S_ISDIR(mode)) { @@ -518,6 +525,8 @@ static int sync_db_populate(alpm_db_t *db) } } } + +readfail: if(archive_ret != ARCHIVE_EOF) { _alpm_log(db->handle, ALPM_LOG_ERROR, _("could not read db '%s' (%s)\n"), db->treename, archive_error_string(archive)); diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index caf1232d..c87409f1 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -526,6 +526,7 @@ create_db() { TAR_OPT=$(verify_repo_extension "$REPO_DB_FILE") # $LOCKFILE is already guaranteed to be absolute so this is safe dirname=${LOCKFILE%/*} + timestamp=$(date +%s) for repo in "db" "files"; do filename=${REPO_DB_PREFIX}.${repo}.${REPO_DB_SUFFIX} @@ -533,12 +534,13 @@ create_db() { tempname=$dirname/.tmp.$filename pushd "$tmpdir/$repo" >/dev/null + echo $timestamp > .TIMESTAMP if ( shopt -s nullglob; files=(*); (( ${#files[*]} )) ); then - bsdtar -c ${TAR_OPT} -f "$tempname" * + bsdtar -c ${TAR_OPT} -f "$tempname" .TIMESTAMP * else - # we have no packages remaining? zip up some emptyness + # we have no packages remaining warning "$(gettext "No packages remain, creating empty database.")" - bsdtar -c ${TAR_OPT} -f "$tempname" -T /dev/null + bsdtar -c ${TAR_OPT} -f "$tempname" .TIMESTAMP fi popd >/dev/null -- 2.23.0