Skip to content

Commit

Permalink
feat(AllowedTags): Adds allowed_tags option (#59)
Browse files Browse the repository at this point in the history
* feat(AllowedTags): Add config allow_untagged? to tags

---------

Co-authored-by: Eduardo <[email protected]>
  • Loading branch information
sezaru and Eduardo authored Jun 9, 2023
1 parent 744b12e commit 6260274
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 7 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ config :git_ops,
header: "Important Changes"
]
],
tags: [
# Only add commits to the changelog that has the "backend" tag
allowed: ["backend"],
# Filter out or not commits that don't contain tags
allow_untagged?: true
]
# Instructs the tool to manage your mix version in your `mix.exs` file
# See below for more information
manage_mix_version?: true,
Expand Down
5 changes: 5 additions & 0 deletions lib/git_ops/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ defmodule GitOps.Config do
end)
end

def allowed_tags, do: :git_ops |> Application.get_env(:tags, []) |> Keyword.get(:allowed, :any)

def allow_untagged?,
do: :git_ops |> Application.get_env(:tags, []) |> Keyword.get(:allow_untagged?, true)

def prefix, do: Application.get_env(:git_ops, :version_tag_prefix) || ""

defp truthy?(nil), do: false
Expand Down
37 changes: 30 additions & 7 deletions lib/mix/tasks/git_ops.release.ex
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ defmodule Mix.Tasks.GitOps.Release do
prefix = Config.prefix()

config_types = Config.types()
allowed_tags = Config.allowed_tags()
allow_untagged? = Config.allow_untagged?()
from_rc? = Version.parse!(current_version).pre != []

{commit_messages_for_version, commit_messages_for_changelog} =
Expand All @@ -98,9 +100,10 @@ defmodule Mix.Tasks.GitOps.Release do
log_for_version? = !opts[:initial]

commits_for_version =
parse_commits(commit_messages_for_version, config_types, log_for_version?)
parse_commits(commit_messages_for_version, config_types, allowed_tags, allow_untagged?, log_for_version?)

commits_for_changelog = parse_commits(commit_messages_for_changelog, config_types, false)
commits_for_changelog =
parse_commits(commit_messages_for_changelog, config_types, allowed_tags, allow_untagged?, false)

prefixed_new_version =
if opts[:initial] do
Expand Down Expand Up @@ -259,14 +262,16 @@ defmodule Mix.Tasks.GitOps.Release do
end
end

defp parse_commits(messages, config_types, log?) do
Enum.flat_map(messages, &parse_commit(&1, config_types, log?))
defp parse_commits(messages, config_types, allowed_tags, allow_untagged?, log?) do
Enum.flat_map(messages, &parse_commit(&1, config_types, allowed_tags, allow_untagged?, log?))
end

defp parse_commit(text, config_types, log?) do
defp parse_commit(text, config_types, allowed_tags, allow_untagged?, log?) do
case Commit.parse(text) do
{:ok, commits} ->
commits_with_type(config_types, commits, text, log?)
commits
|> commits_with_allowed_tags(allowed_tags, allow_untagged?)
|> commits_with_type(config_types, text, log?)

_ ->
error_if_log("Unparseable commit: #{text}", log?)
Expand All @@ -275,7 +280,25 @@ defmodule Mix.Tasks.GitOps.Release do
end
end

defp commits_with_type(config_types, commits, text, log?) do
defp commits_with_allowed_tags(commits, :any, _), do: commits

defp commits_with_allowed_tags(commits, allowed_tags, allow_untagged?) do
case Enum.find(commits, fn %{type: type} -> type == "TAGS" end) do
nil ->
if allow_untagged?, do: commits, else: []

commit ->
tags = commit.message |> String.split(",", trim: true) |> Enum.map(&String.trim/1)

if Enum.any?(tags, fn tag -> tag in allowed_tags end) do
commits
else
[]
end
end
end

defp commits_with_type(commits, config_types, text, log?) do
Enum.flat_map(commits, fn commit ->
if Map.has_key?(config_types, String.downcase(commit.type)) do
[commit]
Expand Down
21 changes: 21 additions & 0 deletions test/config_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ defmodule GitOps.Test.ConfigTest do
Application.put_env(:git_ops, :changelog_file, "CUSTOM_CHANGELOG.md")
Application.put_env(:git_ops, :manage_readme_version, true)
Application.put_env(:git_ops, :types, custom: [header: "Custom"], docs: [hidden?: false])
Application.put_env(:git_ops, :tags, [allowed: ["tag_1", "tag_2"], allow_untagged?: false])
Application.put_env(:git_ops, :version_tag_prefix, "v")
end

Expand Down Expand Up @@ -91,6 +92,26 @@ defmodule GitOps.Test.ConfigTest do
assert types["custom"][:header] == "Custom"
end

test "Allowed tags configuration returns correcly" do
assert Config.allowed_tags() == ["tag_1", "tag_2"]
end

test "Allowed tags configuration returns :any if not set" do
Application.delete_env(:git_ops, :tags)

assert Config.allowed_tags() == :any
end

test "Allow untagged? configuration returns correcly" do
assert Config.allow_untagged?() == false
end

test "Allow untagged? configuration returns true if not set" do
Application.delete_env(:git_ops, :tags)

assert Config.allow_untagged?() == true
end

test "custom prefixes returns correctly" do
assert Config.prefix() == "v"
end
Expand Down

0 comments on commit 6260274

Please sign in to comment.