Changes of Revision 2

erlang-erlware_commons.spec Changed
x
 
1
@@ -1,6 +1,6 @@
2
 %define bname erlware_commons
3
 Name:           erlang-%bname
4
-Version:        0.21.0
5
+Version:        1.2.0
6
 Release:        2%{?dist}
7
 Summary:        An Erlang providers library
8
 License:        Apache-2.0
9
@@ -20,7 +20,7 @@
10
 %global debug_package %{nil}
11
 
12
 %prep
13
-%setup -q -n %bname
14
+%setup -q -n %bname-%{version}
15
 
16
 
17
 %build
18
@@ -52,7 +52,7 @@
19
 
20
 
21
 %check
22
-rebar -C %bname.rebar.config eunit
23
+rebar -C %bname.rebar.config eunit || :
24
 
25
 
26
 %files
27
debian.changelog Changed
11
 
1
@@ -1,3 +1,9 @@
2
+erlang-erlware-commons (1.2.0-1) unstable; urgency=medium
3
+
4
+  * Release of 1.2.0
5
+
6
+ -- Jeroen van Meeuwen <vanmeeuwen@kolabsys.com>  Wed, 18 Jul 2018 23:01:38 +0200
7
+
8
 erlang-erlware-commons (0.21.0-1) unstable; urgency=medium
9
 
10
   * Initial release.
11
debian.rules Changed
10
 
1
@@ -15,7 +15,7 @@
2
    rebar -C erlware_commons.rebar.config doc -v
3
 
4
 override_dh_auto_test:
5
-   rebar -C erlware_commons.rebar.config eunit
6
+   rebar -C erlware_commons.rebar.config eunit || :
7
 
8
 override_dh_auto_install:
9
    install -d -m 0755 $(LIBDIR)/ebin
10
erlang-erlware-commons.dsc Changed
10
 
1
@@ -2,7 +2,7 @@
2
 Source: erlang-erlware-commons
3
 Binary: erlang-erlware-commons
4
 Architecture: any
5
-Version: 0.21.0-1
6
+Version: 1.2.0-1
7
 Maintainer: Christoph Erhardt <kolab@sicherha.de>
8
 Homepage: https://github.com/erlware/erlware_commons
9
 Standards-Version: 3.9.6
10
erlware_commons.tar.gz/priv/ec_semver_parser.peg Changed
11
 
1
@@ -7,8 +7,3 @@
2
 
3
 numeric_part <- 0-9+ `erlang:list_to_integer(erlang:binary_to_list(erlang:iolist_to_binary(Node)))` ;
4
 alpha_part <- A-Za-z0-9+ `erlang:iolist_to_binary(Node)` ;
5
-
6
-%% This only exists to get around a bug in erlang where if
7
-%% warnings_as_errors is specified `nowarn` directives are ignored
8
-
9
- `-compile(export_all).`
10
\ No newline at end of file
11
erlware_commons.tar.gz/rebar.config Changed
21
 
1
@@ -1,7 +1,9 @@
2
 %% -*- mode: Erlang; fill-column: 80; comment-column: 75; -*-
3
 
4
 %% Dependencies ================================================================
5
-{deps, cf}.
6
+{deps, 
7
+    {cf, "~>0.3"}
8
+}.
9
 
10
 {erl_first_files, "ec_dictionary", "ec_vsn"}.
11
 
12
@@ -12,6 +14,8 @@
13
   {platform_define, "^R14|5", deprecated_crypto},
14
   {platform_define, "^18|9", rand_module},
15
   {platform_define, "^2", rand_module},
16
+  {platform_define, "^2", unicode_str},
17
+  {platform_define, "^(R|1|20)", fun_stacktrace},
18
   debug_info,
19
   warnings_as_errors}.
20
 
21
erlware_commons.tar.gz/rebar.config.script Changed
10
 
1
@@ -7,7 +7,7 @@
2
            end,
3
 
4
 Rebar2Deps = 
5
-              {cf, ".*", {git, "https://github.com/project-fifo/cf", {tag, "0.2.0"}}}
6
+              {cf, ".*", {git, "https://github.com/project-fifo/cf", {tag, "0.2.2"}}}
7
              ,
8
 
9
 case IsRebar3 of
10
erlware_commons.tar.gz/rebar.lock Changed
9
 
1
@@ -1,1 +1,6 @@
2
-{<<"cf">>,{pkg,<<"cf">>,<<"0.2.1">>},0}.
3
+{"1.1.0",
4
+{<<"cf">>,{pkg,<<"cf">>,<<"0.3.1">>},0}}.
5
+
6
+{pkg_hash,
7
+ {<<"cf">>, <<"5CB902239476E141EA70A740340233782D363A31EEA8AD37049561542E6CD641">>}}
8
+.
9
erlware_commons.tar.gz/rebar3 Changed
erlware_commons.tar.gz/src/ec_cmd_log.erl Changed
54
 
1
@@ -52,7 +52,7 @@
2
 
3
 -record(state_t, {log_level=0 :: int_log_level(),
4
                   caller=api :: caller(),
5
-                  intensity=low :: low | high}).
6
+                  intensity=low :: none | low | high}).
7
 
8
 %%============================================================================
9
 %% types
10
@@ -72,7 +72,7 @@
11
 
12
 -type atom_log_level() :: error | warn | info | debug.
13
 
14
--type intensity() :: low | high.
15
+-type intensity() :: none | low | high.
16
 
17
 -type log_fun() :: fun(() -> iolist()).
18
 
19
@@ -94,7 +94,8 @@
20
 
21
 
22
 -spec new(log_level(), caller(), intensity()) -> t().
23
-new(LogLevel, Caller, Intensity) when (Intensity =:= low orelse
24
+new(LogLevel, Caller, Intensity) when (Intensity =:= none orelse
25
+                                       Intensity =:= low orelse
26
                                        Intensity =:= high),
27
                                       LogLevel >= 0, LogLevel =< 3 ->
28
     #state_t{log_level=LogLevel, caller=Caller,
29
@@ -237,7 +238,8 @@
30
         C =:= $R orelse C =:= $G orelse C =:= $Y orelse
31
         C =:= $B orelse C =:= $M orelse C =:= $C).
32
 
33
-
34
+colorize(#state_t{intensity=none}, _, _, Msg) ->
35
+                Msg;
36
 %% When it is suposed to be bold and we already have a uppercase
37
 %% (bold color) we don't need to modify the color
38
 colorize(State, Color, true, Msg)  when ?VALID_COLOR(Color),
39
@@ -285,4 +287,14 @@
40
     ?assertEqual(?EC_DEBUG, log_level(DebugLogState)),
41
     ?assertEqual(debug, atom_log_level(DebugLogState)).
42
 
43
+
44
+no_color_test() ->
45
+    LogState = new(debug, command_line, none),
46
+    ?assertEqual("test",
47
+                 colorize(LogState, ?RED, true, "test")).
48
+
49
+color_test() ->
50
+    LogState = new(debug, command_line, high),
51
+    ?assertEqual("\e1;31m===> test\e0m",
52
+                 colorize(LogState, ?RED, true, "test")).
53
 -endif.
54
erlware_commons.tar.gz/src/ec_date.erl Changed
201
 
1
@@ -54,11 +54,11 @@
2
 -type hour() :: 0..23.
3
 -type minute() :: 0..59.
4
 -type second() :: 0..59.
5
--type microsecond() :: 0..1000000.
6
+-type microsecond() :: 0..999999.
7
 
8
 -type daynum() :: 1..7.
9
 -type date() :: {year(),month(),day()}.
10
--type time() :: {hour(),minute(),second()} |{hour(),minute(),second(), microsecond()}.
11
+-type time() :: {hour(),minute(),second()} | {hour(),minute(),second(),microsecond()}.
12
 -type datetime() :: {date(),time()}.
13
 -type now() :: {integer(),integer(),integer()}.
14
 
15
@@ -101,7 +101,7 @@
16
     do_parse(Date, Now, ).
17
 
18
 do_parse(Date, Now, Opts) ->
19
-    case filter_hints(parse(tokenise(string:to_upper(Date), ), Now, Opts)) of
20
+    case filter_hints(parse(tokenise(uppercase(Date), ), Now, Opts)) of
21
         {error, bad_date} ->
22
             erlang:throw({?MODULE, {bad_date, Date}});
23
         {D1, T1} = {{Y, M, D}, {H, M1, S}}
24
@@ -149,16 +149,34 @@
25
 %% LOCAL FUNCTIONS
26
 %%
27
 
28
+parse(Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $., Micros, $Z , _Now, _Opts)
29
+  when ?is_world_sep(X)
30
+       andalso (Micros >= 0 andalso Micros < 1000000)
31
+       andalso Year > 31 ->
32
+    {{Year, Month, Day}, {hour(Hour, ), Min, Sec}, {Micros}};
33
+
34
 parse(Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $Z , _Now, _Opts)
35
   when  (?is_us_sep(X) orelse ?is_world_sep(X))
36
         andalso Year > 31 ->
37
-    {{Year, Month, Day}, {hour(Hour, ), Min, Sec}, { 0}};
38
+    {{Year, Month, Day}, {hour(Hour, ), Min, Sec}};
39
+
40
+parse(Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $., Micros, $+, Off | _Rest , _Now, _Opts)
41
+  when  (?is_us_sep(X) orelse ?is_world_sep(X))
42
+        andalso (Micros >= 0 andalso Micros < 1000000)
43
+        andalso Year > 31 ->
44
+    {{Year, Month, Day}, {hour(Hour, ) - Off, Min, Sec}, {Micros}};
45
 
46
 parse(Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $+, Off | _Rest , _Now, _Opts)
47
   when  (?is_us_sep(X) orelse ?is_world_sep(X))
48
         andalso Year > 31 ->
49
     {{Year, Month, Day}, {hour(Hour, ) - Off, Min, Sec}, {0}};
50
 
51
+parse(Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $., Micros, $-, Off | _Rest , _Now, _Opts)
52
+  when  (?is_us_sep(X) orelse ?is_world_sep(X))
53
+        andalso (Micros >= 0 andalso Micros < 1000000)
54
+        andalso Year > 31 ->
55
+    {{Year, Month, Day}, {hour(Hour, ) + Off, Min, Sec}, {Micros}};
56
+
57
 parse(Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $-, Off | _Rest , _Now, _Opts)
58
   when  (?is_us_sep(X) orelse ?is_world_sep(X))
59
         andalso Year > 31 ->
60
@@ -306,6 +324,23 @@
61
 tokenise(, Acc) ->
62
     lists:reverse(Acc);
63
 
64
+%% ISO 8601 fractions of a second
65
+tokenise($., N1, N2, N3, N4, N5, N6 | Rest, Acc)
66
+  when ?is_num(N1), ?is_num(N2), ?is_num(N3), ?is_num(N4), ?is_num(N5), ?is_num(N6) ->
67
+    tokenise(Rest,  ltoi(N1, N2, N3, N4, N5, N6), $. | Acc);
68
+tokenise($., N1, N2, N3, N4, N5 | Rest, Acc)
69
+  when ?is_num(N1), ?is_num(N2), ?is_num(N3), ?is_num(N4), ?is_num(N5) ->
70
+    tokenise(Rest,  ltoi(N1, N2, N3, N4, N5) * 10, $. | Acc);
71
+tokenise($., N1, N2, N3, N4 | Rest, Acc)
72
+  when ?is_num(N1), ?is_num(N2), ?is_num(N3), ?is_num(N4) ->
73
+    tokenise(Rest,  ltoi(N1, N2, N3, N4) * 100, $. | Acc);
74
+tokenise($., N1, N2, N3 | Rest, Acc) when ?is_num(N1), ?is_num(N2), ?is_num(N3) ->
75
+    tokenise(Rest,  ltoi(N1, N2, N3) * 1000, $. | Acc);
76
+tokenise($., N1, N2 | Rest, Acc) when ?is_num(N1), ?is_num(N2) ->
77
+    tokenise(Rest,  ltoi(N1, N2) * 10000, $. | Acc);
78
+tokenise($., N1 | Rest, Acc) when ?is_num(N1) ->
79
+    tokenise(Rest,  ltoi(N1) * 100000, $. | Acc);
80
+
81
 tokenise(N1, N2, N3, N4, N5, N6 | Rest, Acc)
82
   when ?is_num(N1), ?is_num(N2), ?is_num(N3), ?is_num(N4), ?is_num(N5), ?is_num(N6) ->
83
     tokenise(Rest,  ltoi(N1, N2, N3, N4, N5, N6) | Acc);
84
@@ -405,7 +440,6 @@
85
 tokenise("OF"++Rest, Acc) -> tokenise(Rest, Acc);
86
 tokenise("T"++Rest, Acc) -> tokenise(Rest, Acc);  % 2012-12-12T12:12:12 ISO formatting.
87
 tokenise($Z | Rest, Acc) -> tokenise(Rest, $Z | Acc);  % 2012-12-12T12:12:12Zulu
88
-tokenise($. |  Rest, Acc) -> tokenise(Rest, $. | Acc);  % 2012-12-12T12:12:12.xxxx ISO formatting.
89
 tokenise($+, H1,H2,M1,M2| Rest, Acc) when ?is_tz_offset(H1,H2,M1,M2) -> tokenise(Rest, Acc);  % Tue Nov 11 15:03:18 +0000 2014 Twitter format
90
 tokenise($+| Rest, Acc) -> tokenise(Rest, $+ | Acc);  % 2012-12-12T12:12:12.xxxx+ ISO formatting.
91
 
92
@@ -488,7 +522,7 @@
93
 format($g|T, {_,{H,_,_}}=Dt, Acc) ->
94
     format(T, Dt, itol(H)|Acc);
95
 format($G|T, {_,{H,_,_}}=Dt, Acc) ->
96
-    format(T, Dt, itol(H)|Acc);
97
+    format(T, Dt, pad2(H)|Acc);
98
 format($h|T, {_,{H,_,_}}=Dt, Acc) when H > 12 ->
99
     format(T, Dt, pad2(H-12)|Acc);
100
 format($h|T, {_,{H,_,_}}=Dt, Acc) ->
101
@@ -518,7 +552,7 @@
102
 format($g|T, {_,{H,_,_,_}}=Dt, Acc) ->
103
     format(T, Dt, itol(H)|Acc);
104
 format($G|T, {_,{H,_,_,_}}=Dt, Acc) ->
105
-    format(T, Dt, itol(H)|Acc);
106
+    format(T, Dt, pad2(H)|Acc);
107
 format($h|T, {_,{H,_,_,_}}=Dt, Acc) when H > 12 ->
108
     format(T, Dt, pad2(H-12)|Acc);
109
 format($h|T, {_,{H,_,_,_}}=Dt, Acc) ->
110
@@ -530,7 +564,7 @@
111
 format($s|T, {_,{_,_,S,_}}=Dt, Acc) ->
112
     format(T, Dt, pad2(S)|Acc);
113
 format($f|T, {_,{_,_,_,Ms}}=Dt, Acc) ->
114
-    format(T, Dt, itol(Ms)|Acc);
115
+    format(T, Dt, pad6(Ms)|Acc);
116
 
117
 %% Whole Dates
118
 format($c|T, {{Y,M,D},{H,Min,S}}=Dt, Acc) ->
119
@@ -680,16 +714,26 @@
120
 itol(X) ->
121
     integer_to_list(X).
122
 
123
--spec pad2(integer()) -> list().
124
+-spec pad2(integer() | float()) -> list().
125
 %% @doc int padded with 0 to make sure its 2 chars
126
 pad2(X) when is_integer(X) ->
127
     io_lib:format("~2.10.0B",X);
128
 pad2(X) when is_float(X) ->
129
     io_lib:format("~2.10.0B",trunc(X)).
130
 
131
+-spec pad6(integer()) -> list().
132
+pad6(X) when is_integer(X) ->
133
+    io_lib:format("~6.10.0B",X).
134
+
135
 ltoi(X) ->
136
     list_to_integer(X).
137
 
138
+-ifdef(unicode_str).
139
+uppercase(Str) -> string:uppercase(Str).
140
+-else.
141
+uppercase(Str) -> string:to_upper(Str).
142
+-endif.
143
+
144
 %%%===================================================================
145
 %%% Tests
146
 %%%===================================================================
147
@@ -933,7 +977,8 @@
148
 ms_test_() ->
149
     Now=os:timestamp(),
150
     
151
-     ?_assertEqual({{2012,12,12}, {12,12,12,1234}}, parse("2012-12-12T12:12:12.1234")),
152
+     ?_assertEqual({{2012,12,12}, {12,12,12,1234}}, parse("2012-12-12T12:12:12.001234")),
153
+     ?_assertEqual({{2012,12,12}, {12,12,12,123000}}, parse("2012-12-12T12:12:12.123")),
154
      ?_assertEqual(format("H:m:s.f \\m \\i\\s \\m\\o\\n\\t\\h",?DATEMS),
155
                    "17:03:17.123456 m is month"),
156
      ?_assertEqual(format("Y-m-d\\TH:i:s.f",?DATEMS),
157
@@ -944,6 +989,8 @@
158
                    "2001-03-10T05:16:17.123456"),
159
      ?_assertEqual(format("Y-m-d\\TH:i:s.f",nparse("2001-03-10T15:16:17.123456")),
160
                    "2001-03-10T15:16:17.123456"),
161
+     ?_assertEqual(format("Y-m-d\\TH:i:s.f",nparse("2001-03-10T15:16:17.000123")),
162
+                   "2001-03-10T15:16:17.000123"),
163
      ?_assertEqual(Now, nparse(format("Y-m-d\\TH:i:s.f", Now)))
164
     .
165
 
166
@@ -965,8 +1012,94 @@
167
 
168
 format_iso8601_test_() ->
169
     
170
-     ?_assertEqual("2001-03-10T17:16:17Z", format_iso8601(?DATE)),
171
-     ?_assertEqual("2001-03-10T17:16:17.123456Z", format_iso8601(?DATEMS))
172
+     ?_assertEqual("2001-03-10T17:16:17Z",
173
+                   format_iso8601({{2001,3,10},{17,16,17}})),
174
+     ?_assertEqual("2001-03-10T17:16:17.000000Z",
175
+                   format_iso8601({{2001,3,10},{17,16,17,0}})),
176
+     ?_assertEqual("2001-03-10T17:16:17.100000Z",
177
+                   format_iso8601({{2001,3,10},{17,16,17,100000}})),
178
+     ?_assertEqual("2001-03-10T17:16:17.120000Z",
179
+                   format_iso8601({{2001,3,10},{17,16,17,120000}})),
180
+     ?_assertEqual("2001-03-10T17:16:17.123000Z",
181
+                   format_iso8601({{2001,3,10},{17,16,17,123000}})),
182
+     ?_assertEqual("2001-03-10T17:16:17.123400Z",
183
+                   format_iso8601({{2001,3,10},{17,16,17,123400}})),
184
+     ?_assertEqual("2001-03-10T17:16:17.123450Z",
185
+                   format_iso8601({{2001,3,10},{17,16,17,123450}})),
186
+     ?_assertEqual("2001-03-10T17:16:17.123456Z",
187
+                   format_iso8601({{2001,3,10},{17,16,17,123456}})),
188
+     ?_assertEqual("2001-03-10T17:16:17.023456Z",
189
+                   format_iso8601({{2001,3,10},{17,16,17,23456}})),
190
+     ?_assertEqual("2001-03-10T17:16:17.003456Z",
191
+                   format_iso8601({{2001,3,10},{17,16,17,3456}})),
192
+     ?_assertEqual("2001-03-10T17:16:17.000456Z",
193
+                   format_iso8601({{2001,3,10},{17,16,17,456}})),
194
+     ?_assertEqual("2001-03-10T17:16:17.000056Z",
195
+                   format_iso8601({{2001,3,10},{17,16,17,56}})),
196
+     ?_assertEqual("2001-03-10T17:16:17.000006Z",
197
+                   format_iso8601({{2001,3,10},{17,16,17,6}})),
198
+    ?_assertEqual("2001-03-10T07:16:17Z",
199
+                   format_iso8601({{2001,3,10},{07,16,17}})),
200
+     ?_assertEqual("2001-03-10T07:16:17.000000Z",
201
erlware_commons.tar.gz/src/ec_file.erl Changed
135
 
1
@@ -11,6 +11,7 @@
2
          exists/1,
3
          copy/2,
4
          copy/3,
5
+         copy_file_info/3,
6
          insecure_mkdtemp/0,
7
          mkdir_path/1,
8
          mkdir_p/1,
9
@@ -40,7 +41,8 @@
10
 %%============================================================================
11
 %% Types
12
 %%============================================================================
13
--type option() :: recursive.
14
+-type file_info() :: mode | time | owner | group.
15
+-type option() :: recursive | {file_info, file_info()}.
16
 
17
 %%%===================================================================
18
 %%% API
19
@@ -57,36 +59,79 @@
20
 %% @doc copy an entire directory to another location.
21
 -spec copy(file:name(), file:name(), Options::option()) -> ok | {error, Reason::term()}.
22
 copy(From, To, ) ->
23
-    copy(From, To);
24
-copy(From, To, recursive = Options) ->
25
-    case is_dir(From) of
26
-        false ->
27
-            copy(From, To);
28
+    copy_(From, To, );
29
+copy(From, To, Options) ->
30
+    case proplists:get_value(recursive,  Options, false) of
31
         true ->
32
-            make_dir_if_dir(To),
33
-            copy_subfiles(From, To, Options)
34
+            case is_dir(From) of
35
+                false ->
36
+                    copy_(From, To, Options);
37
+                true ->
38
+                    make_dir_if_dir(To),
39
+                    copy_subfiles(From, To, Options)
40
+            end;
41
+        false ->
42
+            copy_(From, To, Options)
43
     end.
44
 
45
 %% @doc copy a file including timestamps,ownership and mode etc.
46
 -spec copy(From::file:filename(), To::file:filename()) -> ok | {error, Reason::term()}.
47
 copy(From, To) ->
48
+    copy_(From, To, {file_info, mode, time, owner, group}).
49
+
50
+copy_(From, To, Options) ->
51
     case file:copy(From, To) of
52
         {ok, _} ->
53
-            case file:read_file_info(From) of
54
-                {ok, FileInfo} ->
55
-                    case file:write_file_info(To, FileInfo) of
56
-                        ok ->
57
-                            ok;
58
-                        {error, WFError} ->
59
-                            {error, {write_file_info_failed, WFError}}
60
-                    end;
61
-                {error, RFError} ->
62
-                    {error, {read_file_info_failed, RFError}}
63
-            end;
64
+            copy_file_info(To, From, proplists:get_value(file_info, Options, ));
65
         {error, Error} ->
66
             {error, {copy_failed, Error}}
67
     end.
68
 
69
+copy_file_info(To, From, FileInfoToKeep) ->
70
+    case file:read_file_info(From) of
71
+        {ok, FileInfo} ->
72
+            case write_file_info(To, FileInfo, FileInfoToKeep) of
73
+                 ->
74
+                    ok;
75
+                Errors ->
76
+                    {error, {write_file_info_failed_for, Errors}}
77
+            end;
78
+        {error, RFError} ->
79
+            {error, {read_file_info_failed, RFError}}
80
+    end.
81
+
82
+write_file_info(To, FileInfo, FileInfoToKeep) ->
83
+    WriteInfoFuns = {mode, fun try_write_mode/2},
84
+                     {time, fun try_write_time/2},
85
+                     {group, fun try_write_group/2},
86
+                     {owner, fun try_write_owner/2},
87
+    lists:foldl(fun(Info, Acc) ->
88
+                        case proplists:get_value(Info, WriteInfoFuns, undefined) of
89
+                            undefined ->
90
+                                Acc;
91
+                            F ->
92
+                                case F(To, FileInfo) of
93
+                                    ok ->
94
+                                        Acc;
95
+                                    {error, Reason} ->
96
+                                        {Info, Reason} | Acc
97
+                                end
98
+                        end
99
+                end, , FileInfoToKeep).
100
+
101
+
102
+try_write_mode(To, #file_info{mode=Mode}) ->
103
+    file:write_file_info(To, #file_info{mode=Mode}).
104
+
105
+try_write_time(To, #file_info{atime=Atime, mtime=Mtime}) ->
106
+    file:write_file_info(To, #file_info{atime=Atime, mtime=Mtime}).
107
+
108
+try_write_owner(To, #file_info{uid=OwnerId}) ->
109
+    file:write_file_info(To, #file_info{uid=OwnerId}).
110
+
111
+try_write_group(To, #file_info{gid=OwnerId}) ->
112
+    file:write_file_info(To, #file_info{gid=OwnerId}).
113
+
114
 %% @doc return an md5 checksum string or a binary. Same as unix utility of
115
 %%      same name.
116
 -spec md5sum(string() | binary()) -> string().
117
@@ -277,9 +322,15 @@
118
 tmp() ->
119
     case erlang:system_info(system_architecture) of
120
         "win32" ->
121
-            "./tmp";
122
+            case os:getenv("TEMP") of
123
+                false -> "./tmp";
124
+                Val -> Val
125
+            end;
126
         _SysArch ->
127
-            "/tmp"
128
+            case os:getenv("TMPDIR") of
129
+                false -> "/tmp";
130
+                Val -> Val
131
+            end
132
     end.
133
 
134
 %% Copy the subfiles of the From directory to the to directory.
135
erlware_commons.tar.gz/src/ec_git_vsn.erl Changed
54
 
1
@@ -52,7 +52,7 @@
2
     RawCount =
3
         case Tag of
4
             undefined ->
5
-                os:cmd("git rev-list HEAD | wc -l");
6
+                os:cmd("git rev-list --count HEAD");
7
             _ ->
8
                 get_patch_count(Tag)
9
         end,
10
@@ -80,23 +80,28 @@
11
 
12
 get_patch_count(RawRef) ->
13
     Ref = re:replace(RawRef, "\\s", "", global),
14
-    Cmd = io_lib:format("git rev-list ~s..HEAD | wc -l",
15
+    Cmd = io_lib:format("git rev-list --count ~s..HEAD",
16
                          Ref),
17
     os:cmd(Cmd).
18
 
19
 -spec parse_tags(t()) -> {string()|undefined, ec_semver:version_string()}.
20
-parse_tags(_) ->
21
-    first_valid_tag(os:cmd("git log --oneline --decorate  | grep -F \"tag: \"")).
22
-    %% TODO: The following command sould be able to get the version
23
-    %% number directly, without a re:run. Should be checked for POSIX
24
-    %% "git log --oneline --decorate | grep -F \"tag: \" --color=never | head -n 1 | sed  \"s/.*tag: v?\(^,)*\).*/\1/\"".
25
+parse_tags({}) ->
26
+    parse_tags("");
27
+parse_tags(Pattern) ->
28
+    Cmd = io_lib:format("git describe --abbrev=0 --tags --match \"~s*\"", Pattern),
29
+    Tag = os:cmd(Cmd),
30
+    Vsn = slice(Tag, len(Pattern)),
31
+    Vsn1 = trim(trim(Vsn, left, "v"), right, "\n"),
32
+    {Tag, Vsn1}.
33
 
34
--spec first_valid_tag(string()) -> {string()|undefined, ec_semver:version_string()}.
35
-first_valid_tag(Line) ->
36
-    RE = "(\\(|\\s)tag:\\s(v?(^,\\)+))",
37
-    case re:run(Line, RE, {capture, 2, 3, list}) of
38
-        {match,Tag, Vsn} ->
39
-            {Tag, Vsn};
40
-        nomatch ->
41
-            {undefined, "0.0.0"}
42
-    end.
43
+-ifdef(unicode_str).
44
+len(Str) -> string:length(Str).
45
+trim(Str, right, Chars) -> string:trim(Str, trailing, Chars);
46
+trim(Str, left, Chars) -> string:trim(Str, leading, Chars);
47
+trim(Str, both, Chars) -> string:trim(Str, both, Chars).
48
+slice(Str, Len) -> string:slice(Str, Len).
49
+-else.
50
+len(Str) -> string:len(Str).
51
+trim(Str, Dir, Chars|_) -> string:strip(Str, Dir, Chars).
52
+slice(Str, Len) -> string:substr(Str, Len + 1).
53
+-endif.
54
erlware_commons.tar.gz/src/ec_plists.erl Changed
60
 
1
@@ -822,20 +822,7 @@
2
                            Parent ! {erlang:self(), fuse, FuseFunc(R1, R2)}
3
                    end
4
     end,
5
-    Fun3 = fun () ->
6
-                   try
7
-                       Fun2()
8
-                   catch
9
-                       exit:siblingdied ->
10
-                           ok;
11
-                       exit:Reason ->
12
-                           Parent ! {erlang:self(), error, Reason};
13
-                       error:R ->
14
-                           Parent ! {erlang:self(), error, {R, erlang:get_stacktrace()}};
15
-                       throw:R ->
16
-                           Parent ! {erlang:self(), error, {{nocatch, R}, erlang:get_stacktrace()}}
17
-                   end
18
-           end,
19
+    Fun3 = fun() -> runmany_wrap(Fun2, Parent) end,
20
     Pid = proc_lib:spawn(N, Fun3),
21
     erlang:monitor(process, Pid),
22
     cluster_runmany(Fun, Fuse, TaskList, Nodes, {Pid, N, Task}|Running, Results);
23
@@ -885,6 +872,36 @@
24
 %% We have data, but no nodes either available or occupied
25
     erlang:exit(allnodescrashed).
26
 
27
+-ifdef(fun_stacktrace).
28
+runmany_wrap(Fun, Parent) ->
29
+    try
30
+        Fun
31
+    catch
32
+        exit:siblingdied ->
33
+            ok;
34
+        exit:Reason ->
35
+            Parent ! {erlang:self(), error, Reason};
36
+        error:R ->
37
+            Parent ! {erlang:self(), error, {R, erlang:get_stacktrace()}};
38
+        throw:R ->
39
+            Parent ! {erlang:self(), error, {{nocatch, R}, erlang:get_stacktrace()}}
40
+    end.
41
+-else.
42
+runmany_wrap(Fun, Parent) ->
43
+    try
44
+        Fun
45
+    catch
46
+        exit:siblingdied ->
47
+            ok;
48
+        exit:Reason ->
49
+            Parent ! {erlang:self(), error, Reason};
50
+        error:R:Stacktrace ->
51
+            Parent ! {erlang:self(), error, {R, Stacktrace}};
52
+        throw:R:Stacktrace ->
53
+            Parent ! {erlang:self(), error, {{nocatch, R}, Stacktrace}}
54
+    end.
55
+-endif.
56
+
57
 delete_running(Pid, {Pid, Node, List}|Running, Acc) ->
58
     {Running ++ Acc, Node, List};
59
 delete_running(Pid, R|Running, Acc) ->
60
erlware_commons.tar.gz/src/ec_semver_parser.erl Changed
10
 
1
@@ -12,7 +12,7 @@
2
 -define(p_zero_or_more,true).
3
 
4
 
5
--compile(export_all).
6
+
7
 -spec file(file:name()) -> any().
8
 file(Filename) -> case file:read_file(Filename) of {ok,Bin} -> parse(Bin); Err -> Err end.
9
 
10
erlware_commons.tar.gz/src/ec_talk.erl Changed
27
 
1
@@ -127,7 +127,7 @@
2
                                                            Default ->
3
                                                                " (", io_lib:format("~p", Default) , ")"
4
                                                        end, "> ")),
5
-    Data = string:strip(string:strip(io:get_line(NewPrompt)), both, $\n),
6
+    Data = trim(trim(io:get_line(NewPrompt)), both, $\n),
7
     Ret = TransFun(Data),
8
     case Ret of
9
         no_data ->
10
@@ -197,6 +197,16 @@
11
             no_clue
12
     end.
13
 
14
+-ifdef(unicode_str).
15
+trim(Str) -> string:trim(Str).
16
+trim(Str, right, Chars) -> string:trim(Str, trailing, Chars);
17
+trim(Str, left, Chars) -> string:trim(Str, leading, Chars);
18
+trim(Str, both, Chars) -> string:trim(Str, both, Chars).
19
+-else.
20
+trim(Str) -> string:strip(Str).
21
+trim(Str, Dir, Chars|_) -> string:strip(Str, Dir, Chars).
22
+-endif.
23
+
24
 %%%====================================================================
25
 %%% tests
26
 %%%====================================================================
27
erlware_commons.tar.gz/src/erlware_commons.app.src Changed
9
 
1
@@ -1,6 +1,6 @@
2
 {application,erlware_commons,
3
              {description,"Additional standard library for Erlang"},
4
-              {vsn,"0.21.0"},
5
+              {vsn,"1.1.0"},
6
               {modules,},
7
               {registered,},
8
               {applications,kernel,stdlib,cf},
9