chatdesk-ui/postgres_15.8.1.044/nix/tools/update_readme.nu

213 lines
7.1 KiB
Plaintext
Executable File

#!/usr/bin/env nu
# Load required data
def load_flake [] {
nix flake show --json --all-systems | from json
}
def find_index [list: list<any>, value: any] {
let enumerated = ($list | enumerate)
let found = ($enumerated | where item == $value | first)
if ($found | is-empty) {
-1
} else {
$found.index
}
}
def get_systems [flake_json] {
$flake_json | get packages | columns
}
def get_postgres_versions [flake_json] {
let packages = ($flake_json | get packages | get aarch64-linux)
# Get available versions from postgresql packages
let available_versions = ($packages
| columns
| where {|col|
# Match exact postgresql_<number> or postgresql_orioledb-<number>
$col =~ "^postgresql_\\d+$" or $col =~ "^postgresql_orioledb-\\d+$"
}
| each {|pkg_name|
let is_orioledb = ($pkg_name =~ "orioledb")
let pkg_info = ($packages | get $pkg_name)
let version = if $is_orioledb {
$pkg_info.name | str replace "postgresql-" "" | split row "_" | first # Get "17" from "postgresql-17_5"
} else {
$pkg_info.name | str replace "postgresql-" "" | split row "." | first # Get "15" from "postgresql-15.8"
}
{
version: $version,
is_orioledb: $is_orioledb,
name: $pkg_info.name
}
}
)
$available_versions | uniq | sort-by version
}
def get_src_url [pkg_attr] {
let result = (do { nix eval $".#($pkg_attr).src.url" } | complete)
if $result.exit_code == 0 {
$result.stdout | str trim | str replace -a '"' '' # Remove all quotes
} else {
null
}
}
def get_extension_info [flake_json, pg_info] {
let major_version = ($pg_info.version | split row "." | first)
let version_prefix = if $pg_info.is_orioledb {
"psql_orioledb-" + $major_version + "/exts/"
} else {
"psql_" + $major_version + "/exts/"
}
print $"Looking for extensions with prefix: ($version_prefix)"
let sys_packages = ($flake_json | get packages | get aarch64-linux)
let ext_names = ($sys_packages
| columns
| where {|col| $col =~ $"^($version_prefix)"}
)
print $"Found extensions: ($ext_names | str join ', ')"
let all_exts = ($ext_names | each {|ext_name|
let ext_info = ($sys_packages | get $ext_name)
let name = ($ext_name | str replace $version_prefix "")
let version = if $name == "orioledb" {
$ext_info.name # Use name directly for orioledb
} else if ($ext_info.name | str contains "-") {
$ext_info.name | split row "-" | last
} else {
$ext_info.name
}
let src_url = (get_src_url $ext_name)
{
name: $name,
version: $version,
description: $ext_info.description,
url: $src_url
}
})
$all_exts | sort-by name
}
def create_version_link [pg_info] {
if $pg_info.is_orioledb {
let display = $"orioledb-($pg_info.name)"
let url = "https://github.com/orioledb/orioledb"
$"- ✅ Postgres [($display)]\(($url)\)"
} else {
let major_version = ($pg_info.version | split row "." | first)
let url = $"https://www.postgresql.org/docs/($major_version)/index.html"
$"- ✅ Postgres [($pg_info.name)]\(($url)\)" # Use full version number
}
}
def create_ext_table [extensions, pg_info] {
let header_version = if $pg_info.is_orioledb {
$"orioledb-($pg_info.version)" # Add orioledb prefix for orioledb versions
} else {
$pg_info.version
}
let header = [
"", # blank line for spacing
$"### PostgreSQL ($header_version) Extensions",
"| Extension | Version | Description |",
"| ------------- | :-------------: | ------------- |"
]
let rows = ($extensions | each {|ext|
let name = $ext.name
let version = $ext.version
let desc = $ext.description
let url = $ext.url # Get URL from extension info
$"| [($name)]\(($url)\) | [($version)]\(($url)\) | ($desc) |"
})
$header | append $rows
}
def update_readme [] {
let flake_json = (load_flake)
let readme_path = ([$env.PWD "README.md"] | path join)
let readme = (open $readme_path | lines)
let pg_versions = (get_postgres_versions $flake_json)
# Find section indices
let features_start = ($readme | where $it =~ "^## Primary Features" | first)
let features_end = ($readme | where $it =~ "^## Extensions" | first)
let features_start_idx = (find_index $readme $features_start)
let features_end_idx = (find_index $readme $features_end)
if $features_start_idx == -1 or $features_end_idx == -1 {
error make {msg: "Could not find Features sections"}
}
# Update Primary Features section
let features_content = [
($pg_versions | each {|version| create_version_link $version} | str join "\n")
"- ✅ Ubuntu 20.04 (Focal Fossa)."
"- ✅ [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) = logical and [max_replication_slots](https://www.postgresql.org/docs/current/runtime-config-replication.html) = 5. Ready for replication."
"- ✅ [Large Systems Extensions](https://github.com/aws/aws-graviton-getting-started#building-for-graviton-and-graviton2). Enabled for ARM images."
]
# Find extension section indices
let ext_start = ($readme | where $it =~ "^## Extensions" | first)
let ext_start_idx = (find_index $readme $ext_start)
# Find next section after Extensions or use end of file
let next_section_idx = ($readme
| enumerate
| where {|it| $it.index > $ext_start_idx and ($it.item =~ "^## ")}
| first
| get index
| default ($readme | length)
)
if $ext_start_idx == -1 {
error make {msg: "Could not find Extensions section"}
}
# Create extension sections content
let ext_sections_content = ($pg_versions | each {|version|
let extensions = (get_extension_info $flake_json $version)
create_ext_table $extensions $version
} | flatten)
# Combine sections, removing duplicate headers
let before_features = ($readme
| range (0)..($features_start_idx)
| where {|line| not ($line =~ "^## Primary Features")}
)
let features_header = ($readme | get $features_start_idx)
let between_sections = ($readme
| range ($features_end_idx)..($ext_start_idx)
| where {|line|
not ($line =~ "^## Primary Features" or $line =~ "^## Extensions")
}
)
let ext_header = ($readme | get $ext_start_idx)
let after_ext = ($readme | range ($next_section_idx)..($readme | length))
let output = ($before_features
| append $features_header
| append $features_content
| append $between_sections
| append $ext_header
| append $ext_sections_content
| append $after_ext
| str join "\n")
$output | save --force $readme_path
}
# Main execution
update_readme