| #!/usr/bin/env escript |
| %% -*- mode: erlang -*- |
| |
| main(_) -> |
| introspect("rebar.config.script"). |
| |
| introspect(File) -> |
| Bindings = [{'SCRIPT', File}, {'CONFIG', []}], |
| {ok, Config} = file:script(File, Bindings), |
| {deps, Deps} = lists:keyfind(deps, 1, Config), |
| introspect_deps(Deps). |
| |
| introspect_deps([]) -> |
| ok; |
| introspect_deps([Dep | Rest]) -> |
| introspect_dep(Dep), |
| introspect_deps(Rest). |
| |
| introspect_dep({App, VsnRegex, {git, Url, From}, _Raw}) -> |
| introspect_dep({App, VsnRegex, {git, Url, From}}); |
| introspect_dep({App, _VsnRegex, {git, _Url, From}}) -> |
| io:format(bold("~s~n"), [App]), |
| introspect_diff(App, From), |
| io:format("~n", []), |
| ok. |
| |
| revision({branch, Branch}) -> |
| Branch; |
| revision({tag, Tag}) -> |
| Tag; |
| revision(Rev) -> |
| Rev. |
| |
| introspect_diff(App, From) -> |
| introspect_diff(App, revision(From), "origin/master"). |
| |
| introspect_diff(App, From, ToBranch) -> |
| {ok, Log} = sh(App, io_lib:format("git log --pretty=oneline ~s..~s", [From, ToBranch])), |
| case Log of |
| [] -> |
| io:format(" up to date on ~s~n", [bold(ToBranch)]); |
| _ -> |
| io:format(" ~B commits behind ~s~n", [length(Log), bold(ToBranch)]), |
| io:format("~s~n~n", [string:join([" " ++ L || L <- Log], "\n")]) |
| end. |
| |
| sh(App, Cmd) -> |
| Dir = lists:flatten(["src/", atom_to_list(App)]), |
| Port = open_port({spawn, lists:flatten(Cmd)}, |
| [{cd, Dir}, |
| {line, 16384}, |
| exit_status, |
| stderr_to_stdout, |
| use_stdio]), |
| read_port(Port). |
| |
| read_port(Port) -> |
| read_port(Port, []). |
| |
| read_port(Port, Acc) -> |
| receive |
| {Port, {data, {eol, Line}}} -> |
| read_port(Port, [Line | Acc]); |
| {Port, {data, {noeol, Line}}} -> |
| read_port(Port, [Line | Acc]); |
| {Port, {exit_status, 0}} -> |
| {ok, lists:reverse(Acc)}; |
| {Port, {exit_status, Code}} -> |
| {error, Code, Acc} |
| end. |
| |
| bold(Text) -> |
| "\e[1m" ++ Text ++ "\e[0m". |