diff --git a/whatsdirty/test.sh b/whatsdirty/test.sh new file mode 100755 index 0000000..26dd6a1 --- /dev/null +++ b/whatsdirty/test.sh @@ -0,0 +1,141 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +WHATSDIRTY_SCRIPT="$SCRIPT_DIR/whatsdirty.sh" +CONFIG_FILE="$HOME/.config/whatsdirty.conf" +BACKUP_FILE="" +TEST_PASSED=true + +# Colors for output +GREEN='\033[0;32m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +# Function to print test results +print_test() { + local test_name="$1" + local result="$2" + if [ "$result" = "PASS" ]; then + echo -e "${GREEN}✓${NC} $test_name" + else + echo -e "${RED}✗${NC} $test_name" + TEST_PASSED=false + fi +} + +# Function to cleanup and restore +cleanup() { + if [ -n "$BACKUP_FILE" ] && [ -f "$BACKUP_FILE" ]; then + cp "$BACKUP_FILE" "$CONFIG_FILE" + rm -f "$BACKUP_FILE" + elif [ -n "$BACKUP_FILE" ]; then + # Original didn't exist, so remove the created one + rm -f "$CONFIG_FILE" + fi +} + +# Set up trap to restore config on exit +trap cleanup EXIT + +echo "Testing whatsdirty.sh configuration behavior..." +echo + +# Backup existing config if it exists +if [ -f "$CONFIG_FILE" ]; then + BACKUP_FILE=$(mktemp) + cp "$CONFIG_FILE" "$BACKUP_FILE" +else + # Mark that we need to remove the config file on cleanup + BACKUP_FILE="NONE_EXISTED" +fi + +# Remove config to start fresh +rm -f "$CONFIG_FILE" + +# Test 1: Running without arguments and no config should fail +echo "Test 1: First run without arguments (should fail)" +OUTPUT=$("$WHATSDIRTY_SCRIPT" 2>&1 || true) +if echo "$OUTPUT" | grep -q "No directory specified and no saved directory found"; then + print_test "First run without args shows error" "PASS" +else + print_test "First run without args shows error" "FAIL" + echo " Expected: 'No directory specified and no saved directory found'" + echo " Got: $OUTPUT" +fi + +# Test 2: Running with a valid directory should save config +echo -e "\nTest 2: First run with directory argument" +TEST_DIR="/home/j/code" +if [ -d "$TEST_DIR" ]; then + "$WHATSDIRTY_SCRIPT" "$TEST_DIR" > /dev/null 2>&1 + if [ -f "$CONFIG_FILE" ] && [ "$(cat "$CONFIG_FILE")" = "$TEST_DIR" ]; then + print_test "Directory saved to config" "PASS" + else + print_test "Directory saved to config" "FAIL" + fi +else + print_test "Directory saved to config" "SKIP (test directory not found)" +fi + +# Test 3: Running without arguments should use saved directory +echo -e "\nTest 3: Subsequent run without arguments" +if "$WHATSDIRTY_SCRIPT" > /dev/null 2>&1; then + print_test "Uses saved directory from config" "PASS" +else + print_test "Uses saved directory from config" "FAIL" +fi + +# Test 4: Running with new directory should update config +echo -e "\nTest 4: Run with different directory" +NEW_TEST_DIR="$SCRIPT_DIR/.." +if [ -d "$NEW_TEST_DIR" ]; then + CANONICAL_DIR=$(cd "$NEW_TEST_DIR" && pwd) + "$WHATSDIRTY_SCRIPT" "$NEW_TEST_DIR" > /dev/null 2>&1 + if [ -f "$CONFIG_FILE" ] && [ "$(cat "$CONFIG_FILE")" = "$CANONICAL_DIR" ]; then + print_test "Config updated with new directory" "PASS" + else + print_test "Config updated with new directory" "FAIL" + fi +else + print_test "Config updated with new directory" "SKIP (test directory not found)" +fi + +# Test 5: Invalid directory should fail +echo -e "\nTest 5: Invalid directory handling" +OUTPUT=$("$WHATSDIRTY_SCRIPT" "/nonexistent/directory" 2>&1 || true) +if echo "$OUTPUT" | grep -q "Directory '/nonexistent/directory' not found"; then + print_test "Invalid directory shows error" "PASS" +else + print_test "Invalid directory shows error" "FAIL" + echo " Expected: 'Directory '/nonexistent/directory' not found'" + echo " Got: $OUTPUT" +fi + +# Test 6: Saved directory that no longer exists +echo -e "\nTest 6: Saved directory that no longer exists" +mkdir -p "$(dirname "$CONFIG_FILE")" +echo "/nonexistent/saved/directory" > "$CONFIG_FILE" +OUTPUT=$("$WHATSDIRTY_SCRIPT" 2>&1 || true) +if echo "$OUTPUT" | grep -q "no longer exists"; then + # Check that config was removed + if [ ! -f "$CONFIG_FILE" ]; then + print_test "Handles deleted saved directory" "PASS" + else + print_test "Handles deleted saved directory" "FAIL (config not cleaned up)" + fi +else + print_test "Handles deleted saved directory" "FAIL" + echo " Expected message about directory no longer existing" + echo " Got: $OUTPUT" +fi + +# Summary +echo +if [ "$TEST_PASSED" = true ]; then + echo -e "${GREEN}All tests passed!${NC}" + exit 0 +else + echo -e "${RED}Some tests failed!${NC}" + exit 1 +fi \ No newline at end of file diff --git a/whatsdirty/whatsdirty.sh b/whatsdirty/whatsdirty.sh index 1b8bed8..8d59dcd 100755 --- a/whatsdirty/whatsdirty.sh +++ b/whatsdirty/whatsdirty.sh @@ -8,11 +8,48 @@ # for each git repo print the name of the repo, the datestamp of the last commit, # the nubmer of changes since then, and whether it's clean or not. -# if no argument is provided, use the current directory -DIR="${1:-.}" +# Configuration file path +CONFIG_FILE="$HOME/.config/whatsdirty.conf" -# make directory canonical -DIR=$(cd "$DIR" 2>/dev/null && pwd) || { echo "Error: Directory '$1' not found"; exit 1; } +# Function to save directory to config +save_directory() { + local dir="$1" + mkdir -p "$(dirname "$CONFIG_FILE")" + echo "$dir" > "$CONFIG_FILE" +} + +# Function to load directory from config +load_directory() { + if [ -f "$CONFIG_FILE" ]; then + cat "$CONFIG_FILE" + fi +} + +# Determine which directory to use +if [ $# -eq 0 ]; then + # No argument provided - try to load from config + SAVED_DIR=$(load_directory) + if [ -z "$SAVED_DIR" ]; then + echo "Error: No directory specified and no saved directory found." + echo "Usage: $0 " + echo "The specified directory will be saved for future use." + exit 1 + fi + DIR="$SAVED_DIR" +else + # Argument provided - use it and save to config + DIR="$1" + # Validate and canonicalize the directory first + DIR=$(cd "$DIR" 2>/dev/null && pwd) || { echo "Error: Directory '$1' not found"; exit 1; } + save_directory "$DIR" +fi + +# Make sure directory is canonical (in case loaded from config) +DIR=$(cd "$DIR" 2>/dev/null && pwd) || { + echo "Error: Saved directory '$DIR' no longer exists"; + rm -f "$CONFIG_FILE" + exit 1; +} # Color codes RED='\033[0;31m'