Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
6a33152
vm: stream downloads with progress (fix 458 MB var.btrfs timeout)
mobileoverlord May 19, 2026
44e53e6
vm: cargo fmt sweep on update.rs
mobileoverlord May 19, 2026
8e8dd50
vm: `vm start` defaults to ~/.avocado/vm/install/ when nothing else set
mobileoverlord May 19, 2026
f864d84
vm: match avocado connect upload's progress bar style
mobileoverlord May 19, 2026
2759150
vm: add `vm config` subcommand + persistent guest network config
mobileoverlord May 20, 2026
1a505d8
ci: add windows-msvc compile check + gate unix-only modules
mobileoverlord May 20, 2026
abc9dba
runtime: support `extensions: - foo: {enabled: false}` map form
mobileoverlord May 20, 2026
6ef0b6d
ext: emit AVOCADO_ON_MERGE=systemd-tmpfiles --create when tmpfiles.d …
mobileoverlord May 20, 2026
75610cd
image-signing: stream large files through the hasher
mobileoverlord May 20, 2026
c8a017c
docs link update
nicksinas May 20, 2026
124b613
runtime: parse map-form extension entries in build deps + stamps
mobileoverlord May 21, 2026
04e4e9d
vm: CLI owns qemu lifecycle on macOS; IPC is best-effort notify only
mobileoverlord May 21, 2026
ad94379
config: add --detail to surface extensions + runtime cross-refs
mobileoverlord May 21, 2026
d20e1dc
clean: use save_replacing on --unlock so cleared entries stick
mobileoverlord May 21, 2026
c71bd83
vm: persist cpu/memory overrides to ~/.avocado/vm/config.yaml
mobileoverlord May 21, 2026
8fa050e
runtime deploy: add --output json for desktop UI integration
mobileoverlord May 21, 2026
6d4c265
release: bump to 0.40.0
mobileoverlord May 21, 2026
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
20 changes: 20 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,23 @@ jobs:
security:
name: Security Audit
uses: ./.github/workflows/security-reusable.yml

windows-check:
name: Windows compile check
runs-on: windows-latest
steps:
- name: Install build pre-reqs
run: |
choco install nasm cmake -y
echo "C:\Program Files\NASM" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
target: x86_64-pc-windows-msvc

- uses: Swatinem/rust-cache@v2

- name: cargo check (windows-msvc)
run: cargo check --target x86_64-pc-windows-msvc --all-targets
Comment thread
mobileoverlord marked this conversation as resolved.
Dismissed
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "avocado-cli"
version = "0.39.0"
version = "0.40.0"
edition = "2021"
description = "Command line interface for Avocado."
authors = ["Avocado"]
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Command line interface for Avocado.

- [Documentation](https://docs.peridio.com/avocado-cli)
- [Documentation](https://docs.peridio.com/developer-reference/avocado-cli/overview)

## Install

Expand Down
5 changes: 4 additions & 1 deletion src/commands/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,10 @@ impl BuildCommand {
merged_value.get("extensions").and_then(|e| e.as_sequence())
{
for ext in extensions {
if let Some(ext_name) = ext.as_str() {
if let Some(spec) =
crate::utils::runtime_extension::RuntimeExtensionSpec::parse_entry(ext)
{
let ext_name = spec.name.as_str();
// Check if this extension has a source: field (remote extension)
if let Some(Some(source)) = ext_sources.get(ext_name) {
// Remote extension with source field
Expand Down
67 changes: 65 additions & 2 deletions src/commands/clean.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,12 @@ impl CleanCommand {
}
lock_file.clear_all(&target);

// Save updated lock file
// Save updated lock file. `save_replacing` writes verbatim
// without merging from disk — required for unlock semantics
// since the regular `save` would re-add the cleared entries
// through merge.
lock_file
.save(&src_dir)
.save_replacing(&src_dir)
.with_context(|| "Failed to save lock file")?;

print_success(
Expand Down Expand Up @@ -313,6 +316,7 @@ fi
#[cfg(test)]
mod tests {
use super::*;
use crate::utils::lockfile::SysrootType;
use std::fs;
use tempfile::TempDir;

Expand Down Expand Up @@ -381,6 +385,65 @@ mod tests {
assert!(result.is_ok());
}

#[tokio::test]
async fn test_clean_unlock_actually_clears_entries() {
// Regression: `clean --unlock` must use `save_replacing` so
// cleared entries don't get merged back from disk. Previously
// it called `save`, which merged with on-disk state and made
// unlock a no-op — the desktop app's Unlock button hit this.
let temp_dir = TempDir::new().unwrap();
let temp_path = temp_dir.path();

let config_content = r#"
default_target: "qemux86-64"
sdk:
image: "test-image"
"#;
let config_path = temp_path.join("avocado.yaml");
fs::write(&config_path, config_content).unwrap();

let mut lock = LockFile::new();
lock.set_locked_version(
"qemux86-64",
&SysrootType::Sdk("x86_64".to_string()),
"avocado-sdk-bootstrap",
"2024.0.129-r0.0",
);
lock.save(temp_path).unwrap();

assert!(lock
.get_locked_version(
"qemux86-64",
&SysrootType::Sdk("x86_64".to_string()),
"avocado-sdk-bootstrap"
)
.is_some());

let clean_cmd = CleanCommand::new(
Some(temp_path.to_str().unwrap().to_string()),
false,
None,
false,
)
.with_config_path(Some(config_path.to_string_lossy().to_string()))
.with_target(Some("qemux86-64".to_string()))
.with_unlock(true);
let result = clean_cmd.execute().await;
assert!(result.is_ok(), "clean --unlock failed: {result:?}");

let reloaded = LockFile::load(temp_path).unwrap();
assert!(
reloaded
.get_locked_version(
"qemux86-64",
&SysrootType::Sdk("x86_64".to_string()),
"avocado-sdk-bootstrap"
)
.is_none(),
"lock entry should be cleared after `clean --unlock`"
);
}

#[tokio::test]
async fn test_clean_skip_volumes_keeps_state_file() {
// `--skip-volumes` means "leave both the volume and its
Expand Down
Loading
Loading