Current section

Files

Jump to
llm_db lib mix tasks llm_db.version.ex
Raw

lib/mix/tasks/llm_db.version.ex

defmodule Mix.Tasks.LlmDb.Version do
@moduledoc """
Updates the version in mix.exs to CalVer format (YYYY.M.PATCH).
- If current version is from a different month, resets to YYYY.M.0
- If current version is from the same month, increments PATCH
## Usage
mix llm_db.version
## Examples
# Current: 2025.11.5, Today: December 2025
# Result: 2025.12.0
# Current: 2025.12.0, Today: December 2025
# Result: 2025.12.1
"""
use Mix.Task
@shortdoc "Bump version using CalVer (YYYY.M.PATCH)"
@impl Mix.Task
def run(_args) do
mix_exs_path = "mix.exs"
content = File.read!(mix_exs_path)
current_version = extract_version(content)
new_version = compute_next_version(current_version)
updated = Regex.replace(~r/@version ".*"/, content, "@version \"#{new_version}\"")
File.write!(mix_exs_path, updated)
Mix.shell().info("Updated version: #{current_version}#{new_version}")
end
defp extract_version(content) do
case Regex.run(~r/@version "([^"]+)"/, content) do
[_, version] -> version
_ -> "0.0.0"
end
end
defp compute_next_version(current_version) do
today = Date.utc_today()
current_year = today.year
current_month = today.month
case parse_calver(current_version) do
{:ok, ^current_year, ^current_month, patch} ->
# Same month: increment patch
"#{current_year}.#{current_month}.#{patch + 1}"
_ ->
# Different month or invalid: start fresh
"#{current_year}.#{current_month}.0"
end
end
defp parse_calver(version) do
# Handle versions like "2025.12.5" or "2025.12.5-preview"
case Regex.run(~r/^(\d{4})\.(\d{1,2})\.(\d+)/, version) do
[_, year, month, patch] ->
{:ok, String.to_integer(year), String.to_integer(month), String.to_integer(patch)}
_ ->
:error
end
end
end