8
3
Fork
You've already forked pEpEngine
0

Garbage-collect useless management database entries #189

Open
opened 2024年02月14日 13:12:22 +01:00 by lucasaiu · 4 comments

When using p≡p for Email for a while the management database becomes populated with an annoying quantity of garbage identities containing an address, possibly nonexisting or even syntactically invalid, and default values for every other field.

This is expected. In part it is spam, most mostly it is the MUA asking the engine for information about an address while the user is still typing, possibly with typing mistakes: there will be a lot of garbage entries for addresses which do not really exist. This is needed in order to quickly display a "colour" in the privacy bar.

I would like to delete entries with default values (non-p≡p-using, message format 0, no key).

Shall I keep entries with a non-default username, and every other field default? I would provisionally say yes.

There will be one Engine function: pEp_garbage_collect_database, with no parameter other than a session. This will be wrapped in adapters. Interactive applications can call it infrequently, in a specific background thread. It is also sensible to run at startup.

The purpose of this change is making debugging convenient and more deterministic, more than saving space.

When using p≡p for Email for a while the management database becomes populated with an annoying quantity of garbage identities containing an address, possibly nonexisting or even syntactically invalid, and default values for every other field. This is expected. In part it is spam, most mostly it is the MUA asking the engine for information about an address while the user is still typing, possibly with typing mistakes: there will be a lot of garbage entries for addresses which do not really exist. This is needed in order to quickly display a "colour" in the privacy bar. I would like to delete entries with default values (non-p≡p-using, message format 0, no key). Shall I keep entries with a non-default username, and every other field default? I would provisionally say yes. There will be one Engine function: `pEp_garbage_collect_database`, with no parameter other than a session. This will be wrapped in adapters. Interactive applications can call it infrequently, in a specific background thread. It is also sensible to run at startup. The purpose of this change is making debugging convenient and more deterministic, more than saving space.
lucasaiu changed title from (削除) garbage-collect useless management database entries (削除ここまで) to Garbage-collect useless management database entries 2024年02月14日 13:12:31 +01:00
Author
Owner
Copy link

Here is a working DML statement doing what is explained above:

PRAGMAforeign_keys=1;-- For my tests: enforce ON DELETE CASCADE in Identity
-- EXPLAIN QUERY PLAN
DELETEFROMPerson-- SELECT username FROM Person -- For tests
WHEREidIN(SELECTP.idFROMPersonPWHEREP.langISNULLANDP.commentISNULLANDP.main_key_idISNULLANDNOTP.is_pEp_userANDP.id='TOFU_'||P.usernameANDNOTEXISTS(SELECT*FROMIdentityIWHEREI.user_id=P.idAND(I.main_key_idISNOTNULLORI.username<>I.addressORI.commentISNOTNULLORI.flags<>0ORI.is_ownORI.pEp_version_major<>0ORenc_format<>0)));

Its performance should not be too terrible:

QUERY PLAN
|--SEARCH Person USING COVERING INDEX sqlite_autoindex_person_1 (id=?)
|--LIST SUBQUERY 2
| |--SCAN P
| `--CORRELATED SCALAR SUBQUERY 1
| `--SEARCH I USING INDEX identity_userid (user_id=?)
|--SCAN alternate_user_id
|--SCAN revocation_contact_list
|--SEARCH trust USING COVERING INDEX sqlite_autoindex_trust_1 (user_id=?)
`--SEARCH identity USING COVERING INDEX identity_userid (user_id=?)

and in practice I expect it to be even better than it looks here: the subquery will hardly ever be executed for nontrivial Persons, since in the outer query some of the clauses in AND will be found false for all nontrivial Persons, after garbage collection has been performed the first time.

The DML statement is designed in a conservative way, to keep any trivial Person as long as for the same person id there exists a non-trivial Identity. Current p≡p applications do not yet take advantage of this possibility, but this DML statement will not break them when they start doing so.

Here is a working DML statement doing what is explained above: ```SQL PRAGMA foreign_keys = 1; -- For my tests: enforce ON DELETE CASCADE in Identity -- EXPLAIN QUERY PLAN DELETE FROM Person -- SELECT username FROM Person -- For tests WHERE id IN (SELECT P.id FROM Person P WHERE P.lang IS NULL AND P.comment IS NULL AND P.main_key_id IS NULL AND NOT P.is_pEp_user AND P.id = 'TOFU_' || P.username AND NOT EXISTS (SELECT * FROM Identity I WHERE I.user_id = P.id AND (I.main_key_id IS NOT NULL OR I.username <> I.address OR I.comment IS NOT NULL OR I.flags <> 0 OR I.is_own OR I.pEp_version_major <> 0 OR enc_format <> 0))); ``` Its performance should not be too terrible: ``` QUERY PLAN |--SEARCH Person USING COVERING INDEX sqlite_autoindex_person_1 (id=?) |--LIST SUBQUERY 2 | |--SCAN P | `--CORRELATED SCALAR SUBQUERY 1 | `--SEARCH I USING INDEX identity_userid (user_id=?) |--SCAN alternate_user_id |--SCAN revocation_contact_list |--SEARCH trust USING COVERING INDEX sqlite_autoindex_trust_1 (user_id=?) `--SEARCH identity USING COVERING INDEX identity_userid (user_id=?) ``` and in practice I expect it to be even better than it looks here: the subquery will hardly ever be executed for nontrivial `Person`s, since in the outer query some of the clauses in `AND` will be found false for all nontrivial `Person`s, after garbage collection has been performed the first time. The DML statement is designed in a conservative way, to keep any trivial `Person` as long as for the same person id there exists a non-trivial `Identity`. Current p≡p applications do not yet take advantage of this possibility, but this DML statement will not break them when they start doing so.
Author
Owner
Copy link

The statement above works well but some garbage entries survive with correct names and wrong addresses -- coming from intermediate editing states and typos when composing messages.

Example:

sqlite> SELECT * FROM Person WHERE username = 'Sva';
id username main_key_id lang comment is_pEp_user
----------------------------------- -------- ---------------------------------------- ---- ------- -----------
TOFU_sva@pep.foundation Sva DBA0A1A1001396838E3A3269DF2ED8AA4A3144AA 1 
TOFU_sva@pep-project.org Sva 0 
TOFU_sva@pep.-project.org Sva 0 
TOFU_sva@pep.f-project.org Sva 0 
TOFU_sva@pep.fo-project.org Sva 0 
TOFU_sva@pep.fou-project.org Sva 0 
TOFU_sva@pep.foun-project.org Sva 0 
TOFU_sva@pep.found-project.org Sva 0 
TOFU_sva@pep.founda-project.org Sva 0 
TOFU_sva@pep.foundat-project.org Sva 0 
TOFU_sva@pep.foundati-project.org Sva 0 
TOFU_sva@pep.foundatio-project.org Sva 0 
TOFU_sva@pep.foundation-project.org Sva 0 
TOFU_sva@pep Sva 0 
TOFU_sva@pep. Sva 0 
TOFU_sva@pep.f Sva 0 
TOFU_sva@pep.fo Sva 0 
TOFU_sva@pep.fou Sva 0 
TOFU_sva@pep.foun Sva 0 
TOFU_sva@pep.found Sva 0 
TOFU_sva@pep.founda Sva 0 
TOFU_sva@pep.foundat Sva 0 
TOFU_sva@pep.foundati Sva 0 
TOFU_sva@pep.foundatio Sva 0 

It is clear what happened here: at some point when composing a message I must have edited the address in question after it autocompleted, changing the domain from pep.foundation.org to pep-project.org and also making typing mistakes in the process. The Engine saw every intermediate stage of my editing as a separate Person; since all of these Persons have non-default usernames they are considered non-garbage entries by the SQL statement above.

Notice that the first entry is non-garbage in any case, because of the fields main_key_id and is_pEp_user.

I would like to delete entries where the only non-default information is the username. However I will speak with @fdik before doing so, as only he understands the full implications.

The statement above works well but some garbage entries survive with *correct* names and *wrong* addresses -- coming from intermediate editing states and typos when composing messages. Example: ``` sqlite> SELECT * FROM Person WHERE username = 'Sva'; id username main_key_id lang comment is_pEp_user ----------------------------------- -------- ---------------------------------------- ---- ------- ----------- TOFU_sva@pep.foundation Sva DBA0A1A1001396838E3A3269DF2ED8AA4A3144AA 1 TOFU_sva@pep-project.org Sva 0 TOFU_sva@pep.-project.org Sva 0 TOFU_sva@pep.f-project.org Sva 0 TOFU_sva@pep.fo-project.org Sva 0 TOFU_sva@pep.fou-project.org Sva 0 TOFU_sva@pep.foun-project.org Sva 0 TOFU_sva@pep.found-project.org Sva 0 TOFU_sva@pep.founda-project.org Sva 0 TOFU_sva@pep.foundat-project.org Sva 0 TOFU_sva@pep.foundati-project.org Sva 0 TOFU_sva@pep.foundatio-project.org Sva 0 TOFU_sva@pep.foundation-project.org Sva 0 TOFU_sva@pep Sva 0 TOFU_sva@pep. Sva 0 TOFU_sva@pep.f Sva 0 TOFU_sva@pep.fo Sva 0 TOFU_sva@pep.fou Sva 0 TOFU_sva@pep.foun Sva 0 TOFU_sva@pep.found Sva 0 TOFU_sva@pep.founda Sva 0 TOFU_sva@pep.foundat Sva 0 TOFU_sva@pep.foundati Sva 0 TOFU_sva@pep.foundatio Sva 0 ``` It is clear what happened here: at some point when composing a message I must have edited the address in question after it autocompleted, changing the domain from `pep.foundation.org` to `pep-project.org` and also making typing mistakes in the process. The Engine saw every intermediate stage of my editing as a separate `Person`; since all of these `Person`s have non-default usernames they are considered non-garbage entries by the SQL statement above. Notice that the first entry is non-garbage in any case, because of the fields `main_key_id` and `is_pEp_user`. I would like to delete entries where the only non-default information is the username. However I will speak with @fdik before doing so, as only he understands the full implications.
Author
Owner
Copy link

Solution from @fdik : add a last-modification-time column. Consider an entry garbage, even if there is a non-default name, if it is old enough (for example older than one year).

Solution from @fdik : add a last-modification-time column. Consider an entry garbage, even if there is a non-default name, if it is old enough (for example older than one year).
Author
Owner
Copy link

The application is partly to blame, says @fdik: it should use outgoing_message_rating_preview instead of outgoing_message_rating when the field is still being edited. Some garbage, I say, will still be generated.

The application is partly to blame, says @fdik: it should use `outgoing_message_rating_preview` instead of `outgoing_message_rating` when the field is still being edited. Some garbage, I say, will still be generated.
Sign in to join this conversation.
No Branch/Tag specified
master
engine-236
transport-system
dz/zig_0.16.0
FEATURE-232
transport-system-bk-before-showing-volker
FEATURE-206
dz/install_headers_only
FEATURE-220
Release_3.4.0
FEATURE_213
management-db-20
rebuild
own-key-backup
Release_3.3.0
193-attempt-late-2025
debug-mime
mailing-lists
non-destructive-imap
pEpMIME-default
positron-nkls-mixnet
pep4tb_deploy_macos
positron-check-signature
positron-nkls-mixnet--backup--2023年07月19日
gitea-169
heck_idl_codegen
gitea-168
gitea-165
gitea-133
gitea-133-rebased-snapshot-2023年05月10日
gitea-133-rebased-snapshot
gitea-133-unrebased
archive/Release_3.2
dvn/ci/sqlite
nkls-mixnet
gitea-150
gitea-148
gitea-149
positron/dvn/ci-refactor2023
gitea-140
gitea-91
gitea-136
pepmime--renamed
Release_2.1
unexpire-test-keys
gitea-96
gitea-120--2.x
gitea-116--2.x
gitea-121
gitea-118--3.x
gitea-113
gitea-117
foo
gitea-116
heck/tmpbugfix
gitea-100
gitea-104
gitea-90
echo-rate-limit
gitea-105
Release_2.1--with-sequoia-openpgp/v1.13.0-probably-all-wrong
invalid-upgdade
allow-empty-username
gitea-102
gitea-99
doxygen-3.x
gitea-83-84--v3
gitea-83-84--v2
gitea-83-84--v3--old-and-probably-useless
backup-before-using-REQUIRE
some-RCs-from-3.x--3.2.0-RC8-to-3.2.0-RC10
newsequoia2022--bk-2022年10月12日
log-scratch
mscgen
ENGINE-1006-for-engine-v2
sqlite-cleanup
ENGINE-1006-for-engine-v2-rebasing--backup-before-cleaning-2022年08月10日
ENGINE-999
ENGINE-1006-for-engine-v3--bk-before-rebasing
ENGINE-1006-for-engine-v3
ENGINE-1001--2.x
ENGINE-1001--3.x
ENGINE-1002--2.x
ENGINE-1002--3.x
positron/tka-scratch
positron/ENGINE-899
2.1-doxygen-docs
ENGINE-995
big-rewrite
migration-debugging
2.1-fix-two-lines-patch-only
ENGINE-996
QA-180
ENGINE-900
positron-temporary-for-heck-2022年01月12日-a
ENGINE-989
ENGINE-979-for-engine-v2
ENGINE-979-for-engine-v3
ENGINE-984
ENGINE-930
ENGINE-959
ENGINE-959-new-part-to-be-pushed-to-the-old-branch
ENGINE-975
ENGINE-969
ENGINE-971
ENGINE-969--almost-certainly-wrongly-named-and-useless--to-be-removed
ENGINE-974
ENGINE-972
ENGINE-968
ENGINE-619
lucasaiu/WIP-ENGINE-968
ENGINE-967
lucasaiu/test
ENGINE-964
ENGINE-956
lucasaiu/message-struct-change
ENGINE-961
ENGINE-962
lucasaiu/rating-field
Release_3.1
ENGINE-958
ENGINE-847
ENGINE-558
ENGINE-957
ENGINE-955
ENGINE-848
ENGINE-570
ENGINE-953
ENGINE-954
ENGINE-899
ENGINE-898
2.1_audit_refresh
joerg/Release_2.1
doxygen_doc
generate_api
neal/sequoia-1.1
ENGINE-878
ENGINE-606
ENGINE-820
MACOSINST-33
MACOSINST-26
ENGINE-868
ENGINE-814
ENGINE-864
mime-integrate
trustsync
test-README.md
sync
pEpMIME_windows
pEpMIME--old--krista
nuanced_return_codes
key-manipulation-tests
fpr-format-check
extra_keys_add
elevated_attachments
doc_update_sequoia
doxygen-key-id
b0rken_crypto
audit_branch
add_key_notification
Release_2.1.0
ENGINE-871
ENGINE-872
ENGINE-641
v3.4.0
v3.3.0
v3.3.0-RC17
v3.3.0-RC16
v3.3.0-RC15
v3.3.0-RC14
v3.3.0-RC13
v3.3.0-RC12
v3.3.0-RC11
v3.3.0-RC10
v3.3.0-RC9
v3.3.0-RC8
v3.3.0-RC7
v3.3.0-RC6
v3.3.0-RC5
v3.3.0-RC4
v3.3.0-RC3
v3.3.0-RC2
v3.3.0-RC1
v3.2.1
v3.2.0
v3.2.0-RC27
v3.2.0-RC26
v3.2.0-RC25
v3.2.0-RC24
v2.1.72
v3.2.0-RC23
v3.2.0-RC22
v3.2.0-RC21
v2.1.71
v2.1.70
v2.1.69
v3.2.0-RC20
v3.2.0-RC19
v3.2.0-RC18
v3.2.0-RC17
v3.2.0-RC16
v3.2.0-RC15
3.2.0-RC14
v3.2.0-RC14
v2.1.68
v3.2.0-RC13
v2.1.67
v3.2.0-RC12
v2.1.66
v2.1.65
v2.1.65-RC1
v3.2.0-RC11
gitea-86
v3.2.0-RC10
Release_3.2.0-RC9
3.2.0-RC8
Release_2.1.64
Release_2.1.63
Release_2.1.62
Release_2.1.61
Release_2.1.60
Release_2.1.59
Release_2.1.58
Release_2.1.57
Release_2.1.56
Release_2.1.55
Release_2.1.54
Release_3.2.0-RC7
Release_2.1.52
Release_2.1.51-RC6
Release_2.1.51-RC5
Release_2.1.51-RC4
Release_2.1.51-RC3
Release_2.1.51-RC2
Release_2.1.51-RC1
undo-the-incompatible-change-in-ENGINE-959
decrypt_message_2
after-incompatible-change-in-ENGINE-959
before-incompatible-change-in-ENGINE-959
Release_3.2.0-RC6
Release_zOS_0.1
Release_0.0.1
Release_3.2.0-RC5
Release_2.1.50
Release_3.1.10
Release_3.2.0-RC4
Release_3.2.0-RC3
Release_3.2.0-RC2
Release_3.2.0-RC1
Release_2.1.49
Release_2.1.48
Release_3.1.9
Release_3.1.8
Release_3.1.7
Release_3.1.6
Release_2.1.47
Release_2.1.46
Release_3.1.5
Release_3.1.4
Release_2.1.45
Release_3.1.3
Release_2.1.44
Release_2.1.43
Release_3.1.2
Release_3.1.1
Release_2.1.42
Release_3.1.0
Release_2.1.41
Release_2.1.40
archive/ENGINE-633
Release_2.1.39
Release_2.1.38
Release_2.1.37
Release_2.1.36
Release_2.1.35
Release_2.1.34
archive/Release_3.0
Release_3.0.11
Release_2.1.33
Release_2.1.32
Release_3.0.10
Release_2.1.31
Release_3.0.9
Release_2.1.30
Release_3.0.8
Release_3.0.7
Release_2.1.29
Release_3.0.6
Release_3.0.5
Release_2.1.28
Release_3.0.4
Release_3.0.3
Release_3.0.2
Release_2.1.27
Release_3.0.1
Release_3.0.0
Release_2.1.26
Release_2.1.25
archive/ENGINE-606
Release_2.1.24
Release_2.1.23
Release_2.1.22
Release_2.1.21
Release_2.1.20
Release_2.1.19
Release_2.1.18
Release_2.1.17
Release_2.1.16
TEST-ENGINE-820
Release_2.1.15
Release_2.1.14
archive/ENGINE-866
archive/ENGINE-883
TEST_ENGINE-814_1
ENGINE-864
Release_2.1.13
archive/ENGINE-877
Release_2.1.12
archive/ENGINE-864_old
archive/ENGINE-282
archive/ENGINE-109
archive/ENGINE-107
archive/ENGINE-105
archive/AllGroupDevicesShowHandshake
archive/2.0.5_p4a_log_test
archive/IOSAD-186
Release_2.1.11
archive/ENGINE-870
archive/ENGINE-822-sql-refactor
Release_2.1.10
Release_2.1.9
Release_2.1.8
Release_2.1.7
Release_2.1.6
archive/ENGINE-835
Release_2.1.5
archive/IOSAD-182
Release_2.1.4
Release_2.1.3
archive/neal-sequoia-update-staging
Release_2.1.2
Release_2.1.1
archive/Release_2.1.0
Release_2.1.0
Release_2.2.0-RC0
Release_2.1.0-RC39
Release_2.1.0-final
Release_2.1.0-RC38
Release_2.1.0-RC37
archive/short_term_is_own_key_branch
Release_2.1.0-RC36
Release_2.1.0-RC35
Release_2.1.0-RC34
Release_2.1.0-RC33
Release_2.1.0-RC32
archive/IOS-2414
Release_2.1.0-RC31
Release_2.1.0-RC30
Release_2.1.0-RC29
archive/ENGINE-812
Release_2.1.0-RC28
Release_2.1.0-RC27
archive/633-up-id-refactor
archive/test-huss-hypothesis-42
Release_2.1.0-RC26
audit_update_from_sync
Release_2.1.0-RC25
archive/ENGINE-781
archive/ENGINE-780-take2
Release_2.1.0-RC24
Release_2.1.0-RC23
archive/ENGINE-780
Release_2.1.0-RC22
Release_2.1.0-RC21
Release_2.1.0-RC20
archive/IOS-2327
Release_2.1.0-RC19
Release_2.1.0-RC18
Release_2.1.0-RC17
Release_2.1.0-RC16
Release_2.1.0-RC15
Release_2.1.0-RC14
Release_2.1.0-RC13
Release_2.1.0-RC12
Release_2.1.0-RC11
Release_2.1.0-RC10
archive/ENGINE-767
Release_2.1.0-RC9
Release_2.1.0-RC8
Release_2.1.0-RC7
archive/ENGINE-764
Release_2.1.0-RC6
Release_2.1.0-RC5
Release_2.1.0-RC4
Release_2.1.0-RC3
archive/ENGINE-757
Release_2.1.0-RC2
archive/import_key_2.1
Release_2.1.0-RC1
Release_2.0.6
Release_2.0.5
Release_2.1.0-RC0
archive/ENGINE-751
Release_2.0.4
archive/postrelease
archive/ENGINE-750
archive/default-1
Revived_default_branch._Close_postrelease_and_work_here._sync_is_2.0_branch_
Restarting_default_from_postrelease
Release_2.0.3
archive/ENGINE-746
archive/Release_1_branch_deprecated
archive/install_headers
decode-encode-API-change
last-old-mime-api-version
archive/ENGINE-720
Release_2.0.2
archive/ENGINE-736
Release_2.0.1
archive/ENGINE-514
archive/maintain
2.1.0_target
2.0.1_target
archive/remove_gpg
Release_2.0.0
archive/krista_tmp_sequoia_upgrade
archive/ENGINE-703
archive/grind_and_cleanup
archive/reduce
archive/krista-local-7-Jan-2020
archive/IOSAD-163
archive/IOSAD-161
archive/gen_sample
archive/group_key_reset
archive/key_reset_get_revocations
archive/ENGINE-659-gpg
archive/ENGINE-681
archive/ENGINE-655
Last_commit_in_old_default_branch_-_branch_now_moves_to_Release_1_branch_deprecated._Goal_is_to_move_postrelease_to_default_and_continue_with_new_release/branching_rules_
archive/sender-fpr-and-friends
archive/Xcode-sync-session
archive/ENGINE-596
archive/debian_default_test
archive/IOS-1942
archive/tracing_for_thomas
archive/android-stuff
archive/changeset_add
archive/spinlock_remove
archive/signature_test
archive/ENGINE-654
archive/Xcode11
archive/sync-test-dev
archive/ENGINE-638
archive/IOS-BUILD_NDEBUG_FIX
archive/ENGINE-649
archive/ENGINE-639
archive/ENGINE-647
archive/sender-fpr-checks
archive/ENGINE-630
archive/tunneling
archive/beacon_test
archive/IOS-1784
archive/sequoia_windows
archive/googletest
archive/google-ENGINE-325-testing
archive/ENGINE-325
archive/ENGINE-600
archive/ENGINE-571
archive/ENGINE-614
archive/ENGINE-552
archive/ENGINE-551
archive/ENGINE-559
archive/ENGINE-602
archive/IOSAD-120
archive/IOS-1576
archive/ENGINE-581
archive/IOS-1484
archive/notifyHandshake
archive/ENGINE-524
archive/neal/tpk-cache
archive/ENGINE-553
archive/ENGINE-544
archive/ENGINE-550
archive/email_comparison
2.0.0-RC
add
archive/IOSAD-111
archive/ENGINE-540
archive/krista_temp
archive/delete_key
archive/IOS-1482
archive/ENGINE-536
archive/make-cleanup
archive/ENGINE-531
archive/sync_test_refactor
archive/IOSAD-103
archive/krista-netpgp-sync
1.3.0-RC-sync
1.3.0-RC-default
archive/ENGINE-448
archive/ENGINE-510
archive/ENGINE-487
archive/ENGINE-507
Release_1.2.0
archive/ENGINE-474
archive/sequoia
archive/merge_ll_sign_only
archive/ENGINE-479
archive/ENGINE-479_low_level
archive/IOS-1351
archive/IOSAD-101
archive/ENGINE-472
archive/ENGINE-473
archive/ENGINE-358
Release_1.1.2
Release_1.1.1
archive/ENGINE-466
Release_1.1.0
Patch_release_1.0.442
archive/ENGINE-459
archive/ENGINE-463
archive/ENGINE-467
archive/sync_and_key_reset
archive/ENGINE-398
archive/ENGINE-455
archive/ENGINE-427
archive/ENGINE-451
archive/ENGINE-454
Release_1.0.441
archive/ENGINE-450-MARK-II
archive/ENGINE-450
archive/ENGINE-442
archive/ENGINE-440
archive/ENGINE-434
archive/ENGINE-422
archive/local_cmocka
archive/outlook_mime_support
archive/ENGINE-27
archive/ENGINE-139
archive/ENGINE-217
archive/ENGINE-198
archive/ENGINE-140_exclude_identity_from_sync
archive/gpgme-1.9.0
archive/ENGINE-238
archive/ENGINE-229
archive/ENGINE-228
archive/ENGINE-259
archive/ENGINE-254
archive/ENGINE-251
archive/ENGINE-237
archive/ENGINE-233
archive/ENGINE-308
archive/ENGINE-286
archive/ENGINE-275
archive/ENGINE-261
archive/ENGINE-214
archive/import_priv_keys_fix
archive/database_change_branch
archive/ENGINE_314
archive/ENGINE-293
archive/ENGINE-407
archive/ENGINE-400
archive/ENGINE-294
archive/JNI-26
archive/ENGINE-152
archive/ENGINE-137
archive/ENGINE-135
archive/ENGINE-178
archive/ENGINE-173
archive/local_cpptest
archive/ENGINE-430
archive/ENGINE-423
archive/el_presidente
archive/ENGINE-425
archive/ENGINE-420
archive/ENGINE-402
archive/preview_rating
archive/ENGINE-320-lr1
archive/roker-linux
archive/rok-mac
archive/enigmail_tests_pre_revision_2535
archive/thomas_timing_tests
archive/ENGINE-250
archive/mistrust_fixes
archive/ENGINE-352
archive/ENGINE-329
archive/ENGINE-289
archive/ENGINE-339
archive/ENGINE-332
archive/ENGINE-320
ENGINE-323_fixed
archive/ENGINE-322
archive/ENGINE-321
0.9.0_release
archive/test_diphoton
M1.0_current
no_support_provided_from_message_2.0_on_this_branch._Please_use_branch_diphoton_M1
archive/diphoton_M1
archive/ENGINE-305
archive/ENGINE-298
archive/ENGINE-287
archive/ENGINE-290
archive/ENGINE-288
archive/ENGINE-265
last_usable_message_format_commit
archive/krista-temp
archive/ENGINE-262
archive/ENGINE-255
archive/ENGINE-247
archive/2028_fix
archive/ENGINE-226
archive/message-2.0
archive/gpgme_passphrase_cb
archive/gnupg-2.1
archive/ENGINE-9
archive/ENGINE-171
archive/ENGINE-207
archive/ENGINE-9-1
archive/ENGINE-215
archive/ENGINE-204
archive/ENGINE-179
archive/ENGINE-3
archive/ENGINE-209
archive/IOS-506
archive/ENGINE-199
archive/ENGINE-183
archive/ENGINE-207-1
archive/ENGINE-187
archive/fdik_sync
archive/NETPGP-18
archive/ENGINE-189
archive/ENGINE-174
archive/ENGINE-188
archive/ENGINE-172
archive/ENGINE-180
archive/ratings
archive/KeySyncWaitForAccept
archive/GroupMerge
archive/enigmail-color-tests
archive/ENGINE-168
archive/ENGINE-157
archive/ENGINE-155
archive/default-2
archive/JNI-21
archive/default-3
archive/ENGINE-133
for_Outlook-1.1.10
archive/ENGINE-74
archive/ENGINE-112
archive/ENGINE-118
archive/ENGINE-140
archive/ENGINE-140-reloaded
archive/ENGINE-142
archive/ENGINE-84
archive/ENGINE-129
archive/keysync
archive/ENGINE-128
archive/peg-mime
archive/keysync-windows
archive/ENGINE-96
archive/ENGINE-95
archive/ENGINE-98
archive/ENGINE-92
archive/ENGINE-1
archive/krista_local_windows
archive/ENGINE-73
archive/JIRA_smart_commit_test_branch
archive/async_key_management
0.8.0
archive/ENGINE-79
archive/ENGINE-40
archive/import_own_key
archive/fixing_revoke
archive/null_size_attachment
archive/strl-imp
0.7.0
0.7
list
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pEp/pEpEngine#189
Reference in a new issue
pEp/pEpEngine
No description provided.
Delete branch "%!s()"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?