1% * -*- Mode: Prolog -*- */
    2
    3:- module(scan,
    4          [
    5           show_stored_targets/0,
    6           collect_stored_targets/1,
    7           collect_stored_targets/2,
    8
    9           stored_target/5
   10           ]).   11:- use_module(biomake).   12
   13% ----------------------------------------
   14% DATABASE
   15% ----------------------------------------
 stored_target(?Target, ?Dependencies, ?Status, ?TimeBuilt, ?TimeChecked)
   18:- dynamic stored_target/5.
 collect_stored_targets(+Path, +Opts:list)
iterates over files and directories in Path, generating metadata on each file, storing in stored_target/5
   24collect_stored_targets(Opts):-
   25        collect_stored_targets('.',Opts).
   26collect_stored_targets(Path,Opts):-
   27        expand_file_name(Path,Dirs),
   28        forall(member(Dir,Dirs),
   29               (   dir_files_recursive(Dir,Files,[]),
   30                   forall(member(File,Files),
   31                          collect_file(File,Opts)))).
   32
   33dir_files_recursive(Dir,AllFiles,VL) :-
   34        directory_files(Dir,Files),
   35        findall(FilePath,(member(File,Files),
   36                          atomic_list_concat([Dir,/,File],FilePath)),
   37                FilePaths),
   38        debug(biomake,'dir files: ~w',[Dir]),
   39        findall(FilePath,
   40                (   member(Dir2,Files),
   41                    Dir2\='.',
   42                    Dir2\='..',
   43                    \+ member(Dir2,VL),
   44                    atomic_list_concat([Dir,/,Dir2],Dir3),
   45                    exists_directory(Dir3),
   46                    dir_files_recursive(Dir3,Files,[Dir2|VL]),
   47                    member(File,Files),
   48                    atomic_list_concat([Dir3,/,File],FilePath)
   49                    ),
   50                Files2),
   51        append(FilePaths,Files2,AllFiles).
   52
   53collect_file(File,Opts) :-
   54        debug(biomake,'collecting: "~w"',[File]),
   55        get_time(TimeChecked),
   56        file_info(File,DL,Status,Opts),
   57        debug(biomake,'  info: ~w',[Status]),
   58        time_file_wrap(File,TimeBuilt),
   59        retractall(stored_target(File,_,_,_,_)),
   60        assert(stored_target(File,DL,Status,TimeBuilt,TimeChecked)).
   61
   62file_info(T,DL,Status,Opts) :-
   63        target_bindrule(T,Rule),
   64        rule_dependencies(Rule,DL,Opts),
   65        (   rebuild_required(T,DL,[],Opts)
   66        ->  Status=stale
   67        ;   Status=fresh),
   68        !.
   69file_info(_,[],unknown,_).
   70
   71time_file_wrap(F,T) :-
   72        exists_file(F),
   73        time_file(F,T),
   74        !.
   75time_file_wrap(_,-).
   76
   77show_stored_targets :-
   78        forall(stored_target(T,DL,S,T1,T2),
   79	       (atomic_list_concat(DL,' ',DLA),
   80	        format("~w [~w] ~w ~w ~w~n",[T,DLA,S,T1,T2])))