From 323c25338f0361dddd08da3d4039ef1c8096abb9 Mon Sep 17 00:00:00 2001 From: Edgar Date: Mon, 31 Jan 2022 15:31:02 +0100 Subject: [PATCH] :tada: Initial commit --- main.v | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 main.v diff --git a/main.v b/main.v new file mode 100644 index 0000000..19e6d5c --- /dev/null +++ b/main.v @@ -0,0 +1,162 @@ +import os +import net.http +import json +import cli + +const mpr_url = 'https://mpr.makedeb.org/' + +fn main() { + mut app := cli.Command{ + name: 'ayy' + description: 'A simple MPR helper' + commands: [ + cli.Command{ + name: 'install' + usage: '[package name]' + description: 'Install packages' + execute: install + }, + cli.Command{ + name: 'search' + usage: '[package name]' + description: 'Search for packages' + execute: search + required_args: 1 + }, + ] + } + app.setup() + app.parse(os.args) +} + +fn get_pkg_data(pkg_name string) Rpc_resp { + // resp := http.get('$mpr_url/rpc?v=5&type=info&arg[]=$pkg_name') or { + // println(err) + // exit(1) + // } + + resp := http.get('https://vps.anotherfoxguy.com/dl/sw.json') or { + println(err) + exit(1) + } + + data := json.decode(Rpc_resp, resp.text) or { + println('Failed to parse data: $err') + exit(1) + } + return data +} + +fn install(cmd cli.Command) ? { + mut deps := map[string]Dependency{} + for pkg_name in cmd.args { + data := get_pkg_data(pkg_name) + + if data.resultcount != 1 { + println('Package $pkg_name not found on MPR') + exit(1) + } + + pkg := data.results[0] + + collect_deps(pkg.depends, mut deps) + collect_deps(pkg.make_depends, mut deps) + + for _, dat in deps { + match dat.source { + .apt { install_apt_package(dat.name) } + .mpr { install_mpr_package(dat.name) } + } + } + } +} + +fn install_mpr_package(package string) { + exe := os.execute('apt install -y $package') + if apt_search.exit_code != 0 { + println('Warn: $package not found on MPR or apt!!') + exit(1) + } +} + +fn install_apt_package(package string) { + exe := os.execute('apt install -y $package') + if apt_search.exit_code != 0 { + println('Warn: $package not found on MPR or apt!!') + exit(1) + } +} + +fn collect_deps(deps []string, mut result map[string]Dependency) { + for dep in deps { + if dep in result { + return + } + ddata := get_pkg_data(dep) + if ddata.resultcount == 1 { + result[dep] = Dependency{dep, Source.mpr} + } else { + apt_search := os.execute('apt-cache show $dep') + if apt_search.exit_code != 0 { + println('Warn: $dep not found on MPR or apt!!') + return + } + println('aaaaa $apt_search') + result[dep] = Dependency{dep, Source.apt} + } + } +} + +fn search(cmd cli.Command) ? { + pkg := cmd.args[0] + resp := http.get('$mpr_url/rpc?v=5&type=search&arg=$pkg') or { + println(err) + exit(1) + } + data := json.decode(Rpc_resp, resp.text) ? + println('Packages found $data.resultcount') + for res in data.results { + println('\t Name: $res.name') + println('\t Description: $res.description') + } +} + +enum Source { + mpr + apt +} + +struct Dependency { + name string + source Source +} + +struct Rpc_resp { + resultcount int + results []Package + version int +} + +struct Package { + conflicts []string [json: Conflicts] + depends []string [json: Depends] + make_depends []string [json: MakeDepends] + description string [json: Description] + first_submitted int [json: FirstSubmitted] + id int [json: ID] + keywords []string [json: Keywords] + lastmodified int [json: LastModified] + license []string [json: License] + maintainer string [json: Maintainer] + name string [json: Name] + num_votes int [json: NumVotes] + out_of_date string [json: OutOfDate] + package_base string [json: PackageBase] + package_base_id int [json: PackageBaseID] + popularity int [json: Popularity] + provides []string [json: Provides] + replaces []string [json: Replaces] + url string [json: URL] + url_path string [json: URLPath] + version string [json: Version] +}