#!/bin/bash set -e # Setup: Add src directory to PATH and create isolated test directory SRCDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../src" && pwd)" export PATH="$SRCDIR:$PATH" TESTDIR=$(mktemp -d) trap "rm -rf '$TESTDIR'" EXIT cd "$TESTDIR" echo "=== Test: subgit add with single path argument ===" # Step 1: Create an upstream repository mkdir -p upstream/repo1 cd upstream/repo1 git init git config user.email "test@test.com" git config user.name "Test User" echo "test content" > file1.txt git add file1.txt git commit -m "Initial commit" REPO_COMMIT=$(git rev-parse HEAD) REPO_BRANCH=$(git branch --show-current) UPSTREAM_PATH=$(pwd) cd "$TESTDIR" # Step 2: Create parent repo mkdir parent cd parent git init # Step 3: Clone the repo inside parent to create a local copy with .git git clone ../upstream/repo1 myrepo # Step 4: Add the local copy using single-path syntax subgit add myrepo # Step 5: Verify that the repo was added correctly # Check that .subgitrc was created if [ ! -f .subgitrc ]; then echo "FAIL: .subgitrc not created" exit 1 fi # Check that remote was extracted correctly (git clone sets it to the path cloned from) source .subgitrc EXPECTED_REMOTE="$TESTDIR/parent/../upstream/repo1" if [ "${subgitinfo[myrepo/remote]}" != "$EXPECTED_REMOTE" ]; then echo "FAIL: remote not extracted correctly (expected $EXPECTED_REMOTE, got ${subgitinfo[myrepo/remote]})" exit 1 fi # Check that branch was extracted correctly if [ "${subgitinfo[myrepo/branch]}" != "$REPO_BRANCH" ]; then echo "FAIL: branch not extracted correctly (expected $REPO_BRANCH, got ${subgitinfo[myrepo/branch]})" exit 1 fi # Check that commit was extracted correctly if [ "${subgitinfo[myrepo/commit]}" != "$REPO_COMMIT" ]; then echo "FAIL: commit not extracted correctly (expected $REPO_COMMIT, got ${subgitinfo[myrepo/commit]})" exit 1 fi # Check that .git was moved to .subgit/ if [ ! -d .subgit/myrepo ]; then echo "FAIL: bare repo not created in .subgit/" exit 1 fi # Check that .git is now a symlink if [ ! -L myrepo/.git ]; then echo "FAIL: .git symlink not created" exit 1 fi # Check that files are still accessible if [ ! -f myrepo/file1.txt ]; then echo "FAIL: file1.txt not present in working directory" exit 1 fi echo "=== Test: add path with explicit commit override ===" # Clone another repo inside parent git clone ../upstream/repo1 myrepo2 cd myrepo2 echo "new content" > file2.txt git add file2.txt git commit -m "Second commit" SECOND_COMMIT=$(git rev-parse HEAD) cd .. # Add with explicit commit (should use the specified commit, not HEAD) subgit add -c "$REPO_COMMIT" myrepo2 source .subgitrc if [ "${subgitinfo[myrepo2/commit]}" != "$REPO_COMMIT" ]; then echo "FAIL: explicit commit not used (expected $REPO_COMMIT, got ${subgitinfo[myrepo2/commit]})" exit 1 fi # Working directory should be at the specified commit ACTUAL_COMMIT=$(git -C myrepo2 rev-parse HEAD) if [ "$ACTUAL_COMMIT" != "$REPO_COMMIT" ]; then echo "FAIL: working directory not at specified commit" exit 1 fi echo "PASS: add path test"