···3939 `split.legacy-bookmark-behavior = true`, but this will likely be removed in a
4040 future release. [#3419](https://github.com/jj-vcs/jj/issues/3419)
41414242+* The `signing.sign-all` config option has been deprecated in favor of
4343+ `signing.behavior`. The new option accepts `drop` (never sign), `keep` (preserve
4444+ existing signatures), `own` (sign own commits), or `force` (sign all commits).
4545+ Existing `signing.sign-all = true` translates to `signing.behavior = "own"`, and
4646+ `false` translates to `"keep"`.
4747+42484349### New features
4450
+4-4
cli/src/config-schema.json
···607607 "type": "string",
608608 "description": "The key the configured signing backend will use to to sign commits. Overridden by `jj sign` parameter or by the global `--sign-with` option"
609609 },
610610- "sign-all": {
611611- "type": "boolean",
612612- "description": "Whether to sign all commits by default. Overridden by global `--no-sign` option",
613613- "default": false
610610+ "behavior": {
611611+ "type": "string",
612612+ "enum": ["drop", "keep", "own", "force"],
613613+ "description": "Which commits to sign by default. Values: drop (never sign), keep (preserve existing signatures), own (sign own commits), force (sign all commits)"
614614 },
615615 "backends": {
616616 "type": "object",
···1120112011211121```toml
11221122[signing]
11231123-sign-all = true
11231123+behavior = "own"
11241124backend = "gpg"
11251125key = "4ED556E9729E000F"
11261126## You can set `key` to anything accepted by `gpg -u`
···1147114711481148```toml
11491149[signing]
11501150-sign-all = true
11501150+behavior = "own"
11511151backend = "ssh"
11521152key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGj+J6N6SO+4P8dOZqfR1oiay2yxhhHnagH52avUqw5h"
11531153## You can also use a path instead of embedding the key
···1176117611771177### Sign commits only on `jj git push`
1178117811791179-Instead of signing all commits during creation when `signing.sign-all` is
11801180-set to `true`, the `git.sign-on-push` configuration can be used to sign
11791179+Instead of signing all commits during creation when `signing.behavior` is
11801180+set to `own`, the `git.sign-on-push` configuration can be used to sign
11811181commits only upon running `jj git push`. All mutable unsigned commits
11821182being pushed will be signed prior to pushing. This might be preferred if the
11831183signing backend requires user interaction or is slow, so that signing is
11841184performed in a single batch operation.
1185118511861186```toml
11871187-# Configure signing backend as before, without setting `signing.sign-all`
11871187+# Configure signing backend as before, but lazily signing only on push.
11881188[signing]
11891189+behavior = "drop"
11891190backend = "ssh"
11901191key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGj+J6N6SO+4P8dOZqfR1oiay2yxhhHnagH52avUqw5h"
11911192
···141141}
142142143143/// A enum that describes if a created/rewritten commit should be signed or not.
144144-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
144144+#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Deserialize)]
145145+#[serde(rename_all = "kebab-case")]
145146pub enum SignBehavior {
146147 /// Drop existing signatures.
147148 /// This is what jj did before signing support or does now when a signing
+42-9
lib/tests/test_signing.rs
···1616use testutils::TestRepoBackend;
1717use testutils::TestWorkspace;
18181919-fn user_settings(sign_all: bool) -> UserSettings {
1919+fn user_settings(behavior: SignBehavior) -> UserSettings {
2020 let mut config = testutils::base_user_config();
2121 config.add_layer(
2222 ConfigLayer::parse(
···2424 &format!(
2525 r#"
2626 signing.key = "impeccable"
2727- signing.sign-all = {sign_all}
2828- "#
2727+ signing.behavior = "{}"
2828+ "#,
2929+ match behavior {
3030+ SignBehavior::Drop => "drop",
3131+ SignBehavior::Keep => "keep",
3232+ SignBehavior::Own => "own",
3333+ SignBehavior::Force => "force",
3434+ }
2935 ),
3036 )
3137 .unwrap(),
···5561#[test_case(TestRepoBackend::Local ; "local backend")]
5662#[test_case(TestRepoBackend::Git ; "git backend")]
5763fn manual(backend: TestRepoBackend) {
5858- let settings = user_settings(true);
6464+ let settings = user_settings(SignBehavior::Own);
59656066 let signer = Signer::new(Some(Box::new(TestSigningBackend)), vec![]);
6167 let test_workspace = TestWorkspace::init_with_backend_and_signer(backend, signer, &settings);
···84908591#[test_case(TestRepoBackend::Git ; "git backend")]
8692fn keep_on_rewrite(backend: TestRepoBackend) {
8787- let settings = user_settings(true);
9393+ let settings = user_settings(SignBehavior::Own);
88948995 let signer = Signer::new(Some(Box::new(TestSigningBackend)), vec![]);
9096 let test_workspace = TestWorkspace::init_with_backend_and_signer(backend, signer, &settings);
···109115110116#[test_case(TestRepoBackend::Git ; "git backend")]
111117fn manual_drop_on_rewrite(backend: TestRepoBackend) {
112112- let settings = user_settings(true);
118118+ let settings = user_settings(SignBehavior::Own);
113119114120 let signer = Signer::new(Some(Box::new(TestSigningBackend)), vec![]);
115121 let test_workspace = TestWorkspace::init_with_backend_and_signer(backend, signer, &settings);
···138144139145#[test_case(TestRepoBackend::Git ; "git backend")]
140146fn forced(backend: TestRepoBackend) {
141141- let settings = user_settings(true);
147147+ let settings = user_settings(SignBehavior::Force);
142148143149 let signer = Signer::new(Some(Box::new(TestSigningBackend)), vec![]);
144150 let test_workspace = TestWorkspace::init_with_backend_and_signer(backend, signer, &settings);
···148154 let repo = repo.clone();
149155 let mut tx = repo.start_transaction();
150156 let commit = create_random_commit(tx.repo_mut())
151151- .set_sign_behavior(SignBehavior::Force)
152157 .set_author(someone_else())
153158 .write()
154159 .unwrap();
···160165161166#[test_case(TestRepoBackend::Git ; "git backend")]
162167fn configured(backend: TestRepoBackend) {
163163- let settings = user_settings(true);
168168+ let settings = user_settings(SignBehavior::Own);
164169165170 let signer = Signer::new(Some(Box::new(TestSigningBackend)), vec![]);
166171 let test_workspace = TestWorkspace::init_with_backend_and_signer(backend, signer, &settings);
···175180 let commit = repo.store().get_commit(commit.id()).unwrap();
176181 assert_eq!(commit.verification().unwrap(), good_verification());
177182}
183183+184184+#[test_case(TestRepoBackend::Git ; "git backend")]
185185+fn drop_behavior(backend: TestRepoBackend) {
186186+ let settings = user_settings(SignBehavior::Drop);
187187+188188+ let signer = Signer::new(Some(Box::new(TestSigningBackend)), vec![]);
189189+ let test_workspace = TestWorkspace::init_with_backend_and_signer(backend, signer, &settings);
190190+191191+ let repo = &test_workspace.repo;
192192+193193+ let repo = repo.clone();
194194+ let mut tx = repo.start_transaction();
195195+ let commit = create_random_commit(tx.repo_mut())
196196+ .set_sign_behavior(SignBehavior::Own)
197197+ .write()
198198+ .unwrap();
199199+ tx.commit("test").unwrap();
200200+201201+ let original_commit = repo.store().get_commit(commit.id()).unwrap();
202202+ assert_eq!(original_commit.verification().unwrap(), good_verification());
203203+204204+ let mut tx = repo.start_transaction();
205205+ let mut_repo = tx.repo_mut();
206206+ let rewritten = mut_repo.rewrite_commit(&original_commit).write().unwrap();
207207+208208+ let rewritten_commit = repo.store().get_commit(rewritten.id()).unwrap();
209209+ assert_eq!(rewritten_commit.verification().unwrap(), None);
210210+}