@@ -12,7 +12,8 @@ use crev_lib::id::LockedId;
12
12
use crev_lib:: { self , local:: Local } ;
13
13
use std:: {
14
14
collections:: { HashMap , HashSet } ,
15
- io:: { self , BufRead , Write } ,
15
+ fmt:: Write as _,
16
+ io:: { self , BufRead , Write as _} ,
16
17
panic,
17
18
path:: PathBuf ,
18
19
} ;
@@ -138,6 +139,7 @@ fn crate_review(args: opts::CrateReview) -> Result<()> {
138
139
& args. common_proof_create ,
139
140
& args. diff ,
140
141
args. skip_activity_check || is_advisory || args. issue ,
142
+ args. overrides ,
141
143
args. cargo_opts . clone ( ) ,
142
144
) ?;
143
145
let has_public_url = local
@@ -196,18 +198,22 @@ fn print_ids<'a>(
196
198
Ok ( ( ) )
197
199
}
198
200
201
+ fn url_to_status_str < ' a > ( id_url : & UrlOfId < ' a > ) -> ( & ' static str , & ' a str ) {
202
+ match id_url {
203
+ UrlOfId :: None => ( "" , "" ) ,
204
+ UrlOfId :: FromSelfVerified ( url) => ( "==" , url. url . as_str ( ) ) ,
205
+ UrlOfId :: FromSelf ( url) => ( "~=" , url. url . as_str ( ) ) ,
206
+ UrlOfId :: FromOthers ( url) => ( "??" , url. url . as_str ( ) ) ,
207
+ }
208
+ }
209
+
199
210
fn print_mvp_ids < ' a > (
200
211
ids : impl Iterator < Item = ( & ' a Id , u64 ) > ,
201
212
trust_set : & TrustSet ,
202
213
db : & ProofDB ,
203
214
) -> Result < ( ) > {
204
215
for ( id, count) in ids {
205
- let ( status, url) = match db. lookup_url ( id) {
206
- UrlOfId :: None => ( "" , "" ) ,
207
- UrlOfId :: FromSelfVerified ( url) => ( "==" , url. url . as_str ( ) ) ,
208
- UrlOfId :: FromSelf ( url) => ( "~=" , url. url . as_str ( ) ) ,
209
- UrlOfId :: FromOthers ( url) => ( "??" , url. url . as_str ( ) ) ,
210
- } ;
216
+ let ( status, url) = url_to_status_str ( & db. lookup_url ( id) ) ;
211
217
println ! (
212
218
"{:>3} {} {:6} {} {}" ,
213
219
count,
@@ -296,6 +302,7 @@ fn run_command(command: opts::Command) -> Result<CommandExitStatus> {
296
302
& args. common_proof_create ,
297
303
args. level . unwrap_or ( TrustLevel :: Medium ) ,
298
304
args. level . is_none ( ) ,
305
+ args. overrides ,
299
306
) ?;
300
307
}
301
308
opts:: Id :: Untrust ( args) => {
@@ -304,6 +311,7 @@ fn run_command(command: opts::Command) -> Result<CommandExitStatus> {
304
311
& args. common_proof_create ,
305
312
TrustLevel :: None ,
306
313
true ,
314
+ args. overrides ,
307
315
) ?;
308
316
}
309
317
opts:: Id :: Distrust ( args) => {
@@ -312,6 +320,7 @@ fn run_command(command: opts::Command) -> Result<CommandExitStatus> {
312
320
& args. common_proof_create ,
313
321
TrustLevel :: Distrust ,
314
322
true ,
323
+ args. overrides ,
315
324
) ?;
316
325
}
317
326
opts:: Id :: Query ( cmd) => match cmd {
@@ -427,6 +436,7 @@ fn run_command(command: opts::Command) -> Result<CommandExitStatus> {
427
436
& args. common_proof_create ,
428
437
args. level . unwrap_or ( TrustLevel :: Medium ) ,
429
438
args. level . is_none ( ) ,
439
+ args. overrides ,
430
440
) ?;
431
441
// Make sure we have reviews for the new Ids we're trusting
432
442
local. fetch_new_trusted ( Default :: default ( ) , None ) ?;
@@ -496,6 +506,7 @@ fn run_command(command: opts::Command) -> Result<CommandExitStatus> {
496
506
& args. common_proof_create ,
497
507
& args. diff ,
498
508
args. skip_activity_check || is_advisory || args. issue ,
509
+ args. overrides ,
499
510
args. cargo_opts . clone ( ) ,
500
511
)
501
512
} ) ?;
@@ -762,22 +773,56 @@ fn set_trust_level_for_ids(
762
773
common_proof_create : & crate :: opts:: CommonProofCreate ,
763
774
trust_level : TrustLevel ,
764
775
edit_interactively : bool ,
776
+ show_override_suggestions : bool ,
765
777
) -> Result < ( ) > {
766
778
let local = ensure_crev_id_exists_or_make_one ( ) ?;
767
779
let unlocked_id = local. read_current_unlocked_id ( & term:: read_passphrase) ?;
768
780
769
- let mut trust =
770
- local. build_trust_proof ( unlocked_id. as_public_id ( ) , ids. to_vec ( ) , trust_level) ?;
781
+ let overrides = if ids. len ( ) == 1 {
782
+ let db = local. load_db ( ) ?;
783
+
784
+ db. get_trust_proof_between ( & unlocked_id. id . id , & ids[ 0 ] )
785
+ . map ( |trust_proof| trust_proof. override_ . clone ( ) )
786
+ . unwrap_or ( vec ! [ ] )
787
+ } else {
788
+ vec ! [ ]
789
+ } ;
790
+
791
+ let mut trust = local. build_trust_proof (
792
+ unlocked_id. as_public_id ( ) ,
793
+ ids. to_vec ( ) ,
794
+ trust_level,
795
+ overrides,
796
+ ) ?;
771
797
772
798
if edit_interactively {
773
799
let extra_comment = if trust_level == TrustLevel :: Distrust {
774
800
Some ( "WARNING: Distrust has severe consequences. Read documentation below." )
775
801
} else {
776
802
None
777
803
} ;
778
- trust = edit:: edit_proof_content_iteractively ( & trust, None , None , extra_comment) ?;
804
+ trust = edit:: edit_proof_content_iteractively ( & trust, None , None , extra_comment, |text| {
805
+ if show_override_suggestions && trust. override_ . is_empty ( ) {
806
+ writeln ! ( text, "# override:" ) ?;
807
+ }
808
+
809
+ if show_override_suggestions {
810
+ let db = local. load_db ( ) ?;
811
+ for ( id, trust_level) in ids. into_iter ( ) . flat_map ( |id| db. get_reverse_trust_for ( id) )
812
+ {
813
+ let ( status, url) = url_to_status_str ( & db. lookup_url ( id) ) ;
814
+ writeln ! ( text, "# - id-type: {}" , "crev" ) ?; // TODO: support other ids?
815
+ writeln ! ( text, "# id: {} # level: {}" , id, trust_level) ?;
816
+ writeln ! ( text, "# url: {} # {}" , url, status) ?;
817
+ writeln ! ( text, "# comment: \" \" " ) ?;
818
+ }
819
+ }
820
+
821
+ Ok ( ( ) )
822
+ } ) ?;
779
823
}
780
824
825
+ trust. touch_date ( ) ;
781
826
let proof = trust. sign_by ( & unlocked_id) ?;
782
827
783
828
if common_proof_create. print_unsigned {
0 commit comments