move apt repositories module to common
while introducing a 'product' parameter to the relevant functions and adding wrappers for backwards-compatibility. Suggested-by: Wolfgang Bumiller <w.bumiller@proxmox.com> Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
This commit is contained in:
parent
c3982c55b8
commit
f386660b4b
4
Makefile
4
Makefile
@ -41,7 +41,9 @@ pve pmg:
|
|||||||
gen:
|
gen:
|
||||||
$(call package_template,PMG,pmg_rs)
|
$(call package_template,PMG,pmg_rs)
|
||||||
$(call package_template,PVE,pve_rs)
|
$(call package_template,PVE,pve_rs)
|
||||||
perl ./scripts/genpackage.pl Common Proxmox::RS::CalendarEvent
|
perl ./scripts/genpackage.pl Common \
|
||||||
|
Proxmox::RS::APT::Repositories \
|
||||||
|
Proxmox::RS::CalendarEvent
|
||||||
perl ./scripts/genpackage.pl PVE \
|
perl ./scripts/genpackage.pl PVE \
|
||||||
PVE::RS::APT::Repositories \
|
PVE::RS::APT::Repositories \
|
||||||
PVE::RS::OpenId \
|
PVE::RS::OpenId \
|
||||||
|
1
common/src/apt/mod.rs
Normal file
1
common/src/apt/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod repositories;
|
164
common/src/apt/repositories.rs
Normal file
164
common/src/apt/repositories.rs
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
#[perlmod::package(name = "Proxmox::RS::APT::Repositories")]
|
||||||
|
pub mod export {
|
||||||
|
use std::convert::TryInto;
|
||||||
|
|
||||||
|
use anyhow::{bail, Error};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use proxmox_apt::repositories::{
|
||||||
|
APTRepositoryFile, APTRepositoryFileError, APTRepositoryHandle, APTRepositoryInfo,
|
||||||
|
APTStandardRepository,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize)]
|
||||||
|
#[serde(rename_all = "kebab-case")]
|
||||||
|
/// Result for the repositories() function
|
||||||
|
pub struct RepositoriesResult {
|
||||||
|
/// Successfully parsed files.
|
||||||
|
pub files: Vec<APTRepositoryFile>,
|
||||||
|
|
||||||
|
/// Errors for files that could not be parsed or read.
|
||||||
|
pub errors: Vec<APTRepositoryFileError>,
|
||||||
|
|
||||||
|
/// Common digest for successfully parsed files.
|
||||||
|
pub digest: String,
|
||||||
|
|
||||||
|
/// Additional information/warnings about repositories.
|
||||||
|
pub infos: Vec<APTRepositoryInfo>,
|
||||||
|
|
||||||
|
/// Standard repositories and their configuration status.
|
||||||
|
pub standard_repos: Vec<APTStandardRepository>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize)]
|
||||||
|
#[serde(rename_all = "kebab-case")]
|
||||||
|
/// For changing an existing repository.
|
||||||
|
pub struct ChangeProperties {
|
||||||
|
/// Whether the repository should be enabled or not.
|
||||||
|
pub enabled: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get information about configured repositories and standard repositories for `product`.
|
||||||
|
#[export]
|
||||||
|
pub fn repositories(product: &str) -> Result<RepositoriesResult, Error> {
|
||||||
|
let (files, errors, digest) = proxmox_apt::repositories::repositories()?;
|
||||||
|
let digest = hex::encode(&digest);
|
||||||
|
|
||||||
|
let suite = proxmox_apt::repositories::get_current_release_codename()?;
|
||||||
|
|
||||||
|
let infos = proxmox_apt::repositories::check_repositories(&files, suite);
|
||||||
|
let standard_repos =
|
||||||
|
proxmox_apt::repositories::standard_repositories(&files, product, suite);
|
||||||
|
|
||||||
|
Ok(RepositoriesResult {
|
||||||
|
files,
|
||||||
|
errors,
|
||||||
|
digest,
|
||||||
|
infos,
|
||||||
|
standard_repos,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add the repository identified by the `handle` and `product`.
|
||||||
|
/// If the repository is already configured, it will be set to enabled.
|
||||||
|
///
|
||||||
|
/// The `digest` parameter asserts that the configuration has not been modified.
|
||||||
|
#[export]
|
||||||
|
pub fn add_repository(handle: &str, product: &str, digest: Option<&str>) -> Result<(), Error> {
|
||||||
|
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
|
||||||
|
|
||||||
|
let handle: APTRepositoryHandle = handle.try_into()?;
|
||||||
|
let suite = proxmox_apt::repositories::get_current_release_codename()?;
|
||||||
|
|
||||||
|
if let Some(digest) = digest {
|
||||||
|
let expected_digest = hex::decode(digest)?;
|
||||||
|
if expected_digest != current_digest {
|
||||||
|
bail!("detected modified configuration - file changed by other user? Try again.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if it's already configured first
|
||||||
|
for file in files.iter_mut() {
|
||||||
|
for repo in file.repositories.iter_mut() {
|
||||||
|
if repo.is_referenced_repository(handle, product, &suite.to_string()) {
|
||||||
|
if repo.enabled {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
repo.set_enabled(true);
|
||||||
|
file.write()?;
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let (repo, path) =
|
||||||
|
proxmox_apt::repositories::get_standard_repository(handle, product, suite);
|
||||||
|
|
||||||
|
if let Some(error) = errors.iter().find(|error| error.path == path) {
|
||||||
|
bail!(
|
||||||
|
"unable to parse existing file {} - {}",
|
||||||
|
error.path,
|
||||||
|
error.error,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
|
||||||
|
file.repositories.push(repo);
|
||||||
|
|
||||||
|
file.write()?;
|
||||||
|
} else {
|
||||||
|
let mut file = match APTRepositoryFile::new(&path)? {
|
||||||
|
Some(file) => file,
|
||||||
|
None => bail!("invalid path - {}", path),
|
||||||
|
};
|
||||||
|
|
||||||
|
file.repositories.push(repo);
|
||||||
|
|
||||||
|
file.write()?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Change the properties of the specified repository.
|
||||||
|
///
|
||||||
|
/// The `digest` parameter asserts that the configuration has not been modified.
|
||||||
|
#[export]
|
||||||
|
pub fn change_repository(
|
||||||
|
path: &str,
|
||||||
|
index: usize,
|
||||||
|
options: ChangeProperties,
|
||||||
|
digest: Option<&str>,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
|
||||||
|
|
||||||
|
if let Some(digest) = digest {
|
||||||
|
let expected_digest = hex::decode(digest)?;
|
||||||
|
if expected_digest != current_digest {
|
||||||
|
bail!("detected modified configuration - file changed by other user? Try again.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(error) = errors.iter().find(|error| error.path == path) {
|
||||||
|
bail!("unable to parse file {} - {}", error.path, error.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
|
||||||
|
if let Some(repo) = file.repositories.get_mut(index) {
|
||||||
|
if let Some(enabled) = options.enabled {
|
||||||
|
repo.set_enabled(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.write()?;
|
||||||
|
} else {
|
||||||
|
bail!("invalid index - {}", index);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bail!("invalid path - {}", path);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -1 +1,2 @@
|
|||||||
|
pub mod apt;
|
||||||
mod calendar_event;
|
mod calendar_event;
|
||||||
|
@ -1,61 +1,13 @@
|
|||||||
#[perlmod::package(name = "PMG::RS::APT::Repositories")]
|
#[perlmod::package(name = "PMG::RS::APT::Repositories")]
|
||||||
mod export {
|
mod export {
|
||||||
use std::convert::TryInto;
|
use anyhow::Error;
|
||||||
|
|
||||||
use anyhow::{bail, Error};
|
use crate::common::apt::repositories::export as common;
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use proxmox_apt::repositories::{
|
|
||||||
APTRepositoryFile, APTRepositoryFileError, APTRepositoryHandle, APTRepositoryInfo,
|
|
||||||
APTStandardRepository,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "kebab-case")]
|
|
||||||
/// Result for the repositories() function
|
|
||||||
pub struct RepositoriesResult {
|
|
||||||
/// Successfully parsed files.
|
|
||||||
pub files: Vec<APTRepositoryFile>,
|
|
||||||
|
|
||||||
/// Errors for files that could not be parsed or read.
|
|
||||||
pub errors: Vec<APTRepositoryFileError>,
|
|
||||||
|
|
||||||
/// Common digest for successfully parsed files.
|
|
||||||
pub digest: String,
|
|
||||||
|
|
||||||
/// Additional information/warnings about repositories.
|
|
||||||
pub infos: Vec<APTRepositoryInfo>,
|
|
||||||
|
|
||||||
/// Standard repositories and their configuration status.
|
|
||||||
pub standard_repos: Vec<APTStandardRepository>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "kebab-case")]
|
|
||||||
/// For changing an existing repository.
|
|
||||||
pub struct ChangeProperties {
|
|
||||||
/// Whether the repository should be enabled or not.
|
|
||||||
pub enabled: Option<bool>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get information about configured and standard repositories.
|
/// Get information about configured and standard repositories.
|
||||||
#[export]
|
#[export]
|
||||||
pub fn repositories() -> Result<RepositoriesResult, Error> {
|
pub fn repositories() -> Result<common::RepositoriesResult, Error> {
|
||||||
let (files, errors, digest) = proxmox_apt::repositories::repositories()?;
|
common::repositories("pmg")
|
||||||
let digest = hex::encode(&digest);
|
|
||||||
|
|
||||||
let suite = proxmox_apt::repositories::get_current_release_codename()?;
|
|
||||||
|
|
||||||
let infos = proxmox_apt::repositories::check_repositories(&files, suite);
|
|
||||||
let standard_repos = proxmox_apt::repositories::standard_repositories(&files, "pmg", suite);
|
|
||||||
|
|
||||||
Ok(RepositoriesResult {
|
|
||||||
files,
|
|
||||||
errors,
|
|
||||||
digest,
|
|
||||||
infos,
|
|
||||||
standard_repos,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add the repository identified by the `handle`.
|
/// Add the repository identified by the `handle`.
|
||||||
@ -64,60 +16,7 @@ mod export {
|
|||||||
/// The `digest` parameter asserts that the configuration has not been modified.
|
/// The `digest` parameter asserts that the configuration has not been modified.
|
||||||
#[export]
|
#[export]
|
||||||
pub fn add_repository(handle: &str, digest: Option<&str>) -> Result<(), Error> {
|
pub fn add_repository(handle: &str, digest: Option<&str>) -> Result<(), Error> {
|
||||||
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
|
common::add_repository(handle, "pmg", digest)
|
||||||
|
|
||||||
let handle: APTRepositoryHandle = handle.try_into()?;
|
|
||||||
let suite = proxmox_apt::repositories::get_current_release_codename()?;
|
|
||||||
|
|
||||||
if let Some(digest) = digest {
|
|
||||||
let expected_digest = hex::decode(digest)?;
|
|
||||||
if expected_digest != current_digest {
|
|
||||||
bail!("detected modified configuration - file changed by other user? Try again.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if it's already configured first
|
|
||||||
for file in files.iter_mut() {
|
|
||||||
for repo in file.repositories.iter_mut() {
|
|
||||||
if repo.is_referenced_repository(handle, "pmg", &suite.to_string()) {
|
|
||||||
if repo.enabled {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
repo.set_enabled(true);
|
|
||||||
file.write()?;
|
|
||||||
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let (repo, path) = proxmox_apt::repositories::get_standard_repository(handle, "pmg", suite);
|
|
||||||
|
|
||||||
if let Some(error) = errors.iter().find(|error| error.path == path) {
|
|
||||||
bail!(
|
|
||||||
"unable to parse existing file {} - {}",
|
|
||||||
error.path,
|
|
||||||
error.error,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
|
|
||||||
file.repositories.push(repo);
|
|
||||||
|
|
||||||
file.write()?;
|
|
||||||
} else {
|
|
||||||
let mut file = match APTRepositoryFile::new(&path)? {
|
|
||||||
Some(file) => file,
|
|
||||||
None => bail!("invalid path - {}", path),
|
|
||||||
};
|
|
||||||
|
|
||||||
file.repositories.push(repo);
|
|
||||||
|
|
||||||
file.write()?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Change the properties of the specified repository.
|
/// Change the properties of the specified repository.
|
||||||
@ -127,36 +26,9 @@ mod export {
|
|||||||
pub fn change_repository(
|
pub fn change_repository(
|
||||||
path: &str,
|
path: &str,
|
||||||
index: usize,
|
index: usize,
|
||||||
options: ChangeProperties,
|
options: common::ChangeProperties,
|
||||||
digest: Option<&str>,
|
digest: Option<&str>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
|
common::change_repository(path, index, options, digest)
|
||||||
|
|
||||||
if let Some(digest) = digest {
|
|
||||||
let expected_digest = hex::decode(digest)?;
|
|
||||||
if expected_digest != current_digest {
|
|
||||||
bail!("detected modified configuration - file changed by other user? Try again.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(error) = errors.iter().find(|error| error.path == path) {
|
|
||||||
bail!("unable to parse file {} - {}", error.path, error.error);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
|
|
||||||
if let Some(repo) = file.repositories.get_mut(index) {
|
|
||||||
if let Some(enabled) = options.enabled {
|
|
||||||
repo.set_enabled(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
file.write()?;
|
|
||||||
} else {
|
|
||||||
bail!("invalid index - {}", index);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bail!("invalid path - {}", path);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,61 +1,13 @@
|
|||||||
#[perlmod::package(name = "PVE::RS::APT::Repositories", lib = "pve_rs")]
|
#[perlmod::package(name = "PVE::RS::APT::Repositories", lib = "pve_rs")]
|
||||||
mod export {
|
mod export {
|
||||||
use std::convert::TryInto;
|
use anyhow::Error;
|
||||||
|
|
||||||
use anyhow::{bail, Error};
|
use crate::common::apt::repositories::export as common;
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use proxmox_apt::repositories::{
|
|
||||||
APTRepositoryFile, APTRepositoryFileError, APTRepositoryHandle, APTRepositoryInfo,
|
|
||||||
APTStandardRepository,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "kebab-case")]
|
|
||||||
/// Result for the repositories() function
|
|
||||||
pub struct RepositoriesResult {
|
|
||||||
/// Successfully parsed files.
|
|
||||||
pub files: Vec<APTRepositoryFile>,
|
|
||||||
|
|
||||||
/// Errors for files that could not be parsed or read.
|
|
||||||
pub errors: Vec<APTRepositoryFileError>,
|
|
||||||
|
|
||||||
/// Common digest for successfully parsed files.
|
|
||||||
pub digest: String,
|
|
||||||
|
|
||||||
/// Additional information/warnings about repositories.
|
|
||||||
pub infos: Vec<APTRepositoryInfo>,
|
|
||||||
|
|
||||||
/// Standard repositories and their configuration status.
|
|
||||||
pub standard_repos: Vec<APTStandardRepository>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "kebab-case")]
|
|
||||||
/// For changing an existing repository.
|
|
||||||
pub struct ChangeProperties {
|
|
||||||
/// Whether the repository should be enabled or not.
|
|
||||||
pub enabled: Option<bool>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get information about configured and standard repositories.
|
/// Get information about configured and standard repositories.
|
||||||
#[export]
|
#[export]
|
||||||
pub fn repositories() -> Result<RepositoriesResult, Error> {
|
pub fn repositories() -> Result<common::RepositoriesResult, Error> {
|
||||||
let (files, errors, digest) = proxmox_apt::repositories::repositories()?;
|
common::repositories("pve")
|
||||||
let digest = hex::encode(&digest);
|
|
||||||
|
|
||||||
let suite = proxmox_apt::repositories::get_current_release_codename()?;
|
|
||||||
|
|
||||||
let infos = proxmox_apt::repositories::check_repositories(&files, suite);
|
|
||||||
let standard_repos = proxmox_apt::repositories::standard_repositories(&files, "pve", suite);
|
|
||||||
|
|
||||||
Ok(RepositoriesResult {
|
|
||||||
files,
|
|
||||||
errors,
|
|
||||||
digest,
|
|
||||||
infos,
|
|
||||||
standard_repos,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add the repository identified by the `handle`.
|
/// Add the repository identified by the `handle`.
|
||||||
@ -64,60 +16,7 @@ mod export {
|
|||||||
/// The `digest` parameter asserts that the configuration has not been modified.
|
/// The `digest` parameter asserts that the configuration has not been modified.
|
||||||
#[export]
|
#[export]
|
||||||
pub fn add_repository(handle: &str, digest: Option<&str>) -> Result<(), Error> {
|
pub fn add_repository(handle: &str, digest: Option<&str>) -> Result<(), Error> {
|
||||||
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
|
common::add_repository(handle, "pve", digest)
|
||||||
|
|
||||||
let handle: APTRepositoryHandle = handle.try_into()?;
|
|
||||||
let suite = proxmox_apt::repositories::get_current_release_codename()?;
|
|
||||||
|
|
||||||
if let Some(digest) = digest {
|
|
||||||
let expected_digest = hex::decode(digest)?;
|
|
||||||
if expected_digest != current_digest {
|
|
||||||
bail!("detected modified configuration - file changed by other user? Try again.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if it's already configured first
|
|
||||||
for file in files.iter_mut() {
|
|
||||||
for repo in file.repositories.iter_mut() {
|
|
||||||
if repo.is_referenced_repository(handle, "pve", &suite.to_string()) {
|
|
||||||
if repo.enabled {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
repo.set_enabled(true);
|
|
||||||
file.write()?;
|
|
||||||
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let (repo, path) = proxmox_apt::repositories::get_standard_repository(handle, "pve", suite);
|
|
||||||
|
|
||||||
if let Some(error) = errors.iter().find(|error| error.path == path) {
|
|
||||||
bail!(
|
|
||||||
"unable to parse existing file {} - {}",
|
|
||||||
error.path,
|
|
||||||
error.error,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
|
|
||||||
file.repositories.push(repo);
|
|
||||||
|
|
||||||
file.write()?;
|
|
||||||
} else {
|
|
||||||
let mut file = match APTRepositoryFile::new(&path)? {
|
|
||||||
Some(file) => file,
|
|
||||||
None => bail!("invalid path - {}", path),
|
|
||||||
};
|
|
||||||
|
|
||||||
file.repositories.push(repo);
|
|
||||||
|
|
||||||
file.write()?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Change the properties of the specified repository.
|
/// Change the properties of the specified repository.
|
||||||
@ -127,36 +26,9 @@ mod export {
|
|||||||
pub fn change_repository(
|
pub fn change_repository(
|
||||||
path: &str,
|
path: &str,
|
||||||
index: usize,
|
index: usize,
|
||||||
options: ChangeProperties,
|
options: common::ChangeProperties,
|
||||||
digest: Option<&str>,
|
digest: Option<&str>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?;
|
common::change_repository(path, index, options, digest)
|
||||||
|
|
||||||
if let Some(digest) = digest {
|
|
||||||
let expected_digest = hex::decode(digest)?;
|
|
||||||
if expected_digest != current_digest {
|
|
||||||
bail!("detected modified configuration - file changed by other user? Try again.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(error) = errors.iter().find(|error| error.path == path) {
|
|
||||||
bail!("unable to parse file {} - {}", error.path, error.error);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(file) = files.iter_mut().find(|file| file.path == path) {
|
|
||||||
if let Some(repo) = file.repositories.get_mut(index) {
|
|
||||||
if let Some(enabled) = options.enabled {
|
|
||||||
repo.set_enabled(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
file.write()?;
|
|
||||||
} else {
|
|
||||||
bail!("invalid index - {}", index);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bail!("invalid path - {}", path);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user