1
0
mirror of https://github.com/jht5945/buildj.git synced 2026-01-12 16:20:05 +08:00

Compare commits

...

30 Commits

Author SHA1 Message Date
ec27eaa877 feat: update version 2022-09-30 22:54:46 +08:00
26de9ddcc6 feat: v0.1.10, fix java_home on macOS 2021-06-19 14:02:33 +08:00
0a02a56d57 feat: v0.1.9 supports more java commands 2021-04-10 00:31:36 +08:00
186c08a8f5 feat: update version and using simple_error 2021-02-06 11:01:08 +08:00
7248796b2e fix: fix github 2021-02-06 00:31:18 +08:00
1e933bde6b fix: quick fix buildj 2021-02-04 23:34:14 +08:00
9b152d2af1 feat: update version 2021-02-04 23:26:58 +08:00
025b38f7c9 feat: update version 2021-02-04 23:26:29 +08:00
0808508e1a chore: version 2021-02-04 23:23:18 +08:00
ff2e103c4a chore: add install cmd 2020-12-29 00:01:22 +08:00
5aebb24a11 chore: add home, license ,desc 2020-12-26 22:26:22 +08:00
b115226ad3 chore: update dependency 2020-12-26 22:23:04 +08:00
84cc14efd7 chore: merge 2020-12-26 22:22:05 +08:00
bd52eb6042 feat: exit with non 0, when fails 2020-12-26 22:21:17 +08:00
86587e1519 chore: add url 2020-10-11 16:52:00 +08:00
46d57c622c chore: update README 2020-10-11 16:37:59 +08:00
ecdbf4a11f feat: master page 2020-10-11 16:33:33 +08:00
6fa4b60bc4 chore: code style 2020-09-20 17:36:27 +08:00
e227603ab2 feat: use rust_util 0.6.15 2020-09-20 16:59:50 +08:00
c214a53219 feat: update dependencies 2020-09-13 19:51:15 +08:00
7ee4ef2b57 style: code style 2020-08-02 19:10:01 +08:00
84adb46365 chore: use usage.txt file 2020-08-02 18:47:37 +08:00
4160011cab style: code style 2020-08-02 15:58:55 +08:00
f21f124add style: code style 2020-08-02 15:55:20 +08:00
654bf56c0c style: code style 2020-08-02 15:53:48 +08:00
220ae2e8a9 style: code style 2020-08-02 14:39:29 +08:00
ffb253e239 style: use rust_util s macros 2020-08-02 14:25:29 +08:00
de23b593fe style: use rust_util s macros 2020-08-02 12:08:07 +08:00
ddf1c54d5d style: use rust_util s macros 2020-08-02 12:01:51 +08:00
7d5b2b4294 style: use rust_util s macros 2020-08-02 12:00:20 +08:00
15 changed files with 1066 additions and 1518 deletions

1
.gitignore vendored
View File

@@ -1,6 +1,7 @@
# Generated by Cargo # Generated by Cargo
# will have compiled files and executables # will have compiled files and executables
/target/ /target/
.idea/
# These are backup files generated by rustfmt # These are backup files generated by rustfmt
**/*.rs.bk **/*.rs.bk

1
CNAME Normal file
View File

@@ -0,0 +1 @@
buildj.ruststack.org

1851
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +1,19 @@
[package] [package]
name = "buildj" name = "buildj"
version = "0.1.2" version = "0.1.10"
authors = ["Hatter Jiang <jht5945@gmail.com>"] authors = ["Hatter Jiang <jht5945@gmail.com>"]
edition = "2018" edition = "2018"
homepage = "https://buildj.ruststack.org/"
license = "MIT"
description = "A java build tool"
[dependencies] [dependencies]
json = "0.11.14" json = "0.12"
term = "0.5.2" term = "0.7"
reqwest = "0.9.18" reqwest = { version = "0.11", features = [ "blocking" ] }
urlencoding = "1.0.0" urlencoding = "1.1"
dirs = "2.0.1" dirs = "3.0"
rust-crypto = "0.2.36" rust-crypto = "0.2"
lazy_static = "1.3.0" lazy_static = "1.4"
rust_util = "0.2.3" rust_util = "0.6"
plist = "1.1"

View File

@@ -1,15 +1,19 @@
# buildj # buildj
buildj - java build tool buildj - java build tool, website: [https://buildj.ruststack.org/](https://buildj.ruststack.org/)
#### Install ## Install
``` ```
cargo install --git https://github.com/jht5945/buildj [--force] cargo install --git https://github.com/jht5945/buildj [--force]
OR
cargo install buildj [--force]
``` ```
#### Usage ## Usage
Help: ### Help
``` ```
$ buildj ::: $ buildj :::
[INFO] buildj - version 0.1 [INFO] buildj - version 0.1
@@ -25,7 +29,7 @@ buildj :::gradle<version> ]--java<version>] - run gradle with assigne
buildj - run build, run assigned version builder tool buildj - run build, run assigned version builder tool
``` ```
Run Java: ### Run Java
``` ```
$ buildj :::java9 -version $ buildj :::java9 -version
[INFO] buildj - version 0.1 [INFO] buildj - version 0.1
@@ -50,7 +54,7 @@ Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.4", arch: "x86_64", family: "mac" OS name: "mac os x", version: "10.14.4", arch: "x86_64", family: "mac"
``` ```
Run Gradle: ### Run Gradle
``` ```
$ buildj :::gradle3.5.1 -version $ buildj :::gradle3.5.1 -version
[INFO] buildj - version 0.1 [INFO] buildj - version 0.1
@@ -127,6 +131,3 @@ Use xRuns in build:
``` ```
Command: `buildj ...pub` Command: `buildj ...pub`

2
_config.yml Normal file
View File

@@ -0,0 +1,2 @@
theme: jekyll-theme-slate
show_downloads: true

View File

@@ -7,4 +7,7 @@ fn main() {
let date_output = Command::new("date").args(&["+%Y-%m-%dT%H:%M:%S%z"]).output().unwrap(); let date_output = Command::new("date").args(&["+%Y-%m-%dT%H:%M:%S%z"]).output().unwrap();
let date = String::from_utf8(date_output.stdout).unwrap(); let date = String::from_utf8(date_output.stdout).unwrap();
println!("cargo:rustc-env=BUILD_DATE={}", date); println!("cargo:rustc-env=BUILD_DATE={}", date);
let date_year_output = Command::new("date").args(&["+%Y"]).output().unwrap();
let date_year = String::from_utf8(date_year_output.stdout).unwrap();
println!("cargo:rustc-env=BUILD_YEAR={}", date_year)
} }

View File

@@ -1,19 +1,8 @@
use std::{ fs, path::Path, }; use std::{fs, path::Path};
use rust_util::XResult;
use rust_util::{ use crate::http::get_url_content;
iff, use crate::misc::VERBOSE;
XResult,
new_box_ioerror,
util_msg::{
print_ok,
print_debug,
print_warn,
print_error,
}
};
use super::http::get_url_content;
use super::misc::VERBOSE;
pub const BUILD_JSON: &str = "build.json"; pub const BUILD_JSON: &str = "build.json";
@@ -21,7 +10,7 @@ const GET_ARCHIVER_VERSION_URL: &str= "https://hatter.ink/repo/archive_info_vers
pub fn get_archive_version(gid: &str, aid: &str) -> XResult<String> { pub fn get_archive_version(gid: &str, aid: &str) -> XResult<String> {
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Start get archive info: {}:{}", gid, aid)); debugging!("Start get archive info: {}:{}", gid, aid);
} }
let mut url = String::with_capacity(1024); let mut url = String::with_capacity(1024);
url.push_str(GET_ARCHIVER_VERSION_URL); url.push_str(GET_ARCHIVER_VERSION_URL);
@@ -31,11 +20,11 @@ pub fn get_archive_version(gid: &str, aid: &str) -> XResult<String> {
url.push_str(&urlencoding::encode(aid)); url.push_str(&urlencoding::encode(aid));
let version_result = get_url_content(url.as_str())?; let version_result = get_url_content(url.as_str())?;
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Get archive result: {}", version_result)); debugging!("Get archive result: {}", version_result);
} }
let version_result_object = json::parse(&version_result)?; let version_result_object = json::parse(&version_result)?;
if version_result_object["status"] != 200 { if version_result_object["status"] != 200 {
Err(new_box_ioerror(&format!("Get archive info version failed: {}", version_result))) simple_error!("Get archive info version failed: {}", version_result)
} else { } else {
Ok(version_result_object["data"].to_string()) Ok(version_result_object["data"].to_string())
} }
@@ -43,7 +32,7 @@ pub fn get_archive_version(gid: &str, aid: &str) -> XResult<String> {
pub fn create_build_json(args: &[String]) { pub fn create_build_json(args: &[String]) {
if find_build_json_in_current().is_some() { if find_build_json_in_current().is_some() {
print_error(&format!("File exits: {}", BUILD_JSON)); failure!("File exits: {}", BUILD_JSON);
return; return;
} }
@@ -62,7 +51,7 @@ pub fn create_build_json(args: &[String]) {
} }
} }
if java_version.is_empty() || builder.is_empty() || builder_version.is_empty() { if java_version.is_empty() || builder.is_empty() || builder_version.is_empty() {
print_error("Args java version, builder or builder version is not assigned or format error."); failure!("Args java version, builder or builder version is not assigned or format error.");
return; return;
} }
let mut build_json_object = object!{ let mut build_json_object = object!{
@@ -73,7 +62,7 @@ pub fn create_build_json(args: &[String]) {
}, },
}; };
match get_archive_version("me.hatter", "commons") { match get_archive_version("me.hatter", "commons") {
Err(err) => print_error(&format!("Get me.hatter:commons version failed: {}", err)), Err(err) => failure!("Get me.hatter:commons version failed: {}", err),
Ok(ver) => build_json_object["repo"] = object! { Ok(ver) => build_json_object["repo"] = object! {
"dependencies" => array! [ "dependencies" => array! [
format!("me.hatter:commons:{}", ver).as_str() format!("me.hatter:commons:{}", ver).as_str()
@@ -81,8 +70,8 @@ pub fn create_build_json(args: &[String]) {
}, },
} }
match fs::write(BUILD_JSON, json::stringify_pretty(build_json_object, 4)) { match fs::write(BUILD_JSON, json::stringify_pretty(build_json_object, 4)) {
Ok(_) => print_ok(&format!("Write file success: {}", BUILD_JSON)), Ok(_) => success!("Write file success: {}", BUILD_JSON),
Err(err) => print_error(&format!("Write file failed: {}, error message: {}", BUILD_JSON, err)), Err(err) => failure!("Write file failed: {}, error message: {}", BUILD_JSON, err),
} }
} }
@@ -99,7 +88,7 @@ pub fn find_build_json_in_parents() -> Option<String> {
loop { loop {
loop_count += 1_usize; loop_count += 1_usize;
if loop_count > 100_usize { if loop_count > 100_usize {
print_error("Find build.json loop more than 100 loop!"); failure!("Find build.json loop more than 100 loop!");
return None; return None;
} }
@@ -117,17 +106,17 @@ pub fn find_build_json_in_parents() -> Option<String> {
} }
pub fn find_build_json() -> Option<String> { pub fn find_build_json() -> Option<String> {
match find_build_json_in_current() { if let Some(p) = find_build_json_in_current() {
Some(p) => Some(p), return Some(p);
None => match find_build_json_in_parents() { }
match find_build_json_in_parents() {
Some(p) => { Some(p) => {
print_warn(&format!("Cannot find {} in current dir, find: {}", BUILD_JSON, p)); warning!("Cannot find {} in current dir, find: {}", BUILD_JSON, p);
Some(p) Some(p)
}, },
None => { None => {
print_error(&format!("Cannot find {}", BUILD_JSON)); failure!("Cannot find {}", BUILD_JSON);
None None
}, },
},
} }
} }

View File

@@ -1,48 +1,35 @@
use std::fs::File; use std::fs::File;
use rust_util::{XResult, util_io};
use rust_util::{ use crate::misc::VERBOSE;
XResult,
util_io::copy_io,
util_msg::{
print_debug,
print_warn,
},
};
use super::misc::VERBOSE;
pub fn download_url(url: &str, dest: &mut File) -> XResult<()> { pub fn download_url(url: &str, dest: &mut File) -> XResult<()> {
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Start download URL: {}", url)); debugging!("Start download URL: {}", url);
} }
let mut response = reqwest::get(url)?; let mut response = reqwest::blocking::get(url)?;
let header_content_length: i64 = match response.headers().get("content-length") { let header_content_length: i64 = match response.headers().get("content-length") {
None => -1_i64, None => -1_i64, Some(len_value) => {
Some(len_value) => { let len_str = len_value.to_str().unwrap_or_else(|err| {
let len_str = match len_value.to_str() { warning!("Get content length for {:?}, error: {}", len_value, err);
Ok(len_str) => len_str, Err(err) => {
print_warn(&format!("Get content length for {:?}, error: {}", len_value, err));
"-1" "-1"
}, });
}; len_str.parse::<i64>().unwrap_or_else(|err| {
match len_str.parse::<i64>() { warning!("Get content length for {:?}, error: {}", len_value, err);
Ok(len) => len, Err(err) => {
print_warn(&format!("Get content length for {:?}, error: {}", len_value, err));
-1 -1
} })
}
}, },
}; };
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Content-Length: {}", header_content_length)); debugging!("Content-Length: {}", header_content_length);
} }
copy_io(&mut response, dest, header_content_length)?; util_io::copy_io_default(&mut response, dest, header_content_length)?;
Ok(()) Ok(())
} }
pub fn get_url_content(url: &str) -> XResult<String> { pub fn get_url_content(url: &str) -> XResult<String> {
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Get URL: {}", url)); debugging!("Get URL: {}", url);
} }
Ok(reqwest::get(url)?.text()?) Ok(reqwest::blocking::get(url)?.text()?)
} }

View File

@@ -1,24 +1,8 @@
use std::{ use std::{collections::HashMap, env, fs, str, path::Path, process::Command};
collections::HashMap, use rust_util::util_os;
env, use rust_util::util_env;
fs, use crate::{local_util, tool, misc::VERBOSE};
str, use plist::Value;
path::Path,
process::Command,
};
use rust_util::{
iff,
util_os::*,
util_msg::{
print_error,
print_debug,
},
};
use super::{
local_util,
tool,
misc::*,
};
const PATH: &str = "PATH"; const PATH: &str = "PATH";
const JAVA_HOME: &str = "JAVA_HOME"; const JAVA_HOME: &str = "JAVA_HOME";
@@ -46,13 +30,13 @@ pub fn get_java_home(version: &str) -> Option<String> {
} }
pub fn get_cloud_java(version: &str) -> bool { pub fn get_cloud_java(version: &str) -> bool {
if ! is_macos_or_linux() { if !util_os::is_macos_or_linux() {
return false; return false;
} }
let cloud_java_names = match &*BUILDJ_JAVA_NAME { let cloud_java_names = match &*BUILDJ_JAVA_NAME {
None => if is_macos() { None => if util_os::is_macos() {
vec![OPENJDK_MACOS] vec![OPENJDK_MACOS]
} else if is_linux() { } else if util_os::is_linux() {
vec![JDK_LINUX, OPENJDK_LINUX] vec![JDK_LINUX, OPENJDK_LINUX]
} else { } else {
vec![] vec![]
@@ -60,31 +44,52 @@ pub fn get_cloud_java(version: &str) -> bool {
Some(buildj_java_name) => vec![buildj_java_name.as_str()], Some(buildj_java_name) => vec![buildj_java_name.as_str()],
}; };
let local_java_home_base_dir = match local_util::get_user_home_dir(LOCAL_JAVA_HOME_BASE_DIR) { let local_java_home_base_dir = match local_util::get_user_home_dir(LOCAL_JAVA_HOME_BASE_DIR) {
Ok(o) => o, Err(_) => return false, Ok(o) => o,
Err(_) => return false,
}; };
for cloud_java_name in cloud_java_names { for cloud_java_name in cloud_java_names {
if tool::get_and_extract_tool_package(&local_java_home_base_dir, false, cloud_java_name, version, false).is_ok() { if tool::get_and_extract_tool_package(&local_java_home_base_dir, false, cloud_java_name, version, false).is_ok() {
return true; return true;
} }
} }
print_error(&format!("Get java failed, version: {}", version)); failure!("Get java failed, version: {}", version);
false false
} }
pub fn get_macos_java_home(version: &str) -> Option<String> { pub fn get_macos_java_home(version: &str) -> Option<String> {
if ! is_macos() { if !util_os::is_macos() || util_env::is_env_on("SKIP_CHECK_JAVA_HOME") {
return None; return None;
} }
let output = Command::new(MACOS_LIBEXEC_JAVAHOME).arg("-version").arg(version).output().ok()?; let java_home_x = Command::new(MACOS_LIBEXEC_JAVAHOME).arg("-x").output().ok()?;
let output_in_utf8 = str::from_utf8(&output.stderr).ok()?; let java_home_plist_value = match Value::from_reader_xml(&*java_home_x.stdout) {
if *VERBOSE { Err(e) => {
print_debug(&format!("java_home outputs: {}", output_in_utf8)); debugging!("Parse java_home outputs failed: {}", e);
return None;
}
Ok(val) => val,
};
let java_home_plist_value_array = match java_home_plist_value.as_array() {
None => {
debugging!("Covert java_home plist output to array failed: {:?}", java_home_plist_value);
return None;
}
Some(val) => val,
};
for java_home_plist_item in java_home_plist_value_array {
debugging!("Checking: {:?}", java_home_plist_item);
if let Some(jvm_item) = java_home_plist_item.as_dictionary() {
let jvm_version_value = jvm_item.get("JVMVersion");
let jvm_home_path_value = jvm_item.get("JVMHomePath");
if let (Some(Value::String(jvm_version)), Some(Value::String(jvm_path))) = (jvm_version_value, jvm_home_path_value) {
debugging!("Check version: {} vs {}", jvm_version, version);
if jvm_version.starts_with(version) {
debugging!("Check version success: {} -> {}", jvm_version, jvm_path);
return Some(jvm_path.into());
}
}
}
} }
if output_in_utf8.contains("Unable to find any JVMs") {
None None
} else {
Some(str::from_utf8(&output.stdout).ok()?.trim().to_string())
}
} }
pub fn get_local_java_home(version: &str) -> Option<String> { pub fn get_local_java_home(version: &str) -> Option<String> {
@@ -92,16 +97,16 @@ pub fn get_local_java_home(version: &str) -> Option<String> {
let paths = fs::read_dir(Path::new(&local_java_home_base_dir)).ok()?; let paths = fs::read_dir(Path::new(&local_java_home_base_dir)).ok()?;
for path in paths { for path in paths {
if let Ok(dir_entry) = path { if let Ok(dir_entry) = path {
if let Some(p)= dir_entry.path().to_str() { if let Some(p) = dir_entry.path().to_str() {
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Try match path: {}", p)); debugging!("Try match path: {}", p);
} }
let mut path_name = p; let mut path_name = p;
if p.ends_with('/') { if p.ends_with('/') {
path_name = &path_name[..path_name.len() - 1] path_name = &path_name[..path_name.len() - 1]
} }
if let Some(i) = path_name.rfind('/') { if let Some(i) = path_name.rfind('/') {
path_name = &path_name[i+1..]; path_name = &path_name[i + 1..];
} }
let matched_path_opt = if (path_name.starts_with("jdk-") && (&path_name[4..]).starts_with(version)) let matched_path_opt = if (path_name.starts_with("jdk-") && (&path_name[4..]).starts_with(version))
|| (path_name.starts_with("jdk") && (&path_name[3..]).starts_with(version)) { || (path_name.starts_with("jdk") && (&path_name[3..]).starts_with(version)) {
@@ -111,13 +116,13 @@ pub fn get_local_java_home(version: &str) -> Option<String> {
}; };
if let Some(matched_path) = matched_path_opt { if let Some(matched_path) = matched_path_opt {
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Matched JDK path found: {}", matched_path)); debugging!("Matched JDK path found: {}", matched_path);
} }
return if local_util::is_path_exists(matched_path, "Contents/Home") { return if local_util::is_path_exists(matched_path, "Contents/Home") {
Some(format!("{}/{}", matched_path, "Contents/Home")) Some(format!("{}/{}", matched_path, "Contents/Home"))
} else { } else {
Some(matched_path.to_string()) Some(matched_path.to_string())
} };
} }
} }
} }
@@ -128,7 +133,7 @@ pub fn get_local_java_home(version: &str) -> Option<String> {
pub fn extract_jdk_and_wait(file_name: &str) { pub fn extract_jdk_and_wait(file_name: &str) {
if let Ok(local_java_home_base_dir) = local_util::get_user_home_dir(LOCAL_JAVA_HOME_BASE_DIR) { if let Ok(local_java_home_base_dir) = local_util::get_user_home_dir(LOCAL_JAVA_HOME_BASE_DIR) {
local_util::extract_package_and_wait(&local_java_home_base_dir, file_name).unwrap_or_else(|err| { local_util::extract_package_and_wait(&local_java_home_base_dir, file_name).unwrap_or_else(|err| {
print_error(&format!("Extract file: {}, failed: {}", file_name, err)); failure!("Extract file: {}, failed: {}", file_name, err);
}); });
} }
} }

View File

@@ -1,47 +1,25 @@
use std::{ use std::env;
env, use std::path::Path;
fs::{self, File}, use std::process::Command;
io::{Read, ErrorKind}, use std::fs::{self, File};
path::Path, use std::io::{Read, ErrorKind};
process::Command, use rust_util::XResult;
time::SystemTime, use rust_util::util_io::{self, DEFAULT_BUF_SIZE, PrintStatusContext};
}; use crypto::{digest::Digest, md5::Md5, sha1::Sha1, sha2::{Sha256, Sha512}};
use rust_util::{
XResult,
new_box_ioerror,
util_msg::{
print_error,
},
util_io::*,
};
use crypto::{
digest::Digest,
md5::Md5,
sha1::Sha1,
sha2::{Sha256, Sha512},
};
pub fn get_args_as_vec() -> Vec<String> { pub fn get_args_as_vec() -> Vec<String> {
// let mut args_vec:Vec<String> = vec![];
// for arg in env::args() {
// args_vec.push(arg);
// }
// args_vec
env::args().collect::<Vec<String>>() env::args().collect::<Vec<String>>()
} }
pub fn is_buildin_args(args: &[String]) -> bool { pub fn is_buildin_args(args: &[String]) -> bool {
match args.get(1) { args.get(1)
None => false, .map(|arg| arg.starts_with(":::") || arg.starts_with("..."))
Some(arg) => arg.starts_with(":::") || arg.starts_with("..."), .unwrap_or(false)
}
} }
pub fn verify_file_integrity(integrity: &str, file_name: &str) -> XResult<bool> { pub fn verify_file_integrity(integrity: &str, file_name: &str) -> XResult<bool> {
match integrity.find('-') { match integrity.find('-') {
None => Err(new_box_ioerror(&format!("Not supported integrigty: {}", integrity))), None => simple_error!("Not supported integrigty: {}", integrity),
Some(index) => { Some(index) => {
let digest_hex = &integrity[index+1..]; let digest_hex = &integrity[index+1..];
let calc_digest_hex = match &integrity[0..index] { let calc_digest_hex = match &integrity[0..index] {
@@ -49,11 +27,11 @@ pub fn verify_file_integrity(integrity: &str, file_name: &str) -> XResult<bool>
"sha512:hex" => calc_file_digest(&mut Sha512::new(), "SHA512", file_name)?, "sha512:hex" => calc_file_digest(&mut Sha512::new(), "SHA512", file_name)?,
"sha1:hex" => calc_file_digest(&mut Sha1::new(), "SHA1", file_name)?, "sha1:hex" => calc_file_digest(&mut Sha1::new(), "SHA1", file_name)?,
"md5:hex" => calc_file_digest(&mut Md5::new(), "MD5", file_name)?, "md5:hex" => calc_file_digest(&mut Md5::new(), "MD5", file_name)?,
_ => return Err(new_box_ioerror(&format!("Not supported integrigty: {}", integrity))), _ => return simple_error!("Not supported integrigty: {}", integrity),
}; };
let integrity_verify_result = digest_hex == calc_digest_hex.as_str(); let integrity_verify_result = digest_hex == calc_digest_hex.as_str();
if ! integrity_verify_result { if ! integrity_verify_result {
print_error(&format!("Verify integrity failed, expected: {}, actual: {}", digest_hex, calc_digest_hex)); failure!("Verify integrity failed, expected: {}, actual: {}", digest_hex, calc_digest_hex);
} }
Ok(integrity_verify_result) Ok(integrity_verify_result)
}, },
@@ -67,10 +45,10 @@ pub fn calc_sha256(d: &[u8]) -> String {
} }
pub fn calc_file_digest(digest: &mut dyn Digest, digest_alg: &str, file_name: &str) -> XResult<String> { pub fn calc_file_digest(digest: &mut dyn Digest, digest_alg: &str, file_name: &str) -> XResult<String> {
let mut buf: [u8; DEFAULT_BUF_SIZE] = [0u8; DEFAULT_BUF_SIZE]; let mut buf = [0u8; DEFAULT_BUF_SIZE];
let mut f = File::open(file_name)?; let mut f = File::open(file_name)?;
let file_len = f.metadata().map(|md| md.len() as i64).unwrap_or(-1_i64); let file_len = f.metadata().map(|md| md.len() as i64).unwrap_or(-1_i64);
let start = SystemTime::now(); let mut print_status_context = PrintStatusContext::default();
let mut written = 0_i64; let mut written = 0_i64;
loop { loop {
let len = match f.read(&mut buf) { let len = match f.read(&mut buf) {
@@ -81,18 +59,17 @@ pub fn calc_file_digest(digest: &mut dyn Digest, digest_alg: &str, file_name: &s
}; };
digest.input(&buf[..len]); digest.input(&buf[..len]);
written += len as i64; written += len as i64;
let cost = SystemTime::now().duration_since(start.clone()).unwrap(); util_io::print_status_last_line(&format!("Calc {}", digest_alg), file_len, written, &mut print_status_context);
print_status_last_line(&format!("Calc {}", digest_alg), file_len, written, cost);
} }
} }
pub fn get_user_home() -> XResult<String> { pub fn get_user_home() -> XResult<String> {
match dirs::home_dir() { match dirs::home_dir() {
None => Err(new_box_ioerror("Home dir not found!")),
Some(home_dir_o) => match home_dir_o.to_str() { Some(home_dir_o) => match home_dir_o.to_str() {
None => Err(new_box_ioerror("Home dir not found!")),
Some(home_dir_str) => Ok(home_dir_str.to_string()), Some(home_dir_str) => Ok(home_dir_str.to_string()),
None => simple_error!("Home dir not found!"),
}, },
None => simple_error!("Home dir not found!"),
} }
} }
@@ -118,7 +95,7 @@ pub fn extract_package_and_wait(dir: &str, file_name: &str) -> XResult<()> {
cmd = Command::new("tar"); cmd = Command::new("tar");
cmd.arg("-xzvf"); cmd.arg("-xzvf");
} else { } else {
return Err(new_box_ioerror(&format!("Unknown file type: {}", file_name))); return simple_error!("Unknown file type: {}", file_name);
} }
cmd.arg(file_name).current_dir(dir).spawn()?.wait()?; cmd.arg(file_name).current_dir(dir).spawn()?.wait()?;
Ok(()) Ok(())
@@ -133,7 +110,7 @@ pub fn init_home_dir(home_sub_dir: &str) {
pub fn init_dir(dir: &str) { pub fn init_dir(dir: &str) {
if ! Path::new(dir).exists() { if ! Path::new(dir).exists() {
fs::create_dir_all(dir).unwrap_or_else(|err| { fs::create_dir_all(dir).unwrap_or_else(|err| {
print_error(&format!("Init dir {} failed: {}", dir, err)); failure!("Init dir {} failed: {}", dir, err);
}); });
} }
} }

View File

@@ -1,12 +1,10 @@
#[macro_use] #[macro_use] extern crate json;
extern crate json; #[macro_use] extern crate lazy_static;
#[macro_use] #[macro_use] extern crate rust_util;
extern crate lazy_static;
extern crate term; use std::fs;
extern crate dirs; use std::collections::HashMap;
extern crate crypto; use std::process::{self, Command};
extern crate urlencoding;
extern crate rust_util;
pub mod jdk; pub mod jdk;
pub mod local_util; pub mod local_util;
@@ -15,53 +13,43 @@ pub mod tool;
pub mod build_json; pub mod build_json;
pub mod misc; pub mod misc;
use std::{ use rust_util::util_cmd;
collections::HashMap,
fs,
process::Command,
};
use rust_util::{
iff,
util_msg::{
print_ok,
print_info,
print_warn,
print_error,
print_debug,
},
util_cmd::run_command_and_wait,
};
use tool::*; use tool::*;
use jdk::*; use jdk::*;
use build_json::*; use build_json::*;
use misc::*; use misc::*;
const BUILDJ: &str = "buildj";
const BUDERJ_VER: &str = env!("CARGO_PKG_VERSION");
const GIT_HASH: &str = env!("GIT_HASH");
const BUILD_DATE: &str = env!("BUILD_DATE");
fn do_with_buildin_arg_java_cmd(first_arg: &str, args: &[String]) {
fn do_with_buildin_arg_java(first_arg: &str, args: &[String]) { let first_num_pos = first_arg.chars().position(|c| c >= '0' && c <= '9');
let ver = &first_arg[7..]; let (cmd, ver) = match first_num_pos {
if ver.is_empty() { None => {
print_error("Java version is not assigned!"); failure!("Java command version is not assigned!");
return;
},
Some(pos) => {
(&first_arg[3..pos], &first_arg[pos..])
},
};
match get_java_home(ver) {
None => failure!("Assigned java version not found: {}", ver),
Some(java_home) => {
success!("Find java home: {}", java_home);
let java_bin = &format!("{}/bin/{}", java_home, cmd);
if fs::metadata(java_bin).is_ok() {
success!("Command found: {}", java_bin);
} else {
failure!("Command {} not exists", java_bin);
return; return;
} }
match get_java_home(ver) {
None => print_error(&format!("Assigned java version not found: {}", ver)),
Some(java_home) => {
print_ok(&format!("Find java home: {}", java_home));
let java_bin = &format!("{}/bin/java", java_home);
let mut cmd = Command::new(java_bin); let mut cmd = Command::new(java_bin);
cmd.envs(&get_env_with_java_home(&java_home)); cmd.envs(&get_env_with_java_home(&java_home));
if args.len() > 2 { if args.len() > 2 {
cmd.args(&args[2..]); cmd.args(&args[2..]);
} }
run_command_and_wait(&mut cmd).unwrap_or_else(|err| { if let Err(err) = util_cmd::run_command_and_wait(&mut cmd) {
print_error(&format!("Exec java failed: {}", err)); failure!("Exec java failed: {}", err);
}); }
}, },
}; };
} }
@@ -75,33 +63,34 @@ fn do_with_buildin_arg_gradle(first_arg: &str, args: &[String]) {
} }
fn do_with_buildin_arg_config(_first_arg: &str, args: &[String]) { fn do_with_buildin_arg_config(_first_arg: &str, args: &[String]) {
information!("Current config file: ~/{}", tool::STANDARD_CONFIG_JSON);
if args.len() <= 2 { if args.len() <= 2 {
print_error("No arguments, get or set."); failure!("No arguments, get or set.");
return; return;
} }
match args[2].as_str() { match args[2].as_str() {
"get" => match get_tool_package_secret() { "get" => match get_tool_package_secret() {
Err(_) => print_warn("No config found."), Err(_) => warning!("No config found."),
Ok(secret) => print_ok(&format!("Config secret: {}", secret)), Ok(secret) => success!("Config secret: {}", secret),
}, },
"set" => { "set" => {
if args.len() < 4 { if args.len() < 4 {
print_error("Need secret for set, :::config set <secret>"); failure!("Need secret for set, :::config set <secret>");
} else { } else {
match set_tool_package_secret(&args[3]) { match set_tool_package_secret(&args[3]) {
Err(err) => print_error(&format!("Config secret failed: {}", err)), Err(err) => failure!("Config secret failed: {}", err),
Ok(_) => print_ok("Config secret success."), Ok(_) => success!("Config secret success."),
} }
} }
}, },
arg => print_error(&format!("Unknown argument: {}", arg)) arg => failure!("Unknown argument: {}", arg)
} }
} }
fn do_with_buildin_arg_builder(first_arg: &str, args: &[String], builder_name: &str) { fn do_with_buildin_arg_builder(first_arg: &str, args: &[String], builder_name: &str) {
let builder_version = &first_arg[(builder_name.len() + 3)..]; let builder_version = &first_arg[(builder_name.len() + 3)..];
if builder_version.is_empty() { if builder_version.is_empty() {
print_error("Builder version is not assigned!"); failure!("Builder version is not assigned!");
return; return;
} }
let mut has_java = false; let mut has_java = false;
@@ -112,7 +101,7 @@ fn do_with_buildin_arg_builder(first_arg: &str, args: &[String], builder_name: &
if !java_version.is_empty() { if !java_version.is_empty() {
java_home = match get_java_home(java_version) { java_home = match get_java_home(java_version) {
Some(h) => h, None => { Some(h) => h, None => {
print_error(&format!("Assigned java version not found: {}", java_version)); failure!("Assigned java version not found: {}", java_version);
return; return;
}, },
}; };
@@ -120,14 +109,14 @@ fn do_with_buildin_arg_builder(first_arg: &str, args: &[String], builder_name: &
} }
let builder_desc = match tool::get_builder_home(builder_name, builder_version) { let builder_desc = match tool::get_builder_home(builder_name, builder_version) {
Some(h) => h, None => { Some(h) => h, None => {
print_error(&format!("Assigned builder: {}, version: {} not found.", builder_name, builder_version)); failure!("Assigned builder: {}, version: {} not found.", builder_name, builder_version);
return; return;
}, },
}; };
if has_java { if has_java {
print_ok(&format!("JAVA_HOME = {}", java_home)); success!("JAVA_HOME = {}", java_home);
} }
print_ok(&format!("BUILDER_HOME = {}", &builder_desc.home)); success!("BUILDER_HOME = {}", &builder_desc.home);
let mut new_env = iff!(has_java, get_env_with_java_home(&java_home), get_env()); let mut new_env = iff!(has_java, get_env_with_java_home(&java_home), get_env());
for builder_home_name in builder_desc.get_builder_home_name() { for builder_home_name in builder_desc.get_builder_home_name() {
@@ -140,9 +129,9 @@ fn do_with_buildin_arg_builder(first_arg: &str, args: &[String], builder_name: &
for arg in args.iter().skip(from_index) { for arg in args.iter().skip(from_index) {
cmd.arg(&arg); cmd.arg(&arg);
} }
run_command_and_wait(&mut cmd).unwrap_or_else(|err| { if let Err(err) = util_cmd::run_command_and_wait(&mut cmd) {
print_error(&format!("Run build command failed: {}", err)); failure!("Run build command failed: {}", err);
}); }
} }
fn do_with_buildin_arg_ddd(first_arg: &str, args: &[String]) { fn do_with_buildin_arg_ddd(first_arg: &str, args: &[String]) {
@@ -151,7 +140,7 @@ fn do_with_buildin_arg_ddd(first_arg: &str, args: &[String]) {
}; };
let build_json_object_xrun = &build_json_object["xRuns"][&first_arg[3..]]; let build_json_object_xrun = &build_json_object["xRuns"][&first_arg[3..]];
if build_json_object_xrun.is_null() { if build_json_object_xrun.is_null() {
print_error(&format!("Cannot find build.json#xRuns#{}", &first_arg[3..])); failure!("Cannot find build.json#xRuns#{}", &first_arg[3..]);
return; return;
} }
let cmd_name = build_json_object_xrun[0].to_string(); let cmd_name = build_json_object_xrun[0].to_string();
@@ -171,33 +160,38 @@ fn do_with_buildin_arg_ddd(first_arg: &str, args: &[String]) {
cmd.arg(arg.to_string()); cmd.arg(arg.to_string());
} }
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Running cmd: {}, args: {:?}", &cmd_name, cmd_args)); debugging!("Running cmd: {}, args: {:?}", &cmd_name, cmd_args);
}
if let Err(err) = util_cmd::run_command_and_wait(&mut cmd) {
failure!("Run xRun command failed: {}", err);
} }
run_command_and_wait(&mut cmd).unwrap_or_else(|err| {
print_error(&format!("Run xRun command failed: {}", err));
});
} }
fn do_with_buildin_args(args: &[String]) { fn do_with_buildin_args(args: &[String]) {
let first_arg = args.get(1).unwrap(); let first_arg = args.get(1).unwrap();
if first_arg == ":::" || first_arg == ":::help" { match first_arg.as_str() {
print_usage(); ":::" | ":::help" => print_usage(),
} else if first_arg == ":::version" { ":::version" => print_version(),
print_version(); ":::create" => create_build_json(args),
} else if first_arg == ":::create" { ":::config" => do_with_buildin_arg_config(first_arg, args),
create_build_json(args); a if a.starts_with(":::jar") => do_with_buildin_arg_java_cmd(a, args),
} else if first_arg == ":::config" { a if a.starts_with(":::java") => do_with_buildin_arg_java_cmd(a, args),
do_with_buildin_arg_config(first_arg, args); a if a.starts_with(":::jinfo") => do_with_buildin_arg_java_cmd(a, args),
} else if first_arg.starts_with(":::java") { a if a.starts_with(":::jlink") => do_with_buildin_arg_java_cmd(a, args),
do_with_buildin_arg_java(first_arg, args); a if a.starts_with(":::keytool")=> do_with_buildin_arg_java_cmd(a, args),
} else if first_arg.starts_with(":::maven") { a if a.starts_with(":::jaotc") => do_with_buildin_arg_java_cmd(a, args),
do_with_buildin_arg_maven(first_arg, args); a if a.starts_with(":::jcmd") => do_with_buildin_arg_java_cmd(a, args),
} else if first_arg.starts_with(":::gradle") { a if a.starts_with(":::jconsole")=> do_with_buildin_arg_java_cmd(a, args),
do_with_buildin_arg_gradle(first_arg, args); a if a.starts_with(":::jdb") => do_with_buildin_arg_java_cmd(a, args),
} else if first_arg.starts_with("...") { a if a.starts_with(":::jmap") => do_with_buildin_arg_java_cmd(a, args),
do_with_buildin_arg_ddd(first_arg, args); a if a.starts_with(":::jps") => do_with_buildin_arg_java_cmd(a, args),
} else { a if a.starts_with(":::jstack") => do_with_buildin_arg_java_cmd(a, args),
print_error(&format!("Unknown args: {:?}", &args)); a if a.starts_with(":::jstat") => do_with_buildin_arg_java_cmd(a, args),
a if a.starts_with(":::jimage") => do_with_buildin_arg_java_cmd(a, args),
a if a.starts_with(":::maven") => do_with_buildin_arg_maven (a, args),
a if a.starts_with(":::gradle") => do_with_buildin_arg_gradle (a, args),
a if a.starts_with("...") => do_with_buildin_arg_ddd (a, args),
_ => failure!("Unknown args: {:?}", &args),
} }
} }
@@ -207,31 +201,31 @@ fn get_java_and_builder(build_json_object: &json::JsonValue) -> Option<(String,
let builder_version_j = &build_json_object["builder"]["version"]; let builder_version_j = &build_json_object["builder"]["version"];
if java_version_j.is_null() { if java_version_j.is_null() {
print_error("Java version is not assigned!"); failure!("Java version is not assigned!");
return None; return None;
} }
if builder_name_j.is_null() || builder_version_j.is_null() { if builder_name_j.is_null() || builder_version_j.is_null() {
print_error("Builder name or version is not assigned!"); failure!("Builder name or version is not assigned!");
return None; return None;
} }
let java_version = java_version_j.as_str().unwrap(); let java_version = java_version_j.as_str().unwrap();
let builder_name = builder_name_j.as_str().unwrap(); let builder_name = builder_name_j.as_str().unwrap();
let builder_version = builder_version_j.as_str().unwrap(); let builder_version = builder_version_j.as_str().unwrap();
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Java version: {}", java_version)); debugging!("Java version: {}", java_version);
print_debug(&format!("Builder name: {}", builder_name)); debugging!("Builder name: {}", builder_name);
print_debug(&format!("Builder version: {}", builder_version)); debugging!("Builder version: {}", builder_version);
} }
let java_home = match get_java_home(java_version) { let java_home = match get_java_home(java_version) {
Some(h) => h, None => { Some(h) => h, None => {
print_error(&format!("Assigned java version not found: {}", java_version)); failure!("Assigned java version not found: {}", java_version);
return None; return None;
}, },
}; };
let builder_desc = match tool::get_builder_home(builder_name, builder_version) { let builder_desc = match tool::get_builder_home(builder_name, builder_version) {
Some(h) => h, None => { Some(h) => h, None => {
print_error(&format!("Assigned builder: {}, version: {} not found.", builder_name, builder_version)); failure!("Assigned builder: {}, version: {} not found.", builder_name, builder_version);
return None; return None;
}, },
}; };
@@ -246,9 +240,9 @@ fn get_final_args(args: &[String], build_json_object: &json::JsonValue) -> Optio
let a_cmd = &arg1[2..]; let a_cmd = &arg1[2..];
let a_cmd_j = &build_json_object["xArgs"][a_cmd]; let a_cmd_j = &build_json_object["xArgs"][a_cmd];
if a_cmd_j.is_null() { if a_cmd_j.is_null() {
print_warn(&format!("xArgs argument not found: {}", a_cmd)); warning!("xArgs argument not found: {}", a_cmd);
if args.len() == 2 { if args.len() == 2 {
print_error("Only one xArgs argument, exit."); failure!("Only one xArgs argument, exit.");
return None; return None;
} }
final_args.push(arg1.to_string()); final_args.push(arg1.to_string());
@@ -276,10 +270,9 @@ fn process_envs(the_env: &mut HashMap<String, String>, build_json_object: &json:
if ! envs_j.is_null() { if ! envs_j.is_null() {
for env in envs_j.members() { for env in envs_j.members() {
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Env: {}", env)); debugging!("Env: {}", env);
} }
let env_k = &env[0]; let (env_k, env_v) = (&env[0], &env[1]);
let env_v = &env[1];
if let (Some(env_k_str), Some(env_v_str)) = (env_k.as_str(), env_v.as_str()) { if let (Some(env_k_str), Some(env_v_str)) = (env_k.as_str(), env_v.as_str()) {
the_env.insert(env_k_str.to_owned(), env_v_str.to_owned()); the_env.insert(env_k_str.to_owned(), env_v_str.to_owned());
} }
@@ -306,13 +299,13 @@ fn read_build_json_object_from_env() -> Option<json::JsonValue> {
"version" => builder_version[5..], "version" => builder_version[5..],
}; };
} else { } else {
print_warn(&format!("Unknown builder: {}", builder_version)); warning!("Unknown builder: {}", builder_version);
} }
} }
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Use env configed build.json: {}", json::stringify(build_json_object.clone()))); debugging!("Use env configed build.json: {}", json::stringify(build_json_object.clone()));
} }
print_ok("Find build.json @ENV"); success!("Find build.json @ENV");
Some(build_json_object) Some(build_json_object)
} else { } else {
None None
@@ -324,47 +317,46 @@ fn read_build_json_object() -> Option<json::JsonValue> {
return Some(o); return Some(o);
} }
let build_json = match find_build_json() { let build_json = find_build_json()?;
Some(p) => p, None => return None, success!("Find {} @ {}", BUILD_JSON, build_json);
};
print_ok(&format!("Find {} @ {}", BUILD_JSON, build_json)); let build_json_content = fs::read_to_string(build_json).map_err(|err| {
let build_json_content = match fs::read_to_string(build_json) { failure!("Read {} failed: {}", BUILD_JSON, err);
Ok(content) => content, Err(err) => { err
print_error(&format!("Read {} failed: {}", BUILD_JSON, err)); }).ok()?;
return None; json::parse(&build_json_content).map_err(|err| {
}, failure!("Parse JSON failed: {}", err);
}; err
match json::parse(&build_json_content) { }).ok()
Ok(object) => Some(object), Err(err) => {
print_error(&format!("Parse JSON failed: {}", err));
None
},
}
} }
fn main() { fn main() {
print_info(&format!("{} - version {} - {}", BUILDJ, BUDERJ_VER, &GIT_HASH[0..7])); match get_short_git_hash() {
None => information!("{} - version {}", BUILDJ, BUDERJ_VER),
Some(shot_git_hash) => information!("{} - version {} - {}", BUILDJ, BUDERJ_VER, &shot_git_hash),
}
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Full GIT_HASH: {}", GIT_HASH)); if let Some(full_git_hash) = get_full_git_hash() {
print_debug(&format!("Build date: {}", BUILD_DATE)); debugging!("Full GIT_HASH: {}", full_git_hash);
}
debugging!("Build date: {}", BUILD_DATE);
} }
let args = local_util::get_args_as_vec(); let args = local_util::get_args_as_vec();
print_info(&format!("Arguments: {:?}", args)); information!("Arguments: {:?}", args);
if (! *NOBUILDIN) && local_util::is_buildin_args(&args) { if (! *NOBUILDIN) && local_util::is_buildin_args(&args) {
do_with_buildin_args(&args); do_with_buildin_args(&args);
return; return;
} }
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Init home dir: {}", tool::LOCAL_BUILDER_HOME_BASE_DIR)); debugging!("Init home dir: {}", tool::LOCAL_BUILDER_HOME_BASE_DIR);
} }
local_util::init_home_dir(tool::LOCAL_BUILDER_HOME_BASE_DIR); local_util::init_home_dir(tool::LOCAL_BUILDER_HOME_BASE_DIR);
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Init home dir: {}", jdk::LOCAL_JAVA_HOME_BASE_DIR)); debugging!("Init home dir: {}", jdk::LOCAL_JAVA_HOME_BASE_DIR);
} }
local_util::init_home_dir(jdk::LOCAL_JAVA_HOME_BASE_DIR); local_util::init_home_dir(jdk::LOCAL_JAVA_HOME_BASE_DIR);
@@ -373,12 +365,11 @@ fn main() {
}; };
let (java_home, builder_desc) = match get_java_and_builder(&build_json_object) { let (java_home, builder_desc) = match get_java_and_builder(&build_json_object) {
None => return, Some((java_home, builder_desc)) => (java_home, builder_desc), None => return,
Some((java_home, builder_desc)) => (java_home, builder_desc),
}; };
print_ok(&format!("JAVA_HOME = {}", java_home)); success!("JAVA_HOME = {}", java_home);
print_ok(&format!("BUILDER_HOME = {}", &builder_desc.home)); success!("BUILDER_HOME = {}", &builder_desc.home);
let mut new_env = get_env_with_java_home(&java_home); let mut new_env = get_env_with_java_home(&java_home);
for builder_home_name in builder_desc.get_builder_home_name() { for builder_home_name in builder_desc.get_builder_home_name() {
@@ -393,19 +384,26 @@ fn main() {
Some(fa) => fa, None => return, Some(fa) => fa, None => return,
}; };
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Final arguments: {:?}", &final_args)); debugging!("Final arguments: {:?}", &final_args);
} }
for f_arg in final_args { for f_arg in final_args {
cmd.arg(f_arg); cmd.arg(f_arg);
} }
if *VERBOSE { if *VERBOSE {
print_debug("-----BEGIN ENVIRONMENT VARIABLES-----"); debugging!("-----BEGIN ENVIRONMENT VARIABLES-----");
for (k, v) in new_env { for (k, v) in new_env {
print_debug(&format!("{}={}", k, v)); debugging!("{}={}", k, v);
} }
print_debug("-----END ENVIRONMENT VARIABLES-----"); debugging!("-----END ENVIRONMENT VARIABLES-----");
} }
run_command_and_wait(&mut cmd).unwrap_or_else(|err| { let exit_status = util_cmd::run_command_and_wait(&mut cmd).unwrap_or_else(|err| {
print_error(&format!("Run build command failed: {}", err)); failure!("Run build command failed: {}", err);
process::exit(-1);
}); });
if !exit_status.success() {
if let Some(exit_code) = exit_status.code() {
process::exit(exit_code);
}
}
} }

View File

@@ -1,46 +1,48 @@
use std::env; use std::env;
use rust_util::util_env::*; use rust_util::{util_env, util_term};
pub const BUILDJ: &str = "buildj";
pub const BUDERJ_VER: &str = env!("CARGO_PKG_VERSION");
pub const BUILD_DATE: &str = env!("BUILD_DATE");
const GIT_HASH: &str = env!("GIT_HASH");
lazy_static! { lazy_static! {
pub static ref VERBOSE: bool = is_env_on("BUILDJ_VERBOSE"); pub static ref VERBOSE: bool = util_env::is_env_on("BUILDJ_VERBOSE");
pub static ref NOAUTH: bool = is_env_on("BUILDJ_NOAUTH"); pub static ref NOAUTH: bool = util_env::is_env_on("BUILDJ_NOAUTH");
pub static ref NOBUILDIN: bool = is_env_on("BUILDJ_NOBUILDIN"); pub static ref NOBUILDIN: bool = util_env::is_env_on("BUILDJ_NOBUILDIN");
pub static ref AUTH_TOKEN: Option<String> = env::var("BUILDJ_AUTH_TOKEN").ok(); pub static ref AUTH_TOKEN: Option<String> = env::var("BUILDJ_AUTH_TOKEN").ok();
pub static ref JAVA_VERSION: Option<String> = env::var("BUILDJ_JAVA").ok(); pub static ref JAVA_VERSION: Option<String> = env::var("BUILDJ_JAVA").ok();
pub static ref BUILDER_VERSION: Option<String> = env::var("BUILDJ_BUILDER").ok(); pub static ref BUILDER_VERSION: Option<String> = env::var("BUILDJ_BUILDER").ok();
pub static ref BUILD_YEAR: String = env::var("BUILD_YEAR").unwrap_or_else(|_| "unknown".to_string());
} }
pub fn print_usage() { pub fn print_usage() {
println!(r#" println!("\n{}", include_str!("usage.txt"));
buildj ::: - print this message
buildj :::help - print this message
buildj :::version - print version
buildj :::config get|set <secret> - get/set config
buildj :::create --java<version> --maven<version> - create java + maven project
e.g. buildj :::create --java1.8 --maven3.5.2
buildj :::create --java<version> --gradle<version> - create java + gradle project
e.g. buildj :::create --java1.8 --gradle3.5.1
buildj :::java<version> [-version] - run java with assigned version
e.g. buildj :::java1.8 -version
buildj :::maven<version> [--java<version>] - run maven with assigned version and java version
e.g. buildj :::maven3.5.2 --java1.8 ARGS
buildj :::gradle<version> [--java<version>] - run gradle with assigned version and java version
e.g. buildj :::gradle3.5.1 --java1.8 ARGS
buildj - run build, run assigned version builder tool
BUILDJ_NOBUILDIN=1 buildj - ignore buildj buildin commands
BUILDJ_VERBOSE=1 buildj - run buildj in verbose mode
BUILDJ_NOAUTH=1 buildj - run buildj in no auth mode
BUILDJ_JAVA_NAME=jdk-name buildj - assgin java name, e.g. adoptjdk-linux
BUILDJ_AUTH_TOKEN=auth-token buildj - assign auth token
BUILDJ_JAVA=1.8 BUILDJ_BUILDER=maven3.5.2 buildj - direct run buildj"#);
} }
pub fn print_version() { pub fn print_version() {
println!(r#"buildj {} - {} println!(r#"buildj {}{}{}
Copyright (C) 2019-2020 Hatter Jiang. Build date: {}
License MIT <https://opensource.org/licenses/MIT>
Written by Hatter Jiang"#, super::BUDERJ_VER, &super::GIT_HASH[0..7]); Copyright (C) 2019-{} Hatter Jiang.
License MIT <{}https://opensource.org/licenses/MIT{}>
Official website: {}https://buildj.ruststack.org/{}
"#, BUDERJ_VER,
get_short_git_hash().map(|h| format!(" - {}", h)).unwrap_or("".into()),
get_full_git_hash().map(|h| format!("\nFull git commit hash: {}{}{}", util_term::BOLD, h, util_term::END)).unwrap_or("".into()),
BUILD_DATE,
*BUILD_YEAR,
util_term::UNDER, util_term::END,
util_term::UNDER, util_term::END);
} }
pub fn get_full_git_hash() -> Option<&'static str> {
// build from crates, git hash is empty
iff!(GIT_HASH.is_empty(), None, Some(GIT_HASH))
}
pub fn get_short_git_hash() -> Option<&'static str> {
get_full_git_hash().map(|h| &h[0..7])
}

View File

@@ -1,31 +1,13 @@
use std::{ use std::{fs::{self, File}, path::Path};
fs::{self, File}, use rust_util::{ XResult, util_os};
path::Path, use crate::{http, local_util, misc::{AUTH_TOKEN, VERBOSE, NOAUTH}};
};
use rust_util::{
XResult,
new_box_ioerror,
util_os::is_macos_or_linux,
util_msg::{
print_ok,
print_info,
print_warn,
print_error,
print_debug,
},
};
use super::{
http::{ download_url, get_url_content, },
local_util::{self, *},
misc::*,
};
const M2_HOME: &str = "M2_HOME"; const M2_HOME: &str = "M2_HOME";
const MAVEN_HOME: &str = "MAVEN_HOME"; const MAVEN_HOME: &str = "MAVEN_HOME";
const GRADLE_HOME: &str = "GRADLE_HOME"; const GRADLE_HOME: &str = "GRADLE_HOME";
pub const LOCAL_BUILDER_HOME_BASE_DIR: &str = ".jssp/builder"; pub const LOCAL_BUILDER_HOME_BASE_DIR: &str = ".jssp/builder";
const STANDARD_CONFIG_JSON: &str = ".standard_config.json"; pub const STANDARD_CONFIG_JSON: &str = ".standard_config.json";
const TOOL_PACKAGE_DETAIL_URL: &str = "https://hatter.ink/tool/query_tool_by_name_version.json"; const TOOL_PACKAGE_DETAIL_URL: &str = "https://hatter.ink/tool/query_tool_by_name_version.json";
const TOOL_PACKAGE_DETAIL_URL_WITHOUT_AUTH: &str = "https://hatter.ink/tool/query_tool_by_name_version_without_auth.json"; const TOOL_PACKAGE_DETAIL_URL_WITHOUT_AUTH: &str = "https://hatter.ink/tool/query_tool_by_name_version_without_auth.json";
@@ -61,14 +43,14 @@ impl BuilderDesc {
} }
pub fn get_builder_home(builder: &str, version: &str) -> Option<BuilderDesc> { pub fn get_builder_home(builder: &str, version: &str) -> Option<BuilderDesc> {
let local_builder_home_base_dir = match get_user_home_dir(LOCAL_BUILDER_HOME_BASE_DIR) { let local_builder_home_base_dir = match local_util::get_user_home_dir(LOCAL_BUILDER_HOME_BASE_DIR) {
Ok(o) => o, Err(_) => return None, Ok(o) => o, Err(_) => return None,
}; };
let builder_name = match builder { let builder_name = match builder {
"maven" => BuilderName::Maven, "maven" => BuilderName::Maven,
"gradle" => BuilderName::Gradle, "gradle" => BuilderName::Gradle,
_ => { _ => {
print_error(&format!("Unknown builder: {}", builder)); failure!("Unknown builder: {}", builder);
return None; return None;
}, },
}; };
@@ -82,7 +64,7 @@ pub fn get_builder_home(builder: &str, version: &str) -> Option<BuilderDesc> {
} }
pub fn get_cloud_builder(builder: &str, version: &str) -> bool { pub fn get_cloud_builder(builder: &str, version: &str) -> bool {
if ! is_macos_or_linux() { if ! util_os::is_macos_or_linux() {
return false; return false;
} }
let local_builder_home_base_dir = match local_util::get_user_home_dir(LOCAL_BUILDER_HOME_BASE_DIR) { let local_builder_home_base_dir = match local_util::get_user_home_dir(LOCAL_BUILDER_HOME_BASE_DIR) {
@@ -90,7 +72,7 @@ pub fn get_cloud_builder(builder: &str, version: &str) -> bool {
}; };
match get_and_extract_tool_package(&local_builder_home_base_dir, true, builder, version, true) { match get_and_extract_tool_package(&local_builder_home_base_dir, true, builder, version, true) {
Ok(_) => true, Err(err) => { Ok(_) => true, Err(err) => {
print_error(&format!("Get builder: {} failed, version: {}, error: {}", builder, version, err)); failure!("Get builder: {} failed, version: {}, error: {}", builder, version, err);
false false
}, },
} }
@@ -99,7 +81,7 @@ pub fn get_cloud_builder(builder: &str, version: &str) -> bool {
pub fn get_local_builder_home_sub(builder_name: BuilderName, local_builder_home_dir: &str) -> Option<BuilderDesc> { pub fn get_local_builder_home_sub(builder_name: BuilderName, local_builder_home_dir: &str) -> Option<BuilderDesc> {
match get_local_builder_home_sub_first_sub_dir(local_builder_home_dir) { match get_local_builder_home_sub_first_sub_dir(local_builder_home_dir) {
None => { None => {
print_error(&format!("Cannot find builder home in: {}", local_builder_home_dir)); failure!("Cannot find builder home in: {}", local_builder_home_dir);
None None
}, },
Some(p) => Some(BuilderDesc{name: builder_name, home: p, bin: None}), Some(p) => Some(BuilderDesc{name: builder_name, home: p, bin: None}),
@@ -121,26 +103,26 @@ pub fn get_local_builder_home_sub_first_sub_dir(local_builder_home_dir: &str) ->
pub fn get_tool_package_secret() -> XResult<String> { pub fn get_tool_package_secret() -> XResult<String> {
if (*AUTH_TOKEN).is_some() { if (*AUTH_TOKEN).is_some() {
if *VERBOSE { if *VERBOSE {
print_debug("Use auth token from env 'BUILDJ_AUTH_TOKEN'"); debugging!("Use auth token from env 'BUILDJ_AUTH_TOKEN'");
} }
return Ok((*AUTH_TOKEN).as_ref().unwrap().clone()); return Ok((*AUTH_TOKEN).as_ref().unwrap().clone());
} }
let standard_config_file = get_user_home_dir(STANDARD_CONFIG_JSON)?; let standard_config_file = local_util::get_user_home_dir(STANDARD_CONFIG_JSON)?;
let standard_config_json = fs::read_to_string(&standard_config_file)?; let standard_config_json = fs::read_to_string(&standard_config_file)?;
let standard_config_object = json::parse(&standard_config_json)?; let standard_config_object = json::parse(&standard_config_json)?;
let build_js_auth_token = &standard_config_object["build.js"]["auth_token"]; let build_js_auth_token = &standard_config_object["build.js"]["auth_token"];
if build_js_auth_token.is_null() { if build_js_auth_token.is_null() {
Err(new_box_ioerror("Standard json#build.js#auth_token is null.")) simple_error!("Standard json#build.js#auth_token is null.")
} else { } else {
Ok(build_js_auth_token.to_string()) Ok(build_js_auth_token.to_string())
} }
} }
pub fn set_tool_package_secret(secret: &str) -> XResult<()> { pub fn set_tool_package_secret(secret: &str) -> XResult<()> {
let standard_config_file = get_user_home_dir(STANDARD_CONFIG_JSON)?; let standard_config_file = local_util::get_user_home_dir(STANDARD_CONFIG_JSON)?;
match fs::metadata(&standard_config_file) { match fs::metadata(&standard_config_file) {
Err(_) => { Err(_) => {
@@ -149,12 +131,12 @@ pub fn set_tool_package_secret(secret: &str) -> XResult<()> {
"auth_token" => secret, } "auth_token" => secret, }
}, 4)) { }, 4)) {
Ok(_) => Ok(()), Ok(_) => Ok(()),
Err(err) => Err(new_box_ioerror(&format!("Write config failed: {}, error message: {}", standard_config_file, err))), Err(err) => simple_error!("Write config failed: {}, error message: {}", standard_config_file, err),
} }
}, },
Ok(f) => { Ok(f) => {
if ! f.is_file() { if ! f.is_file() {
return Err(new_box_ioerror(&format!("Config is not a file: {}", standard_config_file))); return simple_error!("Config is not a file: {}", standard_config_file);
} }
let standard_config_json = fs::read_to_string(&standard_config_file)?; let standard_config_json = fs::read_to_string(&standard_config_file)?;
let mut standard_config_object = json::parse(&standard_config_json)?; let mut standard_config_object = json::parse(&standard_config_json)?;
@@ -167,7 +149,7 @@ pub fn set_tool_package_secret(secret: &str) -> XResult<()> {
} }
match fs::write(&standard_config_file, json::stringify_pretty(standard_config_object, 4)) { match fs::write(&standard_config_file, json::stringify_pretty(standard_config_object, 4)) {
Ok(_) => Ok(()), Ok(_) => Ok(()),
Err(err) => Err(new_box_ioerror(&format!("Write config failed: {}, error message: {}", &standard_config_file, err))), Err(err) => simple_error!("Write config failed: {}, error message: {}", &standard_config_file, err),
} }
} }
} }
@@ -175,12 +157,12 @@ pub fn set_tool_package_secret(secret: &str) -> XResult<()> {
pub fn get_tool_package_detail(name: &str, version: &str) -> XResult<String> { pub fn get_tool_package_detail(name: &str, version: &str) -> XResult<String> {
let secret: Option<String> = if *NOAUTH { let secret: Option<String> = if *NOAUTH {
print_warn("Running in no auth mode!"); warning!("Running in no auth mode!");
None None
} else { } else {
match get_tool_package_secret() { match get_tool_package_secret() {
Ok(r) => Some(r), Err(err) => { Ok(r) => Some(r), Err(err) => {
print_warn(&format!("Get package detail secret failed: {}, from file: ~/{}", err, STANDARD_CONFIG_JSON)); warning!("Get package detail secret failed: {}, from file: ~/{}", err, STANDARD_CONFIG_JSON);
None None
}, },
} }
@@ -203,30 +185,30 @@ pub fn get_tool_package_detail(name: &str, version: &str) -> XResult<String> {
url.push_str(&urlencoding::encode(name)); url.push_str(&urlencoding::encode(name));
url.push_str("&ver="); url.push_str("&ver=");
url.push_str(&urlencoding::encode(version)); url.push_str(&urlencoding::encode(version));
Ok(get_url_content(url.as_str())?) Ok(http::get_url_content(url.as_str())?)
} }
pub fn get_and_extract_tool_package(base_dir: &str, dir_with_name: bool, name: &str, version: &str, extract_match: bool) -> XResult<bool> { pub fn get_and_extract_tool_package(base_dir: &str, dir_with_name: bool, name: &str, version: &str, extract_match: bool) -> XResult<bool> {
let tool_package_detail = get_tool_package_detail(name, version)?; let tool_package_detail = get_tool_package_detail(name, version)?;
let build_json_object = json::parse(&tool_package_detail)?; let build_json_object = json::parse(&tool_package_detail)?;
if *VERBOSE { if *VERBOSE {
print_debug(&format!("Get tool {}:{}, result JSON: {}", name, version, json::stringify_pretty(build_json_object.clone(), 4))); debugging!("Get tool {}:{}, result JSON: {}", name, version, json::stringify_pretty(build_json_object.clone(), 4));
} }
if build_json_object["status"] != 200 { if build_json_object["status"] != 200 {
return Err(new_box_ioerror(&format!("Error in get tool package detail: {}", build_json_object["message"]))); return simple_error!("Error in get tool package detail: {}", build_json_object["message"]);
} }
let data = &build_json_object["data"]; let data = &build_json_object["data"];
let integrity = &data["integrity"]; let integrity = &data["integrity"];
let url = &data["url"]; let url = &data["url"];
let name = &data["name"]; let name = &data["name"];
if integrity.is_null() || url.is_null() || name.is_null() { if integrity.is_null() || url.is_null() || name.is_null() {
return Err(new_box_ioerror(&format!("Parse tool package detail failed: {}", tool_package_detail))); return simple_error!("Parse tool package detail failed: {}", tool_package_detail);
} }
let n = data["n"].to_string(); let n = data["n"].to_string();
let v = data["v"].to_string(); let v = data["v"].to_string();
if extract_match && version != v { if extract_match && version != v {
return Err(new_box_ioerror(&format!("Required version not match, {}: {} vs {}", name, version, &v))); return simple_error!("Required version not match, {}: {} vs {}", name, version, &v);
} }
let mut target_base_dir = String::with_capacity(512); let mut target_base_dir = String::with_capacity(512);
@@ -235,20 +217,20 @@ pub fn get_and_extract_tool_package(base_dir: &str, dir_with_name: bool, name: &
target_base_dir.push_str("/"); target_base_dir.push_str("/");
target_base_dir.push_str(&format!("{}-{}", n, v)); target_base_dir.push_str(&format!("{}-{}", n, v));
} }
init_dir(&target_base_dir); local_util::init_dir(&target_base_dir);
let target_file_name = format!("{}/{}", &target_base_dir, name.to_string()); let target_file_name = format!("{}/{}", &target_base_dir, name.to_string());
print_info(&format!("Start download: {} -> {}", &url.to_string(), &target_file_name)); information!("Start download: {} -> {}", &url.to_string(), &target_file_name);
download_url(&url.to_string(), &mut File::create(&target_file_name)?)?; http::download_url(&url.to_string(), &mut File::create(&target_file_name)?)?;
print_info(&format!("Start verify integrity: {} ...", &target_file_name)); information!("Start verify integrity: {} ...", &target_file_name);
if local_util::verify_file_integrity(&integrity.to_string(), &target_file_name)? { if local_util::verify_file_integrity(&integrity.to_string(), &target_file_name)? {
print_ok("Verify integrity success."); success!("Verify integrity success.");
} else { } else {
return Err(new_box_ioerror("Verify integrity failed!")); return simple_error!("Verify integrity failed!");
} }
print_info(&format!("Start extract file: {}", &target_file_name)); success!("Start extract file: {}", &target_file_name);
local_util::extract_package_and_wait(&target_base_dir, &name.to_string())?; local_util::extract_package_and_wait(&target_base_dir, &name.to_string())?;
Ok(true) Ok(true)

21
src/usage.txt Normal file
View File

@@ -0,0 +1,21 @@
buildj ::: - print this message
buildj :::help - print this message
buildj :::version - print version
buildj :::config get|set <secret> - get/set config
buildj :::create --java<version> --maven<version> - create java + maven project
e.g. buildj :::create --java1.8 --maven3.5.2
buildj :::create --java<version> --gradle<version> - create java + gradle project
e.g. buildj :::create --java1.8 --gradle3.5.1
buildj :::java<version> [-version] - run java with assigned version
e.g. buildj :::java1.8 -version
buildj :::maven<version> [--java<version>] - run maven with assigned version and java version
e.g. buildj :::maven3.5.2 --java1.8 ARGS
buildj :::gradle<version> [--java<version>] - run gradle with assigned version and java version
e.g. buildj :::gradle3.5.1 --java1.8 ARGS
buildj - run build, run assigned version builder tool
BUILDJ_NOBUILDIN=1 buildj - ignore buildj buildin commands
BUILDJ_VERBOSE=1 buildj - run buildj in verbose mode
BUILDJ_NOAUTH=1 buildj - run buildj in no auth mode
BUILDJ_JAVA_NAME=jdk-name buildj - assgin java name, e.g. adoptjdk-linux
BUILDJ_AUTH_TOKEN=auth-token buildj - assign auth token
BUILDJ_JAVA=1.8 BUILDJ_BUILDER=maven3.5.2 buildj - direct run buildj