source: trunk/src/fixtures.erl @ 88

Revision 88, 2.9 KB checked in by dom, 3 years ago (diff)

Fixed minor bug in fixtures:make_tree/2

Line 
1%%% Copyright (c) Dominic Williams, Nicolas Charpentier, Virgile Delecolle,
2%%% Fabrice Nourisson, Jacques Couvreur.
3%%% All rights reserved.
4%%% See file COPYING.
5
6-module (fixtures).
7-export ([temporary_pathname/0]).
8-export ([make_tree/2, delete_tree/1]).
9-export ([use_tree/3]).
10-export ([use_tree/2]).
11-export ([unique_string/0]).
12-include_lib ("kernel/include/file.hrl").
13
14make_tree (Root, Tree) ->
15    ok = file: make_dir (Root),
16    populate (Root, Tree).
17
18delete_tree (Root) ->
19    depopulate (Root),
20    ok = file: del_dir (Root).
21
22temporary_pathname () ->
23    Roots = [os: getenv (X) || X <- ["TMP", "TEMP", "HOME"], os: getenv (X) /= false],
24    Root = hd ([X || X <- Roots, filelib: is_dir (X) == true]),
25    Pathname = filename: join (Root, unique_string ()),
26    {error, enoent} = file:read_file_info (Pathname),
27    Pathname.
28
29unique_string () ->
30    Node = atom_to_list (node ()),
31    [Name, Host] = string: tokens (Node, "@"),
32    [Mega, Sec, Micro] = [integer_to_list (X) || X <- tuple_to_list (now ())],
33    Name ++ "_at_" ++ Host ++ "_" ++ Mega ++ "_" ++ Sec ++ "_" ++ Micro.
34
35populate (Directory, [{file, Name, Content} | Tail]) ->
36    ok = file: write_file (filename: join (Directory, Name), normalise (Content)),
37    populate (Directory, Tail);
38populate (Directory, [{directory, Name, Content} | Tail]) ->
39    Pathname = filename: join (Directory, Name),
40    ok = file: make_dir (Pathname),
41    populate (Pathname, Content),
42    populate (Directory, Tail);
43populate (_, []) ->
44    ok.
45
46normalise ([String]) when is_list (String) ->
47    String;
48normalise ([H | T]) when is_list (H) ->
49    %% Inserts newlines when list of strings...
50    normalise ([string: concat (H, string: concat ("\n", hd (T))) | tl (T)]);
51normalise (String) when is_list (String) ->
52    String.
53
54depopulate (Directory) ->
55    {ok, Filename_list} = file: list_dir (Directory),
56    Delete = fun (Filename) ->
57                     Pathname = filename: join (Directory, Filename),
58                     {ok, File_info} = file: read_link_info (Pathname),
59                     case File_info#file_info.type of
60                         directory ->
61                             delete_tree (Pathname);
62                         regular ->
63                             ok = file: delete (Pathname);
64                         symlink ->
65                             ok = file: delete (Pathname)
66                     end
67             end,
68    lists: foreach (Delete, Filename_list).
69
70use_tree (Tree, Fun) ->
71    use_tree (temporary_pathname (), Tree, Fun).
72
73use_tree (Dir, Tree, Fun) ->
74    Self = self (),
75    Pid = spawn_link (fun() -> safe_call (Self, Dir, Tree, Fun) end),
76    receive
77        {Pid, {'EXIT', Error}} -> exit (Error);
78        {Pid, Result} -> Result
79    end.
80
81safe_call (Parent, Dir, Tree, Fun) ->
82    process_flag (trap_exit, true),
83    Self = self (),
84    make_tree (Dir, Tree),
85    Pid = spawn_link (fun () -> Self ! {self (), Fun (Dir, Tree)} end),
86    receive M -> delete_tree (Dir) end,
87    case M of
88        {Pid, Result} -> Parent ! {Self, Result};
89        {'EXIT', Pid, Error} -> Parent ! {Self, {'EXIT', Error}};
90        _ -> ignore
91    end.
Note: See TracBrowser for help on using the repository browser.