@@ -29,6 +29,8 @@ use html5ever::tendril::ByteTendril;
29
29
use html5ever:: tokenizer:: {
30
30
BufferQueue , TagToken , Token , TokenSink , TokenSinkResult , Tokenizer , TokenizerOpts ,
31
31
} ;
32
+ use std:: collections:: hash_map:: Entry ;
33
+ use std:: iter:: once;
32
34
33
35
// Add linkcheck exceptions here
34
36
// If at all possible you should use intra-doc links to avoid linkcheck issues. These
@@ -114,13 +116,16 @@ macro_rules! t {
114
116
#[ derive( Parser ) ]
115
117
struct Cli {
116
118
docs : PathBuf ,
119
+ #[ clap( long) ]
120
+ extra_target : Vec < PathBuf > ,
117
121
}
118
122
119
123
fn main ( ) {
120
124
let mut cli = Cli :: parse ( ) ;
121
125
cli. docs = cli. docs . canonicalize ( ) . unwrap ( ) ;
122
126
123
- let mut checker = Checker { root : cli. docs . clone ( ) , cache : HashMap :: new ( ) } ;
127
+ let mut checker =
128
+ Checker { root : cli. docs . clone ( ) , extra_targets : cli. extra_target , cache : HashMap :: new ( ) } ;
124
129
let mut report = Report {
125
130
errors : 0 ,
126
131
start : Instant :: now ( ) ,
@@ -142,6 +147,7 @@ fn main() {
142
147
143
148
struct Checker {
144
149
root : PathBuf ,
150
+ extra_targets : Vec < PathBuf > ,
145
151
cache : Cache ,
146
152
}
147
153
@@ -434,15 +440,24 @@ impl Checker {
434
440
let pretty_path =
435
441
file. strip_prefix ( & self . root ) . unwrap_or ( file) . to_str ( ) . unwrap ( ) . to_string ( ) ;
436
442
437
- let entry =
438
- self . cache . entry ( pretty_path. clone ( ) ) . or_insert_with ( || match fs:: metadata ( file) {
443
+ for base in once ( & self . root ) . chain ( self . extra_targets . iter ( ) ) {
444
+ // TODO: rebase and turn into a let else
445
+ let entry = self . cache . entry ( pretty_path. clone ( ) ) ;
446
+ if let Entry :: Occupied ( e) = & entry {
447
+ if !matches ! ( e. get( ) , FileEntry :: Missing ) {
448
+ break ;
449
+ }
450
+ }
451
+
452
+ let file = base. join ( & pretty_path) ;
453
+ entry. insert_entry ( match fs:: metadata ( & file) {
439
454
Ok ( metadata) if metadata. is_dir ( ) => FileEntry :: Dir ,
440
455
Ok ( _) => {
441
456
if file. extension ( ) . and_then ( |s| s. to_str ( ) ) != Some ( "html" ) {
442
457
FileEntry :: OtherFile
443
458
} else {
444
459
report. html_files += 1 ;
445
- load_html_file ( file, report)
460
+ load_html_file ( & file, report)
446
461
}
447
462
}
448
463
Err ( e) if e. kind ( ) == ErrorKind :: NotFound => FileEntry :: Missing ,
@@ -458,6 +473,9 @@ impl Checker {
458
473
panic ! ( "unexpected read error for {}: {}" , file. display( ) , e) ;
459
474
}
460
475
} ) ;
476
+ }
477
+
478
+ let entry = self . cache . get ( & pretty_path) . unwrap ( ) ;
461
479
( pretty_path, entry)
462
480
}
463
481
}
0 commit comments