This is an automated email from the ASF dual-hosted git repository. fokko pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
The following commit(s) were added to refs/heads/main by this push:
new 21c933a docs: Add release guide for iceberg-rust (#147)
21c933a is described below
commit 21c933a9419c6bf27415d5c752970d4d5f6d4267
Author: Xuanwo <[email protected]>
AuthorDate: Fri Jan 26 19:05:36 2024 +0800
docs: Add release guide for iceberg-rust (#147)
---
.gitattributes | 1 +
.licenserc.yaml | 3 +
crates/catalog/hms/DEPENDENCIES.rust.tsv | 290 ++++++++++++++++++++++
crates/catalog/rest/DEPENDENCIES.rust.tsv | 295 +++++++++++++++++++++++
crates/iceberg/DEPENDENCIES.rust.tsv | 284 ++++++++++++++++++++++
deny.toml | 45 ++++
scripts/dependencies.py | 72 ++++++
scripts/release.sh | 68 ++++++
.licenserc.yaml => scripts/verify.py | 47 +++-
website/src/SUMMARY.md | 8 +-
website/src/{SUMMARY.md => download.md} | 9 -
website/src/reference/setup_gpg.md | 161 +++++++++++++
website/src/release.md | 383 ++++++++++++++++++++++++++++++
13 files changed, 1644 insertions(+), 22 deletions(-)
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..908bda4
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+website export-ignore
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 662cea8..68a8c03 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -23,7 +23,10 @@ header:
paths-ignore:
- 'LICENSE'
- 'NOTICE'
+ - '.gitattributes'
- '**/*.json'
# Generated content by mdbook
- 'website/book'
+ # Generated content by scripts
+ - '**/DEPENDENCIES.*.tsv'
comment: on-failure
diff --git a/crates/catalog/hms/DEPENDENCIES.rust.tsv
b/crates/catalog/hms/DEPENDENCIES.rust.tsv
new file mode 100644
index 0000000..46fa245
--- /dev/null
+++ b/crates/catalog/hms/DEPENDENCIES.rust.tsv
@@ -0,0 +1,290 @@
+crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause
BSL-1.0 CC0-1.0 ISC MIT OpenSSL Unicode-DFS-2016 Unlicense
Zlib
[email protected] X
X
[email protected] X X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected]
X X
[email protected] X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected] X
[email protected] X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected]
X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected]
X
[email protected] X X
[email protected] X X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X
X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected]+deprecated X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X X
[email protected] X X X
[email protected] X
X X
[email protected] X X
X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected]
X
[email protected] X
X
[email protected] X X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X
[email protected] X X
[email protected] X
[email protected] X
[email protected]
X
[email protected] X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X X
X
[email protected] X
X X
[email protected] X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
[email protected]
X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
[email protected]+wasi-snapshot-preview1 X X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X X
diff --git a/crates/catalog/rest/DEPENDENCIES.rust.tsv
b/crates/catalog/rest/DEPENDENCIES.rust.tsv
new file mode 100644
index 0000000..7e56620
--- /dev/null
+++ b/crates/catalog/rest/DEPENDENCIES.rust.tsv
@@ -0,0 +1,295 @@
+crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause
BSL-1.0 CC0-1.0 ISC MIT OpenSSL Unicode-DFS-2016 Unlicense
Zlib
[email protected] X
X
[email protected] X X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected]
X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected]
X X
[email protected] X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected] X
[email protected] X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
[email protected] X X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected]
X
[email protected] X X
[email protected] X X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X
X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected]+deprecated X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X X
[email protected] X X X
[email protected] X
X X
[email protected] X X
X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected]
X
[email protected] X
X
[email protected] X X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X
[email protected] X X
[email protected] X
[email protected] X
[email protected]
X
[email protected] X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected]
X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X X
X
[email protected] X
X X
[email protected] X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
[email protected]
X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
[email protected]+wasi-snapshot-preview1 X X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected]
X X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X X
diff --git a/crates/iceberg/DEPENDENCIES.rust.tsv
b/crates/iceberg/DEPENDENCIES.rust.tsv
new file mode 100644
index 0000000..3979e69
--- /dev/null
+++ b/crates/iceberg/DEPENDENCIES.rust.tsv
@@ -0,0 +1,284 @@
+crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause
BSL-1.0 CC0-1.0 ISC MIT OpenSSL Unicode-DFS-2016 Unlicense
Zlib
[email protected] X
X
[email protected] X X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected]
X X
[email protected] X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected] X
[email protected] X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected] X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected] X
[email protected]
X
[email protected] X X
[email protected] X X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X
X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected]+deprecated X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected]
X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected] X X X
[email protected] X X X
[email protected] X
X X
[email protected] X X
X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected]
X
[email protected] X
X
[email protected] X X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X
[email protected] X X
[email protected] X
[email protected] X
[email protected]
X
[email protected] X
[email protected] X X
[email protected] X X
[email protected] X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X X
X
[email protected] X
X X
[email protected] X
[email protected]
X
[email protected]
X
[email protected] X
X
[email protected]
X
[email protected]
X
[email protected] X
[email protected]
X
[email protected] X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X X
[email protected]
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
[email protected]+wasi-snapshot-preview1 X X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
X
[email protected] X
[email protected] X
[email protected] X X
diff --git a/deny.toml b/deny.toml
new file mode 100644
index 0000000..e323679
--- /dev/null
+++ b/deny.toml
@@ -0,0 +1,45 @@
+# 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.
+
+[licenses]
+unlicensed = "deny"
+copyleft = "deny"
+allow = [
+ "Apache-2.0",
+ "Apache-2.0 WITH LLVM-exception",
+ "MIT",
+ "BSD-3-Clause",
+ "ISC",
+ "CC0-1.0",
+]
+exceptions = [
+ { allow = ["OpenSSL"], name = "ring" },
+ { allow = ["Unicode-DFS-2016"], name = "unicode-ident" },
+ { allow = ["Zlib"], name = "adler32" }
+]
+
+[[licenses.clarify]]
+name = "ring"
+# SPDX considers OpenSSL to encompass both the OpenSSL and SSLeay licenses
+# https://spdx.org/licenses/OpenSSL.html
+# ISC - Both BoringSSL and ring use this for their new files
+# MIT - "Files in third_party/ have their own licenses, as described therein.
The MIT
+# license, for third_party/fiat, which, unlike other third_party directories,
is
+# compiled into non-test libraries, is included below."
+# OpenSSL - Obviously
+expression = "ISC AND MIT AND OpenSSL"
+license-files = [{ path = "LICENSE", hash = 0xbd0eed23 }]
\ No newline at end of file
diff --git a/scripts/dependencies.py b/scripts/dependencies.py
new file mode 100644
index 0000000..13bb445
--- /dev/null
+++ b/scripts/dependencies.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+# 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.
+
+from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, REMAINDER
+import subprocess
+import os
+
+
+DIRS = [
+ "crates/iceberg",
+ "crates/catalog/hms",
+ "crates/catalog/rest"
+]
+
+
+def check_deps():
+ cargo_dirs = DIRS
+ for root in cargo_dirs:
+ print(f"Checking dependencies of {root}")
+ subprocess.run(["cargo", "deny", "check", "license"], cwd=root)
+
+
+def generate_deps():
+ cargo_dirs = DIRS
+ for root in cargo_dirs:
+ print(f"Generating dependencies {root}")
+ result = subprocess.run(
+ ["cargo", "deny", "list", "-f", "tsv", "-t", "0.6"],
+ cwd=root,
+ capture_output=True,
+ text=True,
+ )
+ with open(f"{root}/DEPENDENCIES.rust.tsv", "w") as f:
+ f.write(result.stdout)
+
+
+if __name__ == "__main__":
+ parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
+ parser.set_defaults(func=parser.print_help)
+ subparsers = parser.add_subparsers()
+
+ parser_check = subparsers.add_parser(
+ 'check',
+ description="Check dependencies",
+ help="Check dependencies")
+ parser_check.set_defaults(func=check_deps)
+
+ parser_generate = subparsers.add_parser(
+ 'generate',
+ description="Generate dependencies",
+ help="Generate dependencies")
+ parser_generate.set_defaults(func=generate_deps)
+
+ args = parser.parse_args()
+ arg_dict = dict(vars(args))
+ del arg_dict['func']
+ args.func(**arg_dict)
diff --git a/scripts/release.sh b/scripts/release.sh
new file mode 100644
index 0000000..884ed8a
--- /dev/null
+++ b/scripts/release.sh
@@ -0,0 +1,68 @@
+#!/bin/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.
+
+set -e
+
+if [ -z "${ICEBERG_VERSION}" ]; then
+ echo "ICEBERG_VERSION is unset"
+ exit 1
+else
+ echo "var is set to '$ICEBERG_VERSION'"
+fi
+
+# tar source code
+release_version=${ICEBERG_VERSION}
+# rc versions
+rc_version="${ICEBERG_VERSION_RC:-rc.1}"
+# Corresponding git repository branch
+git_branch=release-${release_version}-${rc_version}
+
+rm -rf dist
+mkdir -p dist/
+
+echo "> Checkout version branch"
+git checkout -B "${git_branch}"
+
+echo "> Start package"
+git archive --format=tar.gz
--output="dist/apache-iceberg-rust-$release_version-src.tar.gz"
--prefix="apache-iceberg-rust-$release_version-src/" --add-file=Cargo.toml
"$git_branch"
+
+cd dist
+echo "> Generate signature"
+for i in *.tar.gz; do
+ echo "$i"
+ gpg --armor --output "$i.asc" --detach-sig "$i"
+done
+echo "> Check signature"
+for i in *.tar.gz; do
+ echo "$i"
+ gpg --verify "$i.asc" "$i"
+done
+echo "> Generate sha512sum"
+for i in *.tar.gz; do
+ echo "$i"
+ sha512sum "$i" >"$i.sha512"
+done
+echo "> Check sha512sum"
+for i in *.tar.gz; do
+ echo "$i"
+ sha512sum --check "$i.sha512"
+done
+
+cd ..
+echo "> Check license"
+docker run -it --rm -v $(pwd):/github/workspace apache/skywalking-eyes header
check
diff --git a/.licenserc.yaml b/scripts/verify.py
similarity index 50%
copy from .licenserc.yaml
copy to scripts/verify.py
index 662cea8..415bb24 100644
--- a/.licenserc.yaml
+++ b/scripts/verify.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
# 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
@@ -15,15 +16,37 @@
# specific language governing permissions and limitations
# under the License.
-header:
- license:
- spdx-id: Apache-2.0
- copyright-owner: Apache Software Foundation
-
- paths-ignore:
- - 'LICENSE'
- - 'NOTICE'
- - '**/*.json'
- # Generated content by mdbook
- - 'website/book'
- comment: on-failure
+
+import subprocess
+import sys
+import os
+
+BASE_DIR = os.getcwd()
+
+
+def check_rust():
+ try:
+ subprocess.run(["cargo", "--version"], check=True)
+ return True
+ except FileNotFoundError:
+ return False
+ except Exception as e:
+ raise Exception("Check rust met unexpected error", e)
+
+def build_core():
+ print("Start building iceberg rust")
+
+ subprocess.run(["cargo", "build", "--release"], check=True)
+
+def main():
+ if not check_rust():
+ print(
+ "Cargo is not found, please check if rust development has been
setup correctly"
+ )
+ print("Visit https://www.rust-lang.org/tools/install for more
information")
+ sys.exit(1)
+
+ build_core()
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/website/src/SUMMARY.md b/website/src/SUMMARY.md
index c0aa07f..de09780 100644
--- a/website/src/SUMMARY.md
+++ b/website/src/SUMMARY.md
@@ -22,7 +22,13 @@
# User Guide
- [Install](./install.md)
+- [Download](./download.md)
# Developer Guide
-- [Contributing](./CONTRIBUTING.md)
\ No newline at end of file
+- [Contributing](./CONTRIBUTING.md)
+- [Release](./release.md)
+
+# Reference
+
+- [Setup GPG key](./reference/setup_gpg.md)
\ No newline at end of file
diff --git a/website/src/SUMMARY.md b/website/src/download.md
similarity index 86%
copy from website/src/SUMMARY.md
copy to website/src/download.md
index c0aa07f..e274853 100644
--- a/website/src/SUMMARY.md
+++ b/website/src/download.md
@@ -17,12 +17,3 @@
~ under the License.
-->
-- [Introduction](./introduction.md)
-
-# User Guide
-
-- [Install](./install.md)
-
-# Developer Guide
-
-- [Contributing](./CONTRIBUTING.md)
\ No newline at end of file
diff --git a/website/src/reference/setup_gpg.md
b/website/src/reference/setup_gpg.md
new file mode 100644
index 0000000..562113d
--- /dev/null
+++ b/website/src/reference/setup_gpg.md
@@ -0,0 +1,161 @@
+<!--
+ ~ 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.
+-->
+
+# Setup GPG key
+
+> This section is a brief from the [Cryptography with
OpenPGP](https://infra.apache.org/openpgp.html) guideline.
+
+
+## Install GPG
+
+For more details, please refer to [GPG official
website](https://www.gnupg.org/download/index.html). Here shows one approach to
install GPG with `apt`:
+
+```shell
+sudo apt install gnupg2
+```
+
+## Generate GPG Key
+
+Attentions:
+
+- Name is best to keep consistent with your full name of Apache ID;
+- Email should be the Apache email;
+- Name is best to only use English to avoid garbled.
+
+Run `gpg --full-gen-key` and complete the generation interactively:
+
+```shell
+gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Please select what kind of key you want:
+ (1) RSA and RSA (default)
+ (2) DSA and Elgamal
+ (3) DSA (sign only)
+ (4) RSA (sign only)
+ (14) Existing key from card
+Your selection? 1 # input 1
+RSA keys may be between 1024 and 4096 bits long.
+What keysize do you want? (2048) 4096 # input 4096
+Requested keysize is 4096 bits
+Please specify how long the key should be valid.
+ 0 = key does not expire
+ <n> = key expires in n days
+ <n>w = key expires in n weeks
+ <n>m = key expires in n months
+ <n>y = key expires in n years
+Key is valid for? (0) 0 # input 0
+Key does not expire at all
+Is this correct? (y/N) y # input y
+
+GnuPG needs to construct a user ID to identify your key.
+
+Real name: Hulk Lin # input your name
+Email address: [email protected] # input your email
+Comment: # input some annotations, optional
+You selected this USER-ID:
+ "Hulk <[email protected]>"
+
+Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O # input O
+We need to generate a lot of random bytes. It is a good idea to perform
+some other action (type on the keyboard, move the mouse, utilize the
+disks) during the prime generation; this gives the random number
+generator a better chance to gain enough entropy.
+We need to generate a lot of random bytes. It is a good idea to perform
+some other action (type on the keyboard, move the mouse, utilize the
+disks) during the prime generation; this gives the random number
+generator a better chance to gain enough entropy.
+
+# Input the security key
+┌──────────────────────────────────────────────────────┐
+│ Please enter this passphrase │
+│ │
+│ Passphrase: _______________________________ │
+│ │
+│ <OK> <Cancel> │
+└──────────────────────────────────────────────────────┘
+# key generation will be done after your inputting the key with the following
output
+gpg: key E49B00F626B marked as ultimately trusted
+gpg: revocation certificate stored as
'/Users/hulk/.gnupg/openpgp-revocs.d/F77B887A4F25A9468C513E9AA3008E49B00F626B.rev'
+public and secret key created and signed.
+
+pub rsa4096 2022-07-12 [SC]
+ F77B887A4F25A9468C513E9AA3008E49B00F626B
+uid [ultimate] hulk <[email protected]>
+sub rsa4096 2022-07-12 [E]
+```
+
+## Upload your key to public GPG keyserver
+
+Firstly, list your key:
+
+```shell
+gpg --list-keys
+```
+
+The output is like:
+
+```shell
+-------------------------------
+pub rsa4096 2022-07-12 [SC]
+ F77B887A4F25A9468C513E9AA3008E49B00F626B
+uid [ultimate] hulk <[email protected]>
+sub rsa4096 2022-07-12 [E]
+```
+
+Then, send your key id to key server:
+
+```shell
+gpg --keyserver keys.openpgp.org --send-key <key-id> # e.g.,
F77B887A4F25A9468C513E9AA3008E49B00F626B
+```
+
+Among them, `keys.openpgp.org` is a randomly selected keyserver, you can use
`keyserver.ubuntu.com` or any other full-featured keyserver.
+
+## Check whether the key is created successfully
+
+Uploading takes about one minute; after that, you can check by your email at
the corresponding keyserver.
+
+Uploading keys to the keyserver is mainly for joining a [Web of
Trust](https://infra.apache.org/release-signing.html#web-of-trust).
+
+## Add your GPG public key to the KEYS document
+
+:::info
+
+`SVN` is required for this step.
+
+:::
+
+The svn repository of the release branch is:
https://dist.apache.org/repos/dist/release/iceberg
+
+Please always add the public key to KEYS in the release branch:
+
+```shell
+svn co https://dist.apache.org/repos/dist/release/iceberg iceberg-dist
+# As this step will copy all the versions, it will take some time. If the
network is broken, please use svn cleanup to delete the lock before re-execute
it.
+cd iceberg-dist
+(gpg --list-sigs [email protected] && gpg --export --armor
[email protected]) >> KEYS # Append your key to the KEYS file
+svn add . # It is not needed if the KEYS document exists before.
+svn ci -m "add gpg key for YOUR_NAME" # Later on, if you are asked to enter a
username and password, just use your apache username and password.
+```
+
+## Upload the GPG public key to your GitHub account
+
+- Enter https://github.com/settings/keys to add your GPG key.
+- Please remember to bind the email address used in the GPG key to your GitHub
account (https://github.com/settings/emails) if you find "unverified" after
adding it.
diff --git a/website/src/release.md b/website/src/release.md
new file mode 100644
index 0000000..18b1088
--- /dev/null
+++ b/website/src/release.md
@@ -0,0 +1,383 @@
+<!--
+ ~ 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.
+-->
+
+This document mainly introduces how the release manager releases a new version
in accordance with the Apache requirements.
+
+## Introduction
+
+`Source Release` is the key point which Apache values, and is also necessary
for an ASF release.
+
+Please remember that publishing software has legal consequences.
+
+This guide complements the foundation-wide policies and guides:
+
+- [Release Policy](https://www.apache.org/legal/release-policy.html)
+- [Release Distribution Policy](https://infra.apache.org/release-distribution)
+- [Release Creation Process](https://infra.apache.org/release-publishing.html)
+
+## Some Terminology of release
+
+In the context of our release, we use several terms to describe different
stages of the release process.
+
+Here's an explanation of these terms:
+
+- `iceberg_version`: the version of Iceberg to be released, like `0.2.0`.
+- `release_version`: the version of release candidate, like `0.2.0-rc.1`.
+- `rc_version`: the minor version for voting round, like `rc.1`.
+
+## Preparation
+
+<div class="warning">
+
+This section is the requirements for individuals who are new to the role of
release manager.
+
+</div>
+
+Refer to [Setup GPG Key](reference/setup_gpg.md) to make sure the GPG key has
been set up.
+
+## Start a tracking issue about the next release
+
+Start a tracking issue on GitHub for the upcoming release to track all tasks
that need to be completed.
+
+Title:
+
+```
+Tracking issues of Iceberg Rust ${iceberg_version} Release
+```
+
+Content:
+
+```markdown
+This issue is used to track tasks of the iceberg rust ${iceberg_version}
release.
+
+## Tasks
+
+### Blockers
+
+> Blockers are the tasks that must be completed before the release.
+
+### Build Release
+
+#### GitHub Side
+
+- [ ] Bump version in project
+- [ ] Update docs
+- [ ] Generate dependencies list
+- [ ] Push release candidate tag to GitHub
+
+#### ASF Side
+
+- [ ] Create an ASF Release
+- [ ] Upload artifacts to the SVN dist repo
+
+### Voting
+
+- [ ] Start VOTE at iceberg community
+
+### Official Release
+
+- [ ] Push the release git tag
+- [ ] Publish artifacts to SVN RELEASE branch
+- [ ] Change Iceberg Rust Website download link
+- [ ] Send the announcement
+
+For details of each step, please refer to:
https://rust.iceberg.apache.org/release
+```
+
+## GitHub Side
+
+### Bump version in project
+
+Bump all components' version in the project to the new iceberg version.
+Please note that this version is the exact version of the release, not the
release candidate version.
+
+- rust core: bump version in `Cargo.toml`
+
+### Update docs
+
+- Update `CHANGELOG.md`, refer to [Generate Release
Note](reference/generate_release_note.md) for more information.
+
+### Generate dependencies list
+
+Download and setup `cargo-deny`. You can refer to
[cargo-deny](https://embarkstudios.github.io/cargo-deny/cli/index.html).
+
+Running `python3 ./scripts/dependencies.py generate` to update the
dependencies list of every package.
+
+### Push release candidate tag
+
+After bump version PR gets merged, we can create a GitHub release for the
release candidate:
+
+- Create a tag at `main` branch on the `Bump Version` / `Patch up version`
commit: `git tag -s "v0.2.0-rc.1"`, please correctly check out the
corresponding commit instead of directly tagging on the main branch.
+- Push tags to GitHub: `git push --tags`.
+
+## ASF Side
+
+If any step in the ASF Release process fails and requires code changes,
+we will abandon that version and prepare for the next one.
+Our release page will only display ASF releases instead of GitHub Releases.
+
+### Create an ASF Release
+
+After GitHub Release has been created, we can start to create ASF Release.
+
+- Checkout to released tag. (e.g. `git checkout v0.2.0-rc.1`, tag is created
in the previous step)
+- Use the release script to create a new release:
`ICEBERG_VERSION=<iceberg_version> ICEBERG_VERSION_RC=<rc_version>
./scripts/release.sh`(e.g. `ICEBERG_VERSION=0.2.0 ICEBERG_VERSION_RC=rc.1
./scripts/release.sh`)
+ - This script will do the following things:
+ - Create a new branch named by `release-${release_version}` from the
tag
+ - Generate the release candidate artifacts under `dist`, including:
+ - `apache-iceberg-rust-${release_version}-src.tar.gz`
+ - `apache-iceberg-rust-${release_version}-src.tar.gz.asc`
+ - `apache-iceberg-rust-${release_version}-src.tar.gz.sha512`
+ - Check the header of the source code. This step needs docker to run.
+- Push the newly created branch to GitHub
+
+This script will create a new release under `dist`.
+
+For example:
+
+```shell
+> tree dist
+dist
+├── apache-iceberg-rust-0.2.0-src.tar.gz
+├── apache-iceberg-rust-0.2.0-src.tar.gz.asc
+└── apache-iceberg-rust-0.2.0-src.tar.gz.sha512
+```
+
+### Upload artifacts to the SVN dist repo
+
+SVN is required for this step.
+
+The svn repository of the dev branch is:
<https://dist.apache.org/repos/dist/dev/iceberg/iceberg-rust>
+
+First, checkout Iceberg to local directory:
+
+```shell
+# As this step will copy all the versions, it will take some time. If the
network is broken, please use svn cleanup to delete the lock before re-execute
it.
+svn co https://dist.apache.org/repos/dist/dev/iceberg/iceberg-rust
iceberg-dist-dev
+```
+
+Then, upload the artifacts:
+
+> The `${release_version}` here should be like `0.2.0-rc.1`
+
+```shell
+cd iceberg-dist-dev
+# create a directory named by version
+mkdir ${release_version}
+# copy source code and signature package to the versioned directory
+cp ${repo_dir}/dist/* ${release_version}/
+# check svn status
+svn status
+# add to svn
+svn add ${release_version}
+# check svn status
+svn status
+# commit to SVN remote server
+svn commit -m "Prepare for ${release_version}"
+```
+
+Visit <https://dist.apache.org/repos/dist/dev/iceberg/iceberg-rust/> to make
sure the artifacts are uploaded correctly.
+
+### Rescue
+
+If you accidentally published wrong or unexpected artifacts, like wrong
signature files, wrong sha256 files,
+please cancel the release for the current `release_version`,
+_increase th RC counting_ and re-initiate a release with the new
`release_version`.
+And remember to delete the wrong artifacts from the SVN dist repo.
+
+## Voting
+
+Iceberg Community Vote should send email to: <[email protected]>:
+
+Title:
+
+```
+[VOTE] Release Apache Iceberg Rust ${release_version} RC1
+```
+
+Content:
+
+```
+Hello, Apache Iceberg Rust Community,
+
+This is a call for a vote to release Apache Iceberg rust version
${iceberg_version}.
+
+The tag to be voted on is ${iceberg_version}.
+
+The release candidate:
+
+https://dist.apache.org/repos/dist/dev/iceberg/iceberg-rust/${release_version}/
+
+Keys to verify the release candidate:
+
+https://downloads.apache.org/iceberg/KEYS
+
+Git tag for the release:
+
+https://github.com/apache/iceberg-rust/releases/tag/${release_version}
+
+Please download, verify, and test.
+
+The VOTE will be open for at least 72 hours and until the necessary
+number of votes are reached.
+
+[ ] +1 approve
+[ ] +0 no opinion
+[ ] -1 disapprove with the reason
+
+To learn more about Apache Iceberg, please see https://rust.iceberg.apache.org/
+
+Checklist for reference:
+
+[ ] Download links are valid.
+[ ] Checksums and signatures.
+[ ] LICENSE/NOTICE files exist
+[ ] No unexpected binary files
+[ ] All source files have ASF headers
+[ ] Can compile from source
+
+More detailed checklist please refer to:
+https://github.com/apache/iceberg-rust/tree/main/scripts
+
+To compile from source, please refer to:
+https://github.com/apache/iceberg-rust/blob/main/CONTRIBUTING.md
+
+Here is a Python script in release to help you verify the release candidate:
+
+./scripts/verify.py
+
+Thanks
+
+${name}
+```
+
+Example: <https://lists.apache.org/thread/c211gqq2yl15jbxqk4rcnq1bdqltjm5l>
+
+After at least 3 `+1` binding vote (from Iceberg PMC member), claim the vote
result:
+
+Title:
+
+```
+[RESULT][VOTE] Release Apache Iceberg Rust ${release_version} RC1
+```
+
+Content:
+
+```
+Hello, Apache Iceberg Rust Community,
+
+The vote to release Apache Iceberg Rust ${release_version} has passed.
+
+The vote PASSED with 3 +1 binding and 1 +1 non-binding votes, no +0 or -1
votes:
+
+Binding votes:
+
+- xxx
+- yyy
+- zzz
+
+Non-Binding votes:
+
+- aaa
+
+Vote thread: ${vote_thread_url}
+
+Thanks
+
+${name}
+```
+
+Example: <https://lists.apache.org/thread/xk5myl10mztcfotn59oo59s4ckvojds6>
+
+## Official Release
+
+### Push the release git tag
+
+```shell
+# Checkout the tags that passed VOTE
+git checkout ${release_version}
+# Tag with the iceberg version
+git tag -s ${iceberg_version}
+# Push tags to github to trigger releases
+git push origin ${iceberg_version}
+```
+
+### Publish artifacts to SVN RELEASE branch
+
+```shell
+svn mv
https://dist.apache.org/repos/dist/dev/iceberg/iceberg-rust/${release_version}
https://dist.apache.org/repos/dist/release/iceberg/iceberg-rust/${iceberg_version}
-m "Release ${iceberg_version}"
+```
+
+### Change Iceberg Rust Website download link
+
+Update the download link in `website/src/download.md` to the new release
version.
+
+### Create a GitHub Release
+
+- Click [here](https://github.com/apache/iceberg-rust/releases/new) to create
a new release.
+- Pick the git tag of this release version from the dropdown menu.
+- Make sure the branch target is `main`.
+- Generate the release note by clicking the `Generate release notes` button.
+- Add the release note from every component's `upgrade.md` if there are
breaking changes before the content generated by GitHub. Check them carefully.
+- Publish the release.
+
+### Send the announcement
+
+Send the release announcement to `[email protected]` and CC
`[email protected]`.
+
+Instead of adding breaking changes, let's include the new features as "notable
changes" in the announcement.
+
+Title:
+
+```
+[ANNOUNCE] Release Apache Iceberg Rust ${iceberg_version}
+```
+
+Content:
+
+```
+Hi all,
+
+The Apache Iceberg Rust community is pleased to announce
+that Apache Iceberg Rust ${iceberg_version} has been released!
+
+Iceberg is a data access layer that allows users to easily and efficiently
+retrieve data from various storage services in a unified way.
+
+The notable changes since ${iceberg_version} include:
+1. xxxxx
+2. yyyyyy
+3. zzzzzz
+
+Please refer to the change log for the complete list of changes:
+https://github.com/apache/iceberg-rust/releases/tag/v${iceberg_version}
+
+Apache Iceberg Rust website: https://rust.iceberg.apache.org/
+
+Download Links: https://rust.iceberg.apache.org/download
+
+Iceberg Resources:
+- Issue: https://github.com/apache/iceberg-rust/issues
+- Mailing list: [email protected]
+
+Thanks
+On behalf of Apache Iceberg Community
+```
+
+Example: <https://lists.apache.org/thread/oy77n55brvk72tnlb2bjzfs9nz3cfd0s>
