On Tue, Nov 05, 2019 at 11:54:34PM +1000, Allan McRae wrote: > 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 <[email protected]> > --- > > 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)
This should probably utilize SOURCE_DATE_EPOCH or something equivalent?
timestamp=$(date --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%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
--
Morten Linderud
PGP: 9C02FF419FECBE16
signature.asc
Description: PGP signature
