Add desktop integration interface function; implement Linux version
This commit is contained in:
parent
894edbe39e
commit
6c1ff3562b
@ -1 +1 @@
|
||||
0.8.0
|
||||
0.9.0
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{application,zx,
|
||||
[{description,"An Erlang development tool and Zomp user client"},
|
||||
{vsn,"0.8.0"},
|
||||
{vsn,"0.9.0"},
|
||||
{applications,[stdlib,kernel]},
|
||||
{modules,[zx,zx_auth,zx_conn,zx_conn_sup,zx_daemon,zx_key,
|
||||
zx_lib,zx_local,zx_net,zx_peer,zx_peer_man,
|
||||
BIN
zomp/lib/otpr/zx/0.9.0/launcher.png
Normal file
BIN
zomp/lib/otpr/zx/0.9.0/launcher.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
@ -24,7 +24,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-behavior(application).
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
@ -35,7 +35,7 @@
|
||||
-export([run/2, not_done/1, done/1,
|
||||
subscribe/1, unsubscribe/0,
|
||||
list/0, list/1, list/2, list/3, latest/1,
|
||||
list_type/2, list_type_ar/1, describe/1, describe_plural/1,
|
||||
list_type/2, list_type_ar/1, describe/1, describe_plural/1, integrate/1,
|
||||
stop/0, silent_stop/0]).
|
||||
-export([start/2, stop/1]).
|
||||
|
||||
@ -63,7 +63,7 @@
|
||||
Minor :: non_neg_integer() | z,
|
||||
Patch :: non_neg_integer() | z}.
|
||||
-type host() :: {string() | inet:ip_address(), inet:port_number()}.
|
||||
-type key() :: term(). % Srsly. This is what public_key:der_decode/2 returns.
|
||||
-type key() :: term(). % wtf? This is what public_key:der_decode/2 returns
|
||||
-type key_data() :: {Name :: key_name(),
|
||||
Public :: none | key_bin(),
|
||||
Private :: none | key_bin()}.
|
||||
@ -133,7 +133,7 @@ do(["run", PackageString | ArgV]) ->
|
||||
not_done(run(PackageString, ArgV));
|
||||
do(["integrate", "desktop", PackageString]) ->
|
||||
ok = zx_daemon:connect(),
|
||||
done(zx_local:integrate(PackageString));
|
||||
done(integrate0(PackageString));
|
||||
do(["list", "realms"]) ->
|
||||
done(zx_local:list_realms());
|
||||
do(["list", "packages", Realm]) ->
|
||||
@ -669,6 +669,126 @@ describe_plural(PackageIDs) ->
|
||||
{ok, [Description || {_, {ok, Description}} <- Descriptions]}.
|
||||
|
||||
|
||||
-spec integrate(PackageString) -> zx:outcome()
|
||||
when PackageString :: string().
|
||||
|
||||
integrate0(PackageString) ->
|
||||
case zx_lib:package_id(PackageString) of
|
||||
{ok, PackageID} -> integrate(PackageID);
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
|
||||
integrate(PackageID) ->
|
||||
case resolve_version(PackageID) of
|
||||
{fetch, FetchID} -> integrate2(PackageID, FetchID);
|
||||
{installed, InstalledID} -> integrate3(PackageID, InstalledID);
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
|
||||
integrate2(PackageID, FetchID) ->
|
||||
case fetch(FetchID) of
|
||||
ok -> integrate3(PackageID, FetchID);
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
|
||||
integrate3(PackageID, InstalledID) ->
|
||||
Dir = zx_lib:ppath(lib, InstalledID),
|
||||
{ok, Meta} = zx_lib:read_project_meta(Dir),
|
||||
case maps:get(type, Meta) of
|
||||
gui -> integrate4(PackageID, InstalledID, Meta);
|
||||
Type -> {error, {bad_app_type, Type}}
|
||||
end.
|
||||
|
||||
integrate4(PackageID, InstalledID, Meta) ->
|
||||
case os:type() of
|
||||
{unix, linux} ->
|
||||
integrate_linux(PackageID, InstalledID, Meta);
|
||||
% {win32, nt} ->
|
||||
Other ->
|
||||
Message = "Sorry! This command is not yet supported on ~p.",
|
||||
ok = tell(error, Message, [Other]),
|
||||
{error, "Feature unsupported on this platform."}
|
||||
end.
|
||||
|
||||
|
||||
integrate_linux(PackageID, InstalledID, Meta) ->
|
||||
XDG_DESKTOP_DIR = discover_xdg_desktop(),
|
||||
case filelib:is_dir(XDG_DESKTOP_DIR) of
|
||||
true -> integrate_linux(PackageID, InstalledID, Meta, XDG_DESKTOP_DIR);
|
||||
false -> {error, "No desktop directory defined by XDG."}
|
||||
end.
|
||||
|
||||
integrate_linux(PackageID, InstalledID, Meta, XDG_DESKTOP_DIR) ->
|
||||
IconPath = place_icon(InstalledID),
|
||||
Name = element(2, InstalledID),
|
||||
Title =
|
||||
case maps:get(name, Meta) of
|
||||
"" -> Name;
|
||||
N -> N
|
||||
end,
|
||||
{ok, PackageString} = zx_lib:package_string(PackageID),
|
||||
Version = element(3, PackageID),
|
||||
{ok, VersionString} = zx_lib:version_to_string(Version),
|
||||
Exec = "zx run " ++ PackageString,
|
||||
Launcher = filename:join(XDG_DESKTOP_DIR, Name ++ ".desktop"),
|
||||
Entry =
|
||||
["[Desktop Entry]\n",
|
||||
"Encoding=UTF-8\n",
|
||||
"Version=", VersionString, "\n",
|
||||
"Exec=", Exec, "\n",
|
||||
"Name=", Title, "\n",
|
||||
"Comment=", Title, "\n",
|
||||
"Type=Application\n",
|
||||
"Terminal=false\n",
|
||||
"Icon=", IconPath, "\n"],
|
||||
ok = file:write_file(Launcher, unicode:characters_to_list(Entry)),
|
||||
_ = os:cmd("chmod +x " ++ Launcher),
|
||||
ok.
|
||||
|
||||
|
||||
place_icon({Realm, Name, Version}) ->
|
||||
InstallDir = zx_lib:path(lib, Realm, Name, Version),
|
||||
VarDir = zx_lib:path(var, Realm, Name),
|
||||
Icon = "launcher.png",
|
||||
IconSource = filename:join(InstallDir, Icon),
|
||||
IconPath = filename:join(VarDir, Icon),
|
||||
{ok, _} =
|
||||
case filelib:is_regular(IconSource) of
|
||||
true ->
|
||||
file:copy(IconSource, IconPath);
|
||||
false ->
|
||||
ZxVersionS = os:getenv("ZX_VERSION"),
|
||||
{ok, ZxVersion} = zx_lib:string_to_version(ZxVersionS),
|
||||
ZxDir = zx_lib:path(lib, "otpr", "zx", ZxVersion),
|
||||
ZxIconPath = filename:join(ZxDir, Icon),
|
||||
ok = filelib:ensure_dir(IconPath),
|
||||
file:copy(ZxIconPath, IconPath)
|
||||
end,
|
||||
IconPath.
|
||||
|
||||
discover_xdg_desktop() ->
|
||||
XDG_UserDirsConf =
|
||||
case os:getenv("XDG_CONFIG_HOME") of
|
||||
false -> filename:join(os:getenv("HOME"), ".config/user-dirs.dirs");
|
||||
"" -> filename:join(os:getenv("HOME"), ".config/user-dirs.dirs");
|
||||
D -> filename:join(D, "user-dirs.dirs")
|
||||
end,
|
||||
{ok, Bits} = file:read_file(XDG_UserDirsConf),
|
||||
Segments = string:split(unicode:characters_to_list(Bits), "\n", all),
|
||||
search_xdg(Segments).
|
||||
|
||||
search_xdg(["XDG_DESKTOP_DIR=" ++ Value | _]) ->
|
||||
filename:join(os:getenv("HOME"), filename:basename(string:trim(Value, both, "\"")));
|
||||
search_xdg([_ | Rest]) ->
|
||||
search_xdg(Rest);
|
||||
search_xdg([]) ->
|
||||
filename:join(os:getenv("HOME"), "Desktop").
|
||||
|
||||
|
||||
|
||||
%%% Execution of application
|
||||
|
||||
-spec run(PackageString, RunArgs) -> zx:outcome()
|
||||
@ -723,20 +843,20 @@ tuplize(String, Acc) ->
|
||||
|
||||
run2(FuzzyID, RunArgs) ->
|
||||
case resolve_version(FuzzyID) of
|
||||
{installed, PackageID} -> run3(PackageID, RunArgs);
|
||||
{fetch, PackageID} -> run3_maybe(PackageID, RunArgs);
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
|
||||
run3_maybe(PackageID, RunArgs) ->
|
||||
case fetch(PackageID) of
|
||||
ok -> run3(PackageID, RunArgs);
|
||||
{fetch, PackageID} -> run3(PackageID, RunArgs);
|
||||
{installed, PackageID} -> run4(PackageID, RunArgs);
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
|
||||
run3(PackageID, RunArgs) ->
|
||||
case fetch(PackageID) of
|
||||
ok -> run4(PackageID, RunArgs);
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
|
||||
run4(PackageID, RunArgs) ->
|
||||
Dir = zx_lib:ppath(lib, PackageID),
|
||||
{ok, Meta} = zx_lib:read_project_meta(Dir),
|
||||
Type = maps:get(type, Meta),
|
||||
@ -999,7 +1119,7 @@ usage_user() ->
|
||||
" zx import realm RealmFile~n"
|
||||
" zx drop realm Realm~n"
|
||||
" zx add mirror [Address [Port]]~n"
|
||||
" zx drop mirror [Address [Port]]~n~n"
|
||||
" zx drop mirror [Address [Port]]~n"
|
||||
" zx --version~n~n".
|
||||
|
||||
usage_dev() ->
|
||||
@ -9,7 +9,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_auth).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -7,7 +7,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_conn).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -5,7 +5,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_conn_sup).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-behavior(supervisor).
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
@ -138,7 +138,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_daemon).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-behavior(gen_server).
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
@ -8,7 +8,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_key).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -10,7 +10,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_lib).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -6,7 +6,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_local).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -5,7 +5,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_net).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -8,7 +8,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_peer).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -9,7 +9,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_peer_man).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-behavior(gen_server).
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
@ -6,7 +6,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_peer_sup).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-behaviour(supervisor).
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
@ -10,7 +10,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_peers).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-behavior(supervisor).
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
@ -5,7 +5,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_proxy).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -5,7 +5,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_sup).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-behavior(supervisor).
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
@ -6,7 +6,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_tty).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -5,7 +5,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_userconf).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -7,7 +7,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zx_zsp).
|
||||
-vsn("0.8.0").
|
||||
-vsn("0.9.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("GPL-3.0").
|
||||
@ -9,7 +9,7 @@
|
||||
{license,"MIT"}.
|
||||
{modules,[]}.
|
||||
{name,"zx"}.
|
||||
{package_id,{"otpr","zx",{0,8,0}}}.
|
||||
{package_id,{"otpr","zx",{0,9,0}}}.
|
||||
{prefix,"zx_"}.
|
||||
{repo_url,"https://gitlab.com/zxq9/zx"}.
|
||||
{tags,["tools","package manager","erlang"]}.
|
||||
Loading…
x
Reference in New Issue
Block a user