diff --git a/.Rbuildignore b/.Rbuildignore index 11ed100330..689b1dac02 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -57,3 +57,5 @@ ^man/dot-extract_constructor_and_modifiers\.Rd$ ^man/dot-apply_modifiers\.Rd$ ^man/handle_vertex_type_arg\.Rd$ +^vendor\.sh$ +^vendor-one\.sh$ diff --git a/tools/README.md b/tools/README.md index f95c2e1386..cb3173d119 100644 --- a/tools/README.md +++ b/tools/README.md @@ -5,7 +5,7 @@ In the shell: ```sh -tools/update-cigraph.sh +vendor.sh ``` There is a CI/CD workflow that runs this very frequently. diff --git a/tools/update-cigraph.sh b/tools/update-cigraph.sh deleted file mode 100755 index 84580e0360..0000000000 --- a/tools/update-cigraph.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -set -e -set -x -set -o pipefail - -cd $(dirname $0)/.. - -if [ -z "$1" ]; then - upstream_dir=../../igraph -else - upstream_dir="$1" -fi - -if [ -n "$(git status --porcelain)" ]; then - echo "Error: working directory not clean" - exit 1 -fi - -if [ -n "$(git -C "$upstream_dir" status --porcelain)" ]; then - echo "Warning: working directory $upstream_dir not clean" -fi - -commit=$(git -C "$upstream_dir" rev-parse HEAD) -echo "Importing commit $commit" - -base=$(git log -n 1 --format="%s" -- src/vendor/cigraph | sed -r 's#^.*igraph/igraph@(.*)$|^.*$#\1#') - -rm -rf src/vendor/cigraph -mkdir -p src/vendor/cigraph - -git clone "$upstream_dir" src/vendor/cigraph - -cmake -Ssrc/vendor/cigraph -Bsrc/vendor/cigraph/build - -mv src/vendor/cigraph/build/include/igraph_version.h src/vendor/ - -rm -rf src/vendor/cigraph/.git src/vendor/cigraph/.github src/vendor/cigraph/doc src/vendor/cigraph/examples src/vendor/cigraph/fuzzing src/vendor/cigraph/tests src/vendor/cigraph/tools src/vendor/cigraph/build - -if [ $(git status --porcelain -- src/vendor | wc -l) -le 0 ]; then - echo "No changes." - git checkout -- src/vendor - exit 0 -fi - -make -f Makefile-cigraph - -R -q -e 'cpp11::cpp_register()' - -git add src/vendor src/*.mk R/aaa-auto.R src/cpp11.cpp src/rinterface.c - -( - echo "chore: Update vendored sources to igraph/igraph@$commit" - echo - git -C "$upstream_dir" log --first-parent --format="%s" ${base}..${commit} | sed -r 's%(#[0-9]+)%igraph/igraph\1%g' -) | git commit --file /dev/stdin diff --git a/vendor-one.sh b/vendor-one.sh new file mode 100755 index 0000000000..9568386db3 --- /dev/null +++ b/vendor-one.sh @@ -0,0 +1,94 @@ +#!/bin/bash +# https://unix.stackexchange.com/a/654932/19205 +# Using bash for -o pipefail + +set -e +set -x +set -o pipefail + +cd `dirname $0` + +project=igraph +vendor_base_dir=src/vendor +vendor_dir=${vendor_base_dir}/cigraph +repo_org=${project} +repo_name=${project} + + +if [ -z "$1" ]; then + upstream_basedir=../../${project} +else + upstream_basedir="$1" +fi + +upstream_dir=.git/${project} + +if [ "$upstream_basedir" != "$upstream_dir" ]; then + git clone "$upstream_basedir" "$upstream_dir" +fi + +if [ -n "$(git status --porcelain)" ]; then + echo "Error: working directory not clean" + exit 1 +fi + +if [ -n "$(git -C "$upstream_dir" status --porcelain)" ]; then + echo "Warning: working directory $upstream_dir not clean" +fi + +base=$(git log -n 3 --format="%s" -- ${vendor_dir} | tee /dev/stderr | sed -nr '/^.*'${repo_org}.${repo_name}'@([0-9a-f]+)( .*)?$/{s//\1/;p;}' | head -n 1) + +original=$(git -C "$upstream_dir" log --first-parent --reverse --format="%H" ${base}..HEAD) + +message= +is_tag= + +for commit in $original; do + echo "Importing commit $commit" + + git -C "$upstream_dir" checkout "$commit" + + rm -rf ${vendor_dir} + mkdir -p ${vendor_dir} + + git clone "$upstream_dir" ${vendor_dir} + + cmake -S${vendor_dir} -B${vendor_dir}/build + + mv ${vendor_dir}/build/include/igraph_version.h src/vendor/ + + rm -rf ${vendor_dir}/.git ${vendor_dir}/.github ${vendor_dir}/doc ${vendor_dir}/examples ${vendor_dir}/fuzzing ${vendor_dir}/tests ${vendor_dir}/tools ${vendor_dir}/build + + make -f Makefile-cigraph + + R -q -e 'cpp11::cpp_register()' + + # Always vendor tags + if [ $(git -C "$upstream_dir" describe --tags "$commit" | grep -c -- -) -eq 0 ]; then + message="vendor: Update vendored sources (tag $(git -C "$upstream_dir" describe --tags "$commit")) to ${repo_org}/${repo_name}@$commit" + is_tag=true + break + fi + + if [ $(git status --porcelain -- ${vendor_base_dir} | wc -l) -gt 1 ]; then + message="vendor: Update vendored sources to ${repo_org}/${repo_name}@$commit" + break + fi +done + +if [ "$message" = "" ]; then + echo "No changes." + git checkout -- ${vendor_base_dir} + rm -rf "$upstream_dir" + exit 0 +fi + +git add . + +( + echo "$message" + echo + git -C "$upstream_dir" log --first-parent --format="%s" ${base}..${commit} | tee /dev/stderr | sed -r 's%(#[0-9]+)%'${repo_org}/${repo_name}'\1%g' +) | git commit --file /dev/stdin + +rm -rf "$upstream_dir" diff --git a/vendor.sh b/vendor.sh new file mode 100755 index 0000000000..547e2d45fc --- /dev/null +++ b/vendor.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# https://unix.stackexchange.com/a/654932/19205 +# Using bash for -o pipefail + +set -e +set -x +set -o pipefail + +cd `dirname $0` + +project=igraph +vendor_base_dir=src/vendor +vendor_dir=${vendor_base_dir}/cigraph +repo_org=${project} +repo_name=${project} + + +if [ -z "$1" ]; then + upstream_basedir=../../${project} +else + upstream_basedir="$1" +fi + +upstream_dir=.git/${project} + +if [ "$upstream_basedir" != "$upstream_dir" ]; then + git clone "$upstream_basedir" "$upstream_dir" +fi + +if [ -n "$(git status --porcelain)" ]; then + echo "Error: working directory not clean" + exit 1 +fi + +if [ -n "$(git -C "$upstream_dir" status --porcelain)" ]; then + echo "Warning: working directory $upstream_dir not clean" +fi + +base=$(git log -n 3 --format="%s" -- ${vendor_dir} | tee /dev/stderr | sed -nr '/^.*'${repo_org}.${repo_name}'@([0-9a-f]+)( .*)?$/{s//\1/;p;}' | head -n 1) + +original=$(git -C "$upstream_dir" rev-parse --verify HEAD) + +message= +is_tag= + +for commit in $original; do + echo "Importing commit $commit" + + rm -rf ${vendor_dir} + mkdir -p ${vendor_dir} + + git clone "$upstream_dir" ${vendor_dir} + + cmake -S${vendor_dir} -B${vendor_dir}/build + + mv ${vendor_dir}/build/include/igraph_version.h src/vendor/ + + rm -rf ${vendor_dir}/.git ${vendor_dir}/.github ${vendor_dir}/doc ${vendor_dir}/examples ${vendor_dir}/fuzzing ${vendor_dir}/tests ${vendor_dir}/tools ${vendor_dir}/build + + make -f Makefile-cigraph + + R -q -e 'cpp11::cpp_register()' + + # Always vendor tags + if [ $(git -C "$upstream_dir" describe --tags "$commit" | grep -c -- -) -eq 0 ]; then + message="vendor: Update vendored sources (tag $(git -C "$upstream_dir" describe --tags "$commit")) to ${repo_org}/${repo_name}@$commit" + is_tag=true + break + fi + + if [ $(git status --porcelain -- ${vendor_base_dir} | wc -l) -gt 1 ]; then + message="vendor: Update vendored sources to ${repo_org}/${repo_name}@$commit" + break + fi +done + +if [ "$message" = "" ]; then + echo "No changes." + git checkout -- ${vendor_base_dir} + rm -rf "$upstream_dir" + exit 0 +fi + +git add . + +( + echo "$message" + echo + git -C "$upstream_dir" log --first-parent --format="%s" ${base}..${commit} | tee /dev/stderr | sed -r 's%(#[0-9]+)%'${repo_org}/${repo_name}'\1%g' +) | git commit --file /dev/stdin + +rm -rf "$upstream_dir"