#!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" CORE_IDE_DIR="${ROOT}/core_ide" PATCH_DIR="${ROOT}/patches/lapce" SERIES_FILE="${PATCH_DIR}/series" BASE_REF="" usage() { cat <<'EOF' Usage: ./scripts/core-ide-export-patches.sh [--base ] Exports the commits in core_ide (BASE..HEAD) as patch files into: patches/lapce/*.patch and rewrites: patches/lapce/series If --base is not provided, the script tries (first match): upstream/master, upstream/main, origin/master, origin/main EOF } while [[ $# -gt 0 ]]; do case "$1" in -h|--help) usage exit 0 ;; --base) BASE_REF="${2:-}" shift 2 ;; *) echo "Unknown argument: $1" >&2 usage >&2 exit 2 ;; esac done if [[ ! -d "${CORE_IDE_DIR}/.git" ]]; then echo "Missing core_ide git checkout: ${CORE_IDE_DIR}" >&2 exit 1 fi mkdir -p "${PATCH_DIR}" if [[ ! -f "${SERIES_FILE}" ]]; then echo "Missing series file: ${SERIES_FILE}" >&2 exit 1 fi if [[ -n "$(git -C "${CORE_IDE_DIR}" status --porcelain)" ]]; then echo "core_ide working tree is not clean. Commit changes before exporting patches." >&2 exit 1 fi ref_exists() { git -C "${CORE_IDE_DIR}" show-ref --verify --quiet "refs/remotes/$1" \ || git -C "${CORE_IDE_DIR}" show-ref --verify --quiet "refs/heads/$1" \ || git -C "${CORE_IDE_DIR}" rev-parse --verify --quiet "$1" >/dev/null 2>&1 } if [[ -z "${BASE_REF}" ]]; then for candidate in "upstream/master" "upstream/main" "origin/master" "origin/main"; do if ref_exists "${candidate}"; then BASE_REF="${candidate}" break fi done fi if [[ -z "${BASE_REF}" ]]; then echo "Could not auto-detect a base ref. Provide --base ." >&2 exit 1 fi HEAD_SHA="$(git -C "${CORE_IDE_DIR}" rev-parse HEAD)" BASE_SHA="$(git -C "${CORE_IDE_DIR}" rev-parse "${BASE_REF}")" if [[ "${HEAD_SHA}" == "${BASE_SHA}" ]]; then echo "No commits to export (HEAD equals base ${BASE_REF})." rm -f "${PATCH_DIR}"/*.patch printf "%s\n" \ "# List Lapce patch files (one per line)." \ "# This file is consumed by: ./scripts/core-ide-apply-patches.sh" \ "" \ >"${SERIES_FILE}" exit 0 fi rm -f "${PATCH_DIR}"/*.patch git -C "${CORE_IDE_DIR}" format-patch \ --output-directory "${PATCH_DIR}" \ --no-stat \ --no-signature \ "${BASE_REF}..HEAD" ( cd "${PATCH_DIR}" { echo "# List Lapce patch files (one per line)." echo "# This file is consumed by: ./scripts/core-ide-apply-patches.sh" echo ls -1 *.patch 2>/dev/null | sort } >"${SERIES_FILE}" ) echo "OK: exported patches to ${PATCH_DIR} (base=${BASE_REF})."