diff --git a/zomp/lib/otpr/zx/0.1.0/src/zx.erl b/zomp/lib/otpr/zx/0.1.0/src/zx.erl index b824ce2..9031436 100644 --- a/zomp/lib/otpr/zx/0.1.0/src/zx.erl +++ b/zomp/lib/otpr/zx/0.1.0/src/zx.erl @@ -99,6 +99,10 @@ do(["init", "app", PackageString]) -> do(["init", "lib", PackageString]) -> ok = compatibility_check([unix]), done(zx_local:initialize(lib, PackageString)); +do(["list", "deps"]) -> + done(zx_local:list_deps()); +do(["list", "deps", PackageString]) -> + done(zx_local:list_deps(PackageString)); do(["install", PackageFile]) -> done(zx_local:assimilate(PackageFile)); do(["set", "dep", PackageString]) -> diff --git a/zomp/lib/otpr/zx/0.1.0/src/zx_local.erl b/zomp/lib/otpr/zx/0.1.0/src/zx_local.erl index 8e08a41..abf3b86 100644 --- a/zomp/lib/otpr/zx/0.1.0/src/zx_local.erl +++ b/zomp/lib/otpr/zx/0.1.0/src/zx_local.erl @@ -10,9 +10,9 @@ -copyright("Craig Everett "). -license("GPL-3.0"). --export([initialize/2, assimilate/1, set_dep/1, set_version/1, +-export([initialize/2, assimilate/1, set_version/1, list_realms/0, list_packages/1, list_versions/1, - drop_dep/1, verup/1, package/1, + set_dep/1, list_deps/0, list_deps/1, drop_dep/1, verup/1, package/1, add_realm/1, drop_realm/1, takeover/1, abdicate/1, create_plt/0, dialyze/0, @@ -286,65 +286,6 @@ assimilate2(CWD, PackageID) -> log(info, Message, [PackageString]). --spec set_dep(PackageString :: string()) -> zx:outcome(). -%% @private -%% Set a dependency in the current project. If the project currently has a dependency -%% on the same package then the version of that dependency is updated to reflect that -%% in the PackageString argument. - -set_dep(PackageString) -> - case zx_lib:package_id(PackageString) of - {ok, {_, _, {_, _, z}}} -> - Message = - "Incomplete version tuple. Dependencies must be fully specified.", - {error, Message, 22}; - {ok, PackageID} -> - set_dep2(PackageID); - {error, invalid_package_string} -> - {error, "Invalid package string", 22} - end. - - --spec set_dep2(zx:package_id()) -> ok. - -set_dep2(PackageID) -> - {ok, Meta} = zx_lib:read_project_meta(), - Deps = maps:get(deps, Meta), - case lists:member(PackageID, Deps) of - true -> ok; - false -> set_dep(PackageID, Deps, Meta) - end. - - --spec set_dep(PackageID, Deps, Meta) -> ok - when PackageID :: zx:package_id(), - Deps :: [zx:package_id()], - Meta :: [term()]. -%% @private -%% Given the PackageID, list of Deps and the current contents of the project Meta, add -%% or update Deps to include (or update) Deps to reflect a dependency on PackageID, if -%% such a dependency is not already present. Then write the project meta back to its -%% file and exit. - -set_dep(PackageID = {Realm, Name, NewVersion}, Deps, Meta) -> - ExistingPackageIDs = fun({R, N, _}) -> {R, N} == {Realm, Name} end, - NewDeps = - case lists:partition(ExistingPackageIDs, Deps) of - {[{Realm, Name, OldVersion}], Rest} -> - Message = "Updating dep ~ts to ~ts", - {ok, OldPS} = zx_lib:package_string({Realm, Name, OldVersion}), - {ok, NewPS} = zx_lib:package_string({Realm, Name, NewVersion}), - ok = log(info, Message, [OldPS, NewPS]), - [PackageID | Rest]; - {[], Deps} -> - {ok, PackageString} = zx_lib:package_string(PackageID), - ok = log(info, "Adding dep ~ts", [PackageString]), - [PackageID | Deps] - end, - NewMeta = maps:put(deps, NewDeps, Meta), - zx_lib:write_project_meta(NewMeta). - - -spec set_version(VersionString) -> zx:outcome() when VersionString :: string(). %% @private @@ -501,6 +442,103 @@ add_realm2(Data) -> end. +-spec set_dep(PackageString :: string()) -> zx:outcome(). +%% @private +%% Set a dependency in the current project. If the project currently has a dependency +%% on the same package then the version of that dependency is updated to reflect that +%% in the PackageString argument. + +set_dep(PackageString) -> + case zx_lib:package_id(PackageString) of + {ok, {_, _, {_, _, z}}} -> + Message = + "Incomplete version tuple. Dependencies must be fully specified.", + {error, Message, 22}; + {ok, PackageID} -> + set_dep2(PackageID); + {error, invalid_package_string} -> + {error, "Invalid package string", 22} + end. + + +-spec set_dep2(zx:package_id()) -> ok. + +set_dep2(PackageID) -> + {ok, Meta} = zx_lib:read_project_meta(), + Deps = maps:get(deps, Meta), + case lists:member(PackageID, Deps) of + true -> ok; + false -> set_dep(PackageID, Deps, Meta) + end. + + +-spec set_dep(PackageID, Deps, Meta) -> ok + when PackageID :: zx:package_id(), + Deps :: [zx:package_id()], + Meta :: [term()]. +%% @private +%% Given the PackageID, list of Deps and the current contents of the project Meta, add +%% or update Deps to include (or update) Deps to reflect a dependency on PackageID, if +%% such a dependency is not already present. Then write the project meta back to its +%% file and exit. + +set_dep(PackageID = {Realm, Name, NewVersion}, Deps, Meta) -> + ExistingPackageIDs = fun({R, N, _}) -> {R, N} == {Realm, Name} end, + NewDeps = + case lists:partition(ExistingPackageIDs, Deps) of + {[{Realm, Name, OldVersion}], Rest} -> + Message = "Updating dep ~ts to ~ts", + {ok, OldPS} = zx_lib:package_string({Realm, Name, OldVersion}), + {ok, NewPS} = zx_lib:package_string({Realm, Name, NewVersion}), + ok = log(info, Message, [OldPS, NewPS]), + [PackageID | Rest]; + {[], Deps} -> + {ok, PackageString} = zx_lib:package_string(PackageID), + ok = log(info, "Adding dep ~ts", [PackageString]), + [PackageID | Deps] + end, + NewMeta = maps:put(deps, NewDeps, Meta), + zx_lib:write_project_meta(NewMeta). + + +-spec list_deps() -> zx:outcome(). +%% @private +%% List deps in the current (local) project directory. +%% This is very different from list_deps/1, which makes a remote query to a Zomp +%% realm to discover deps for potentially unknown or locally uncached packages. + +list_deps() -> + case zx_lib:read_project_meta() of + {ok, Meta} -> + Deps = maps:get(deps, Meta), + Print = + fun(P) -> + {ok, PackageString} = zx_lib:package_string(P), + io:format("~ts~n", [PackageString]) + end, + lists:foreach(Print, Deps); + Error -> + Error + end. + + +-spec list_deps(zx:package_id()) -> zx:outcome(). +%% @private +%% List deps for the specified package. This quite often requires a query to a Zomp +%% realm over the network, but not if the referenced package happens to be cached +%% locally. + +list_deps(PackageString) -> + case zx_lib:package_id(PackageString) of + {ok, {_, _, {_, _, z}}} -> + {error, "Packages must be fully specified; no partial versions.", 22}; + {ok, PackageID} -> + log(info, "Phooey! list_deps(~tp) isn't yet implemented!", [PackageID]); + {error, invalid_package_string} -> + {error, "Invalid package string.", 22} + end. + + -spec drop_dep(zx:package_id()) -> ok. %% @private %% Remove the indicate dependency from the local project's zomp.meta record.