prepare better repository resolution
This commit is contained in:
parent
935bfb4139
commit
ab651b9b97
8 changed files with 134 additions and 99 deletions
|
|
@ -11,8 +11,9 @@ fn main() {
|
||||||
} else {
|
} else {
|
||||||
PathBuf::from(&args[1])
|
PathBuf::from(&args[1])
|
||||||
};
|
};
|
||||||
|
|
||||||
let project = parse_project(&dir).unwrap();
|
let project = parse_project(&dir).unwrap();
|
||||||
get_settings().unwrap();
|
|
||||||
fs::write(
|
fs::write(
|
||||||
PathBuf::from("index.html"),
|
PathBuf::from("index.html"),
|
||||||
project.generate_dependency_html(),
|
project.generate_dependency_html(),
|
||||||
|
|
|
||||||
79
src/maven/common_model.rs
Normal file
79
src/maven/common_model.rs
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
use crate::xml::dom_parser::Node;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Repository {
|
||||||
|
pub releases: Option<RepositoryPolicy>,
|
||||||
|
pub snapshots: Option<RepositoryPolicy>,
|
||||||
|
pub id: Option<String>,
|
||||||
|
pub name: Option<String>,
|
||||||
|
pub url: Option<String>,
|
||||||
|
pub layout: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct RepositoryPolicy {
|
||||||
|
pub enabled: bool,
|
||||||
|
pub update_policy: Option<String>,
|
||||||
|
pub checksum_policy: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_repositories(element: Node) -> Vec<Repository> {
|
||||||
|
let mut repositories = vec![];
|
||||||
|
|
||||||
|
for child in element.children {
|
||||||
|
match child.name.as_str() {
|
||||||
|
"repository" => repositories.push(get_repository(child)),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
repositories
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_repository(element: Node) -> Repository {
|
||||||
|
let mut releases = None;
|
||||||
|
let mut snapshots = None;
|
||||||
|
let mut id = None;
|
||||||
|
let mut name = None;
|
||||||
|
let mut url = None;
|
||||||
|
let mut layout = "default".to_owned();
|
||||||
|
|
||||||
|
for child in element.children {
|
||||||
|
match child.name.as_str() {
|
||||||
|
"releases" => releases = Some(get_update_policy(child)),
|
||||||
|
"snapshots" => snapshots = Some(get_update_policy(child)),
|
||||||
|
"id" => id = child.text,
|
||||||
|
"name" => name = child.text,
|
||||||
|
"url" => url = child.text,
|
||||||
|
"layout" => layout = child.text.unwrap_or("default".to_owned()),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Repository {
|
||||||
|
releases,
|
||||||
|
snapshots,
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
url,
|
||||||
|
layout,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_update_policy(element: Node) -> RepositoryPolicy {
|
||||||
|
let mut enabled = true;
|
||||||
|
let mut update_policy = None;
|
||||||
|
let mut checksum_policy = None;
|
||||||
|
|
||||||
|
for child in element.children {
|
||||||
|
match child.name.as_str() {
|
||||||
|
"enabled" => enabled = child.text.map(|b| b == "true").unwrap_or(true),
|
||||||
|
"update_policy" => update_policy = child.text,
|
||||||
|
"checksum_policy" => checksum_policy = child.text,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RepositoryPolicy {
|
||||||
|
enabled,
|
||||||
|
update_policy,
|
||||||
|
checksum_policy,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use std::{env, sync::LazyLock};
|
use std::{env, sync::LazyLock};
|
||||||
|
|
||||||
|
pub mod common_model;
|
||||||
pub mod metadata;
|
pub mod metadata;
|
||||||
pub mod pom;
|
pub mod pom;
|
||||||
pub mod pom_parser;
|
pub mod pom_parser;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use std::path::PathBuf;
|
||||||
|
|
||||||
/// the maven object model
|
/// the maven object model
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Pom {
|
pub struct Pom {
|
||||||
pub parent: Option<Parent>,
|
pub parent: Option<Parent>,
|
||||||
pub group_id: Option<String>,
|
pub group_id: Option<String>,
|
||||||
|
|
@ -19,6 +19,7 @@ pub struct Pom {
|
||||||
pub module_names: Vec<String>,
|
pub module_names: Vec<String>,
|
||||||
pub modules: Vec<Pom>,
|
pub modules: Vec<Pom>,
|
||||||
pub directory: PathBuf,
|
pub directory: PathBuf,
|
||||||
|
pub repositories: Vec<Repository>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Pom {}
|
impl Pom {}
|
||||||
|
|
@ -72,11 +73,19 @@ impl Dependency {
|
||||||
absolute_path.push(self.to_jar_path());
|
absolute_path.push(self.to_jar_path());
|
||||||
absolute_path
|
absolute_path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_snapshot(&self) -> bool {
|
||||||
|
self.version
|
||||||
|
.as_ref()
|
||||||
|
.map(|v| v.ends_with("SNAPSHOT"))
|
||||||
|
.unwrap_or(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use crate::maven::HOME;
|
use crate::maven::HOME;
|
||||||
|
use crate::maven::common_model::Repository;
|
||||||
|
|
||||||
impl Display for Dependency {
|
impl Display for Dependency {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::maven::common_model::get_repositories;
|
||||||
use crate::maven::pom::{Dependency, Developer, Parent, Pom};
|
use crate::maven::pom::{Dependency, Developer, Parent, Pom};
|
||||||
use crate::xml::SaxError;
|
use crate::xml::SaxError;
|
||||||
use crate::xml::dom_parser::{Node, get_document};
|
use crate::xml::dom_parser::{Node, get_document};
|
||||||
|
|
@ -17,6 +18,7 @@ pub fn get_pom(home_dir: PathBuf, xml: impl Into<String>) -> Result<Pom, SaxErro
|
||||||
let mut dependency_management = vec![];
|
let mut dependency_management = vec![];
|
||||||
let mut properties = HashMap::new(); // useless assignments...
|
let mut properties = HashMap::new(); // useless assignments...
|
||||||
let mut module_names = vec![]; // not useless assignment...
|
let mut module_names = vec![]; // not useless assignment...
|
||||||
|
let mut repositories = vec![]; // not useless assignment...
|
||||||
|
|
||||||
for child in get_document(xml.into().as_str())?.root.children {
|
for child in get_document(xml.into().as_str())?.root.children {
|
||||||
match child.name.as_str() {
|
match child.name.as_str() {
|
||||||
|
|
@ -31,9 +33,16 @@ pub fn get_pom(home_dir: PathBuf, xml: impl Into<String>) -> Result<Pom, SaxErro
|
||||||
"dependencyManagement" => dependency_management = get_dependency_mgmt(child),
|
"dependencyManagement" => dependency_management = get_dependency_mgmt(child),
|
||||||
"properties" => properties = get_properties(child),
|
"properties" => properties = get_properties(child),
|
||||||
"modules" => add_modules(child, &mut module_names),
|
"modules" => add_modules(child, &mut module_names),
|
||||||
|
"repositories" => repositories = get_repositories(child),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO before returning, calculate all
|
||||||
|
// * dependency versions
|
||||||
|
// * repositories
|
||||||
|
// maybe put that in a separate model struct
|
||||||
|
|
||||||
Ok(Pom {
|
Ok(Pom {
|
||||||
parent,
|
parent,
|
||||||
group_id,
|
group_id,
|
||||||
|
|
@ -48,10 +57,11 @@ pub fn get_pom(home_dir: PathBuf, xml: impl Into<String>) -> Result<Pom, SaxErro
|
||||||
module_names,
|
module_names,
|
||||||
modules: vec![],
|
modules: vec![],
|
||||||
directory: home_dir,
|
directory: home_dir,
|
||||||
|
repositories,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_modules(element: Node, modules: &mut Vec<String>){
|
fn add_modules(element: Node, modules: &mut Vec<String>) {
|
||||||
for module in element.children {
|
for module in element.children {
|
||||||
modules.push(module.text.expect("Cannot read module name"));
|
modules.push(module.text.expect("Cannot read module name"));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::maven::pom::{Dependency, Pom};
|
use crate::maven::pom::{Dependency, Pom};
|
||||||
use crate::maven::pom_parser::get_pom;
|
use crate::maven::pom_parser::get_pom;
|
||||||
|
use crate::maven::settings::{Settings, get_settings};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
@ -29,9 +30,14 @@ pub fn parse_project(project_dir: &Path) -> Result<Project, String> {
|
||||||
let mut root = get_pom(project_dir.to_path_buf(), pom_file).map_err(|e| e.to_string())?;
|
let mut root = get_pom(project_dir.to_path_buf(), pom_file).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
resolve_modules(project_dir, &mut root);
|
resolve_modules(project_dir, &mut root);
|
||||||
let project_home = project_dir.to_str().unwrap_or_else(|| "?").to_string(); //TODO unwrap can fail??
|
let project_home = project_dir.to_str().unwrap_or_else(|| "?").to_string()
|
||||||
|
let settings = get_settings()?;
|
||||||
|
|
||||||
Ok(Project { project_home, root })
|
Ok(Project {
|
||||||
|
settings,
|
||||||
|
project_home,
|
||||||
|
root,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// examines modules in pom and loads them
|
// examines modules in pom and loads them
|
||||||
|
|
@ -63,12 +69,15 @@ fn read_module_pom(project_dir: &Path, module: &String) -> Pom {
|
||||||
//the (root) pom holds the child references to modules
|
//the (root) pom holds the child references to modules
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Project {
|
pub struct Project {
|
||||||
|
pub settings: Settings,
|
||||||
pub project_home: String,
|
pub project_home: String,
|
||||||
pub root: Pom,
|
pub root: Pom,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Project {
|
impl Project {
|
||||||
/// get a list of dependencies for a pom in the project
|
/// get a list of dependencies for a pom in the project
|
||||||
|
///
|
||||||
|
/// Note to self: maybe calculating the versions should be done earlier
|
||||||
pub fn get_dependencies(&self, pom: &Pom) -> Vec<Dependency> {
|
pub fn get_dependencies(&self, pom: &Pom) -> Vec<Dependency> {
|
||||||
pom.dependencies
|
pom.dependencies
|
||||||
.iter()
|
.iter()
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::maven::pom::Dependency;
|
use crate::maven::pom::{Dependency, Pom};
|
||||||
use crate::maven::project::Project;
|
use crate::maven::project::Project;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
@ -13,11 +13,11 @@ const MAVEN_CENTRAL: &str = "https://repo1.maven.org/maven2/";
|
||||||
|
|
||||||
// TODO should not be downloading dependencies
|
// TODO should not be downloading dependencies
|
||||||
pub fn report(project: &Project) {
|
pub fn report(project: &Project) {
|
||||||
let pom = &project.root;
|
let pom = &project.root; // TODO other modules
|
||||||
for dep in &project.get_dependencies(pom) {
|
for dep in &project.get_dependencies(pom) {
|
||||||
let path = PathBuf::from(dep.to_absolute_jar_path());
|
let path = PathBuf::from(dep.to_absolute_jar_path());
|
||||||
if !path.exists() {
|
if !path.exists() {
|
||||||
download(dep).expect(&format!("Can't download jar file {}", dep));
|
download(&pom, dep).expect(&format!("Can't download jar file {}", dep));
|
||||||
}
|
}
|
||||||
let jar_file = File::open(dep.to_absolute_jar_path()).expect("Can't open jar file");
|
let jar_file = File::open(dep.to_absolute_jar_path()).expect("Can't open jar file");
|
||||||
let mut archive = ZipArchive::new(jar_file).expect("Can't read jar file");
|
let mut archive = ZipArchive::new(jar_file).expect("Can't read jar file");
|
||||||
|
|
@ -33,22 +33,23 @@ pub fn report(project: &Project) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut src_main_java = pom.directory.clone();
|
analyse_source(&packages, &new_path(&pom.directory, "src/main/java"));
|
||||||
src_main_java.push("src/main/java"); //TODO other src directories
|
analyse_source(&packages, &new_path(&pom.directory, "src/test/java")); //TODO other src dirs, generated src
|
||||||
|
|
||||||
traverse(&packages, &src_main_java);
|
|
||||||
|
|
||||||
let mut src_test_java = pom.directory.clone();
|
|
||||||
src_test_java.push("src/test/java"); //TODO other src directories
|
|
||||||
|
|
||||||
traverse(&packages, &src_test_java);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_path(dir: &PathBuf, child: &str) -> PathBuf {
|
||||||
|
let mut new_dir = dir.clone();
|
||||||
|
new_dir.push(child);
|
||||||
|
new_dir
|
||||||
|
}
|
||||||
|
|
||||||
use reqwest::blocking::Client;
|
use reqwest::blocking::Client;
|
||||||
|
|
||||||
fn download(dep: &Dependency) -> Result<(), String> {
|
fn download(pom: &Pom, dep: &Dependency) -> Result<(), String> {
|
||||||
//TODO inspect settings.xml
|
//TODO inspect settings.xml
|
||||||
|
// gather repositories
|
||||||
|
// pom.repositories
|
||||||
|
|
||||||
let url = format!("{}{}.jar", MAVEN_CENTRAL, dep);
|
let url = format!("{}{}.jar", MAVEN_CENTRAL, dep);
|
||||||
|
|
||||||
|
|
@ -75,13 +76,13 @@ fn download(dep: &Dependency) -> Result<(), String> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn traverse(packages: &HashSet<String>, dir: &Path) {
|
fn analyse_source(packages: &HashSet<String>, dir: &Path) {
|
||||||
if dir.exists() {
|
if dir.exists() {
|
||||||
for entry in dir.read_dir().unwrap() {
|
for entry in dir.read_dir().unwrap() {
|
||||||
let entry = entry.unwrap();
|
let entry = entry.unwrap();
|
||||||
let path = entry.path();
|
let path = entry.path();
|
||||||
if path.is_dir() {
|
if path.is_dir() {
|
||||||
traverse(packages, &path);
|
analyse_source(packages, &path);
|
||||||
} else {
|
} else {
|
||||||
if path.extension().unwrap() == "java" {
|
if path.extension().unwrap() == "java" {
|
||||||
analyse(packages, &path);
|
analyse(packages, &path);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
use std::{fs, path::PathBuf, str::FromStr};
|
use std::{fs, path::PathBuf, str::FromStr};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
maven::{CUSTOM_SETTINGS_LOCATION, HOME, MAVEN_HOME},
|
maven::{
|
||||||
|
CUSTOM_SETTINGS_LOCATION, HOME, MAVEN_HOME,
|
||||||
|
common_model::{Repository, get_repositories},
|
||||||
|
},
|
||||||
xml::dom_parser::{Node, get_document},
|
xml::dom_parser::{Node, get_document},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -278,67 +281,6 @@ fn get_properties(element: Node) -> Vec<Property> {
|
||||||
properties
|
properties
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_repositories(element: Node) -> Vec<Repository> {
|
|
||||||
let mut repositories = vec![];
|
|
||||||
|
|
||||||
for child in element.children {
|
|
||||||
match child.name.as_str() {
|
|
||||||
"repository" => repositories.push(get_repository(child)),
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
repositories
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_repository(element: Node) -> Repository {
|
|
||||||
let mut releases = None;
|
|
||||||
let mut snapshots = None;
|
|
||||||
let mut id = None;
|
|
||||||
let mut name = None;
|
|
||||||
let mut url = None;
|
|
||||||
let mut layout = "default".to_owned();
|
|
||||||
|
|
||||||
for child in element.children {
|
|
||||||
match child.name.as_str() {
|
|
||||||
"releases" => releases = Some(get_update_policy(child)),
|
|
||||||
"snapshots" => snapshots = Some(get_update_policy(child)),
|
|
||||||
"id" => id = child.text,
|
|
||||||
"name" => name = child.text,
|
|
||||||
"url" => url = child.text,
|
|
||||||
"layout" => layout = child.text.unwrap_or("default".to_owned()),
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Repository {
|
|
||||||
releases,
|
|
||||||
snapshots,
|
|
||||||
id,
|
|
||||||
name,
|
|
||||||
url,
|
|
||||||
layout,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_update_policy(element: Node) -> RepositoryPolicy {
|
|
||||||
let mut enabled = true;
|
|
||||||
let mut update_policy = None;
|
|
||||||
let mut checksum_policy = None;
|
|
||||||
|
|
||||||
for child in element.children {
|
|
||||||
match child.name.as_str() {
|
|
||||||
"enabled" => enabled = child.text.map(|b| b == "true").unwrap_or(true),
|
|
||||||
"update_policy" => update_policy = child.text,
|
|
||||||
"checksum_policy" => checksum_policy = child.text,
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RepositoryPolicy {
|
|
||||||
enabled,
|
|
||||||
update_policy,
|
|
||||||
checksum_policy,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_activation_os(element: Node) -> ActivationOs {
|
fn get_activation_os(element: Node) -> ActivationOs {
|
||||||
let mut name = None;
|
let mut name = None;
|
||||||
let mut family = None;
|
let mut family = None;
|
||||||
|
|
@ -496,20 +438,3 @@ pub struct Property {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub value: Option<String>,
|
pub value: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct Repository {
|
|
||||||
pub releases: Option<RepositoryPolicy>,
|
|
||||||
pub snapshots: Option<RepositoryPolicy>,
|
|
||||||
pub id: Option<String>,
|
|
||||||
pub name: Option<String>,
|
|
||||||
pub url: Option<String>,
|
|
||||||
pub layout: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct RepositoryPolicy {
|
|
||||||
pub enabled: bool,
|
|
||||||
pub update_policy: Option<String>,
|
|
||||||
pub checksum_policy: Option<String>,
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue