This is an automated email from the ASF dual-hosted git repository.

paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-nanoarrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 5eccbdd  [C][R] Port release verification script (#78)
5eccbdd is described below

commit 5eccbdd1cdcfaafd0493d96283963dc73dfa4b59
Author: Dewey Dunnington <[email protected]>
AuthorDate: Fri Dec 2 12:11:34 2022 -0400

    [C][R] Port release verification script (#78)
    
    * add version information
    
    * expose version in the R package
    
    * draft port of verification script
    
    * update example
    
    * release verification script runs locally
    
    * document, maybe run RC verification on CI
    
    * maybe fix RC script
    
    * maybe install latex
    
    * test version info
    
    * make better use of show_info
    
    * more probable DIST_URL
    
    * maybe better GHA output
    
    * maybe try with apt-get update?
---
 .github/workflows/build-and-test.yaml              |   1 +
 .github/workflows/verify-source.yaml               |  74 +++++
 CMakeLists.txt                                     |  10 +-
 dev/release/verify-release-candidate.sh            | 326 +++++++++++++++++++++
 r/NAMESPACE                                        |   2 +-
 r/R/nanoarrow-package.R                            |   8 +-
 ...{nanoarrow_build_id.Rd => nanoarrow_version.Rd} |   8 +-
 r/src/init.c                                       |   8 +-
 r/src/{build_id.c => version.c}                    |   8 +-
 r/tests/testthat/test-nanoarrow-package.R          |   6 +-
 src/nanoarrow/build_id.h.in                        |   9 +
 src/nanoarrow/nanoarrow.h                          |   9 +
 src/nanoarrow/utils.c                              |   4 +
 src/nanoarrow/utils_test.cc                        |   5 +
 14 files changed, 456 insertions(+), 22 deletions(-)

diff --git a/.github/workflows/build-and-test.yaml 
b/.github/workflows/build-and-test.yaml
index 0928563..6c8a48c 100644
--- a/.github/workflows/build-and-test.yaml
+++ b/.github/workflows/build-and-test.yaml
@@ -52,6 +52,7 @@ jobs:
 
       - name: Install dependencies
         run: |
+          sudo apt-get update
           sudo apt install -y -V ca-certificates lsb-release wget cmake 
valgrind
           wget https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id 
--short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release 
--codename --short).deb
           sudo apt-get install -y -V 
./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
diff --git a/.github/workflows/verify-source.yaml 
b/.github/workflows/verify-source.yaml
new file mode 100644
index 0000000..3831553
--- /dev/null
+++ b/.github/workflows/verify-source.yaml
@@ -0,0 +1,74 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+    branches:
+      - main
+    paths:
+      - 'CMakeLists.txt'
+      - '.github/workflows/verify-source.yaml'
+      - 'dev/release/verify-release-candidate.sh'
+      - 'src/nanoarrow/**'
+
+name: Release Candidate Verification
+
+jobs:
+  verify-rc:
+    runs-on: ubuntu-latest
+    name: ${{ matrix.config.label }}
+
+    steps:
+      - name: Checkout repo
+        uses: actions/checkout@v3
+        with:
+          path: src
+          fetch-depth: 0
+
+      - name: Install dependencies
+        run: |
+          sudo apt-get update
+          sudo apt install -y -V ca-certificates lsb-release wget cmake
+          wget https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id 
--short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release 
--codename --short).deb
+          sudo apt-get install -y -V 
./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
+          sudo apt-get update
+          sudo apt-get install -y -V libarrow-dev
+          rm apache-arrow-apt-*.deb
+
+      # Needed for R source verification
+      - uses: r-lib/actions/setup-tinytex@v2
+      - uses: r-lib/actions/setup-pandoc@v2
+      - uses: r-lib/actions/setup-r@v2
+        with:
+          use-public-rspm: true
+
+      - name: Run dev/release/verify-release-candidate.sh
+        run: |
+          mkdir nanoarrow-verify-tmp
+          export NANOARROW_TMPDIR=`pwd`/nanoarrow-verify-tmp
+          cd src/dev/release
+          ./verify-release-candidate.sh
+
+      - name: Upload temp directory
+        if: failure()
+        uses: actions/upload-artifact@main
+        with:
+          path: nanoarrow-verify-tmp
+          name: nanoarrow-verify-tmp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 64f14cf..2bea056 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,9 +16,15 @@
 # under the License.
 
 message(STATUS "Building using CMake version: ${CMAKE_VERSION}")
-cmake_minimum_required(VERSION 3.14)
+cmake_minimum_required(VERSION 3.16)
 
-project(NanoArrow)
+set(NANOARROW_VERSION "0.1.0-SNAPSHOT")
+string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" NANOARROW_BASE_VERSION 
"${NANOARROW_VERSION}")
+project(nanoarrow VERSION "${NANOARROW_BASE_VERSION}")
+
+set(NANOARROW_VERSION_MAJOR "${nanoarrow_VERSION_MAJOR}")
+set(NANOARROW_VERSION_MINOR "${nanoarrow_VERSION_MINOR}")
+set(NANOARROW_VERSION_PATCH "${nanoarrow_VERSION_PATCH}")
 
 option(NANOARROW_BUILD_TESTS "Build tests" OFF)
 option(NANOARROW_BUNDLE "Create bundled nanoarrow.h and nanoarrow.c" OFF)
diff --git a/dev/release/verify-release-candidate.sh 
b/dev/release/verify-release-candidate.sh
new file mode 100755
index 0000000..b7cd1f8
--- /dev/null
+++ b/dev/release/verify-release-candidate.sh
@@ -0,0 +1,326 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# Requirements
+# - cmake >= 3.16
+# - R >= 3.5.0
+# - Arrow C++ >= 10.0.0
+#
+# Environment Variables
+# - NANOARROW_CMAKE_OPTIONS (e.g., to help cmake find Arrow C++)
+# - R_HOME: Path to the desired R installation. Defaults to `R` on PATH.
+# - TEST_SOURCE: Set to 0 to selectively run component verification.
+# - TEST_C: Builds the C library and tests using the default CMake 
+#   configuration. Defaults to the value of TEST_SOURCE.
+# - TEST_C_BUNDLED: Bundles and builds the nanoarrow.h/nanorrow.c distribution
+#   and runs tests. Defaults to the value of TEST_SOURCE.
+# - TEST_R: Builds the R package source tarball and runs R CMD check.
+#   Defaults to the value of TEST_SOURCE.
+
+set -e
+set -o pipefail
+
+if [ ${VERBOSE:-0} -gt 0 ]; then
+  set -x
+fi
+
+case $# in
+  0) VERSION="HEAD"
+     SOURCE_KIND="local"
+     TEST_BINARIES=0
+     ;;
+  1) VERSION="$1"
+     SOURCE_KIND="git"
+     TEST_BINARIES=0
+     ;;
+  2) VERSION="$1"
+     RC_NUMBER="$2"
+     SOURCE_KIND="tarball"
+     ;;
+  *) echo "Usage:"
+     echo "  Verify release candidate:"
+     echo "    $0 X.Y.Z RC_NUMBER"
+     echo "  Verify only the source distribution:"
+     echo "    TEST_DEFAULT=0 TEST_SOURCE=1 $0 X.Y.Z RC_NUMBER"
+     echo ""
+     echo "  Run the source verification tasks on a remote git revision:"
+     echo "    $0 GIT-REF"
+     echo "  Run the source verification tasks on this nanoarrow checkout:"
+     echo "    $0"
+     exit 1
+     ;;
+esac
+
+# Note that these point to the current verify-release-candidate.sh directories
+# which is different from the NANOARROW_SOURCE_DIR set in 
ensure_source_directory()
+SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
+NANOARROW_DIR="$(cd "${SOURCE_DIR}/../.." && pwd)"
+
+show_header() {
+  if [ -z "$GITHUB_WORKSPACE" ]; then
+    echo ""
+    printf '=%.0s' $(seq ${#1}); printf '\n'
+    echo "${1}"
+    printf '=%.0s' $(seq ${#1}); printf '\n'
+  else
+    echo "::group::${1}"; printf '\n'
+  fi
+}
+
+show_info() {
+  echo "└ ${1}"
+}
+
+NANOARROW_DIST_URL='https://dist.apache.org/repos/dist/dev/arrow'
+
+download_dist_file() {
+  curl \
+    --silent \
+    --show-error \
+    --fail \
+    --location \
+    --remote-name $NANOARROW_DIST_URL/$1
+}
+
+download_rc_file() {
+  download_dist_file apache-arrow-nanoarrow-${VERSION}-rc${RC_NUMBER}/$1
+}
+
+import_gpg_keys() {
+  if [ "${GPGKEYS_ALREADY_IMPORTED:-0}" -gt 0 ]; then
+    return 0
+  fi
+  download_dist_file KEYS
+  gpg --import KEYS
+
+  GPGKEYS_ALREADY_IMPORTED=1
+}
+
+if type shasum >/dev/null 2>&1; then
+  sha256_verify="shasum -a 256 -c"
+  sha512_verify="shasum -a 512 -c"
+else
+  sha256_verify="sha256sum -c"
+  sha512_verify="sha512sum -c"
+fi
+
+fetch_archive() {
+  import_gpg_keys
+
+  local dist_name=$1
+  download_rc_file ${dist_name}.tar.gz
+  download_rc_file ${dist_name}.tar.gz.asc
+  download_rc_file ${dist_name}.tar.gz.sha256
+  download_rc_file ${dist_name}.tar.gz.sha512
+  gpg --verify ${dist_name}.tar.gz.asc ${dist_name}.tar.gz
+  ${sha256_verify} ${dist_name}.tar.gz.sha256
+  ${sha512_verify} ${dist_name}.tar.gz.sha512
+}
+
+verify_dir_artifact_signatures() {
+  import_gpg_keys
+
+  # verify the signature and the checksums of each artifact
+  find $1 -name '*.asc' | while read sigfile; do
+    artifact=${sigfile/.asc/}
+    gpg --verify $sigfile $artifact || exit 1
+
+    # go into the directory because the checksum files contain only the
+    # basename of the artifact
+    pushd $(dirname $artifact)
+    base_artifact=$(basename $artifact)
+    if [ -f $base_artifact.sha256 ]; then
+      ${sha256_verify} $base_artifact.sha256 || exit 1
+    fi
+    if [ -f $base_artifact.sha512 ]; then
+      ${sha512_verify} $base_artifact.sha512 || exit 1
+    fi
+    popd
+  done
+}
+
+setup_tempdir() {
+  cleanup() {
+    if [ "${TEST_SUCCESS}" = "yes" ]; then
+      rm -fr "${NANOARROW_TMPDIR}"
+    else
+      echo "Failed to verify release candidate. See ${NANOARROW_TMPDIR} for 
details."
+    fi
+  }
+
+  show_header "Creating temporary directory"
+
+  if [ -z "${NANOARROW_TMPDIR}" ]; then
+    # clean up automatically if NANOARROW_TMPDIR is not defined
+    NANOARROW_TMPDIR=$(mktemp -d -t "nanoarrow-${VERSION}.XXXXX")
+    trap cleanup EXIT
+  else
+    # don't clean up automatically
+    mkdir -p "${NANOARROW_TMPDIR}"
+  fi
+
+  echo "Working in sandbox ${NANOARROW_TMPDIR}"
+}
+
+test_and_install_c() {
+  show_header "Build, install, and test C library"
+
+  mkdir -p $NANOARROW_TMPDIR/build
+  pushd $NANOARROW_TMPDIR/build
+
+  show_info "Configure CMake Project"
+  cmake ${NANOARROW_SOURCE_DIR} \
+    -DNANOARROW_BUILD_TESTS=ON \
+    ${NANOARROW_CMAKE_OPTIONS:-}
+  
+  show_info "Build CMake Project"
+  cmake --build .
+
+  show_info "Install CMake Project"
+  cmake --install . --prefix=$NANOARROW_HOME
+
+  show_info "Run Tests"
+  ctest --output-on-failure
+
+  popd
+}
+
+test_c_bundled() {
+  show_header "Build test C library"
+
+  mkdir -p $NANOARROW_TMPDIR/build_bundled
+  pushd $NANOARROW_TMPDIR/build_bundled
+
+  show_info "Configure CMake Project"
+  cmake ${NANOARROW_SOURCE_DIR} \
+    -DNANOARROW_BUILD_TESTS=ON \
+    -DNANOARROW_BUNDLE=ON \
+    ${NANOARROW_CMAKE_OPTIONS:-}
+  
+  show_info "Build CMake Project"
+  cmake --build .
+
+  show_info "Run Tests"
+  ctest --output-on-failure
+
+  popd
+}
+
+test_r() {
+  show_header "Build and test R package"
+
+  if [ ! -z "${R_HOME}" ]; then
+    R_BIN=${R_HOME}/bin/R
+  else
+    R_BIN=R
+  fi
+
+  show_info "Install nanoarrow test dependencies"
+  $R_BIN -e 'install.packages("pak", repos = "https://cloud.r-project.org";); 
pak::local_install_dev_deps("r")'
+
+  show_info "Build the R package source tarball"
+  pushd r
+  ./configure
+  popd
+
+  # Builds the R source tarball
+  pushd $NANOARROW_TMPDIR
+  $R_BIN CMD build $NANOARROW_SOURCE_DIR/r
+  R_PACKAGE_TARBALL_NAME=`ls nanoarrow_*.tar.gz`
+
+  show_info "Run R CMD check"
+  # Runs R CMD check on the tarball
+  $R_BIN CMD check $R_PACKAGE_TARBALL_NAME
+
+  popd
+}
+
+ensure_source_directory() {
+  show_header "Ensuring source directory"
+
+  dist_name="apache-arrow-nanoarrow-${VERSION}"
+
+  if [ "${SOURCE_KIND}" = "local" ]; then
+    # Local nanoarrow repository
+    if [ -z "$NANOARROW_SOURCE_DIR" ]; then
+      export NANOARROW_SOURCE_DIR="${NANOARROW_DIR}"
+    fi
+    echo "Verifying local nanoarrow checkout at ${NANOARROW_SOURCE_DIR}"
+  elif [ "${SOURCE_KIND}" = "git" ]; then
+    # Remote nanoarrow repository
+    : ${SOURCE_REPOSITORY:="https://github.com/apache/arrow-nanoarrow"}
+    echo "Verifying nanoarrow repository ${SOURCE_REPOSITORY} with revision 
checkout ${VERSION}"
+    export NANOARROW_SOURCE_DIR="${NANOARROW_TMPDIR}/arrow-nanoarrow"
+    if [ ! -d "${NANOARROW_SOURCE_DIR}" ]; then
+      git clone --recurse-submodules $SOURCE_REPOSITORY $NANOARROW_SOURCE_DIR
+      git -C $NANOARROW_SOURCE_DIR checkout $VERSION
+    fi
+  else
+    # Release tarball
+    echo "Verifying official nanoarrow release candidate 
${VERSION}-rc${RC_NUMBER}"
+    export NANOARROW_SOURCE_DIR="${NANOARROW_TMPDIR}/${dist_name}"
+    if [ ! -d "${NANOARROW_SOURCE_DIR}" ]; then
+      pushd $NANOARROW_TMPDIR
+      fetch_archive ${dist_name}
+      tar xf ${dist_name}.tar.gz
+      popd
+    fi
+  fi
+}
+
+
+test_source_distribution() {
+  export NANOARROW_HOME=$NANOARROW_TMPDIR/install
+  pushd $NANOARROW_SOURCE_DIR
+
+  if [ ${TEST_C} -gt 0 ]; then
+    test_and_install_c
+  fi
+
+  if [ ${TEST_C_BUNDLED} -gt 0 ]; then
+    test_c_bundled
+  fi
+
+  if [ ${TEST_R} -gt 0 ]; then
+    test_r
+  fi
+
+  popd
+}
+
+# By default test all functionalities.
+# To deactivate one test, deactivate the test and all of its dependents
+# To explicitly select one test, set TEST_DEFAULT=0 TEST_X=1
+: ${TEST_DEFAULT:=1}
+
+: ${TEST_SOURCE:=${TEST_DEFAULT}}
+: ${TEST_C:=${TEST_SOURCE}}
+: ${TEST_C_BUNDLED:=${TEST_SOURCE}}
+: ${TEST_R:=${TEST_SOURCE}}
+
+TEST_SUCCESS=no
+
+setup_tempdir
+ensure_source_directory
+test_source_distribution
+
+TEST_SUCCESS=yes
+
+echo "Release candidate ${VERSION}-RC${RC_NUMBER} looks good!"
+exit 0
diff --git a/r/NAMESPACE b/r/NAMESPACE
index 6bfd421..1213a36 100644
--- a/r/NAMESPACE
+++ b/r/NAMESPACE
@@ -56,7 +56,6 @@ export(infer_nanoarrow_schema)
 export(nanoarrow_allocate_array)
 export(nanoarrow_allocate_array_stream)
 export(nanoarrow_allocate_schema)
-export(nanoarrow_build_id)
 export(nanoarrow_pointer_addr_chr)
 export(nanoarrow_pointer_addr_dbl)
 export(nanoarrow_pointer_addr_pretty)
@@ -65,6 +64,7 @@ export(nanoarrow_pointer_is_valid)
 export(nanoarrow_pointer_move)
 export(nanoarrow_pointer_release)
 export(nanoarrow_schema_parse)
+export(nanoarrow_version)
 importFrom(utils,getFromNamespace)
 importFrom(utils,str)
 useDynLib(nanoarrow, .registration = TRUE)
diff --git a/r/R/nanoarrow-package.R b/r/R/nanoarrow-package.R
index aba93dd..4c5511a 100644
--- a/r/R/nanoarrow-package.R
+++ b/r/R/nanoarrow-package.R
@@ -34,12 +34,12 @@ NULL
 #' @export
 #'
 #' @examples
-#' nanoarrow_build_id()
+#' nanoarrow_version()
 #'
-nanoarrow_build_id <- function(runtime = TRUE) {
+nanoarrow_version <- function(runtime = TRUE) {
   if (runtime) {
-    .Call(nanoarrow_c_build_id_runtime)
+    .Call(nanoarrow_c_version_runtime)
   } else {
-    .Call(nanoarrow_c_build_id)
+    .Call(nanoarrow_c_version)
   }
 }
diff --git a/r/man/nanoarrow_build_id.Rd b/r/man/nanoarrow_version.Rd
similarity index 78%
rename from r/man/nanoarrow_build_id.Rd
rename to r/man/nanoarrow_version.Rd
index cdeaf33..18f9efc 100644
--- a/r/man/nanoarrow_build_id.Rd
+++ b/r/man/nanoarrow_version.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/nanoarrow-package.R
-\name{nanoarrow_build_id}
-\alias{nanoarrow_build_id}
+\name{nanoarrow_version}
+\alias{nanoarrow_version}
 \title{Underlying 'nanoarrow' C library build}
 \usage{
-nanoarrow_build_id(runtime = TRUE)
+nanoarrow_version(runtime = TRUE)
 }
 \arguments{
 \item{runtime}{Compare TRUE and FALSE values to detect a
@@ -18,6 +18,6 @@ was compiled against.
 Underlying 'nanoarrow' C library build
 }
 \examples{
-nanoarrow_build_id()
+nanoarrow_version()
 
 }
diff --git a/r/src/init.c b/r/src/init.c
index 33c40ed..1827fe7 100644
--- a/r/src/init.c
+++ b/r/src/init.c
@@ -35,8 +35,6 @@ extern SEXP nanoarrow_c_infer_schema_array(SEXP array_xptr);
 extern SEXP nanoarrow_c_array_proxy(SEXP array_xptr, SEXP array_view_xptr, 
SEXP recursive_sexp);
 extern SEXP nanoarrow_c_buffer_info(SEXP buffer_xptr);
 extern SEXP nanoarrow_c_buffer_as_raw(SEXP buffer_xptr);
-extern SEXP nanoarrow_c_build_id(void);
-extern SEXP nanoarrow_c_build_id_runtime(void);
 extern SEXP nanoarrow_c_convert_array_stream(SEXP array_stream_xptr, SEXP 
ptype_sexp, SEXP size_sexp, SEXP n_sexp);
 extern SEXP nanoarrow_c_convert_array(SEXP array_xptr, SEXP ptype_sexp);
 extern SEXP nanoarrow_c_infer_ptype(SEXP schema_xptr);
@@ -55,6 +53,8 @@ extern SEXP nanoarrow_c_export_array(SEXP array_xptr, SEXP 
ptr_dst);
 extern SEXP nanoarrow_c_schema_to_list(SEXP schema_xptr);
 extern SEXP nanoarrow_c_schema_parse(SEXP schema_xptr);
 extern SEXP nanoarrow_c_schema_format(SEXP schema_xptr, SEXP recursive_sexp);
+extern SEXP nanoarrow_c_version();
+extern SEXP nanoarrow_c_version_runtime();
 
 static const R_CallMethodDef CallEntries[] = {
     {"nanoarrow_c_make_altrep_chr", (DL_FUNC)&nanoarrow_c_make_altrep_chr, 1},
@@ -69,8 +69,6 @@ static const R_CallMethodDef CallEntries[] = {
     {"nanoarrow_c_array_proxy", (DL_FUNC)&nanoarrow_c_array_proxy, 3},
     {"nanoarrow_c_buffer_info", (DL_FUNC)&nanoarrow_c_buffer_info, 1},
     {"nanoarrow_c_buffer_as_raw", (DL_FUNC)&nanoarrow_c_buffer_as_raw, 1},
-    {"nanoarrow_c_build_id", (DL_FUNC)&nanoarrow_c_build_id, 0},
-    {"nanoarrow_c_build_id_runtime", (DL_FUNC)&nanoarrow_c_build_id_runtime, 
0},
     {"nanoarrow_c_convert_array_stream", 
(DL_FUNC)&nanoarrow_c_convert_array_stream, 4},
     {"nanoarrow_c_convert_array", (DL_FUNC)&nanoarrow_c_convert_array, 2},
     {"nanoarrow_c_infer_ptype", (DL_FUNC)&nanoarrow_c_infer_ptype, 1},
@@ -89,6 +87,8 @@ static const R_CallMethodDef CallEntries[] = {
     {"nanoarrow_c_schema_to_list", (DL_FUNC)&nanoarrow_c_schema_to_list, 1},
     {"nanoarrow_c_schema_parse", (DL_FUNC)&nanoarrow_c_schema_parse, 1},
     {"nanoarrow_c_schema_format", (DL_FUNC)&nanoarrow_c_schema_format, 2},
+    {"nanoarrow_c_version", (DL_FUNC)&nanoarrow_c_version, 0},
+    {"nanoarrow_c_version_runtime", (DL_FUNC)&nanoarrow_c_version_runtime, 0},
     {NULL, NULL, 0}};
 /* end generated by tools/make-callentries.R */
 
diff --git a/r/src/build_id.c b/r/src/version.c
similarity index 84%
rename from r/src/build_id.c
rename to r/src/version.c
index 32166de..0318cae 100644
--- a/r/src/build_id.c
+++ b/r/src/version.c
@@ -21,10 +21,10 @@
 
 #include "nanoarrow.h"
 
-SEXP nanoarrow_c_build_id(void) {
-  return Rf_mkString(NANOARROW_BUILD_ID);
+SEXP nanoarrow_c_version() {
+  return Rf_mkString(NANOARROW_VERSION);
 }
 
-SEXP nanoarrow_c_build_id_runtime(void) {
-  return Rf_mkString(ArrowNanoarrowBuildId());
+SEXP nanoarrow_c_version_runtime() {
+  return Rf_mkString(ArrowNanoarrowVersion());
 }
diff --git a/r/tests/testthat/test-nanoarrow-package.R 
b/r/tests/testthat/test-nanoarrow-package.R
index e0bb3cb..0427b34 100644
--- a/r/tests/testthat/test-nanoarrow-package.R
+++ b/r/tests/testthat/test-nanoarrow-package.R
@@ -15,9 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 
-test_that("nanoarrow_build_id() works", {
+test_that("nanoarrow_version() works", {
   expect_identical(
-    nanoarrow_build_id(runtime = TRUE),
-    nanoarrow_build_id(runtime = FALSE)
+    nanoarrow_version(runtime = TRUE),
+    nanoarrow_version(runtime = FALSE)
   )
 })
diff --git a/src/nanoarrow/build_id.h.in b/src/nanoarrow/build_id.h.in
index 536cf60..b0cf0de 100644
--- a/src/nanoarrow/build_id.h.in
+++ b/src/nanoarrow/build_id.h.in
@@ -18,6 +18,15 @@
 #ifndef NANOARROW_BUILD_ID_H_INCLUDED
 #define NANOARROW_BUILD_ID_H_INCLUDED
 
+#define NANOARROW_VERSION_MAJOR @NANOARROW_VERSION_MAJOR@
+#define NANOARROW_VERSION_MINOR @NANOARROW_VERSION_MINOR@
+#define NANOARROW_VERSION_PATCH @NANOARROW_VERSION_PATCH@
+#define NANOARROW_VERSION "@NANOARROW_VERSION@"
+
+#define NANOARROW_VERSION_INT                                        \
+  (NANOARROW_VERSION_MAJOR * 10000 + NANOARROW_VERSION_MINOR * 100 + \
+   NANOARROW_VERSION_PATCH)
+
 @NANOARROW_NAMESPACE_DEFINE@
 
 #define NANOARROW_BUILD_ID "@NANOARROW_BUILD_ID@"
diff --git a/src/nanoarrow/nanoarrow.h b/src/nanoarrow/nanoarrow.h
index 6d2c059..4dc8e68 100644
--- a/src/nanoarrow/nanoarrow.h
+++ b/src/nanoarrow/nanoarrow.h
@@ -36,6 +36,9 @@
 #define NANOARROW_SYMBOL(A, B) NANOARROW_CAT(A, B)
 
 #define ArrowNanoarrowBuildId NANOARROW_SYMBOL(NANOARROW_NAMESPACE, 
ArrowNanoarrowBuildId)
+#define ArrowNanoarrowVersion NANOARROW_SYMBOL(NANOARROW_NAMESPACE, 
ArrowNanoarrowVersion)
+#define ArrowNanoarrowVersionInt \
+  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowNanoarrowVersionInt)
 #define ArrowErrorMessage NANOARROW_SYMBOL(NANOARROW_NAMESPACE, 
ArrowErrorMessage)
 #define ArrowMalloc NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMalloc)
 #define ArrowRealloc NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowRealloc)
@@ -186,6 +189,12 @@ const char* ArrowErrorMessage(struct ArrowError* error);
 /// \brief Return the build id against which the library was compiled
 const char* ArrowNanoarrowBuildId(void);
 
+/// \brief Return a version string in the form "major.minor.patch"
+const char* ArrowNanoarrowVersion();
+
+/// \brief Return an integer that can be used to compare versions sequentially
+int ArrowNanoarrowVersionInt();
+
 /// \brief Initialize a description of buffer arrangements from a storage type
 void ArrowLayoutInit(struct ArrowLayout* layout, enum ArrowType storage_type);
 
diff --git a/src/nanoarrow/utils.c b/src/nanoarrow/utils.c
index 1db2835..7df4d17 100644
--- a/src/nanoarrow/utils.c
+++ b/src/nanoarrow/utils.c
@@ -26,6 +26,10 @@
 
 const char* ArrowNanoarrowBuildId(void) { return NANOARROW_BUILD_ID; }
 
+const char* ArrowNanoarrowVersion() { return NANOARROW_VERSION; }
+
+int ArrowNanoarrowVersionInt() { return NANOARROW_VERSION_INT; }
+
 int ArrowErrorSet(struct ArrowError* error, const char* fmt, ...) {
   if (error == NULL) {
     return NANOARROW_OK;
diff --git a/src/nanoarrow/utils_test.cc b/src/nanoarrow/utils_test.cc
index 27f6393..f166400 100644
--- a/src/nanoarrow/utils_test.cc
+++ b/src/nanoarrow/utils_test.cc
@@ -29,6 +29,11 @@ TEST(BuildIdTest, BuildIdTest) {
   EXPECT_STREQ(ArrowNanoarrowBuildId(), NANOARROW_BUILD_ID);
 }
 
+TEST(BuildIdTest, VersionTest) {
+  EXPECT_STREQ(ArrowNanoarrowVersion(), NANOARROW_VERSION);
+  EXPECT_EQ(ArrowNanoarrowVersionInt(), NANOARROW_VERSION_INT);
+}
+
 TEST(ErrorTest, ErrorTestSet) {
   ArrowError error;
   EXPECT_EQ(ArrowErrorSet(&error, "there were %d foxes", 4), NANOARROW_OK);

Reply via email to