File size: 2,996 Bytes
ec27586
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env bash
# DispatchPulse pre-submission validator.
#
# Runs the same three checks the hackathon's automated grader runs:
#   1. POST /reset to the live HF Space — must return HTTP 200
#   2. docker build of the repo (Dockerfile in root, then server/Dockerfile)
#   3. `openenv validate` against the repo
#
# Usage:
#   ./scripts/validate-submission.sh https://<your-space>.hf.space [path/to/repo]
#
# Exits non-zero on the first failure.
set -uo pipefail

PING_URL="${1:-}"
REPO_DIR="${2:-.}"

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
RESET='\033[0m'

stop_at() {
    echo -e "${RED}validation FAILED at: $1${RESET}" >&2
    exit 1
}

ok() {
    echo -e "${GREEN}OK${RESET} $1"
}

warn() {
    echo -e "${YELLOW}WARN${RESET} $1"
}

if [[ -z "$PING_URL" ]]; then
    echo "Usage: $0 <space_url> [repo_dir]" >&2
    exit 2
fi

# ---------------------------------------------------------------------------
# Check 1: HF Space deploys
# ---------------------------------------------------------------------------
echo
echo "[1/3] HF Space deploys — POST $PING_URL/reset"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
    -H "Content-Type: application/json" -d '{}' \
    "$PING_URL/reset" --max-time 30 || echo "000")

if [[ "$HTTP_CODE" != "200" ]]; then
    stop_at "HF Space /reset returned $HTTP_CODE (expected 200)"
fi
ok "HF Space /reset returned 200"

# ---------------------------------------------------------------------------
# Check 2: Docker build
# ---------------------------------------------------------------------------
echo
echo "[2/3] Docker build"
DOCKER_CONTEXT=""
if [[ -f "$REPO_DIR/Dockerfile" ]]; then
    DOCKER_CONTEXT="$REPO_DIR"
    echo "  using Dockerfile at: $REPO_DIR/Dockerfile"
elif [[ -f "$REPO_DIR/server/Dockerfile" ]]; then
    DOCKER_CONTEXT="$REPO_DIR/server"
    echo "  using Dockerfile at: $REPO_DIR/server/Dockerfile"
else
    stop_at "no Dockerfile found in $REPO_DIR or $REPO_DIR/server"
fi

if ! command -v docker >/dev/null 2>&1; then
    warn "docker CLI not found locally — skipping docker build (graders will run it)"
else
    if ! timeout 600 docker build "$DOCKER_CONTEXT" >/tmp/dispatchpulse-docker-build.log 2>&1; then
        echo "--- last 40 lines of docker build log ---" >&2
        tail -40 /tmp/dispatchpulse-docker-build.log >&2
        stop_at "docker build failed"
    fi
    ok "docker build succeeded (log: /tmp/dispatchpulse-docker-build.log)"
fi

# ---------------------------------------------------------------------------
# Check 3: openenv validate
# ---------------------------------------------------------------------------
echo
echo "[3/3] openenv validate"
if ! command -v openenv >/dev/null 2>&1; then
    warn "openenv CLI not found locally — skipping (graders will run it)"
else
    if ! (cd "$REPO_DIR" && openenv validate); then
        stop_at "openenv validate failed"
    fi
    ok "openenv validate passed"
fi

echo
echo -e "${GREEN}All checks passed.${RESET}"