diff --git a/Makefile b/Makefile index f87baa2..1177c8c 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # ============================================================================= -# Knowledge Genome - Makefile v. 1.6.3 +# Knowledge Genome - Makefile v. 1.7.0 # Orchestrates the setup and management of the knowledge base. # ============================================================================= diff --git a/deploy/nexus/genome-raw-commit.sh b/deploy/nexus/genome-raw-commit.sh index 7d6ac2c..dae028e 100644 --- a/deploy/nexus/genome-raw-commit.sh +++ b/deploy/nexus/genome-raw-commit.sh @@ -87,13 +87,32 @@ for key in "${!G_FILES[@]}"; do summary="${summary}${summary:+; }${G_NAME[$key]}:${short}" done -# Pull in any remote advances (e.g. a merged wiki PR), then push +# Push to origin/. The vault is SCRATCH, so we never do an interactive rebase +# (which can conflict when the same raw file is edited repeatedly). Strategy: +# try a fast-forward push; if origin moved, re-apply our raw changes on top of a +# fresh origin/ and push again. Deterministic, conflict-free. git fetch -q origin -if git show-ref --verify --quiet "refs/remotes/origin/${GENOME_BASE}"; then - git rebase -q "origin/${GENOME_BASE}" \ - || { git rebase --abort 2>/dev/null || true; printf '{"status":"error","reason":"rebase-conflict","genome":"%s"}\n' "$genome"; exit 1; } +if ! git push -q "$clone_url" "HEAD:${GENOME_BASE}" 2>/dev/null; then + # origin advanced: capture our just-made tree for raw/, realign hard, re-apply, retry once. + tmp="$(mktemp -d)" + cp -a raw/. "$tmp"/ 2>/dev/null || true + git reset -q --hard "origin/${GENOME_BASE}" + git clean -q -fd + cp -a "$tmp"/. raw/ 2>/dev/null || true + rm -rf "$tmp" + git add -A -- raw/ + git reset -q -- raw/.stignore raw/.stfolder 2>/dev/null || true + if git diff --cached --quiet; then + # our content already matches origin -> nothing to push, report ok-noop-after-realign + printf '{"status":"ok","genome":"%s","base":"%s","commits":0,"head":"%s","summary":"already in sync after realign","files":[]}\n' \ + "$genome" "$GENOME_BASE" "$(git rev-parse --short HEAD)" + exit 0 + fi + git commit -q --author="${DEFAULT_AUTHOR_NAME} <${DEFAULT_AUTHOR_EMAIL}>" \ + -m "raw(${genome}): re-apply after realign" -- raw/ || true + git push -q "$clone_url" "HEAD:${GENOME_BASE}" \ + || { printf '{"status":"error","reason":"push-failed-after-realign","genome":"%s"}\n' "$genome"; exit 1; } fi -git push -q "$clone_url" "HEAD:${GENOME_BASE}" head="$(git rev-parse --short HEAD)" # `files` array: local (file://) and remote (Forgejo web) link for each committed raw diff --git a/deploy/vm101/n8n-pi-wrap b/deploy/vm101/n8n-pi-wrap index 7fc5484..3baa288 100755 --- a/deploy/vm101/n8n-pi-wrap +++ b/deploy/vm101/n8n-pi-wrap @@ -72,9 +72,23 @@ case "$cmd" in set -a; . "${HOME}/.config/knowledge-genome.env"; set +a cd "${GENOMES_ROOT}/${genome}" 2>/dev/null || { echo '{"status":"error","reason":"unknown genome"}'; exit 1; } git fetch -q origin - # changed/added raw files (exclude deletions: nothing to ingest), only under raw/, skip Syncthing infra - files="$(git diff --name-only --diff-filter=d "${before}" "${after}" -- raw/ 2>/dev/null \ - | grep -vE '(^|/)\.st(folder|ignore)' || true)" + # Resolve the diff base robustly: + # - before all-zero (brand-new branch) or unreachable (force-push) -> fall back to after~1 + # - if even after~1 is missing (root commit) -> list all raw files in `after` + base="$before" + case "$before" in *[!0]*) : ;; *) base="" ;; esac # all-zero -> empty + if [ -n "$base" ] && ! git cat-file -e "${base}^{commit}" 2>/dev/null; then base=""; fi + if [ -z "$base" ]; then + if git cat-file -e "${after}~1^{commit}" 2>/dev/null; then base="${after}~1"; else base=""; fi + fi + if [ -n "$base" ]; then + files="$(git diff --name-only --diff-filter=d "${base}" "${after}" -- raw/ 2>/dev/null \ + | grep -vE '(^|/)\.st(folder|ignore)' || true)" + else + # no usable base: enumerate raw files present at `after` + files="$(git ls-tree -r --name-only "${after}" -- raw/ 2>/dev/null \ + | grep -vE '(^|/)\.st(folder|ignore)' || true)" + fi # emit a JSON array via jq (safe escaping) printf '%s\n' "$files" | grep -c . >/dev/null 2>&1 || files="" if [ -z "$files" ]; then