Packages
gpb
4.19.6
5.0.0
4.21.7
4.21.6
4.21.5
4.21.4
4.21.3
4.21.2
4.21.1
4.21.0
4.20.0
4.19.9
4.19.8
4.19.7
4.19.6
4.19.5
4.19.4
4.19.3
4.19.2
4.19.1
4.19.0
4.18.0
4.17.7
4.17.6
4.17.5
4.17.3
4.17.2
4.17.1
4.17.0
4.16.2
4.16.1
4.16.0
4.15.2
4.15.1
4.14.2
4.14.1
4.14.0
4.13.0
4.12.0
4.11.2
4.11.1
4.11.0
4.10.6
4.10.5
4.10.4
4.10.3
4.10.2
4.10.1
4.10.0
4.9.3
4.9.2
4.9.1
4.9.0
4.8.0
4.7.3
4.7.2
4.7.1
4.7.0
4.6.0
4.5.1
4.5.0
4.4.1
4.4.0
4.3.3
4.3.2
4.3.1
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.9
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.2
4.0.1
4.0.0
3.28.1
3.28.0
3.27.7
3.27.6
3.27.5
3.27.4
3.27.3
3.27.2
3.27.1
3.27.0
3.26.8
3.26.7
3.26.6
3.26.5
3.26.4
3.26.3
3.26.2
3.26.1
3.26.0
3.25.2
3.25.1
3.25.0
3.24.4
3.24.3
3.24.2
3.24.1
3.24.0
3.23.2
3.23.1
3.23.0
3.22.5
3.22.4
3.22.3
3.22.2
3.22.1
3.22.0
3.21.3
3.21.2
3.21.1
3.21.0
3.20.3
3.20.2
3.20.0
3.19.0
3.18.10
3.18.9
3.18.8
3.18.7
3.18.6
3.18.5
3.18.4
3.18.3
3.18.2
3.18.1
3.18.0
3.17.13
3.17.12
3.17.11
3.17.10
3.17.9
3.17.8
3.17.5
3.17.4
3.17.3
3.17.2
3.17.1
3.17.0
3.16.0
3.15.0
3.14.0
3.13.0
3.12.2
3.12.1
3.12.0
3.11.0
A compiler for Google protocol buffer definitions files for Erlang.
Current section
Files
Jump to
Current section
Files
build/find-vsn
#!/usr/bin/env escript
%% -*- erlang -*-
-include_lib("kernel/include/file.hrl").
-mode(compile).
main(["--show-vsn"]) ->
case find_vsn() of
{ok, {Vsn, _Source}} ->
io:put_chars([Vsn, "\n"]),
do_exit(0);
{error, _} ->
print_no_vsn_error(),
do_exit(1)
end;
main(["--show-vsn-source"]) ->
case find_vsn() of
{ok, {_Vsn, Source}} ->
io:put_chars([atom_to_list(Source), "\n"]),
do_exit(0);
{error, _} ->
print_no_vsn_error(),
do_exit(1)
end;
main(["--have-vsn"]) ->
case find_vsn() of
{ok, {_Vsn, _Source}} ->
io:put_chars("true\n");
{error, _} ->
io:put_chars("false\n")
end,
do_exit(0);
main(["--check-have-vsn"]) ->
case find_vsn() of
{ok, {_Vsn, _Source}} ->
do_exit(0);
{error, _} ->
do_exit(1)
end;
main(_) ->
io:format("usage: ~s --show-vsn | --show-vsn-source~n",
[escript:script_name()]),
do_exit(1).
do_exit(ExitCode) ->
halt(ExitCode).
find_vsn() ->
case find_vsn_from_file() of
{ok, Vsn} ->
{ok, {Vsn, file}};
{error, Reason1} ->
case find_vsn_from_git() of
{ok, Vsn} ->
{ok, {Vsn, git}};
{error, Reason2} ->
{error, {Reason1, Reason2}}
end
end.
find_vsn_from_file() ->
%% assume in top dir
%% else move up until either .git or gpb.vsn??
%% though not across file systems?
%% or until dir looks like top of gpb (eg src/gpb.erl exists)
case file:get_cwd() of
{ok, Cwd} ->
try_walk_root_wise(Cwd, "gpb.vsn");
{error, Reason} ->
{error, {no_cwd, Reason}}
end.
try_walk_root_wise(Dir, Base) ->
case is_at_gpb_root(Dir) of
true ->
case file:read_file(filename:join(Dir, Base)) of
{ok, Vsn} ->
{ok, first_line_no_nl(binary_to_list(Vsn))};
{error, _} ->
{error, no_file}
end;
false ->
case up_dir(Dir) of
{ok, Up} -> try_walk_root_wise(Up, Base);
{error, Reason} -> {error, Reason}
end
end.
is_at_gpb_root(Dir) ->
lists:any(
fun(F) -> F() end,
[fun() -> filelib:is_dir(filename:join(Dir, ".git")) end,
fun() -> filelib:is_regular(fjoin(Dir, ".git")) end, % a git worktree?
fun() -> filelib:is_regular(fjoin(Dir, "gpb.vsn")) end,
fun() -> filelib:is_regular(fjoin([Dir, "src", "gpb.erl"])) end]).
fjoin(Dir, Name) -> filename:join(Dir, Name).
fjoin(Comps) -> filename:join(Comps).
up_dir(Dir) ->
case filename:dirname(Dir) of
Dir ->
{error, at_file_system_root};
"." -> % windows
{error, at_file_system_root};
Up ->
%% Check if we move cross
case {file:read_file_info(Dir), file:read_file_info(Up)} of
{{ok, #file_info{major_device=SameDev}},
{ok, #file_info{major_device=SameDev}}} ->
{ok, Up};
{{ok, _},
{ok, _}} ->
{error, cross_device};
{_, {error, Reason}} ->
{error, Reason};
{{error, Reason}, _} ->
{error, Reason};
_ ->
{error, undefined}
end
end.
find_vsn_from_git() ->
Cmd = case os:type() of
{win32,_} ->
"git describe --always --tags --match [0-9]*.[0-9]*";
_ ->
"git describe --always --tags --match '[0-9]*.[0-9]*'"
end,
Output = os:cmd(Cmd),
Line1 = first_line_no_nl(Output),
case looks_like_vsn_output(Line1) of
true ->
{ok, Line1};
false ->
{error, {Cmd, Output}}
end.
-define(is_digit(C), ($0 =< C andalso C =< $9)).
looks_like_vsn_output([C1 | _]=Str) when ?is_digit(C1) ->
%% Examples of valid outputs:
%% "4.17.3"
%% "4.17.3-1-g0bfce0e"
is_vsn_str_1(Str);
looks_like_vsn_output(_) ->
false.
is_vsn_str_1([C | Rest]) when ?is_digit(C) -> is_vsn_str_1(Rest);
is_vsn_str_1("." ++ Rest) -> is_vsn_str_2(Rest);
is_vsn_str_1(_) -> false.
is_vsn_str_2([C | Rest]) when ?is_digit(C) -> is_vsn_str_2(Rest);
is_vsn_str_2("." ++ Rest) -> is_vsn_str_3(Rest);
is_vsn_str_2(_) -> false.
is_vsn_str_3([C | Rest]) when ?is_digit(C) -> is_vsn_str_3(Rest);
is_vsn_str_3("-" ++ _) -> true;
is_vsn_str_3("") -> true;
is_vsn_str_3(_) -> false.
first_line_no_nl("\r" ++ _) -> "";
first_line_no_nl("\n" ++ _) -> "";
first_line_no_nl([C | Tl]) -> [C | first_line_no_nl(Tl)];
first_line_no_nl("") -> "".
print_no_vsn_error() ->
io:put_chars(["No version information found: no gpb.vsn file "
"and not in a git repo.\n"]).