From 6260274a73effa4358464f69d6db2986bf1fd582 Mon Sep 17 00:00:00 2001 From: "Eduardo B. A" <279828+sezaru@users.noreply.github.com> Date: Fri, 9 Jun 2023 00:40:19 -0300 Subject: [PATCH] feat(AllowedTags): Adds allowed_tags option (#59) * feat(AllowedTags): Add config allow_untagged? to tags --------- Co-authored-by: Eduardo --- README.md | 6 ++++++ lib/git_ops/config.ex | 5 +++++ lib/mix/tasks/git_ops.release.ex | 37 ++++++++++++++++++++++++++------ test/config_test.exs | 21 ++++++++++++++++++ 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 872e08f..b35af4e 100644 --- a/README.md +++ b/README.md @@ -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, diff --git a/lib/git_ops/config.ex b/lib/git_ops/config.ex index 9706d59..a4bc663 100644 --- a/lib/git_ops/config.ex +++ b/lib/git_ops/config.ex @@ -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 diff --git a/lib/mix/tasks/git_ops.release.ex b/lib/mix/tasks/git_ops.release.ex index d713ef1..25ef1a0 100644 --- a/lib/mix/tasks/git_ops.release.ex +++ b/lib/mix/tasks/git_ops.release.ex @@ -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} = @@ -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 @@ -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?) @@ -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] diff --git a/test/config_test.exs b/test/config_test.exs index 576efea..e370524 100644 --- a/test/config_test.exs +++ b/test/config_test.exs @@ -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 @@ -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