aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/command/repository_command.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/command/repository_command.rs')
-rw-r--r--crates/shirabe/src/command/repository_command.rs167
1 files changed, 45 insertions, 122 deletions
diff --git a/crates/shirabe/src/command/repository_command.rs b/crates/shirabe/src/command/repository_command.rs
index 79b4a15..2aea141 100644
--- a/crates/shirabe/src/command/repository_command.rs
+++ b/crates/shirabe/src/command/repository_command.rs
@@ -2,19 +2,17 @@
use indexmap::IndexMap;
use shirabe_external_packages::composer::pcre::preg::Preg;
-use shirabe_external_packages::symfony::component::console::command::command::Command;
-use shirabe_external_packages::symfony::component::console::command::command::CommandBase;
-use shirabe_external_packages::symfony::console::completion::completion_input::CompletionInput;
use shirabe_external_packages::symfony::console::input::input_interface::InputInterface;
use shirabe_external_packages::symfony::console::output::output_interface::OutputInterface;
use shirabe_php_shim::{
InvalidArgumentException, PHP_URL_HOST, PhpMixed, RuntimeException, parse_url, strtolower,
};
-use crate::command::base_command::BaseCommand;
+use crate::command::base_command::{BaseCommand, BaseCommandData, HasBaseCommandData};
use crate::command::base_config_command::BaseConfigCommand;
use crate::composer::Composer;
use crate::config::Config;
+use crate::config::config_source_interface::ConfigSourceInterface;
use crate::config::json_config_source::JsonConfigSource;
use crate::console::input::input_argument::InputArgument;
use crate::console::input::input_option::InputOption;
@@ -24,9 +22,7 @@ use crate::json::json_file::JsonFile;
#[derive(Debug)]
pub struct RepositoryCommand {
- inner: CommandBase,
- composer: Option<Composer>,
- io: Option<Box<dyn IOInterface>>,
+ base_command_data: BaseCommandData,
config: Option<Config>,
config_file: Option<JsonFile>,
@@ -35,24 +31,21 @@ pub struct RepositoryCommand {
impl RepositoryCommand {
pub fn configure(&mut self) {
- let suggest_repo_names_before = self.suggest_repo_names();
- let suggest_repo_names_after = self.suggest_repo_names();
- let suggest_repo_names_name = self.suggest_repo_names();
- let suggest_type_for_add = Self::suggest_type_for_add();
- self.inner.inner
+ // TODO(cli-completion): suggest_repo_names() / suggest_type_for_add()
+ self
.set_name("repository")
- .set_aliases(vec!["repo".to_string()])
+ .set_aliases(&["repo".to_string()])
.set_description("Manages repositories")
.set_definition(vec![
- InputOption::new("global", Some(PhpMixed::String("g".to_string())), Some(InputOption::VALUE_NONE), "Apply command to the global config file", None, vec![]),
- InputOption::new("file", Some(PhpMixed::String("f".to_string())), Some(InputOption::VALUE_REQUIRED), "If you want to choose a different composer.json or config.json", None, vec![]),
- InputOption::new("append", None, Some(InputOption::VALUE_NONE), "When adding a repository, append it (lower priority) instead of prepending it", None, vec![]),
- InputOption::new("before", None, Some(InputOption::VALUE_REQUIRED), "When adding a repository, insert it before the given repository name", None, suggest_repo_names_before),
- InputOption::new("after", None, Some(InputOption::VALUE_REQUIRED), "When adding a repository, insert it after the given repository name", None, suggest_repo_names_after),
- InputArgument::new("action", Some(InputArgument::OPTIONAL), "Action to perform: list, add, remove, set-url, get-url, enable, disable", Some(PhpMixed::String("list".to_string())), vec!["list", "add", "remove", "set-url", "get-url", "enable", "disable"]),
- InputArgument::new("name", Some(InputArgument::OPTIONAL), "Repository name (or special name packagist.org for enable/disable)", None, suggest_repo_names_name),
- InputArgument::new("arg1", Some(InputArgument::OPTIONAL), "Type for add, or new URL for set-url, or JSON config for add", None, suggest_type_for_add),
- InputArgument::new("arg2", Some(InputArgument::OPTIONAL), "URL for add (if not using JSON)", None, vec![]),
+ InputOption::new("global", Some(PhpMixed::String("g".to_string())), Some(InputOption::VALUE_NONE), "Apply command to the global config file", None),
+ InputOption::new("file", Some(PhpMixed::String("f".to_string())), Some(InputOption::VALUE_REQUIRED), "If you want to choose a different composer.json or config.json", None),
+ InputOption::new("append", None, Some(InputOption::VALUE_NONE), "When adding a repository, append it (lower priority) instead of prepending it", None),
+ InputOption::new("before", None, Some(InputOption::VALUE_REQUIRED), "When adding a repository, insert it before the given repository name", None),
+ InputOption::new("after", None, Some(InputOption::VALUE_REQUIRED), "When adding a repository, insert it after the given repository name", None),
+ InputArgument::new("action", Some(InputArgument::OPTIONAL), "Action to perform: list, add, remove, set-url, get-url, enable, disable", Some(PhpMixed::String("list".to_string()))),
+ InputArgument::new("name", Some(InputArgument::OPTIONAL), "Repository name (or special name packagist.org for enable/disable)", None),
+ InputArgument::new("arg1", Some(InputArgument::OPTIONAL), "Type for add, or new URL for set-url, or JSON config for add", None),
+ InputArgument::new("arg2", Some(InputArgument::OPTIONAL), "URL for add (if not using JSON)", None),
])
.set_help(
"This command lets you manage repositories in your composer.json.\n\n\
@@ -98,7 +91,7 @@ impl RepositoryCommand {
.as_string()
.map(|s| s.to_string());
- let config_data = self.inner.config_file.as_ref().unwrap().read()?;
+ let config_data = self.config_file.as_ref().unwrap().read()?;
let config_file_path = self
.inner
.config_file
@@ -106,12 +99,11 @@ impl RepositoryCommand {
.unwrap()
.get_path()
.to_string();
- self.inner
- .config
+ self.config
.as_mut()
.unwrap()
.merge(config_data, &config_file_path);
- let repos = self.inner.config.as_ref().unwrap().get_repositories();
+ let repos = self.config.as_ref().unwrap().get_repositories();
match action.as_str() {
"list" | "ls" | "show" => {
@@ -173,21 +165,17 @@ impl RepositoryCommand {
}
let reference_name = before.as_deref().or(after.as_deref()).unwrap();
let offset: i64 = if after.is_some() { 1 } else { 0 };
- self.inner
- .config_source
- .as_mut()
- .unwrap()
- .insert_repository(
- name.as_deref().unwrap(),
- repo_config,
- reference_name,
- offset,
- );
+ self.config_source.as_mut().unwrap().insert_repository(
+ name.as_deref().unwrap(),
+ repo_config,
+ reference_name,
+ offset,
+ );
return Ok(0);
}
let append = input.get_option("append").as_bool().unwrap_or(false);
- self.inner.config_source.as_mut().unwrap().add_repository(
+ self.config_source.as_mut().unwrap().add_repository(
name.as_deref().unwrap(),
repo_config,
append,
@@ -202,13 +190,12 @@ impl RepositoryCommand {
}));
}
let name_str = name.as_deref().unwrap();
- self.inner
- .config_source
+ self.config_source
.as_mut()
.unwrap()
.remove_repository(name_str);
if ["packagist", "packagist.org"].contains(&name_str) {
- self.inner.config_source.as_mut().unwrap().add_repository(
+ self.config_source.as_mut().unwrap().add_repository(
"packagist.org",
PhpMixed::Bool(false),
false,
@@ -223,8 +210,7 @@ impl RepositoryCommand {
code: 0,
}));
}
- self.inner
- .config_source
+ self.config_source
.as_mut()
.unwrap()
.set_repository_url(name.as_deref().unwrap(), arg1.as_deref().unwrap());
@@ -242,7 +228,7 @@ impl RepositoryCommand {
if let PhpMixed::Array(ref repo_map) = *repo {
let url = repo_map.get("url").and_then(|v| v.as_string());
if let Some(url) = url {
- self.inner.inner.get_io().write(url);
+ self.get_io().write(url);
return Ok(0);
}
return Err(anyhow::anyhow!(InvalidArgumentException {
@@ -257,7 +243,7 @@ impl RepositoryCommand {
if n == name_str {
let url = repo_map.get("url").and_then(|v| v.as_string());
if let Some(url) = url {
- self.inner.inner.get_io().write(url);
+ self.get_io().write(url);
return Ok(0);
}
return Err(anyhow::anyhow!(InvalidArgumentException {
@@ -286,7 +272,7 @@ impl RepositoryCommand {
let name_str = name.as_deref().unwrap();
if ["packagist", "packagist.org"].contains(&name_str) {
let append = input.get_option("append").as_bool().unwrap_or(false);
- self.inner.config_source.as_mut().unwrap().add_repository(
+ self.config_source.as_mut().unwrap().add_repository(
"packagist.org",
PhpMixed::Bool(false),
append,
@@ -307,8 +293,7 @@ impl RepositoryCommand {
}
let name_str = name.as_deref().unwrap();
if ["packagist", "packagist.org"].contains(&name_str) {
- self.inner
- .config_source
+ self.config_source
.as_mut()
.unwrap()
.remove_repository("packagist.org");
@@ -331,7 +316,7 @@ impl RepositoryCommand {
}
fn list_repositories(&self, mut repos: IndexMap<String, PhpMixed>) {
- let io = self.inner.inner.get_io();
+ let io = self.get_io();
let mut packagist_present = false;
for (_key, repo) in &repos {
@@ -396,84 +381,14 @@ impl RepositoryCommand {
.get("url")
.and_then(|v| v.as_string())
.map(|s| s.to_string())
- .unwrap_or_else(|| JsonFile::encode(repo));
+ .unwrap_or_else(|| JsonFile::encode(repo, 448));
io.write(&format!("[{}] <info>{}</info> {}", name, r#type, url));
}
}
}
- fn suggest_type_for_add() -> Box<dyn Fn(&CompletionInput) -> Vec<String>> {
- Box::new(|input: &CompletionInput| {
- if input.get_argument("action").as_string() == Some("add") {
- vec![
- "composer".to_string(),
- "vcs".to_string(),
- "artifact".to_string(),
- "path".to_string(),
- ]
- } else {
- vec![]
- }
- })
- }
-
- fn suggest_repo_names(&self) -> Box<dyn Fn(&CompletionInput) -> Vec<String> + '_> {
- Box::new(move |input: &CompletionInput| {
- let action = input
- .get_argument("action")
- .as_string()
- .unwrap_or("")
- .to_string();
- if ["enable", "disable"].contains(&action.as_str()) {
- return vec!["packagist.org".to_string()];
- }
- if !["remove", "set-url", "get-url"].contains(&action.as_str()) {
- return vec![];
- }
- let config = Factory::create_config(None, None).unwrap();
- let config_file_path = self.inner.get_composer_config_file(input, &config);
- let config_file = JsonFile::new(config_file_path, None, None);
- let data = config_file.read().unwrap_or_default();
- let mut repos = vec![];
- if let Some(repositories) = data.get("repositories").and_then(|v| v.as_list()) {
- for repo in repositories {
- if let PhpMixed::Array(ref repo_map) = **repo {
- if let Some(name) = repo_map.get("name").and_then(|v| v.as_string()) {
- repos.push(name.to_string());
- }
- }
- }
- }
- repos.sort();
- repos
- })
- }
-}
-
-impl BaseCommand for RepositoryCommand {
- fn inner(&self) -> &CommandBase {
- &self.inner
- }
-
- fn inner_mut(&mut self) -> &mut CommandBase {
- &mut self.inner
- }
-
- fn composer(&self) -> Option<&Composer> {
- self.composer.as_ref()
- }
-
- fn composer_mut(&mut self) -> &mut Option<Composer> {
- &mut self.composer
- }
-
- fn io(&self) -> Option<&dyn IOInterface> {
- self.io.as_deref()
- }
-
- fn io_mut(&mut self) -> &mut Option<Box<dyn IOInterface>> {
- &mut self.io
- }
+ // TODO(cli-completion): fn suggest_type_for_add()
+ // TODO(cli-completion): fn suggest_repo_names(&self)
}
impl BaseConfigCommand for RepositoryCommand {
@@ -502,4 +417,12 @@ impl BaseConfigCommand for RepositoryCommand {
}
}
-impl Command for RepositoryCommand {}
+impl HasBaseCommandData for RepositoryCommand {
+ fn base_command_data(&self) -> &BaseCommandData {
+ &self.base_command_data
+ }
+
+ fn base_command_data_mut(&mut self) -> &mut BaseCommandData {
+ &mut self.base_command_data
+ }
+}