1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use super::publishers::CommitAuthorConfig;
use super::{StringOrBool, deserialize_string_or_bool_opt};
// ---------------------------------------------------------------------------
// AurSourceConfig
// ---------------------------------------------------------------------------
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct AurSourceConfig {
/// Override the package name (default: crate name, no -bin suffix).
pub name: Option<String>,
/// Build IDs filter.
pub ids: Option<Vec<String>>,
/// Commit author with optional signing.
pub commit_author: Option<CommitAuthorConfig>,
/// Custom commit message template.
pub commit_msg_template: Option<String>,
/// Short description of the package.
pub description: Option<String>,
/// Project homepage URL.
pub homepage: Option<String>,
/// SPDX license identifier.
pub license: Option<String>,
/// Skip publishing. `"true"` always skips; `"auto"` skips for prereleases.
#[serde(deserialize_with = "deserialize_string_or_bool_opt", default)]
pub skip_upload: Option<StringOrBool>,
/// Custom URL template for download URLs.
pub url_template: Option<String>,
/// PKGBUILD maintainer entries.
pub maintainers: Option<Vec<String>>,
/// Contributors listed in PKGBUILD comments.
pub contributors: Option<Vec<String>>,
/// Packages this PKGBUILD provides.
pub provides: Option<Vec<String>>,
/// Packages this PKGBUILD conflicts with.
pub conflicts: Option<Vec<String>>,
/// Runtime dependencies.
pub depends: Option<Vec<String>>,
/// Optional dependencies.
pub optdepends: Option<Vec<String>>,
/// Build-time dependencies (source packages need these).
pub makedepends: Option<Vec<String>>,
/// Backup files to preserve on upgrade.
pub backup: Option<Vec<String>>,
/// Package release number (default: "1").
pub rel: Option<String>,
/// Custom `prepare()` function body for PKGBUILD.
pub prepare: Option<String>,
/// Custom `build()` function body for PKGBUILD.
pub build: Option<String>,
/// Custom `package()` function body for PKGBUILD.
pub package: Option<String>,
/// AUR SSH git URL override. Defaults to
/// `ssh://aur@aur.archlinux.org/<package>.git`, derived from the resolved
/// package name; set this only for a non-standard endpoint.
pub git_url: Option<String>,
/// Custom SSH command for git operations.
pub git_ssh_command: Option<String>,
/// Path to SSH private key file.
pub private_key: Option<String>,
/// Subdirectory in the git repo for committed files.
pub directory: Option<String>,
/// Skip this config.
/// Accepts the legacy `disable:` spelling via serde alias for back-compat.
#[serde(
alias = "disable",
deserialize_with = "deserialize_string_or_bool_opt",
default
)]
pub skip: Option<StringOrBool>,
/// Content for a .install file (post-install/pre-remove scripts).
pub install: Option<String>,
/// Explicit architecture list (default: auto-detect from artifacts).
pub arches: Option<Vec<String>>,
/// `x86_64` micro-architecture variant — `v1` (baseline), `v2`, `v3`
/// (AVX2), or `v4`. Constrained
/// to a typed enum because AUR source pkgs build from the upstream
/// tarball (no binary artifacts to filter), so the value's only role
/// is as the `Amd64` template var consumed by `prepare:` / `build:` /
/// `package:` script bodies — typos must fail at parse time, not
/// silently render an invalid string into the PKGBUILD.
/// When unset, defaults to `v1` at template-render time.
pub amd64_variant: Option<Amd64Variant>,
/// Override whether this publisher failing should fail the overall release.
///
/// Default: `false` — a failure here is logged but does not abort the release.
/// Set to `true` to fail the release on any error.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
/// Template-conditional gate: when the rendered result is falsy
/// (`"false"` / `"0"` / `"no"` / empty), the AUR source config is
/// skipped. Render failure hard-errors. The
/// `aur_sources[].if:`.
#[serde(rename = "if")]
pub if_condition: Option<String>,
/// When `true`, a triggered rollback leaves this publisher's work in
/// place rather than attempting to undo it. Default `false`.
pub retain_on_rollback: Option<bool>,
}
/// `x86_64` micro-architecture variant. A typed
/// values. Used by [`AurSourceConfig::amd64_variant`] to constrain the
/// `prepare:` / `build:` / `package:` template var surface to a known set —
/// AUR source pkgs build from the upstream tarball so the value is
/// template-only (no artifact filter) and a typo would render an invalid
/// PKGBUILD silently.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Amd64Variant {
V1,
V2,
V3,
V4,
}
impl Amd64Variant {
/// Canonical lowercase string form (`"v1"`..`"v4"`). Matches the
/// `Goamd64` external surface and the value rendered into the PKGBUILD
/// `Amd64` template var.
pub fn as_str(&self) -> &'static str {
match self {
Amd64Variant::V1 => "v1",
Amd64Variant::V2 => "v2",
Amd64Variant::V3 => "v3",
Amd64Variant::V4 => "v4",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn amd64_variant_as_str_covers_every_arm() {
assert_eq!(Amd64Variant::V1.as_str(), "v1");
assert_eq!(Amd64Variant::V2.as_str(), "v2");
assert_eq!(Amd64Variant::V3.as_str(), "v3");
assert_eq!(Amd64Variant::V4.as_str(), "v4");
}
#[test]
fn amd64_variant_deserializes_snake_case() {
// The `snake_case` serde rename is the load-bearing contract: a
// `v3` in YAML must parse to the typed variant so a typo fails at
// parse time instead of rendering an invalid PKGBUILD.
let v: Amd64Variant = serde_json::from_str("\"v3\"").expect("v3 parses");
assert_eq!(v, Amd64Variant::V3);
assert!(
serde_json::from_str::<Amd64Variant>("\"avx2\"").is_err(),
"an unknown variant must be rejected at parse time"
);
}
#[test]
fn skip_alias_disable_round_trips() {
// `disable:` is the legacy spelling; serde alias must map it onto
// `skip` so old configs keep working.
let cfg: AurSourceConfig =
serde_yaml_ng::from_str("disable: true").expect("legacy disable: parses");
assert!(matches!(cfg.skip, Some(StringOrBool::Bool(true))));
}
}