diff options
author | Timo Teräs <timo.teras@iki.fi> | 2016-02-16 15:19:15 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2016-02-16 15:19:52 +0200 |
commit | 445ea072205cfb2d9ecd9ffb28d88023d5d24ea5 (patch) | |
tree | 7285a08987facb67d8513a3b22f8aa22650b7ad5 /src | |
parent | 22d56cfe28ed53f3bf3d53dc606ae45748c5bb7d (diff) | |
download | apk-tools-445ea072205cfb2d9ecd9ffb28d88023d5d24ea5.tar.gz apk-tools-445ea072205cfb2d9ecd9ffb28d88023d5d24ea5.tar.bz2 apk-tools-445ea072205cfb2d9ecd9ffb28d88023d5d24ea5.tar.xz apk-tools-445ea072205cfb2d9ecd9ffb28d88023d5d24ea5.zip |
implement fetch --purge
which will delete any .apk package on output directory that were
not downloaded by fetch
this allows apk fetch to incrementally build repositories for
binary images
Diffstat (limited to 'src')
-rw-r--r-- | src/fetch.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/fetch.c b/src/fetch.c index 3bb7934..14e0790 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -264,6 +264,37 @@ err: mark_error(ctx, match, name); } +static int purge_package(void *pctx, int dirfd, const char *filename) +{ + char tmp[PATH_MAX]; + struct fetch_ctx *ctx = (struct fetch_ctx *) pctx; + struct apk_database *db = ctx->db; + struct apk_provider *p0; + struct apk_name *name; + apk_blob_t b = APK_BLOB_STR(filename), bname, bver; + size_t l; + + if (apk_pkg_parse_name(b, &bname, &bver)) return 0; + name = apk_db_get_name(db, bname); + if (!name) return 0; + + foreach_array_item(p0, name->providers) { + if (p0->pkg->name != name) continue; + l = snprintf(tmp, sizeof tmp, PKG_FILE_FMT, PKG_FILE_PRINTF(p0->pkg)); + if (l > sizeof tmp) continue; + if (apk_blob_compare(b, APK_BLOB_PTR_LEN(tmp, l)) != 0) continue; + if (p0->pkg->marked) return 0; + break; + } + + apk_message("Purging %s", filename); + if (apk_flags & APK_SIMULATE) + return 0; + + unlinkat(dirfd, filename, 0); + return 0; +} + static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_array *args) { struct fetch_ctx *ctx = (struct fetch_ctx *) pctx; @@ -290,6 +321,11 @@ static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_arr if (!ctx->errors) apk_hash_foreach(&db->available.packages, fetch_package, ctx); + /* Remove packages not matching download spec from the output directory */ + if (!ctx->errors && (apk_flags & APK_PURGE) && + !(ctx->flags & FETCH_STDOUT) && ctx->outdir_fd > 0) + apk_dir_foreach_file(ctx->outdir_fd, purge_package, ctx); + return ctx->errors; } |