5 Commits

Author SHA1 Message Date
9b4ed2837e Merge branch 'develop' 2022-12-12 17:41:41 +01:00
701e64df6f Release v0.7.12 2022-12-12 17:41:41 +01:00
23fc942db7 Warn on empty filters
Closes #29
2022-12-12 15:43:27 +01:00
38bba1472e Improve error messages during sync errors
Closes #46
2022-12-12 15:21:42 +01:00
7d131bbacf 'Enable deny_unknown_fields for all config structs 2022-12-12 15:10:00 +01:00
6 changed files with 42 additions and 14 deletions

2
Cargo.lock generated
View File

@@ -330,7 +330,7 @@ dependencies = [
[[package]]
name = "git-repo-manager"
version = "0.7.11"
version = "0.7.12"
dependencies = [
"clap",
"comfy-table",

View File

@@ -1,6 +1,6 @@
[package]
name = "git-repo-manager"
version = "0.7.11"
version = "0.7.12"
edition = "2021"
authors = [

View File

@@ -166,7 +166,7 @@ def test_repos_find_remote_no_filter(provider, configtype, default, use_config):
cmd = grm(args)
assert cmd.returncode == 0
assert len(cmd.stderr) == 0
assert "did not specify any filters" in cmd.stderr.lower()
if default or configtype == "toml":
output = toml.loads(cmd.stdout)

View File

@@ -33,6 +33,7 @@ pub struct ConfigTrees {
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ConfigProviderFilter {
pub access: Option<bool>,
pub owner: Option<bool>,
@@ -41,6 +42,7 @@ pub struct ConfigProviderFilter {
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ConfigProvider {
pub provider: RemoteProvider,
pub token_command: String,
@@ -181,6 +183,12 @@ impl Config {
filters.access.unwrap_or(false),
);
if filter.empty() {
print_warning(
"The configuration does not contain any filters, so no repos will match",
);
}
let repos = match config.provider {
RemoteProvider::Github => {
match provider::Github::new(filter, token, config.api_url) {

View File

@@ -38,7 +38,7 @@ fn main() {
}
}
Err(error) => {
print_error(&format!("Error syncing trees: {}", error));
print_error(&format!("Sync error: {}", error));
process::exit(1);
}
}
@@ -55,6 +55,10 @@ fn main() {
let filter =
provider::Filter::new(args.users, args.groups, args.owner, args.access);
if filter.empty() {
print_warning("You did not specify any filters, so no repos will match");
}
let worktree = args.worktree == "true";
let repos = match args.provider {
@@ -62,7 +66,7 @@ fn main() {
match provider::Github::new(filter, token, args.api_url) {
Ok(provider) => provider,
Err(error) => {
print_error(&format!("Error: {}", error));
print_error(&format!("Sync error: {}", error));
process::exit(1);
}
}
@@ -76,7 +80,7 @@ fn main() {
match provider::Gitlab::new(filter, token, args.api_url) {
Ok(provider) => provider,
Err(error) => {
print_error(&format!("Error: {}", error));
print_error(&format!("Sync error: {}", error));
process::exit(1);
}
}
@@ -112,13 +116,13 @@ fn main() {
}
}
Err(error) => {
print_error(&format!("Error syncing trees: {}", error));
print_error(&format!("Sync error: {}", error));
process::exit(1);
}
}
}
Err(error) => {
print_error(&format!("Error: {}", error));
print_error(&format!("Sync error: {}", error));
process::exit(1);
}
}
@@ -278,6 +282,10 @@ fn main() {
filters.access.unwrap_or(false),
);
if filter.empty() {
print_warning("You did not specify any filters, so no repos will match");
}
let repos = match config.provider {
provider::RemoteProvider::Github => {
match match provider::Github::new(filter, token, config.api_url) {
@@ -383,6 +391,10 @@ fn main() {
let filter =
provider::Filter::new(args.users, args.groups, args.owner, args.access);
if filter.empty() {
print_warning("You did not specify any filters, so no repos will match");
}
let worktree = args.worktree == "true";
let repos = match args.provider {

View File

@@ -89,6 +89,10 @@ impl Filter {
access,
}
}
pub fn empty(&self) -> bool {
self.users.is_empty() && self.groups.is_empty() && !self.owner && !self.access
}
}
pub enum ApiErrorResponse<T>
@@ -270,12 +274,16 @@ pub trait Provider {
}
for group in &self.filter().groups {
let group_projects = self
.get_group_projects(group)
.map_err(|error| match error {
ApiErrorResponse::Json(x) => x.to_string(),
ApiErrorResponse::String(s) => s,
})?;
let group_projects = self.get_group_projects(group).map_err(|error| {
format!(
"group \"{}\": {}",
group,
match error {
ApiErrorResponse::Json(x) => x.to_string(),
ApiErrorResponse::String(s) => s,
}
)
})?;
for group_project in group_projects {
let mut already_present = false;
for repo in &repos {