Merge lp:~charlesk/keeper/wtf into lp:keeper/devel

Proposed by Charles Kerr
Status: Needs review
Proposed branch: lp:~charlesk/keeper/wtf
Merge into: lp:keeper/devel
Diff against target: 513 lines (+260/-117)
2 files modified
src/tar/tar-creator.cpp (+123/-64)
tests/unit/tar/tar-creator-test.cpp (+137/-53)
To merge this branch: bzr merge lp:~charlesk/keeper/wtf
Reviewer Review Type Date Requested Status
unity-api-1-bot continuous-integration Approve
Unity API Team Pending
Review via email: mp+305854@code.launchpad.net

Commit message

Another testing branch for the CI bot, do not review/approve/land

Description of the change

Another testing branch for the CI bot, do not review/approve/land

To post a comment you must log in.
Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

FAILED: Continuous integration, rev:110
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/77/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build/663/console
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/669
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/484/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/484/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/484/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/484/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/484/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/484/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/484/console
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/484/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/484
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/484/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/77/rebuild

review: Needs Fixing (continuous-integration)
lp:~charlesk/keeper/wtf updated
111. By Charles Kerr

split tar-creator-test out from one big test to several more focused tests

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/81/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/670
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/676
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/491/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/491
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/491/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/81/rebuild

review: Approve (continuous-integration)
Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:111
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/82/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/671
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/677
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/492/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/492
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/492/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/82/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
112. By Charles Kerr

refactor tar-creator-test a bit more to remove redundant code

113. By Charles Kerr

in tar-creator, fix dtor issue by moving field step_buf_ ahead of step_archive_ in instantiation order

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:113
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/83/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/672
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/678
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/493/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/493
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/493/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/83/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
114. By Charles Kerr

in TarCreator::Impl::Impl(), remove redundant variable initialization

115. By Charles Kerr

in tar-creator, reintroduce wrapped_archive_write_new(), which is a convenience function that wraps archive_write_new() in a shared_ptr

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:115
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/84/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/673
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/679
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/494/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/494
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/494/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/84/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
116. By Charles Kerr

in TarCreator::Impl::step(), clear the step_archive_ smart_ptr after the last step is done

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:116
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/85/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/675
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/681
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/495/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/495
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/495/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/85/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
117. By Charles Kerr

in TarCreator::Impl add wrapped_archive_write_header(), a helper that calls archive_write_header() and handles return values like ARCHIVE_RETRY and ARCHIVE_WARN

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:117
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/86/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/676
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/682
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/496/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/496
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/496/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/86/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
118. By Charles Kerr

in TarCreator::Impl add wrapped_archive_write_data(), a helper that calls archive_write_data() and handles return values like ARCHIVE_RETRY and ARCHIVE_WARN

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:118
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/87/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/677
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/683
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/497/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/497
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/497/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/87/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
119. By Charles Kerr

in TarCreator::Impl add wrapped_archive_write_close(), a helper that calls archive_write_close() and handles return values like ARCHIVE_RETRY and ARCHIVE_WARN

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:119
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/88/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/678
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/684
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/498/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/498
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/498/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/88/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
120. By Charles Kerr

in TarCreator::Impl::step(), fix looping bug that caused too much data to be read in a single pass

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:120
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/89/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/679
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/685
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/499/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/499
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/499/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/89/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
121. By Charles Kerr

experimental commit: re-introduce TarCreatorFixture::CreateCompressed

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:121
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/90/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/680
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/686
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/500/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/500
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/500/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/90/rebuild

review: Approve (continuous-integration)
lp:~charlesk/keeper/wtf updated
122. By Charles Kerr

sync with trunk

123. By Charles Kerr

in tar-creator-test, add variations of making a tar from an empty file set

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:123
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/91/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/681
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/687
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/501/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/501
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/501/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-keeper-ci/91/rebuild

review: Approve (continuous-integration)

Unmerged revisions

123. By Charles Kerr

in tar-creator-test, add variations of making a tar from an empty file set

122. By Charles Kerr

sync with trunk

121. By Charles Kerr

experimental commit: re-introduce TarCreatorFixture::CreateCompressed

120. By Charles Kerr

in TarCreator::Impl::step(), fix looping bug that caused too much data to be read in a single pass

119. By Charles Kerr

in TarCreator::Impl add wrapped_archive_write_close(), a helper that calls archive_write_close() and handles return values like ARCHIVE_RETRY and ARCHIVE_WARN

118. By Charles Kerr

in TarCreator::Impl add wrapped_archive_write_data(), a helper that calls archive_write_data() and handles return values like ARCHIVE_RETRY and ARCHIVE_WARN

117. By Charles Kerr

in TarCreator::Impl add wrapped_archive_write_header(), a helper that calls archive_write_header() and handles return values like ARCHIVE_RETRY and ARCHIVE_WARN

116. By Charles Kerr

in TarCreator::Impl::step(), clear the step_archive_ smart_ptr after the last step is done

115. By Charles Kerr

in tar-creator, reintroduce wrapped_archive_write_new(), which is a convenience function that wraps archive_write_new() in a shared_ptr

114. By Charles Kerr

in TarCreator::Impl::Impl(), remove redundant variable initialization

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/tar/tar-creator.cpp'
--- src/tar/tar-creator.cpp 2016-09-05 18:38:36 +0000
+++ src/tar/tar-creator.cpp 2016-09-17 00:21:32 +0000
@@ -48,10 +48,6 @@
48 Impl(const QStringList& filenames, bool compress)48 Impl(const QStringList& filenames, bool compress)
49 : filenames_(filenames)49 : filenames_(filenames)
50 , compress_(compress)50 , compress_(compress)
51 , step_archive_()
52 , step_filenum_(-1)
53 , step_file_()
54 , step_buf_()
55 {51 {
56 }52 }
5753
@@ -63,15 +59,13 @@
63 bool step(std::vector<char>& fillme)59 bool step(std::vector<char>& fillme)
64 {60 {
65 step_buf_.resize(0);61 step_buf_.resize(0);
66 bool success = true;62 bool success {true};
6763
68 // if this is the first step, create an archive64 // if this is the first step, create an archive
69 if (!step_archive_)65 if (!step_archive_)
70 {66 {
71 step_archive_.reset(archive_write_new(), [](struct archive* a){archive_write_free(a);});67qDebug() << "new archive";
72 archive_write_set_format_pax(step_archive_.get());68 step_archive_ = wrapped_archive_write_new(compress_);
73 if (compress_)
74 archive_write_add_filter_xz(step_archive_.get());
75 archive_write_open(step_archive_.get(), &step_buf_, nullptr, append_bytes_write_cb, nullptr);69 archive_write_open(step_archive_.get(), &step_buf_, nullptr, append_bytes_write_cb, nullptr);
7670
77 step_file_.reset();71 step_file_.reset();
@@ -86,13 +80,15 @@
86 if (step_filenum_ >= filenames_.size()) // tried to read past the end80 if (step_filenum_ >= filenames_.size()) // tried to read past the end
87 {81 {
88 success = false;82 success = false;
83 step_archive_.reset();
89 break;84 break;
90 }85 }
9186
92 // step to next file87 // step to next file
93 if (++step_filenum_ == filenames_.size()) // we made it to the end!88 if (++step_filenum_ == filenames_.size()) // we made it to the end!
94 {89 {
95 archive_write_close(step_archive_.get());90qDebug() << "finished last file, let's close the archive";
91 wrapped_archive_write_close(step_archive_.get());
96 break;92 break;
97 }93 }
9894
@@ -110,28 +106,16 @@
110 const auto n = step_file_->read(inbuf, sizeof(inbuf));106 const auto n = step_file_->read(inbuf, sizeof(inbuf));
111 if (n > 0) // got data107 if (n > 0) // got data
112 {108 {
113 for(;;) {109 wrapped_archive_write_data(step_archive_.get(), inbuf, size_t(n), step_file_->fileName());
114 if (archive_write_data(step_archive_.get(), inbuf, size_t(n)) != -1)110 break;
115 break;
116 const auto err = archive_errno(step_archive_.get());
117 if (err == ARCHIVE_RETRY)
118 continue;
119 auto errstr = QString::fromUtf8("Error adding data for '%1': %2 (%3)")
120 .arg(step_file_->fileName())
121 .arg(archive_error_string(step_archive_.get()))
122 .arg(err);
123 qWarning() << qPrintable(errstr);
124 if (err != ARCHIVE_WARN)
125 throw std::runtime_error(errstr.toStdString());
126 }
127 }111 }
128 else if (n < 0) // read error112 else if (n < 0) // read error
129 {113 {
130 success = false;114 success = false;
131 auto errstr = QStringLiteral("read()ing %1 returned %2 (%3)")115 auto const errstr = QStringLiteral("read()ing %1 returned %2 (%3)")
132 .arg(step_file_->fileName())116 .arg(step_file_->fileName())
133 .arg(n)117 .arg(n)
134 .arg(step_file_->errorString());118 .arg(step_file_->errorString());
135 qWarning() << errstr;119 qWarning() << errstr;
136 throw std::runtime_error(errstr.toStdString());120 throw std::runtime_error(errstr.toStdString());
137 }121 }
@@ -154,9 +138,9 @@
154 const void * vsource,138 const void * vsource,
155 size_t len)139 size_t len)
156 {140 {
157 auto& target = *static_cast<std::vector<char>*>(vtarget);141 auto target = static_cast<std::vector<char>*>(vtarget);
158 const auto& source = static_cast<const char*>(vsource);142 auto const source = static_cast<const char*>(vsource);
159 target.insert(target.end(), source, source+len);143 target->insert(target->end(), source, source+len);
160 return ssize_t(len);144 return ssize_t(len);
161 }145 }
162146
@@ -165,12 +149,13 @@
165 const void *,149 const void *,
166 size_t len)150 size_t len)
167 {151 {
168 *static_cast<ssize_t*>(userdata) += len;152 auto const sslen = ssize_t(len);
169 return ssize_t(len);153 *static_cast<ssize_t*>(userdata) += sslen;
154 return sslen;
170 }155 }
171156
172 static void add_file_header_to_archive(struct archive* archive,157 static void add_file_header_to_archive(struct archive * archive,
173 const QString& filename)158 QString const & filename)
174 {159 {
175 struct stat st;160 struct stat st;
176 const auto filename_utf8 = filename.toUtf8();161 const auto filename_utf8 = filename.toUtf8();
@@ -180,42 +165,119 @@
180 archive_entry_copy_stat(entry, &st);165 archive_entry_copy_stat(entry, &st);
181 archive_entry_set_pathname(entry, filename_utf8.constData());166 archive_entry_set_pathname(entry, filename_utf8.constData());
182167
183 int ret;168 wrapped_archive_write_header(archive, entry, filename);
184 do {
185 ret = archive_write_header(archive, entry);
186 if ((ret==ARCHIVE_WARN) || (ret==ARCHIVE_FAILED) || (ret==ARCHIVE_FATAL))
187 {
188 auto errstr = QString::fromUtf8("Error adding header for '%1': %2 (%3)")
189 .arg(filename)
190 .arg(archive_error_string(archive))
191 .arg(ret);
192 qWarning() << qPrintable(errstr);
193 if ((ret==ARCHIVE_FATAL) || (ret==ARCHIVE_FAILED))
194 throw std::runtime_error(errstr.toStdString());
195 }
196 } while (ret == ARCHIVE_RETRY);
197169
198 archive_entry_free(entry);170 archive_entry_free(entry);
199 }171 }
200172
173 static void wrapped_archive_write_header(struct archive * archive,
174 struct archive_entry * entry,
175 QString const & source)
176 {
177 for (;;)
178 {
179 auto const err = archive_write_header(archive, entry);
180 if (err == ARCHIVE_OK)
181 break;
182
183 if (err == ARCHIVE_RETRY)
184 continue;
185
186 auto const errstr = QStringLiteral("Error adding header for '%1': %2 (%3)")
187 .arg(source)
188 .arg(archive_error_string(archive))
189 .arg(err);
190 qWarning() << qPrintable(errstr);
191 if (err == ARCHIVE_WARN)
192 break;
193
194 throw std::runtime_error(errstr.toStdString());
195 }
196 }
197
198 static void wrapped_archive_write_data(struct archive * archive,
199 void const * buf_in,
200 size_t bufsize_in,
201 QString const source)
202 {
203 auto bufsize = bufsize_in;
204 auto buf = static_cast<char const*>(buf_in);
205
206 while (bufsize > 0)
207 {
208 auto const n_written = archive_write_data(archive, buf, bufsize);
209
210 if (n_written != -1)
211 {
212 bufsize -= n_written;
213 buf += n_written;
214 continue;
215 }
216
217 auto const err = archive_errno(archive);
218 if (err == ARCHIVE_RETRY)
219 continue;
220
221 auto const errstr = QStringLiteral("Error adding data for '%1': %2 (%3)")
222 .arg(source)
223 .arg(archive_error_string(archive))
224 .arg(err);
225 qWarning() << qPrintable(errstr);
226 if (err == ARCHIVE_WARN)
227 continue;
228
229 throw std::runtime_error(errstr.toStdString());
230 }
231 }
232
233 static std::shared_ptr<struct archive> wrapped_archive_write_new(bool compress)
234 {
235 auto archive = archive_write_new();
236 archive_write_set_format_pax(archive);
237 archive_write_set_bytes_per_block(archive, 0);
238 if (compress)
239 archive_write_add_filter_xz(archive);
240 return std::shared_ptr<struct archive>(archive, [](struct archive* a){archive_write_free(a);});
241 }
242
243 static void wrapped_archive_write_close(struct archive* archive)
244 {
245 for (;;)
246 {
247 auto const err = archive_write_close(archive);
248 if (err == ARCHIVE_OK)
249 break;
250
251 if (err == ARCHIVE_RETRY)
252 continue;
253
254 auto const errstr = QStringLiteral("Error calling archive_write_close(): %1 (%2)")
255 .arg(archive_error_string(archive))
256 .arg(err);
257 qWarning() << qPrintable(errstr);
258 if (err == ARCHIVE_WARN)
259 break;
260
261 throw std::runtime_error(errstr.toStdString());
262 }
263 }
264
201 ssize_t calculate_uncompressed_size() const265 ssize_t calculate_uncompressed_size() const
202 {266 {
203 ssize_t archive_size {};267 ssize_t archive_size {};
204268
205 auto a = archive_write_new();269 auto a = wrapped_archive_write_new(false);
206 archive_write_set_format_pax(a);270 archive_write_open(a.get(), &archive_size, nullptr, count_bytes_write_cb, nullptr);
207 archive_write_open(a, &archive_size, nullptr, count_bytes_write_cb, nullptr);
208271
209 for (const auto& filename : filenames_)272 for (const auto& filename : filenames_)
210 {273 {
211 add_file_header_to_archive(a, filename);274 add_file_header_to_archive(a.get(), filename);
212275
213 // libarchive pads any missing data,276 // libarchive pads any missing data,
214 // so we don't need to call archive_write_data()277 // so we don't need to call archive_write_data()
215 }278 }
216279
217 archive_write_close(a);280 wrapped_archive_write_close(a.get());
218 archive_write_free(a);
219 return archive_size;281 return archive_size;
220 }282 }
221283
@@ -223,14 +285,12 @@
223 {285 {
224 ssize_t archive_size {};286 ssize_t archive_size {};
225287
226 auto a = archive_write_new();288 auto a = wrapped_archive_write_new(true);
227 archive_write_set_format_pax(a);289 archive_write_open(a.get(), &archive_size, nullptr, count_bytes_write_cb, nullptr);
228 archive_write_add_filter_xz(a);
229 archive_write_open(a, &archive_size, nullptr, count_bytes_write_cb, nullptr);
230290
231 for (const auto& filename : filenames_)291 for (const auto& filename : filenames_)
232 {292 {
233 add_file_header_to_archive(a, filename);293 add_file_header_to_archive(a.get(), filename);
234294
235 // process the file295 // process the file
236 QFile file(filename);296 QFile file(filename);
@@ -242,7 +302,7 @@
242 if (n_read == 0)302 if (n_read == 0)
243 break;303 break;
244 if (n_read > 0)304 if (n_read > 0)
245 archive_write_data(a, buf, size_t(n_read));305 wrapped_archive_write_data(a.get(), buf, size_t(n_read), filename);
246 if (n_read < 0) {306 if (n_read < 0) {
247 auto errstr = QStringLiteral("Reading '%1' returned %2 (%3)")307 auto errstr = QStringLiteral("Reading '%1' returned %2 (%3)")
248 .arg(file.fileName())308 .arg(file.fileName())
@@ -254,18 +314,17 @@
254 }314 }
255 }315 }
256316
257 archive_write_close(a);317 wrapped_archive_write_close(a.get());
258 archive_write_free(a);
259 return archive_size;318 return archive_size;
260 }319 }
261320
262 const QStringList filenames_;321 const QStringList filenames_;
263 const bool compress_ {};322 const bool compress_ {};
264323
324 std::vector<char> step_buf_;
265 std::shared_ptr<struct archive> step_archive_;325 std::shared_ptr<struct archive> step_archive_;
266 int step_filenum_ {-1};326 int step_filenum_ {-1};
267 QSharedPointer<QFile> step_file_;327 QSharedPointer<QFile> step_file_;
268 std::vector<char> step_buf_;
269};328};
270329
271/**330/**
272331
=== modified file 'tests/unit/tar/tar-creator-test.cpp'
--- tests/unit/tar/tar-creator-test.cpp 2016-09-12 15:28:06 +0000
+++ tests/unit/tar/tar-creator-test.cpp 2016-09-17 00:21:32 +0000
@@ -48,67 +48,151 @@
48 {48 {
49 }49 }
5050
51};51 void test_tar_creation(int min_files,
5252 int max_files,
53/***53 int max_filesize,
54****54 int max_dirs,
55***/55 bool compressed,
5656 int n_runs)
57TEST_F(TarCreatorFixture, Create)
58{
59 static constexpr int n_runs {5};
60
61 for (int i=0; i<n_runs; ++i)
62 {57 {
63 for (const auto compression_enabled : std::array<bool,2>{false, true})58 for (int i=0; i<n_runs; ++i)
64 {59 {
65 // build a directory full of random files
66 QTemporaryDir in;60 QTemporaryDir in;
67 QDir indir(in.path());61 QDir indir(in.path());
68 FileUtils::fillTemporaryDirectory(in.path());62 FileUtils::fillTemporaryDirectory(in.path(), min_files, max_files, max_filesize, max_dirs);
6963 test_tar_creation(indir, compressed);
70 // create the tar creator64 }
71 EXPECT_TRUE(QDir::setCurrent(in.path()));65 }
72 QStringList files;66
73 for (auto file : FileUtils::getFilesRecursively(in.path()))67 void test_tar_creation(QDir const& in,
74 files += indir.relativeFilePath(file);68 bool compression_enabled)
75 TarCreator tar_creator(files, compression_enabled);69 {
7670 qDebug() << Q_FUNC_INFO;
77 // simple sanity check on its size estimate71
78 const auto estimated_size = tar_creator.calculate_size();72 // create the tar creator
79 const auto filesize_sum = std::accumulate(73 EXPECT_TRUE(QDir::setCurrent(in.path()));
74 QStringList files;
75 for (auto& file : FileUtils::getFilesRecursively(in.path())) {
76 qDebug() << file;
77 files += in.relativeFilePath(file);
78 }
79 TarCreator tar_creator(files, compression_enabled);
80
81 // test that the size calculator returns a consistent value
82 const auto calculated_size = tar_creator.calculate_size();
83 for (int i=0, n=5; i<n; ++i)
84 EXPECT_EQ(calculated_size, tar_creator.calculate_size());
85
86 // if uncompressed, test that the tar is at least as large as the source files
87 if (!compression_enabled) {
88 auto const filesize_sum = std::accumulate(
80 files.begin(),89 files.begin(),
81 files.end(),90 files.end(),
82 0,91 0,
83 [](ssize_t sum, QString const& filename){return sum + QFileInfo(filename).size();}92 [](ssize_t sum, QString const& filename){return sum + QFileInfo(filename).size();}
84 );93 );
85 if (!compression_enabled)94 EXPECT_GT(calculated_size, filesize_sum);
86 ASSERT_GT(estimated_size, filesize_sum);95 }
8796
88 // does it match the actual size?97 // create the tar
89 size_t actual_size {};98 size_t actual_size {};
90 std::vector<char> contents, step;99 std::vector<char> contents, step;
91 while (tar_creator.step(step)) {100 while (tar_creator.step(step)) {
92 contents.insert(contents.end(), step.begin(), step.end());101 contents.insert(contents.end(), step.begin(), step.end());
93 actual_size += step.size();102 actual_size += step.size();
94 }103 }
95 ASSERT_EQ(estimated_size, actual_size);104 EXPECT_EQ(calculated_size, actual_size);
96105
97 // untar it106 // untar it
98 QTemporaryDir out;107 QTemporaryDir out;
99 QDir outdir(out.path());108 QDir const outdir(out.path());
100 QFile tarfile(outdir.filePath("tmp.tar"));109 QFile tarfile(outdir.filePath("tmp.tar"));
101 tarfile.open(QIODevice::WriteOnly);110 tarfile.open(QIODevice::WriteOnly);
102 tarfile.write(contents.data(), contents.size());111 tarfile.write(contents.data(), contents.size());
103 tarfile.close();112 tarfile.close();
104 QProcess untar;113 QProcess untar;
105 untar.setWorkingDirectory(outdir.path());114 untar.setWorkingDirectory(outdir.path());
106 untar.start("tar", QStringList() << "xf" << tarfile.fileName());115 untar.start("tar", QStringList() << "xf" << tarfile.fileName());
107 EXPECT_TRUE(untar.waitForFinished()) << qPrintable(untar.errorString());116 EXPECT_TRUE(untar.waitForFinished()) << qPrintable(untar.errorString());
108117
109 // compare it to the original118 // compare it to the original
110 EXPECT_TRUE(tarfile.remove());119 EXPECT_TRUE(tarfile.remove());
111 EXPECT_TRUE(FileUtils::compareDirectories(in.path(), out.path()));120 EXPECT_TRUE(FileUtils::compareDirectories(in.path(), out.path()));
112 }
113 }121 }
122};
123
124/***
125****
126***/
127
128TEST_F(TarCreatorFixture, CreateUncompressedOfNothing)
129{
130 static constexpr int min_files {0};
131 static constexpr int max_files {min_files};
132 static constexpr int max_filesize {0};
133 static constexpr int max_dirs {0};
134 static constexpr bool compressed {false};
135 static constexpr int n_runs {5};
136
137 test_tar_creation(min_files, max_files, max_filesize, max_dirs, compressed, n_runs);
138}
139
140TEST_F(TarCreatorFixture, CreateCompressedOfNothing)
141{
142 static constexpr int min_files {0};
143 static constexpr int max_files {min_files};
144 static constexpr int max_filesize {0};
145 static constexpr int max_dirs {0};
146 static constexpr bool compressed {true};
147 static constexpr int n_runs {5};
148
149 test_tar_creation(min_files, max_files, max_filesize, max_dirs, compressed, n_runs);
150}
151
152TEST_F(TarCreatorFixture, CreateUncompressedOfSingleFile)
153{
154 static constexpr int min_files {1};
155 static constexpr int max_files {min_files};
156 static constexpr int max_filesize {1024};
157 static constexpr int max_dirs {0};
158 static constexpr bool compressed {false};
159 static constexpr int n_runs {5};
160
161 test_tar_creation(min_files, max_files, max_filesize, max_dirs, compressed, n_runs);
162}
163
164TEST_F(TarCreatorFixture, CreateCompressedOfSingleFile)
165{
166 static constexpr int min_files {1};
167 static constexpr int max_files {min_files};
168 static constexpr int max_filesize {1024};
169 static constexpr int max_dirs {0};
170 static constexpr bool compressed {true};
171 static constexpr int n_runs {5};
172
173 test_tar_creation(min_files, max_files, max_filesize, max_dirs, compressed, n_runs);
174}
175
176TEST_F(TarCreatorFixture, CreateUncompressedOfTree)
177{
178 static constexpr int min_files {100};
179 static constexpr int max_files {min_files};
180 static constexpr int max_filesize {1024};
181 static constexpr int max_dirs {10};
182 static constexpr bool compressed {false};
183 static constexpr int n_runs {5};
184
185 test_tar_creation(min_files, max_files, max_filesize, max_dirs, compressed, n_runs);
186}
187
188TEST_F(TarCreatorFixture, CreateCompressedOfTree)
189{
190 static constexpr int min_files {100};
191 static constexpr int max_files {min_files};
192 static constexpr int max_filesize {1024};
193 static constexpr int max_dirs {10};
194 static constexpr bool compressed {true};
195 static constexpr int n_runs {5};
196
197 test_tar_creation(min_files, max_files, max_filesize, max_dirs, compressed, n_runs);
114}198}

Subscribers

People subscribed via source and target branches

to all changes: