@@ -15,7 +15,7 @@ use digest::DigestUtil;
15
15
use json;
16
16
use sha1:: Sha1 ;
17
17
use serialize:: { Encoder , Encodable , Decoder , Decodable } ;
18
- use arc:: RWARC ;
18
+ use arc:: { ARC , RWARC } ;
19
19
use treemap:: TreeMap ;
20
20
21
21
use std:: cell:: Cell ;
@@ -174,11 +174,12 @@ impl Logger {
174
174
}
175
175
}
176
176
177
+ #[deriving(Clone)]
177
178
struct Context {
178
179
db: RWARC<Database>,
179
- logger: Logger,
180
- cfg: json::Object,
181
- freshness: TreeMap<~str,@ fn(&str,&str)->bool>
180
+ logger: RWARC< Logger> ,
181
+ cfg: ARC< json::Object> ,
182
+ freshness: ARC< TreeMap<~str,~ fn(&str,&str)->bool> >
182
183
}
183
184
184
185
struct Prep<'self> {
@@ -228,12 +229,14 @@ fn digest_file(path: &Path) -> ~str {
228
229
229
230
impl Context {
230
231
231
- pub fn new(db: RWARC<Database>, lg: Logger, cfg: json::Object) -> Context {
232
+ pub fn new(db: RWARC<Database>,
233
+ lg: RWARC<Logger>,
234
+ cfg: ARC<json::Object>) -> Context {
232
235
Context {
233
236
db: db,
234
237
logger: lg,
235
238
cfg: cfg,
236
- freshness: TreeMap::new()
239
+ freshness: ARC( TreeMap::new() )
237
240
}
238
241
}
239
242
@@ -267,19 +270,20 @@ impl<'self> Prep<'self> {
267
270
fn is_fresh(&self, cat: &str, kind: &str,
268
271
name: &str, val: &str) -> bool {
269
272
let k = kind.to_owned();
270
- let f = self.ctxt.freshness.find(&k);
273
+ let f = self.ctxt.freshness.get(). find(&k);
271
274
let fresh = match f {
272
275
None => fail!(" missing freshness-function for ' %s' ", kind) ,
273
276
Some ( f) => ( * f) ( name, val)
274
277
} ;
275
- let lg = self . ctxt . logger ;
276
- if fresh {
277
- lg. info( fmt ! ( "%s %s:%s is fresh" ,
278
- cat, kind, name) ) ;
279
- } else {
280
- lg. info ( fmt ! ( "%s %s:%s is not fresh" ,
281
- cat, kind, name) )
282
- }
278
+ do self. ctxt. logger. write |lg| {
279
+ if fresh {
280
+ lg. info( fmt ! ( "%s %s:%s is fresh" ,
281
+ cat, kind, name) ) ;
282
+ } else {
283
+ lg. info ( fmt ! ( "%s %s:%s is not fresh" ,
284
+ cat, kind, name) )
285
+ }
286
+ } ;
283
287
fresh
284
288
}
285
289
@@ -380,13 +384,21 @@ fn test() {
380
384
}
381
385
382
386
let cx = Context :: new( RWARC ( Database :: new( Path ( "db.json" ) ) ) ,
383
- Logger :: new( ) , TreeMap :: new( ) ) ;
387
+ RWARC ( Logger :: new( ) ) ,
388
+ ARC ( TreeMap :: new( ) ) ) ;
384
389
385
390
let s = do cx. with_prep( "test1" ) |prep| {
391
+
392
+ let subcx = cx. clone( ) ;
393
+
386
394
prep. declare_input( "file" , pth. to_str( ) , digest_file( & pth) ) ;
387
395
do prep. exec |_exe| {
388
396
let out = Path ( "foo.o" ) ;
389
397
run:: process_status( "gcc" , [ ~"foo. c", ~" -o", out. to_str( ) ] ) ;
398
+
399
+ let _proof_of_concept = subcx. prep( "subfn" ) ;
400
+ // Could run sub-rules inside here.
401
+
390
402
out. to_str( )
391
403
}
392
404
} ;
0 commit comments