Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion APKBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,14 @@ prepare() {

build() {
cargo auditable build --release --frozen
cargo xtask dist-data greetd-config.toml --greetd-vt 7 --greetd-user greetd
}

package() {
install -Dm644 data/mobi.phosh.phrog.gschema.xml -t "$pkgdir"/usr/share/glib-2.0/schemas/
install -Dm644 data/phrog.session -t "$pkgdir"/usr/share/gnome-session/sessions/
install -Dm644 data/mobi.phosh.Phrog.desktop -t "$pkgdir"/usr/share/applications/
install -Dm644 dist/alpine/greetd-config.toml -t "$pkgdir"/etc/phrog/
install -Dm644 target/dist-data/greetd-config.toml -t "$pkgdir"/etc/phrog/
install -d "$pkgdir"/usr/share/phrog/autostart
install -d "$pkgdir"/etc/phrog/autostart
install -Dm755 target/release/phrog -t "$pkgdir"/usr/bin/
Expand Down
5 changes: 2 additions & 3 deletions data/phrog.toml → data/greetd-config.toml.in
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
[terminal]
vt = 7
vt = @VT@

# The default session, also known as the greeter.
[default_session]
command = "/usr/libexec/phrog-greetd-session"
user = "_greetd"
user = "@USER@"

# The session to be used on boot
#[initial_session]
Expand Down
2 changes: 1 addition & 1 deletion debian/phrog.install
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ data/mobi.phosh.Phrog.target /usr/lib/systemd/user/
data/systemd-session.conf usr/lib/systemd/user/gnome-session@phrog.target.d

# Debian-specific config
data/phrog.toml etc/greetd
target/dist-data/phrog.toml etc/greetd
debian/config/phoc.ini usr/share/phrog
debian/config/systemd/phrog.conf usr/lib/systemd/system/greetd.service.d
1 change: 1 addition & 0 deletions debian/rules
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export INSTALL_DIR=$(CURDIR)/debian/phrog
# during build and delete it afterwards
override_dh_auto_build:
HOME=$(CURDIR)/debian/tmp_home cargo build
HOME=$(CURDIR)/debian/tmp_home cargo xtask dist-data phrog.toml --greetd-vt 7 --greetd-user _greetd

override_dh_auto_install:
install -D -m0755 target/$(DEB_HOST_RUST_TYPE)/debug/phrog \
Expand Down
10 changes: 0 additions & 10 deletions dist/alpine/greetd-config.toml

This file was deleted.

10 changes: 0 additions & 10 deletions dist/fedora/greetd-config.toml

This file was deleted.

3 changes: 2 additions & 1 deletion phrog.spec
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ chmod 0700 /tmp/runtime-dir

%build
%cargo_build
%{__cargo} run --frozen --quiet --package xtask -- dist-data greetd-config.toml --greetd-vt 1 --greetd-user greetd
%cargo_vendor_manifest
%{cargo_license_summary}
%{cargo_license} > LICENSE.dependencies
Expand All @@ -71,7 +72,7 @@ chmod 0700 /tmp/runtime-dir
%{__install} -Dpm 0644 data/mobi.phosh.phrog.gschema.xml -t %{buildroot}%{_datadir}/glib-2.0/schemas/
%{__install} -Dpm 0644 data/phrog.session -t %{buildroot}%{_datadir}/gnome-session/sessions/
%{__install} -Dpm 0644 data/mobi.phosh.Phrog.desktop -t %{buildroot}%{_datadir}/applications/
%{__install} -Dpm 0644 dist/fedora/greetd-config.toml -t %{buildroot}%{_sysconfdir}/phrog/
%{__install} -Dpm 0644 target/dist-data/greetd-config.toml -t %{buildroot}%{_sysconfdir}/phrog/
%{__install} -Dpm 0644 dist/fedora/phrog.service -t %{buildroot}%{_unitdir}/
%{__install} -Dpm 0644 data/systemd-session.conf -T %{buildroot}%{_userunitdir}/gnome-session@phrog.target.d/session.conf
%{__install} -Dpm 0755 data/phrog-greetd-session -t %{buildroot}%{_libexecdir}/
Expand Down
110 changes: 107 additions & 3 deletions xtask/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::error::Error;
use std::fs;
use std::path::{Path, PathBuf};
use std::path::{Component, Path, PathBuf};
use std::process::{self, Command};

use clap::{Parser, Subcommand};
Expand All @@ -9,6 +9,7 @@ use toml_edit::{value, DocumentMut};

type Result<T> = std::result::Result<T, Box<dyn Error>>;

const GREETD_CONFIG_TEMPLATE: &str = include_str!("../../data/greetd-config.toml.in");
const VERSION_USAGE: &str = "Use X.Y.Z or X.Y.Z-rc.N.";

#[derive(Debug, PartialEq, Eq)]
Expand All @@ -33,6 +34,17 @@ enum Commands {
/// Version to bump to (X.Y.Z or X.Y.Z-rc.N).
version: String,
},
/// Generate packaging data.
DistData {
/// File name for the generated greetd config under target/dist-data.
file_name: String,
/// VT to run greetd on.
#[arg(long)]
greetd_vt: u8,
/// User greetd should use for phrog.
#[arg(long)]
greetd_user: String,
},
}

fn main() {
Expand All @@ -45,6 +57,11 @@ fn main() {
fn run() -> Result<()> {
match Cli::parse().command {
Commands::Bump { version } => bump(&version),
Commands::DistData {
file_name,
greetd_vt,
greetd_user,
} => dist_data(&file_name, greetd_vt, &greetd_user),
}
}

Expand Down Expand Up @@ -101,6 +118,21 @@ fn bump(version: &str) -> Result<()> {
Ok(())
}

fn dist_data(file_name: &str, greetd_vt: u8, greetd_user: &str) -> Result<()> {
let root = project_root()?;
let out_path = dist_data_path(&root, file_name)?;
let out_dir = out_path
.parent()
.ok_or_else(|| format!("output path '{}' has no parent", out_path.display()))?;

fs::create_dir_all(&out_dir)?;
fs::write(&out_path, render_greetd_config(greetd_vt, greetd_user))?;

println!("Generated {}", out_path.display());

Ok(())
}

fn parse_version(version: &str) -> Result<ReleaseVersion> {
let parsed = Version::parse(version)
.map_err(|error| format!("unsupported version '{version}': {error}. {VERSION_USAGE}"))?;
Expand Down Expand Up @@ -134,6 +166,24 @@ fn parse_version(version: &str) -> Result<ReleaseVersion> {
})
}

fn render_greetd_config(greetd_vt: u8, greetd_user: &str) -> String {
GREETD_CONFIG_TEMPLATE
.replace("@VT@", &greetd_vt.to_string())
.replace("@USER@", greetd_user)
}

fn dist_data_path(root: &Path, file_name: &str) -> Result<PathBuf> {
let path = Path::new(file_name);
let mut components = path.components();

match (components.next(), components.next()) {
(Some(Component::Normal(_)), None) => Ok(root.join("target/dist-data").join(path)),
_ => {
Err(format!("dist-data file name must not contain path separators: {file_name}").into())
}
}
}

fn project_root() -> Result<PathBuf> {
Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
Expand All @@ -143,6 +193,13 @@ fn project_root() -> Result<PathBuf> {

fn update_cargo_toml(path: &Path, cargo_version: &str) -> Result<()> {
let text = fs::read_to_string(path)?;
let updated = update_cargo_toml_text(&text, cargo_version)?;

fs::write(path, updated)?;
Ok(())
}

fn update_cargo_toml_text(text: &str, cargo_version: &str) -> Result<String> {
let mut document = text.parse::<DocumentMut>()?;
let package = document["package"]
.as_table_mut()
Expand All @@ -154,8 +211,7 @@ fn update_cargo_toml(path: &Path, cargo_version: &str) -> Result<()> {

package["version"] = value(cargo_version);

fs::write(path, document.to_string())?;
Ok(())
Ok(document.to_string())
}

fn replace_line(path: &Path, predicate: impl Fn(&str) -> bool, replacement: &str) -> Result<()> {
Expand Down Expand Up @@ -285,6 +341,54 @@ mod tests {
assert!(error.contains(VERSION_USAGE));
}

#[test]
fn renders_greetd_config() {
assert_eq!(
render_greetd_config(7, "_greetd"),
"[terminal]\nvt = 7\n\n[default_session]\ncommand = \"/usr/libexec/phrog-greetd-session\"\nuser = \"_greetd\"\n\n# The session to be used on boot\n#[initial_session]\n#command = \"systemd-cat phosh-session\"\n#user = \"username\"\n"
);
}

#[test]
fn builds_dist_data_path() {
assert_eq!(
dist_data_path(Path::new("/tmp/phrog"), "phrog.toml").unwrap(),
PathBuf::from("/tmp/phrog/target/dist-data/phrog.toml")
);
}

#[test]
fn rejects_nested_dist_data_path() {
assert_eq!(
dist_data_path(Path::new("/tmp/phrog"), "debian/phrog.toml")
.unwrap_err()
.to_string(),
"dist-data file name must not contain path separators: debian/phrog.toml"
);
}

#[test]
fn updates_cargo_toml_package_version_only() {
let text = concat!(
"[package]\n",
"name = \"phrog\"\n",
"version = \"1.2.3\"\n\n",
"[dependencies]\n",
"clap = { version = \"4\" }\n"
);

assert_eq!(
update_cargo_toml_text(text, "2.0.0").unwrap(),
concat!(
"[package]\n",
"name = \"phrog\"\n",
"version = \"2.0.0\"\n\n",
"[dependencies]\n",
"clap = { version = \"4\" }\n"
)
);
}

#[test]
fn updates_readme_demo_download_url() {
let text =
Expand Down
Loading