commit
3d1bb2dafe
@ -0,0 +1,3 @@
|
||||
PKG_WARNER_PACKAGES="test1,test2"
|
||||
PKG_WARNER_DISTRO="Crystal"
|
||||
PKG_WARNER_PMAN="ame"
|
@ -0,0 +1,3 @@
|
||||
.direnv/
|
||||
.idea/
|
||||
target/
|
@ -0,0 +1,229 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
version = "0.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
|
||||
dependencies = [
|
||||
"hermit-abi",
|
||||
"libc",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "3.2.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a3dbbb6653e7c55cc8595ad3e1f7be8f32aba4eb7ff7f0fd1163d4f3d137c0a9"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"clap_derive",
|
||||
"clap_lex",
|
||||
"indexmap",
|
||||
"once_cell",
|
||||
"textwrap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "3.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ba52acd3b0a5c33aeada5cdaa3267cdc7c594a98731d4268cdc1532f4264cb4"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_lex"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
|
||||
dependencies = [
|
||||
"os_str_bytes",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "colored"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
|
||||
dependencies = [
|
||||
"atty",
|
||||
"lazy_static",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
|
||||
|
||||
[[package]]
|
||||
name = "os_str_bytes"
|
||||
version = "6.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "648001efe5d5c0102d8cea768e348da85d90af8ba91f0bea908f157951493cd4"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-warner"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"clap",
|
||||
"colored",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
|
||||
dependencies = [
|
||||
"proc-macro-error-attr",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error-attr"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.43"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.99"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "textwrap"
|
||||
version = "0.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
@ -0,0 +1,14 @@
|
||||
[package]
|
||||
name = "pkg-warner"
|
||||
version = "0.1.0"
|
||||
authors = ["Michal S. <michal[at]tar[dot]black>"]
|
||||
edition = "2021"
|
||||
description = "A simple, OS-agnostic package manager warner"
|
||||
repository = "https://github.com/crystal-linux/pkg-warner"
|
||||
license-file = "LICENSE"
|
||||
keywords = ["package", "manager", "warner"]
|
||||
categories = ["command-line-utilities"]
|
||||
|
||||
[dependencies]
|
||||
clap = { version = "3.2.16", default-features = false, features = ["std", "derive"] }
|
||||
colored = { version = "2.0.0", default-features = false }
|
@ -0,0 +1,36 @@
|
||||
# Maintainer: Michal S <michal[at]tar[dot]black>
|
||||
# Developer: Michal S <michal[at]tar[dot]black>
|
||||
|
||||
pkgname=pkg-warner
|
||||
pkgver=0.1.0
|
||||
pkgrel=1
|
||||
pkgdesc="Simple package manager warner tool for distribution developers"
|
||||
arch=('x86_64')
|
||||
url="https://github.com/crystal-linux/pkg-warner"
|
||||
license=('GPL3')
|
||||
source=("git+$url?rev=0.1.0")
|
||||
sha256sums=('SKIP')
|
||||
makedepends=('cargo')
|
||||
|
||||
prepare() {
|
||||
cd "$srcdir/$pkgname"
|
||||
cargo fetch --locked --target "$CARCH-unknown-linux-gnu"
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/$pkgname"
|
||||
export RUSTUP_TOOLCHAIN=stable
|
||||
export CARGO_TARGET_DIR=target
|
||||
|
||||
# These following envvars are Crystal-specific, please adjust for your own distro!
|
||||
export PKG_WARNER_PACKAGES=""
|
||||
export PKG_WARNER_DISTRO="Crystal"
|
||||
export PKG_WARNER_PMAN="ame/pacman"
|
||||
|
||||
cargo build --frozen --release
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/$pkgname"
|
||||
cargo run --frozen --release -- -ivd "${pkgdir}/usr/bin"
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
<p align="center">
|
||||
<a href="https://github.com/crystal-linux/Malachite">
|
||||
<img src="https://getcryst.al/site/assets/other/logo.png" alt="Logo" width="150" height="150">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<h2 align="center">Package Warner</h2>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/crystal-linux/.github/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-GPL--3.0-blue.svg" alt="License">
|
||||
<a href="https://github/crystal-linux/malachite"><img alt="GitHub isses" src="https://img.shields.io/github/issues-raw/crystal-linux/pkg-warner"></a>
|
||||
<a href="https://github/crystal-linux/malachite"><img alt="GitHub pull requests" src="https://img.shields.io/github/issues-pr-raw/crystal-linux/pkg-warner"></a><br>
|
||||
<a href="https://discord.gg/hYJgu8K5aA"><img alt="Discord" src="https://img.shields.io/discord/825473796227858482?color=blue&label=Discord&logo=Discord&logoColor=white"> </a>
|
||||
<a href="https://github.com/not-my-segfault"> <img src="https://img.shields.io/badge/Maintainer-@not%2D-my%2D-segfault-brightgreen" alt="The maintainer of this repository" href="https://github.com/not-my-segfault"></a><br>
|
||||
<a href="https://fosstodon.org/@crystal_linux"><img alt="Mastodon Follow" src="https://img.shields.io/mastodon/follow/108618426259408142?domain=https%3A%2F%2Ffosstodon.org">
|
||||
<a href="https://twitter.com/crystal_linux"><img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/crystal_linux"></a>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<p align="center"> <code>pkg-warner</code> is a simple and configurable package warner tool for distribution packagers.</p>
|
||||
|
||||
|
||||
## Configuration
|
||||
|
||||
`pkg-warner` is configured at build time using three environment variables:
|
||||
- `PKG_WARNER_PACKAGES`: a comma-separated list of **incorrect** package managers to warn about.
|
||||
- `PKG_WARNER_DISTRO`: the distribution name to use in the warning.
|
||||
- `PKG_WARNER_PMAN`: the **correct** package manager name to use in the warning.
|
||||
|
||||
Then, in the packaging process you can run `pkg-warner -id "${dest_dir}"` to copy itself to `${dest_dir}/<each value in PKG_WARNER_PACKAGES>` under the destination directory. (e.g., `./pkg/usr/bin/apt`)
|
||||
|
||||
If no `-d/--dest-dir` id provided, it'll install to `/usr/bin` by default.
|
||||
|
||||
If you want an example of how to adapt this to your own distribution/packaging process, see the provided [PKGBUILD](PKGBUILD)
|
||||
|
||||
## How to build:
|
||||
|
||||
Tested on latest Cargo (1.60.0-nightly)
|
||||
|
||||
### Debug/development builds
|
||||
|
||||
- `cargo build`
|
||||
|
||||
### Optimised/release builds
|
||||
|
||||
- `cargo build --release`
|
@ -0,0 +1,64 @@
|
||||
{
|
||||
"nodes": {
|
||||
"naersk": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1655042882,
|
||||
"narHash": "sha256-9BX8Fuez5YJlN7cdPO63InoyBy7dm3VlJkkmTt6fS1A=",
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"rev": "cddffb5aa211f50c4b8750adbec0bbbdfb26bb9f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1659494082,
|
||||
"narHash": "sha256-XRwMisQY/BcvDMDRVkd4n3/CT89HOtlPgWIQUNPvWSc=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "8c7576622aeb4707351a17e83429667f42e7d910",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"naersk": "naersk",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"utils": "utils"
|
||||
}
|
||||
},
|
||||
"utils": {
|
||||
"locked": {
|
||||
"lastModified": 1656928814,
|
||||
"narHash": "sha256-RIFfgBuKz6Hp89yRr7+NR5tzIAbn52h8vT6vXkYjZoM=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "7e2a3b3dfd9af950a856d66b0a7d01e3c18aa249",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
utils.url = "github:numtide/flake-utils";
|
||||
naersk = {
|
||||
url = "github:nix-community/naersk";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
utils,
|
||||
naersk,
|
||||
}:
|
||||
utils.lib.eachDefaultSystem (system: let
|
||||
pkgs = nixpkgs.legacyPackages."${system}";
|
||||
naersk-lib = naersk.lib."${system}";
|
||||
in rec
|
||||
{
|
||||
packages.pkg-warner = naersk-lib.buildPackage {
|
||||
pname = "pkg-warner";
|
||||
root = ./.;
|
||||
|
||||
PKG_WARNER_PACKAGES = "test1,test2,test3";
|
||||
PKG_WARNER_DISTRO = "Test Linux";
|
||||
PKG_WARNER_PMAN = "test4";
|
||||
};
|
||||
|
||||
packages.default = packages.pkg-warner;
|
||||
|
||||
apps.pkg-warner = utils.lib.mkApp {
|
||||
drv = packages.pkg-warner;
|
||||
};
|
||||
|
||||
apps.default = apps.pkg-warner;
|
||||
|
||||
devShells.default = pkgs.mkShell {
|
||||
nativeBuildInputs = with pkgs; [
|
||||
rustc
|
||||
cargo
|
||||
cargo-audit
|
||||
rustfmt
|
||||
clippy
|
||||
|
||||
just
|
||||
];
|
||||
};
|
||||
|
||||
formatter = pkgs.alejandra;
|
||||
});
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
set dotenv-load := true
|
||||
|
||||
# Run all checks and tests
|
||||
check *FLAGS:
|
||||
cargo clippy --all {{FLAGS}} -- -D warnings
|
||||
cargo fmt --all --check {{FLAGS}}
|
||||
|
||||
# Test the warner
|
||||
test *FLAGS:
|
||||
cargo run {{FLAGS}} -- --test
|
||||
|
||||
# Test using Nix
|
||||
test-nix:
|
||||
nix run .# -- --test
|
@ -0,0 +1,17 @@
|
||||
use clap::{ArgAction, Parser};
|
||||
|
||||
#[derive(Debug, Clone, Parser)]
|
||||
#[clap(name=env!("CARGO_PKG_NAME"), version=env!("CARGO_PKG_VERSION"), about=env!("CARGO_PKG_DESCRIPTION"))]
|
||||
pub struct Args {
|
||||
#[clap(long, short, action=ArgAction::SetTrue)]
|
||||
pub init: bool,
|
||||
|
||||
#[clap(long = "dest-dir", short)]
|
||||
pub dest_dir: Option<String>,
|
||||
|
||||
#[clap(long, action=ArgAction::SetTrue)]
|
||||
pub test: bool,
|
||||
|
||||
#[clap(long, short, action=ArgAction::SetTrue)]
|
||||
pub verbose: bool,
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
mod strings;
|
||||
mod structs;
|
||||
|
||||
pub use strings::*;
|
||||
pub use structs::*;
|
@ -0,0 +1,53 @@
|
||||
use std::process::exit;
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
use clap::Parser;
|
||||
use colored::Colorize;
|
||||
|
||||
use crate::internal::AppExitCode;
|
||||
|
||||
const ERR_SYMBOL: &str = "✘";
|
||||
const WARN_SYMBOL: &str = "⚠";
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! log {
|
||||
($($arg:tt)+) => {
|
||||
$crate::internal::log_fn(&format!("[{}:{}] {}", file!(), line!(), format!($($arg)+)));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn log_fn(msg: &str) {
|
||||
if crate::args::Args::parse().verbose {
|
||||
eprintln!(
|
||||
"{} {}",
|
||||
SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.as_secs(),
|
||||
msg
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! crash {
|
||||
($exit_code:expr, $($arg:tt)+) => {
|
||||
$crate::internal::crash_fn($exit_code, &format!("[{}:{}] {}", file!(), line!(), format!($($arg)+)));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn crash_fn(exit_code: AppExitCode, msg: &str) {
|
||||
println!("{} {}", ERR_SYMBOL.bold().red(), msg.bold().bright_red());
|
||||
exit(exit_code as i32);
|
||||
}
|
||||
|
||||
pub fn warn(bin: &str, dist: &str, pman: &str) {
|
||||
println!(
|
||||
"{} {} is not supported on {}. Please use {} instead!",
|
||||
WARN_SYMBOL.bold().yellow(),
|
||||
bin.bold().yellow(),
|
||||
dist.bold(),
|
||||
pman.bold(),
|
||||
);
|
||||
exit(AppExitCode::Success as i32);
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
pub enum AppExitCode {
|
||||
Success = 1, // the correct package manager
|
||||
CalledDirectly = 2,
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::cargo)]
|
||||
|
||||
use clap::Parser;
|
||||
use std::{env, ops::Deref, process::Command};
|
||||
|
||||
mod args;
|
||||
mod internal;
|
||||
|
||||
use args::Args;
|
||||
use internal::{warn, AppExitCode};
|
||||
|
||||
fn main() {
|
||||
// Parse CLI arguments
|
||||
let args = Args::parse();
|
||||
|
||||
// Get the current executable name as a String
|
||||
let bin = env::current_exe()
|
||||
.unwrap()
|
||||
.as_path()
|
||||
.file_name()
|
||||
.unwrap()
|
||||
.deref()
|
||||
.to_string_lossy()
|
||||
.to_string();
|
||||
|
||||
// Get variables from the environment at build time to simplify the code
|
||||
let pkgs = env!("PKG_WARNER_PACKAGES")
|
||||
.split(',')
|
||||
.collect::<Vec<&str>>();
|
||||
let pman = env!("PKG_WARNER_PMAN").to_string();
|
||||
let dist = env!("PKG_WARNER_DISTRO").to_string();
|
||||
|
||||
// If --test is specified, print the warn message and exit
|
||||
if args.test {
|
||||
warn(&bin, &dist, &pman);
|
||||
}
|
||||
|
||||
// Check if the binary is called directly by the user, if so tell them off
|
||||
if bin == "pkg-warner" {
|
||||
if args.init {
|
||||
init(&pkgs, args.dest_dir);
|
||||
} else {
|
||||
crash!(
|
||||
AppExitCode::CalledDirectly,
|
||||
"`pkg-warner` is not meant to be called directly by the user"
|
||||
);
|
||||
}
|
||||
} else {
|
||||
warn(&bin, &dist, &pman);
|
||||
}
|
||||
}
|
||||
|
||||
fn init(pkgs: &[&str], dest_dir: Option<String>) {
|
||||
log!("Initializing: {}", pkgs.join(", "));
|
||||
|
||||
// Either unwrap the dest_dir if present or use /usr/bin
|
||||
let dest_dir = dest_dir.unwrap_or_else(|| "/usr/bin".to_string());
|
||||
|
||||
for pkg in pkgs {
|
||||
log!("Installing \"{}\"", pkg);
|
||||
|
||||
Command::new("install")
|
||||
.arg("-Dm0755")
|
||||
.arg(format!("{}", env::current_exe().unwrap().display()))
|
||||
.arg(format!("{}/{}", dest_dir, pkg))
|
||||
.spawn()
|
||||
.unwrap();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue