#!/bin/bash # -*- coding: utf-8 -*- # Test file for: check_dependancy_commands.sh THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(realpath "$THIS_DIR/../..")" # Test counter TESTS_RUN=0 TESTS_PASSED=0 TESTS_FAILED=0 # Colors GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' assert_success() { local cmd="$1" local desc="${2:-$cmd}" ((TESTS_RUN++)) if eval "$cmd" > /dev/null 2>&1; then echo -e "${GREEN}✓${NC} $desc" ((TESTS_PASSED++)) else echo -e "${RED}✗${NC} $desc" ((TESTS_FAILED++)) fi } assert_file_exists() { local file="$1" ((TESTS_RUN++)) if [ -f "$file" ]; then echo -e "${GREEN}✓${NC} File exists: $file" ((TESTS_PASSED++)) else echo -e "${RED}✗${NC} File missing: $file" ((TESTS_FAILED++)) fi } # Add your tests here test_placeholder() { echo "TODO: Add tests for check_dependancy_commands.sh" } # Run tests main() { echo "Testing: check_dependancy_commands.sh" echo "========================================" test_placeholder echo "========================================" echo "Results: $TESTS_PASSED/$TESTS_RUN passed" [ $TESTS_FAILED -gt 0 ] && exit 1 exit 0 } main "$@" # -------------------------------------------------------------------------------- # Start of Source Code from: /home/ywatanabe/proj/scitex-writer/scripts/shell/modules/check_dependancy_commands.sh # -------------------------------------------------------------------------------- # #!/bin/bash # # -*- coding: utf-8 -*- # # Timestamp: "2025-11-11 07:23:33 (ywatanabe)" # # File: ./scripts/shell/modules/check_dependancy_commands.sh # # ORIG_DIR="$(pwd)" # THIS_DIR="$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)" # LOG_PATH="$THIS_DIR/.$(basename $0).log" # echo > "$LOG_PATH" # # GIT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" # # GRAY='\033[0;90m' # GREEN='\033[0;32m' # YELLOW='\033[0;33m' # RED='\033[0;31m' # NC='\033[0m' # No Color # # echo_info() { echo -e "${GRAY}INFO: $1${NC}"; } # log_info() { # if [ "${SCITEX_LOG_LEVEL:-1}" -ge 2 ]; then # echo -e " \033[0;90m→ $1\033[0m" # fi # } # echo_success() { echo -e "${GREEN}SUCC: $1${NC}"; } # echo_warning() { echo -e "${YELLOW}WARN: $1${NC}"; } # echo_error() { echo -e "${RED}ERRO: $1${NC}"; } # echo_header() { echo_info "=== $1 ==="; } # # --------------------------------------- # # # Don't clear log at start - timing info will be appended # # # Configurations # source ./config/load_config.sh $SCITEX_WRITER_DOC_TYPE # # # Source the 00_shared LaTeX commands module # source "$(dirname ${BASH_SOURCE[0]})/command_switching.src" # log_info "Running ${BASH_SOURCE[0]}..." # # # # Detect package manager # detect_package_manager() { # if command -v apt &> /dev/null; then # echo "apt" # elif command -v yum &> /dev/null; then # echo "yum" # else # echo "unknown" # fi # } # # # Check if sudo is available # has_sudo() { # if command -v sudo &> /dev/null; then # return 0 # else # return 1 # fi # } # # PKG_MANAGER=$(detect_package_manager) # SUDO_PREFIX="" # if has_sudo; then # SUDO_PREFIX="sudo " # fi # # # Standalone checker for each tool # check_pdflatex() { # local cmd=$(get_cmd_pdflatex "$ORIG_DIR") # if [ -z "$cmd" ]; then # echo "- pdflatex" # if [ "$PKG_MANAGER" = "apt" ]; then # echo " - ${SUDO_PREFIX}apt install texlive-latex-base" # elif [ "$PKG_MANAGER" = "yum" ]; then # echo " - ${SUDO_PREFIX}yum install texlive-latex" # fi # echo " - Or use: module load texlive" # echo " - Or use: apptainer/singularity with texlive container" # return 1 # fi # return 0 # } # # check_bibtex() { # local cmd=$(get_cmd_bibtex "$ORIG_DIR") # if [ -z "$cmd" ]; then # echo "- bibtex" # if [ "$PKG_MANAGER" = "apt" ]; then # echo " - ${SUDO_PREFIX}apt install texlive-bibtex-extra" # elif [ "$PKG_MANAGER" = "yum" ]; then # echo " - ${SUDO_PREFIX}yum install texlive-bibtex" # fi # echo " - Or use: module load texlive" # echo " - Or use: apptainer/singularity with texlive container" # return 1 # fi # return 0 # } # # check_latexdiff() { # local cmd=$(get_cmd_latexdiff "$ORIG_DIR") # if [ -z "$cmd" ]; then # echo "- latexdiff" # if [ "$PKG_MANAGER" = "apt" ]; then # echo " - ${SUDO_PREFIX}apt install latexdiff" # elif [ "$PKG_MANAGER" = "yum" ]; then # echo " - ${SUDO_PREFIX}yum install texlive-latexdiff" # fi # echo " - Or use: module load texlive" # echo " - Or use: apptainer/singularity with texlive container" # return 1 # fi # return 0 # } # # check_texcount() { # local cmd=$(get_cmd_texcount "$ORIG_DIR") # if [ -z "$cmd" ]; then # echo "- texcount" # if [ "$PKG_MANAGER" = "apt" ]; then # echo " - ${SUDO_PREFIX}apt install texlive-extra-utils" # elif [ "$PKG_MANAGER" = "yum" ]; then # echo " - ${SUDO_PREFIX}yum install texlive-texcount" # fi # echo " - Or use: module load texlive" # echo " - Or use: apptainer/singularity with texlive container" # return 1 # fi # return 0 # } # # check_xlsx2csv() { # if ! command -v xlsx2csv &> /dev/null && ! python3 -c "import xlsx2csv" &> /dev/null 2>&1; then # echo "- xlsx2csv" # echo " - pip install xlsx2csv" # if [ "$PKG_MANAGER" = "apt" ]; then # echo " - Or: ${SUDO_PREFIX}apt install xlsx2csv" # fi # return 1 # fi # return 0 # } # # check_csv2latex() { # if ! command -v csv2latex &> /dev/null && ! python3 -c "import csv2latex" &> /dev/null 2>&1; then # echo "- csv2latex" # echo " - pip install csv2latex" # return 1 # fi # return 0 # } # # check_parallel() { # if ! command -v parallel &> /dev/null; then # echo "- parallel" # if [ "$PKG_MANAGER" = "apt" ]; then # echo " - ${SUDO_PREFIX}apt install parallel" # elif [ "$PKG_MANAGER" = "yum" ]; then # echo " - ${SUDO_PREFIX}yum install parallel" # fi # return 1 # fi # return 0 # } # # check_opencv() { # if command -v python3 &> /dev/null; then # if ! python3 -c "import cv2" &> /dev/null 2>&1; then # echo "- opencv-python (optional, for --crop_tif)" # echo " - pip install opencv-python" # return 1 # fi # fi # return 0 # } # # check_numpy() { # if command -v python3 &> /dev/null; then # if ! python3 -c "import numpy" &> /dev/null 2>&1; then # echo "- numpy (optional, for --crop_tif)" # echo " - pip install numpy" # return 1 # fi # fi # return 0 # } # # check_mmdc() { # local cmd=$(get_cmd_mmdc "$ORIG_DIR") # if [ -z "$cmd" ]; then # echo "- mmdc (optional, for Mermaid diagrams)" # if ! command -v npm &> /dev/null; then # echo " - First install npm/nodejs" # fi # echo " - npm install -g @mermaid-js/mermaid-cli" # echo " - Or use: apptainer/singularity with mermaid container" # return 1 # fi # return 0 # } # # check_bibtexparser() { # if command -v python3 &> /dev/null; then # if ! python3 -c "import bibtexparser" &> /dev/null 2>&1; then # echo "- bibtexparser (for bibliography analysis tools)" # echo " - pip install bibtexparser" # return 1 # fi # fi # return 0 # } # # # Check all required commands (parallelized for speed) # check_all_dependencies() { # local has_missing_required=false # local has_missing_optional=false # local required_output="" # local optional_output="" # # # Log run timestamp # echo "=== $(date '+%Y-%m-%d %H:%M:%S') ===" >> "$LOG_PATH" # # # Quick native-only check to avoid expensive container warmup # local all_native_available=true # local start_native_check=$(date +%s%N) # # # Check if all required native commands exist (fast check only) # if ! command -v pdflatex &> /dev/null || ! pdflatex --version &> /dev/null 2>&1; then # all_native_available=false # elif ! command -v bibtex &> /dev/null || ! bibtex --version &> /dev/null 2>&1; then # all_native_available=false # elif ! command -v latexdiff &> /dev/null; then # all_native_available=false # elif ! command -v texcount &> /dev/null || ! texcount --version &> /dev/null 2>&1; then # all_native_available=false # fi # # local end_native_check=$(date +%s%N) # local native_check_ms=$(( (end_native_check - start_native_check) / 1000000 )) # echo "Native check: ${native_check_ms}ms" >> "$LOG_PATH" # echo_info " Native check: ${native_check_ms}ms" # # # Only do expensive warmup if native commands are missing # if [ "$all_native_available" = false ]; then # echo_info " Native commands incomplete, checking alternatives..." # # Pre-warmup: do expensive shared setup once before parallelizing # # This prevents each parallel job from doing redundant work # local start_warmup=$(date +%s%N) # get_container_runtime &> /dev/null # load_texlive_module &> /dev/null # setup_latex_container &> /dev/null # setup_mermaid_container &> /dev/null # local end_warmup=$(date +%s%N) # local warmup_ms=$(( (end_warmup - start_warmup) / 1000000 )) # echo "Warmup: ${warmup_ms}ms" >> "$LOG_PATH" # echo_info " Warmup: ${warmup_ms}ms" # else # echo_info " All native LaTeX commands available (skipping container warmup)" # fi # # # Temp directory for parallel results # local temp_dir=$(mktemp -d) # # # Run all required checks in parallel, capturing exit codes # local start_checks=$(date +%s%N) # (check_pdflatex > "$temp_dir/req_pdflatex" 2>&1; echo $? > "$temp_dir/req_pdflatex.exit") & # (check_bibtex > "$temp_dir/req_bibtex" 2>&1; echo $? > "$temp_dir/req_bibtex.exit") & # (check_latexdiff > "$temp_dir/req_latexdiff" 2>&1; echo $? > "$temp_dir/req_latexdiff.exit") & # (check_texcount > "$temp_dir/req_texcount" 2>&1; echo $? > "$temp_dir/req_texcount.exit") & # (check_xlsx2csv > "$temp_dir/req_xlsx2csv" 2>&1; echo $? > "$temp_dir/req_xlsx2csv.exit") & # (check_csv2latex > "$temp_dir/req_csv2latex" 2>&1; echo $? > "$temp_dir/req_csv2latex.exit") & # (check_parallel > "$temp_dir/req_parallel" 2>&1; echo $? > "$temp_dir/req_parallel.exit") & # # # Run all optional checks in parallel # (check_opencv > "$temp_dir/opt_opencv" 2>&1; echo $? > "$temp_dir/opt_opencv.exit") & # (check_numpy > "$temp_dir/opt_numpy" 2>&1; echo $? > "$temp_dir/opt_numpy.exit") & # (check_mmdc > "$temp_dir/opt_mmdc" 2>&1; echo $? > "$temp_dir/opt_mmdc.exit") & # (check_bibtexparser > "$temp_dir/opt_bibtexparser" 2>&1; echo $? > "$temp_dir/opt_bibtexparser.exit") & # # # Wait for all background jobs # wait # local end_checks=$(date +%s%N) # local checks_ms=$(( (end_checks - start_checks) / 1000000 )) # echo "Parallel checks: ${checks_ms}ms" >> "$LOG_PATH" # echo_info " Parallel checks: ${checks_ms}ms" # # # Collect required results with exit codes # declare -A tool_status # for tool in pdflatex bibtex latexdiff texcount xlsx2csv csv2latex parallel; do # local exit_code=$(cat "$temp_dir/req_${tool}.exit" 2>/dev/null || echo 1) # if [ "$exit_code" -eq 0 ]; then # tool_status[$tool]="✓" # else # has_missing_required=true # tool_status[$tool]="✗" # if [ -s "$temp_dir/req_${tool}" ]; then # required_output="${required_output}$(cat "$temp_dir/req_${tool}")\n" # fi # fi # done # # # Collect optional results # for result_file in "$temp_dir"/opt_*.exit; do # local tool=$(basename "$result_file" .exit | sed 's/opt_//') # local exit_code=$(cat "$result_file" 2>/dev/null || echo 1) # if [ "$exit_code" -ne 0 ]; then # has_missing_optional=true # if [ -s "${result_file%.exit}" ]; then # optional_output="${optional_output}$(cat "${result_file%.exit}")\n" # fi # fi # done # # # Cleanup # rm -rf "$temp_dir" # # # Display results # if [ "$has_missing_required" = true ]; then # echo_error " Missing required tools:" # echo -e "$required_output" # return 1 # else # # Show summary table using cached results (no additional checks!) # echo_success " Required tools:" # printf " %-20s %s\n" "pdflatex" "${tool_status[pdflatex]}" # printf " %-20s %s\n" "bibtex" "${tool_status[bibtex]}" # printf " %-20s %s\n" "latexdiff" "${tool_status[latexdiff]}" # printf " %-20s %s\n" "texcount" "${tool_status[texcount]}" # printf " %-20s %s\n" "xlsx2csv" "${tool_status[xlsx2csv]}" # printf " %-20s %s\n" "csv2latex" "${tool_status[csv2latex]}" # printf " %-20s %s\n" "parallel" "${tool_status[parallel]}" # fi # # if [ "$has_missing_optional" = true ]; then # echo_warning " Missing optional tools:" # echo -e "$optional_output" # fi # # return 0 # } # # # Run checks # check_all_dependencies # exit_code=$? # # exit $exit_code # # # EOF # -------------------------------------------------------------------------------- # End of Source Code from: /home/ywatanabe/proj/scitex-writer/scripts/shell/modules/check_dependancy_commands.sh # --------------------------------------------------------------------------------