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 <al...@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

Reply via email to