We truncated the diff of some files because they were too big.
If you want to see the full diff for every file, click here.
Changes of Revision 2
erlang-erlware_commons.spec
Changed
x
1
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
10
%global debug_package %{nil}
11
12
%prep
13
-%setup -q -n %bname
14
+%setup -q -n %bname-%{version}
15
16
17
%build
18
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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