diff options
author | Timo Teras <timo.teras@iki.fi> | 2009-07-16 15:16:05 +0300 |
---|---|---|
committer | Timo Teras <timo.teras@iki.fi> | 2009-07-16 15:16:05 +0300 |
commit | 6b471bb614beaeadcfa08008918ef6a2d93ac7e0 (patch) | |
tree | fd46188956a5fb8c22801dc49efa5e8730b657c6 /src/index.c | |
parent | 0f6d96a4f5a904fd95b96e13715b50befa6a0ee9 (diff) | |
download | apk-tools-6b471bb614beaeadcfa08008918ef6a2d93ac7e0.tar.gz apk-tools-6b471bb614beaeadcfa08008918ef6a2d93ac7e0.tar.bz2 apk-tools-6b471bb614beaeadcfa08008918ef6a2d93ac7e0.tar.xz apk-tools-6b471bb614beaeadcfa08008918ef6a2d93ac7e0.zip |
various: new style index generation
change the index generation to do old index, or the new style index
where package identity is sha1 of control block and it's contained
within an .tar.gz to allow signing in future.
Diffstat (limited to 'src/index.c')
-rw-r--r-- | src/index.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/src/index.c b/src/index.c index d7402f9..86c1f44 100644 --- a/src/index.c +++ b/src/index.c @@ -10,18 +10,23 @@ */ #include <stdio.h> +#include <fcntl.h> #include <unistd.h> #include "apk_applet.h" #include "apk_database.h" +#define INDEX_OLD_FORMAT 0x10000 + struct counts { int unsatisfied; }; struct index_ctx { const char *index; + const char *output; time_t index_mtime; + int method; }; static int index_parse(void *ctx, int optch, int optindex, const char *optarg) @@ -32,6 +37,12 @@ static int index_parse(void *ctx, int optch, int optindex, const char *optarg) case 'x': ictx->index = optarg; break; + case 'o': + ictx->output = optarg; + break; + case INDEX_OLD_FORMAT: + ictx->method = APK_SIGN_GENERATE_V1; + break; default: return -1; } @@ -83,6 +94,16 @@ static int index_main(void *ctx, int argc, char **argv) int total, i, j, found, newpkgs = 0; struct index_ctx *ictx = (struct index_ctx *) ctx; + if (isatty(STDOUT_FILENO) && ictx->output == NULL && + !(apk_flags & APK_FORCE)) { + apk_error("Will not write binary index to console " + "without --force"); + return -1; + } + + if (ictx->method == 0) + ictx->method = APK_SIGN_GENERATE; + apk_db_open(&db, NULL, APK_OPENF_READ); if (index_read_file(&db, ictx) < 0) { apk_db_close(&db); @@ -137,13 +158,33 @@ static int index_main(void *ctx, int argc, char **argv) } while (0); if (!found) { - apk_db_pkg_add_file(&db, argv[i]); - newpkgs++; + if (apk_pkg_read(&db, argv[i], ictx->method) != NULL) + newpkgs++; } } - os = apk_ostream_to_fd(STDOUT_FILENO); + if (ictx->method == APK_SIGN_GENERATE) { + memset(&fi, 0, sizeof(fi)); + fi.name = "APKINDEX"; + fi.mode = 0755 | S_IFREG; + os = apk_ostream_counter(&fi.size); + apk_db_index_write(&db, os); + os->close(os); + } + + if (ictx->output != NULL) + os = apk_ostream_to_file(ictx->output, 0755); + else + os = apk_ostream_to_fd(STDOUT_FILENO); + if (ictx->method == APK_SIGN_GENERATE) { + os = apk_ostream_gzip(os); + apk_tar_write_entry(os, &fi, NULL); + } total = apk_db_index_write(&db, os); + if (ictx->method == APK_SIGN_GENERATE) { + apk_tar_write_padding(os, &fi); + apk_tar_write_entry(os, NULL, NULL); + } os->close(os); apk_hash_foreach(&db.available.names, warn_if_no_providers, &counts); @@ -160,9 +201,13 @@ static int index_main(void *ctx, int argc, char **argv) } static struct apk_option index_options[] = { + { 'o', "output", "Write the generated index to FILE", + required_argument, "FILE" }, { 'x', "index", "Read INDEX to speed up new index creation by reusing " "the information from an old index", required_argument, "INDEX" }, + { INDEX_OLD_FORMAT, "old-format", + "Specify to create old style index files" } }; static struct apk_applet apk_index = { |