# alpm-srcinfo
A library and command line tool for the specification, parsing and linting of **A**rch **L**inux **P**ackage **M**anagement (ALPM) [SRCINFO] files.
`SRCINFO` files describe a `PKGBUILD` file in a way that doesn't require an interactive shell to evaluate it.
## Documentation
- <https://alpm.archlinux.page/alpm-srcinfo/ARCHITECTURE.html> A high-level overview on how this project works.
- <https://alpm.archlinux.page/rustdoc/alpm_srcinfo/> for development version of the crate
- <https://docs.rs/alpm-srcinfo/latest/alpm_srcinfo/> for released versions of the crate
## Examples
### Commandline
```bash
cat > "$SRCINFO_TEMPFILE" << EOF
pkgbase = example
pkgver = 1.0.0
epoch = 1
pkgrel = 1
pkgdesc = A project that does something
url = https://example.org/
arch = x86_64
depends = glibc
optdepends = python: for special-python-script.py
makedepends = cmake
checkdepends = extra-test-tool
pkgname = example
depends = glibc
depends = gcc-libs
EOF
alpm-srcinfo format-packages "$SRCINFO_TEMPFILE" --architecture x86_64 --pretty > "$SRCINFO_OUTPUT"
```
### Library
```rust
use alpm_srcinfo::{SourceInfo, MergedPackage};
use alpm_types::{Architecture, PackageRelation, Name};
# fn main() -> Result<(), alpm_srcinfo::Error> {
let source_info_data = r#"
pkgbase = example
pkgver = 1.0.0
epoch = 1
pkgrel = 1
pkgdesc = A project that does something
url = https://example.org/
arch = x86_64
depends = glibc
optdepends = python: for special-python-script.py
makedepends = cmake
checkdepends = extra-test-tool
pkgname = example
depends = glibc
depends = gcc-libs
"#;
// Parse the file. This might already error if the file cannot be parsed.
let source_info_result = SourceInfo::from_string(source_info_data)?;
// Make sure there're aren't unrecoverable logic errors, such as missing values.
// Recoverable errors would be lints and deprecation warnings.
let source_info = source_info_result.source_info()?;
// Get all merged package representations for the x86_64 architecture.
let mut packages: Vec<MergedPackage> = source_info.packages_for_architecture(Architecture::X86_64).collect();
let package = packages.remove(0);
assert_eq!(package.name, Name::new("example")?);
assert_eq!(package.architecture, Architecture::X86_64);
assert_eq!(package.dependencies, vec![
PackageRelation::new(Name::new("glibc")?, None),
PackageRelation::new(Name::new("gcc-libs")?, None)
]);
# Ok(())
# }
```
## Features
- `cli` adds the commandline handling needed for the `almp-srcinfo` binary (enabled by default).
- `winnow-debug` enables the `winnow/debug` feature, which shows the exact parsing process of winnow.
## Contributing
Please refer to the [contribution guidelines] to learn how to contribute to this project.
## License
This project can be used under the terms of the [Apache-2.0] or [MIT].
Contributions to this project, unless noted otherwise, are automatically licensed under the terms of both of those licenses.
[contribution guidelines]: ../CONTRIBUTING.md
[Apache-2.0]: ../LICENSES/Apache-2.0.txt
[MIT]: ../LICENSES/MIT.txt
[SRCINFO]: https://alpm.archlinux.page/specifications/SRCINFO.5.html