• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

IJHack / QtPass / 35698271281
93%

Build:
DEFAULT BRANCH: main
Ran 22 Sep 2026 07:19AM UTC
Jobs 1
Files 114
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

22 Sep 2026 07:10AM UTC coverage: 92.939% (+0.07%) from 92.873%
35698271281

push

github

web-flow
One staged write for entries, copies and .gpg-id files; re-encryption goes through it too (#1904)

* One staged write for entries, copies and .gpg-id files; re-encryption goes through it too

Three copies of "create a temporary next to the destination, fill it through
its handle, sync, rename it into place, check the name is not a link" had
grown: Util::writeFileReplacing() for bytes, a static copyFileReplacing() in
imitatepass.cpp for Copy(), and ImitatePass::placeEncryptedFile() for Insert().
util.cpp now has one stageAndReplace() behind Util::writeFileReplacing() and
the new Util::copyFileReplacing(); Copy() and placeEncryptedFile() call the
latter. The copy is owner-only whatever the source's mode, as pass's own cp
under its umask 077 makes it.

reencryptSingleFile() still had gpg write into a temporary created next to the
entry: exclusive and unguessable, but gpg then opened it by name, so the same
window Insert() closed in #1882 remained. gpg now writes into a QTemporaryDir
outside the store, the ciphertext is verified there, and placeEncryptedFile()
replaces the entry in one rename. That retires the two-rename dance through
<entry>.reencrypt.bak with its restore-on-failure branches and three user-facing
messages; recoverReencryptLeftovers() stays, since 1.8.x wrote those names.

Four re-encryption tests follow the new flow (gpg output outside the store; a
vanished entry, a vanished ciphertext and a read-only store each leave the
entry untouched and say why), and tst_util covers copyFileReplacing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JuQsrHonihp1nARE7bzstc

* lupdate + best-effort translations for the two Util read messages

Six ImitatePass strings went with the code they belonged to; "Cannot read %1."
and "Cannot read %1: %2" are new in the Util context and filled in for every
catalog but en_US, he and ru, kept type="unfinished" for Weblate review.

Co-Authored-By: Claude Opus 5... (continued)

40 of 52 new or added lines in 2 files covered. (76.92%)

10 existing lines in 2 files now uncovered.

8766 of 9432 relevant lines covered (92.94%)

147.79 hits per line

Uncovered Changes

Lines Coverage ∆ File
9
92.75
-1.77% src/util.cpp
3
95.45
1.62% src/imitatepass.cpp

Coverage Regressions

Lines Coverage ∆ File
9
0.0
0.0% src/qrc_qmake_qmake_qm_files.cpp
1
95.45
1.62% src/imitatepass.cpp
Jobs
ID Job ID Ran Files Coverage
1 35698271281.1 22 Sep 2026 07:19AM UTC 114
92.94
GitHub Action Run
Source Files on build 35698271281
  • Tree
  • List 114
  • Changed 4
  • Source Changed 4
  • Coverage Changed 3
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #35698271281
  • ee2c51d9 on github
  • Prev Build on main (#35698254431)
  • Next Build on main (#35721653780)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc