Changeset 56 for trunk


Ignore:
Timestamp:
07/06/09 11:50:16 (3 years ago)
Author:
dom
Message:

Added clean removal of subdirectories to directory_watcher.

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/directory_watcher.erl

    r54 r56  
    66-export ([init/2]). 
    77-export ([init_recursive/2]). 
     8-export([start_io/2]). 
     9-export([start_io/0]). 
    810-include_lib ("kernel/include/file.hrl"). 
     11 
     12start_io () -> 
     13    start_io (".", 3000). 
     14 
     15start_io (Dir, Interval) -> 
     16    Watcher = spawn_link (?MODULE, init_recursive, [Dir, self ()]), 
     17    io_loop (Interval, Watcher). 
     18 
     19io_loop (Interval, Watcher) -> 
     20    Watcher ! check, 
     21    receive 
     22        {directory_watcher, _, Event} -> 
     23            io: fwrite ("~p~n", [Event]), 
     24            io_loop (Interval, Watcher); 
     25        stop -> 
     26            bye 
     27    after Interval -> 
     28            io_loop (Interval, Watcher) 
     29    end. 
    930 
    1031init (Directory, Pid) -> 
     
    1637 
    1738check (Directory, Pid, State) -> 
    18     New_state = list_dir (Directory, Pid, State), 
     39    New_state = list_dir (Directory, Pid), 
    1940    compare (Pid, State, New_state), 
    2041    loop (Directory, Pid, New_state). 
    2142 
    22 list_dir (Directory, Pid, State) -> 
    23     list_dir (Directory, Pid, State, file: list_dir (Directory)). 
     43list_dir (Directory, Pid) -> 
     44    list_dir (Directory, Pid, file: list_dir (Directory)). 
    2445 
    25 list_dir (Directory, _, _, {ok, Filenames}) -> 
     46list_dir (Directory, _, {ok, Filenames}) -> 
    2647    Paths = [filename: join (Directory, F) || F <- Filenames], 
    2748    read_state (Paths); 
    28 list_dir (Directory, Pid, State, Error) -> 
     49list_dir (Directory, Pid, Error) -> 
    2950    notify (Pid, {directory, Directory, Error}), 
    30     State. 
     51    []. 
    3152 
    3253read_state (Filenames) -> 
     
    6182            notify (Pid, Event), 
    6283            loop_recursive (Directory, Pid, [Watcher | Watchers]); 
     84        {?MODULE, Watcher, {directory, _, {error, enoent}}} -> 
     85            Watcher ! stop, 
     86            loop_recursive (Directory, Pid, Watchers -- [Watcher]); 
     87        {?MODULE, _, bye} -> 
     88            loop_recursive (Directory, Pid, Watchers); 
    6389        {?MODULE, _, Event} -> 
    6490            notify (Pid, Event), 
  • trunk/src/directory_watcher_test.erl

    r55 r56  
    1010-export ([bad_symlinks_are_ignored/0]). 
    1111-export ([recursive/0]). 
     12-export([directories_can_be_removed/0]). 
     13-export([directories_can_be_removed_when_recursive/0]). 
    1214 
    1315tests_from_empty () -> 
     
    3739 
    3840recursive () -> 
     41    ok = fixtures: use_tree (tree (), fun recursive/2). 
     42 
     43directories_can_be_removed () -> 
     44    ok = fixtures: use_tree (tree (), fun directories_can_be_removed/2). 
     45 
     46directories_can_be_removed_when_recursive () -> 
     47    ok = fixtures: use_tree (tree (), fun directories_can_be_removed_when_recursive/2). 
     48 
     49tree () -> 
    3950    Subsub = {directory, "subsubdir", 
    4051              [{file, "subsubfile.sub", "titi"}]}, 
     
    4556             [{file, "subfile.ext", "toto"}, 
    4657              Subsub]}], 
    47     ok = fixtures: use_tree (Tree, fun recursive/2). 
     58    Tree. 
     59 
     60directories_can_be_removed (Dir, _) ->     
     61    Watcher = spawn_link (directory_watcher, init, [Dir, self ()]), 
     62    receive_all (), 
     63    Subdir = filename: join (Dir, "subdir"), 
     64    fixtures: delete_tree (Subdir),  
     65    Watcher ! check, 
     66    {unknown, Subdir, lost} = receive_one (), 
     67    ok. 
     68 
     69directories_can_be_removed_when_recursive (Dir, _) ->     
     70    Watcher = spawn_link (directory_watcher, init_recursive, [Dir, self ()]), 
     71    receive_all (), 
     72    Subdir = filename: join ([Dir, "subdir", "subsubdir"]), 
     73    fixtures: delete_tree (Subdir),  
     74    Watcher ! check, 
     75    File = filename: join (Subdir, "subsubfile.sub"), 
     76    [{unknown, File, lost}, {unknown, Subdir, lost}] = receive_all (), 
     77    ok. 
    4878 
    4979recursive (Dir, _) -> 
     
    147177    after 500 -> timeout 
    148178    end. 
     179 
     180receive_all () -> 
     181    lists: reverse (receive_all ([])). 
     182 
     183receive_all (Acc) -> 
     184    receive {directory_watcher, _, Event} -> 
     185            receive_all ([Event | Acc]) 
     186    after 500 -> 
     187            Acc 
     188    end. 
Note: See TracChangeset for help on using the changeset viewer.