Skip to content

Commit 00431d4

Browse files
committed
fix: more stolen code
- replace flatpak-builder run with flatpak build - fix env handling - have every build dir be inside .flatplay - once again, most of this is not mine
1 parent 0765b91 commit 00431d4

File tree

6 files changed

+177
-26
lines changed

6 files changed

+177
-26
lines changed

Cargo.lock

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ colored = "3.0.0"
1616
walkdir = "2.5.0"
1717
console = "0.16.0"
1818
clap_complete = "4.5.55"
19+
regex = "1.11.1"
1920

2021
[[bin]]
2122
name = "flatplay"

src/command.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@ fn command_succeeds(cmd: &str, args: &[&str]) -> bool {
2424

2525
// Runs a command, handling Flatpak sandbox and container specifics.
2626
pub fn run_command(command: &str, args: &[&str]) -> Result<()> {
27-
let mut args = args.to_vec();
27+
let mut command_args = args.to_vec();
2828

2929
// Workaround for rofiles-fuse issues in containers.
3030
if command == "flatpak-builder"
3131
&& is_inside_container()
32-
&& !args.contains(&"--disable-rofiles-fuse")
32+
&& !command_args.contains(&"--disable-rofiles-fuse")
3333
{
34-
args.push("--disable-rofiles-fuse");
34+
command_args.push("--disable-rofiles-fuse");
3535
}
3636

37-
let (program, args) = if is_sandboxed() {
37+
let (program, final_args) = if is_sandboxed() {
3838
if command_succeeds("host-spawn", &["--version"]) {
3939
let mut new_args = vec![command];
40-
new_args.extend_from_slice(&args);
40+
new_args.extend_from_slice(&command_args);
4141
("host-spawn", new_args)
4242
} else {
4343
let mut new_args = vec![
@@ -46,26 +46,26 @@ pub fn run_command(command: &str, args: &[&str]) -> Result<()> {
4646
"--env=TERM=xterm-256color",
4747
command,
4848
];
49-
new_args.extend_from_slice(&args);
49+
new_args.extend_from_slice(&command_args);
5050
("flatpak-spawn", new_args)
5151
}
5252
} else {
53-
(command, args)
53+
(command, command_args)
5454
};
5555

5656
println!(
5757
"\n{} {} {}",
5858
">".purple().bold(),
5959
program.italic(),
60-
args.join(" ").italic()
60+
final_args.join(" ").italic()
6161
);
62-
let mut command = Command::new(program)
63-
.args(&args)
62+
let mut command_process = Command::new(program)
63+
.args(&final_args)
6464
.stdout(Stdio::inherit())
6565
.stderr(Stdio::inherit())
6666
.spawn()?;
6767

68-
let status = command.wait()?;
68+
let status = command_process.wait()?;
6969

7070
if !status.success() {
7171
return Err(anyhow::anyhow!(

src/lib.rs

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pub mod command;
22
pub mod manifest;
33
pub mod state;
4+
pub mod utils;
45

56
use anyhow::Result;
67
use colored::*;
@@ -10,6 +11,7 @@ use dialoguer::{Select, theme::ColorfulTheme};
1011
use manifest::Manifest;
1112
use state::State;
1213
use std::fs;
14+
use utils::{get_a11y_bus_args, get_host_env};
1315
use walkdir::WalkDir;
1416

1517
const BUILD_DIR: &str = ".flatplay";
@@ -138,36 +140,49 @@ impl FlatpakManager {
138140
let buildsystem = buildsystem.as_deref();
139141
match buildsystem {
140142
Some("meson") => {
143+
let build_dir = format!("{}/_build", BUILD_DIR);
141144
let mut meson_args = vec!["build", &repo_dir, "meson", "setup"];
142145
if let Some(config_opts) = config_opts {
143146
meson_args.extend(config_opts.iter().map(|s| s.as_str()));
144147
}
145-
meson_args.extend(&["--prefix=/app", "_build"]);
148+
meson_args.extend(&["--prefix=/app", &build_dir]);
146149
run_command("flatpak", &meson_args)?;
147-
run_command("flatpak", &["build", &repo_dir, "ninja", "-C", "_build"])?;
148150
run_command(
149151
"flatpak",
150-
&["build", &repo_dir, "meson", "install", "-C", "_build"],
152+
&["build", &repo_dir, "ninja", "-C", &build_dir],
153+
)?;
154+
run_command(
155+
"flatpak",
156+
&["build", &repo_dir, "meson", "install", "-C", &build_dir],
151157
)?;
152158
}
153159
Some("cmake") | Some("cmake-ninja") => {
160+
let build_dir = format!("{}/_build", BUILD_DIR);
161+
let b_flag = format!("-B{}", build_dir);
154162
let mut cmake_args = vec![
155163
"build",
156164
&repo_dir,
157165
"cmake",
158166
"-G",
159167
"Ninja",
160-
"..",
161-
".",
168+
&b_flag,
169+
"-DCMAKE_EXPORT_COMPILE_COMMANDS=1",
170+
"-DCMAKE_BUILD_TYPE=RelWithDebInfo",
162171
"-DCMAKE_INSTALL_PREFIX=/app",
163172
];
164173
if let Some(config_opts) = config_opts {
165174
cmake_args.extend(config_opts.iter().map(|s| s.as_str()));
166175
}
167-
run_command("mkdir", &["-p", &format!("{}/_build", BUILD_DIR)])?;
176+
cmake_args.push(".");
168177
run_command("flatpak", &cmake_args)?;
169-
run_command("flatpak", &["build", &repo_dir, "ninja"])?;
170-
run_command("flatpak", &["build", &repo_dir, "ninja", "install"])?;
178+
run_command(
179+
"flatpak",
180+
&["build", &repo_dir, "ninja", "-C", &build_dir],
181+
)?;
182+
run_command(
183+
"flatpak",
184+
&["build", &repo_dir, "ninja", "-C", &build_dir, "install"],
185+
)?;
171186
}
172187
Some("simple") => {
173188
if let Some(build_commands) = build_commands {
@@ -333,17 +348,38 @@ impl FlatpakManager {
333348
}
334349

335350
let manifest = self.manifest.as_ref().unwrap();
336-
let manifest_path = self.state.active_manifest.as_ref().unwrap();
337351
let repo_dir = format!("{}/repo", BUILD_DIR);
338352

339-
let args = vec![
340-
"--run",
341-
&repo_dir,
342-
manifest_path.to_str().unwrap(),
343-
&manifest.command,
353+
let mut args = vec![
354+
"build".to_string(),
355+
"--with-appdir".to_string(),
356+
"--allow=devel".to_string(),
357+
"--talk-name=org.freedesktop.portal.*".to_string(),
358+
"--talk-name=org.a11y.Bus".to_string(),
344359
];
345360

346-
flatpak_builder(&args)
361+
for (key, value) in get_host_env() {
362+
args.push(format!("--env={}={}", key, value));
363+
}
364+
365+
for arg in get_a11y_bus_args() {
366+
args.push(arg);
367+
}
368+
369+
for arg in &manifest.finish_args {
370+
args.push(arg.clone());
371+
}
372+
args.push(repo_dir);
373+
args.push(manifest.command.clone());
374+
if let Some(x_run_args) = &manifest.x_run_args {
375+
for arg in x_run_args {
376+
args.push(arg.clone());
377+
}
378+
}
379+
380+
let args_str: Vec<&str> = args.iter().map(|s| s.as_str()).collect();
381+
382+
run_command("flatpak", &args_str)
347383
}
348384

349385
pub fn clean(&mut self) -> Result<()> {

src/manifest.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ pub struct Manifest {
5252
#[serde(rename = "runtime-version")]
5353
pub runtime_version: String,
5454
pub command: String,
55+
#[serde(rename = "x-run-args")]
56+
pub x_run_args: Option<Vec<String>>,
5557
#[serde(default)]
5658
pub modules: Vec<Module>,
5759
#[serde(rename = "finish-args", default)]

src/utils.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
use regex::Regex;
2+
use std::collections::HashMap;
3+
use std::env;
4+
use std::process::Command;
5+
6+
pub fn get_host_env() -> HashMap<String, String> {
7+
let forwarded_env_keys = vec![
8+
"COLORTERM",
9+
"DESKTOP_SESSION",
10+
"LANG",
11+
"WAYLAND_DISPLAY",
12+
"XDG_CURRENT_DESKTOP",
13+
"XDG_SEAT",
14+
"XDG_SESSION_DESKTOP",
15+
"XDG_SESSION_ID",
16+
"XDG_SESSION_TYPE",
17+
"XDG_VTNR",
18+
"AT_SPI_BUS_ADDRESS",
19+
];
20+
21+
let mut env_vars = HashMap::new();
22+
23+
for (key, value) in env::vars() {
24+
if forwarded_env_keys.contains(&key.as_str()) {
25+
env_vars.insert(key, value);
26+
}
27+
}
28+
29+
env_vars
30+
}
31+
32+
pub fn get_a11y_bus_args() -> Vec<String> {
33+
let output = Command::new("gdbus")
34+
.args([
35+
"call",
36+
"--session",
37+
"--dest=org.a11y.Bus",
38+
"--object-path=/org/a11y/bus",
39+
"--method=org.a11y.Bus.GetAddress",
40+
])
41+
.output();
42+
43+
let output = match output {
44+
Ok(output) if output.status.success() => output,
45+
_ => return Vec::new(),
46+
};
47+
48+
let address = String::from_utf8_lossy(&output.stdout)
49+
.trim()
50+
.replace("('", "")
51+
.replace("',)", "");
52+
53+
let re = Regex::new(r"unix:path=([^,]+)(,.*)?").unwrap();
54+
let caps = match re.captures(&address) {
55+
Some(caps) => caps,
56+
None => return Vec::new(),
57+
};
58+
59+
let unix_path = caps.get(1).map_or("", |m| m.as_str());
60+
let suffix = caps.get(2).map_or("", |m| m.as_str());
61+
62+
vec![
63+
format!("--bind-mount=/run/flatpak/at-spi-bus={}", unix_path),
64+
if !suffix.is_empty() {
65+
format!(
66+
"--env=AT_SPI_BUS_ADDRESS=unix:path=/run/flatpak/at-spi-bus{}",
67+
suffix
68+
)
69+
} else {
70+
"--env=AT_SPI_BUS_ADDRESS=unix:path=/run/flatpak/at-spi-bus".to_string()
71+
},
72+
]
73+
}

0 commit comments

Comments
 (0)