ic-memory 0.28.1

Durable stable-memory allocation governance for Internet Computer canisters
Documentation
# Select one candidate; preserve historical notes, including undated versions
# at or below an explicitly supplied canonical previous version.
function historical(value, a, b, n) {
    if (previous == "") return 0
    split(value, a, "."); split(previous, b, ".")
    for (n = 1; n <= 3; n++) {
        if (length(a[n]) != length(b[n])) return length(a[n]) < length(b[n])
        if (a[n] != b[n]) return ("x" a[n]) < ("x" b[n])
    }
    return 1
}
{
    lines[NR] = $0
    if ($0 ~ /^## / && first == 0) first = NR
    if ($0 == "## [" version "] - " date) { finalized++; finalized_line=NR }
    else if (index($0, "## [" version "] - ") == 1) conflict = 1
    heading_version = substr($2, 2, length($2)-2)
    if ($0 ~ /^## \[(Draft|[0-9]+\.[0-9]+\.[0-9]+)\]$/ &&
        ($2 == "[Draft]" || !historical(heading_version))) {
        drafts++
        start = NR
        if ($0 != "## [Draft]" && $0 != "## [" version "]") conflict = 1
    } else if (start && !finish && NR > start && $0 ~ /^## /) {
        finish = NR
    }
}
END {
    if (conflict || drafts > 1 || (finalized &&
        (!allow_finalized || finalized != 1 || drafts || finalized_line != first))) {
        print "ambiguous or already finalized release candidate" > "/dev/stderr"
        exit 1
    }
    if (finalized) {
        for (i = 1; i <= NR; i++) print lines[i]
        exit
    }
    if (!first) first = NR + 1
    if (!finish) finish = NR + 1
    for (i = 1; i <= NR + 1; i++) {
        if (i == first) {
            print "## [" version "] - " date
            if (start) {
                for (j = start + 1; j < finish; j++) print lines[j]
            } else {
                print ""
            }
        }
        if (i <= NR && (!start || i < start || i >= finish)) print lines[i]
    }
}