diff --git a/NEWS b/NEWS index fa70f035..08a18859 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,14 @@ xbps-0.48 (???): + * xbps-create(1): it is now able to generate identical packages when its + content does not differ. This is the first part required to the + "100% reproducible builds" goal. + + * xbps-create(1): do not add a build-date property to packages. + + * xbps-rindex(1): use mtime of file instead of the build-date field in the + package to set build-date in the repo index. + * libxbps: when using verbose mode (-v) also print pkgs that are being added to the transaction, this way we can know what pkg(s) are blocking a transaction when there are unresolved (reverse)dependencies. @@ -27,11 +36,6 @@ xbps-0.48 (???): extra alphanumeric characters in the `reverts' object. Added a new testcase to verify its correctness. - * xbps-create(1): do not add a build-date property to packages. - - * xbps-rindex(1): use mtime of file instead of the build-date field in the - package to set build-date in the repo index. - xbps-0.47 (2015-07-18): * When executing pkg configuration, override the umask with sane defaults. diff --git a/lib/archive.c b/lib/archive.c index 1afb25ed..f1c56f42 100644 --- a/lib/archive.c +++ b/lib/archive.c @@ -75,7 +75,6 @@ xbps_archive_append_buf(struct archive *ar, const void *buf, const size_t buflen const char *fname, const mode_t mode, const char *uname, const char *gname) { struct archive_entry *entry; - time_t tm; assert(ar); assert(buf); @@ -83,7 +82,6 @@ xbps_archive_append_buf(struct archive *ar, const void *buf, const size_t buflen assert(uname); assert(gname); - tm = time(NULL); entry = archive_entry_new(); assert(entry); @@ -93,9 +91,6 @@ xbps_archive_append_buf(struct archive *ar, const void *buf, const size_t buflen archive_entry_set_gname(entry, gname); archive_entry_set_pathname(entry, fname); archive_entry_set_size(entry, buflen); - archive_entry_set_atime(entry, tm, 0); - archive_entry_set_mtime(entry, tm, 0); - archive_entry_set_ctime(entry, tm, 0); if (archive_write_header(ar, entry) != ARCHIVE_OK) { archive_entry_free(entry); diff --git a/tests/xbps/xbps-create/basic_test.sh b/tests/xbps/xbps-create/basic_test.sh index 6c7512a8..fae52431 100644 --- a/tests/xbps/xbps-create/basic_test.sh +++ b/tests/xbps/xbps-create/basic_test.sh @@ -110,9 +110,39 @@ restore_mtime_body() { atf_check_equal "$expected" "$result" } +atf_test_case reproducible_pkg + +reproducible_pkg_head() { + atf_set "descr" "xbps-create(1): generate identical packages" +} + +reproducible_pkg_body() { + mkdir -p repo pkg_A/usr/include/gsm + + # identical content + echo QWERTY > pkg_A/usr/include/gsm/gsm.h + xbps-create -A noarch -n foo-1.0_1 -s "foo pkg" pkg_A + atf_check_equal $? 0 + mv foo-1.0_1.noarch.xbps foo-1.0_1.noarch.xbps.orig + atf_check_equal $? 0 + sleep 1 + xbps-create -A noarch -n foo-1.0_1 -s "foo pkg" pkg_A + atf_check_equal $? 0 + cmp -s foo-1.0_1.noarch.xbps foo-1.0_1.noarch.xbps.orig + atf_check_equal $? 0 + + # modified content + echo QWERTZ > pkg_A/usr/include/gsm/gsm.h + xbps-create -A noarch -n foo-1.0_1 -s "foo pkg" pkg_A + atf_check_equal $? 0 + cmp -s foo-1.0_1.noarch.xbps foo-1.0_1.noarch.xbps.orig + atf_check_equal $? 1 +} + atf_init_test_cases() { atf_add_test_case hardlinks_size atf_add_test_case symlink_relative_target atf_add_test_case symlink_relative_target_cwd atf_add_test_case restore_mtime + atf_add_test_case reproducible_pkg }