From 432f0690541a7899255791024da3123688edae99 Mon Sep 17 00:00:00 2001 From: ming Date: Sat, 12 Oct 2024 08:44:55 +0800 Subject: [PATCH] Update Makefile --- Makefile | 176 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 148 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index 7c96e14..932d514 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ # Makefile for Quarto Project Automation - # Detect OS OS := $(shell uname | tr A-Z a-z) ifeq ($(OS), darwin) @@ -19,7 +18,6 @@ remotedir := drwater@serev:/home/www/drwater/$(projtype)/$(pubtype)/$(reponame)/ outputdir := $(shell awk -F': *' '/^ *output-dir:/ {print $$2 "/" }' ./_quarto.yml) siteurl := https://drwater.rcees.ac.cn/$(projtype)/$(pubtype)/$(reponame)/@$(branchname) - # Variables for colors and port bcolor := grey port := 4199 @@ -36,7 +34,7 @@ else ifeq ($(findstring PUB,$(branchname)),PUB) endif # Set port based on branch name -branch_ports := main:4200 SM:4201 TX:4202 FJ:4203 YF:4204 ZY:4205 WW:4206 JB:4207 YY:4208 +branch_ports := main:4200 SM:4201 TX:4202 FJ:4203 YF:4204 ZY:4205 WW:4206 JB:4207 YY:4208 YJ:4209 DYF:4210 port := $(shell echo $(branch_ports) | tr " " "\n" | grep -E "^$(branchname):" | sed -E 's/^$(branchname):([0-9]+)/\1/') port := $(if $(port),$(port),4199) @@ -44,32 +42,103 @@ port := $(if $(port),$(port),4199) STATE_FILE := .source_state # checkfile -GREPSTR := " \|^submit\|^analysis\|_cache\|_freeze\|^site_libs\|^www" +GREPSTR := " \|(\|)\|^submit\|^analysis\|_cache\|_freeze\|^site_libs\|^www" # Default target -.PHONY: all preview readme rsync local clean upload fix_links force +.PHONY: all preview readme rsync local clean upload fix_links force check_git_status -all: render upload clean +all: local upload clean commit + +force: check_git_status render filehash upload clean commit -# Render target with hash checking -render: - @current_hash=$$(find $(shell git ls-files "*.qmd" "_*.yml" "*.pdf" "*.svg" "*.png" | grep -v $(GREPSTR)) -exec cat {} + | md5sum | awk '{print $$1}'); \ - if [ ! -f $(STATE_FILE) ] || [ "$$current_hash" != "$$(cat $(STATE_FILE))" ]; then \ - echo "Changes detected, rendering..."; \ - quarto render; \ - echo "$$current_hash" > $(STATE_FILE); \ - git add . && git commit -m "render compile"; \ +local: check_git_status lazyrender + +# Update Makefile from a specific location if on macOS +updmakefile: + @if [ "$(OS)" = "OSX" ]; then \ + echo "基于 $$HOME/bin/publish2dw.Makefile 更新本项目 Makefile..."; \ + cp "$$HOME/bin/publish2dw.Makefile" "./Makefile"; \ + git add "Makefile" && git commit -m "Update Makefile"; \ + echo "本项目Makefile更新完成."; \ else \ - echo "No changes detected, skipping render."; \ + echo "Makefile 无需在本系统上更新."; \ fi -# Force render target -force: - @echo "Forcing render..." - @quarto render + +check_git_status: + @uncommitted=$$(git status --porcelain); \ + if [ -n "$$uncommitted" ]; then \ + git status; \ + read -p "当前存在未提交的修改(如上),是否要提交?(Y/N, default is N): " answer; \ + answer=$${answer:-N}; \ + if [ "$$answer" = "Y" ] || [ "$$answer" = "y" ]; then \ + read -p "请输入修改说明: " message; \ + git add . && git commit -m "$$message"; \ + else \ + echo "未提交,如后续操作为pull,则无法继续"; \ + fi; \ + fi + + + +# Lazy render with hash checking +lazyrender: @current_hash=$$(find $(shell git ls-files "*.qmd" "_*.yml" "*.pdf" "*.svg" "*.png" | grep -v $(GREPSTR)) -exec cat {} + | md5sum | awk '{print $$1}'); \ - echo "$$current_hash" > $(STATE_FILE); \ - git add . && git commit -m "render compile"; \ + if [ ! -f $(STATE_FILE) ] || [ "$$current_hash" != "$$(cat $(STATE_FILE))" ]; then \ + echo "源文件发生变化, 重新编译..."; \ + echo "$$current_hash" > $(STATE_FILE); \ + $(MAKE) render; \ + else \ + echo "源文件无变化, 跳过编译..."; \ + exit 0; \ + fi + +# Render target +render: + @quarto render + +commit: + @echo "提交修改(commit)..."; \ + git add .; \ + if [ -n "$$(git diff --cached)" ]; then \ + git commit -m "render compile"; \ + else \ + echo "没有修改记录,跳过."; \ + fi; \ + +# Pull changes from the specified branch based on the current branch +pull: + @echo "从远程拉取项目更新..."; \ + $(MAKE) check_git_status; \ + current_branch=$$(git rev-parse --abbrev-ref HEAD); \ + if [ "$$current_branch" = main ]; then \ + echo "当前分枝为$$current_branch."; \ + remote_branch=$$(git branch --remote | grep -v 'main' | grep "[A-Z]\{2,\}" | awk '{print $$1}' | sed 's/origin\///' | head -n 1); \ + if [ -n "$$remote_branch" ]; then \ + echo "尝试从远程分枝$$remote_branch 拉取更新..."; \ + git pull origin $$remote_branch; \ + else \ + echo "远程无可用分支$$remote_branch."; \ + fi; \ + else \ + echo "尝试将远程main分枝合并至本地$$current_branch 分枝."; \ + git pull origin main; \ + fi + +# Pull changes from the main branch +pullmain: + $(MAKE) check_git_status; \ + @current_branch=$$(git rev-parse --abbrev-ref HEAD); \ + @echo "尝试将远程main分枝合并至本地$$current_branch 分枝."; \ + git pull origin main; \ + +push: + @echo "推送到远程..."; \ + git push + +filehash: + @current_hash=$$(find $(shell git ls-files "*.qmd" "_*.yml" "*.pdf" "*.svg" "*.png" | grep -v $(GREPSTR)) -exec cat {} + | md5sum | awk '{print $$1}'); \ + echo "$$current_hash" > $(STATE_FILE) # Preview the site on a specific port preview: @@ -82,11 +151,11 @@ readme: @rm "$(outputdir)/README.md" # Sync files with remote server -rsync: render +rsync: @rsync -azvu --progress --delete -r "$(outputdir)" "$(remotedir)" # Open local site -local: render +open: @if [ "$(OS)" = "OSX" ]; then open "$(outputdir)/index.html"; fi # Clean unnecessary files @@ -94,8 +163,8 @@ clean: @rm -f ./*.spl ./*.aux ./*.bbl ./*.blg ./*.log ./*.tex ./*.bcf ./*.tex.sedbak ./*.fdb_latexmk # Upload files to server and fix links -upload: render - @chmod -R 2775 "$(outputdir)" +upload: + @mkdir -p "$(outputdir)" && chmod -R 2775 "$(outputdir)" @$(MAKE) fix_links @if rsync -azvu --progress --delete -r "$(outputdir)" "$(remotedir)"; then \ if [ "$(OS)" = "OSX" ]; then \ @@ -112,9 +181,6 @@ upload: render fi; \ fi - - - # Fix links in www directory fix_links: @find ./www -type f -name "*.html" -exec sed -i.bak \ @@ -125,3 +191,57 @@ fix_links: -e "s/$(reponame)\/blob/$(reponame)\/raw\/branch/g" \ -e "s/$(reponame)\/edit/$(reponame)\/_edit/g" {} + @find ./www -type f -name "*.bak" -exec rm {} + + + +# Help: list all available commands with descriptions (English and Chinese) +help: + @echo "Makefile for Quarto Project Automation" + @echo "=======================================" + @echo "Available targets (English):" + @echo "" + @echo " make all - Execute local build, upload, clean, and commit" + @echo " make force - Force render, hash update, upload, clean, and commit" + @echo " make local - Check git status and perform a lazy render if changes detected" + @echo " make check_git_status - Check for uncommitted changes and ask to commit them" + @echo " make lazyrender - Render if source files have changed based on hash comparison" + @echo " make render - Force Quarto to render the project" + @echo " make commit - Commit changes if no previous uncommitted changes" + @echo " make filehash - Generate and store the file hash of source files" + @echo " make preview - Preview the site locally on the specific port (default: 4199)" + @echo " make readme - Render README.md from Quarto index.qmd" + @echo " make rsync - Sync output files with the remote server" + @echo " make open - Open the generated site locally in the browser" + @echo " make clean - Clean up unnecessary files" + @echo " make upload - Upload files to the server and fix links" + @echo " make fix_links - Fix HTML links in the 'www' directory for the remote server" + @echo " make updmakefile - Update the Makefile" + @echo " make help - Display this help message" + @echo "" + @echo "Available targets (中文):" + @echo "" + @echo " make all - 执行本地构建、上传、清理和提交" + @echo " make force - 强制渲染、更新哈希、上传、清理并提交" + @echo " make local - 检查Git状态,若检测到更改则进行懒惰渲染" + @echo " make check_git_status - 检查未提交的更改,并询问是否提交" + @echo " make lazyrender - 如果源文件发生更改,则根据哈希比较进行渲染" + @echo " make render - 强制 Quarto 渲染项目" + @echo " make commit - 如果没有未提交的更改则提交" + @echo " make filehash - 生成并存储源文件的哈希值" + @echo " make preview - 本地在特定端口预览网站 (默认: 4199)" + @echo " make readme - 从 Quarto 的 index.qmd 生成 README.md" + @echo " make rsync - 将输出文件同步到远程服务器" + @echo " make open - 在浏览器中打开生成的网站" + @echo " make clean - 清理不必要的文件" + @echo " make upload - 上传文件到服务器并修复链接" + @echo " make fix_links - 修复 'www' 目录中的 HTML 链接" + @echo " make updmakefile - 更新本项目 Makefile" + @echo " make help - 显示此帮助信息" + @echo "" + @echo "Environment variables (English and 中文):" + @echo " bcolor - Background color based on branch name (基于分支名的背景颜色)" + @echo " port - Port number based on branch name (基于分支名的端口号)" + @echo " STATE_FILE - File for storing hash state of source files (用于存储源文件哈希状态的文件)" + @echo " siteurl - The URL where the site will be hosted (网站托管的 URL)" + @echo "" + +