Enable priority per-hook

This commit is contained in:
Chris de Graaf 2019-09-24 15:07:57 +07:00
parent 5e843dadbb
commit 6d95bf78a0
No known key found for this signature in database
GPG Key ID: 150FFDD9B0073C7B
4 changed files with 10 additions and 6 deletions

View File

@ -61,12 +61,14 @@ By default, the tags are `"{{"` and `"}}"`.
tags(::Plugin) = "{{", "}}" tags(::Plugin) = "{{", "}}"
""" """
priority(::Plugin) -> Int priority(::Plugin, ::Union{typeof(prehook), typeof(hook), typeof(posthook)}) -> Int
Determines the order in which plugins are processed (higher goes first). Determines the order in which plugins are processed (higher goes first).
The default priority (`DEFAULT_PRIORITY`), is `$DEFAULT_PRIORITY`. The default priority (`DEFAULT_PRIORITY`), is `$DEFAULT_PRIORITY`.
You can implement this function per-stage (by using `::typeof(hook)`, for example), or for all stages by simply using `::Function`.
""" """
priority(::Plugin) = DEFAULT_PRIORITY priority(::Plugin, ::Function) = DEFAULT_PRIORITY
""" """
gitignore(::Plugin) -> Vector{String} gitignore(::Plugin) -> Vector{String}

View File

@ -19,6 +19,9 @@ Creates a Git repository and a `.gitignore` file.
gpgsign::Bool = false gpgsign::Bool = false
end end
# Try to make sure that no files are created after we commit.
priority(::Git, ::typeof(posthook)) = 5
Base.:(==)(a::Git, b::Git) = all(map(n -> getfield(a, n) == getfield(b, n), fieldnames(Git))) Base.:(==)(a::Git, b::Git) = all(map(n -> getfield(a, n) == getfield(b, n), fieldnames(Git)))
function gitignore(p::Git) function gitignore(p::Git)

View File

@ -6,7 +6,7 @@ Creates a `Project.toml`.
struct ProjectFile <: Plugin end struct ProjectFile <: Plugin end
# Other plugins like Tests will modify this file. # Other plugins like Tests will modify this file.
priority(::ProjectFile) = typemax(Int) - DEFAULT_PRIORITY + 1 priority(::ProjectFile, ::typeof(hook)) = typemax(Int) - 5
function hook(::ProjectFile, t::Template, pkg_dir::AbstractString) function hook(::ProjectFile, t::Template, pkg_dir::AbstractString)
toml = Dict( toml = Dict(

View File

@ -77,8 +77,7 @@ function Template(::Val{false}; kwargs...)
append!(plugins, getkw(kwargs, :plugins)) append!(plugins, getkw(kwargs, :plugins))
disabled = getkw(kwargs, :disable_defaults) disabled = getkw(kwargs, :disable_defaults)
append!(plugins, filter(p -> !(typeof(p) in disabled), default_plugins())) append!(plugins, filter(p -> !(typeof(p) in disabled), default_plugins()))
plugins = unique(typeof, plugins) plugins = sort(unique(typeof, plugins); by=string)
sort!(plugins; by=priority, rev=true)
return Template(authors, dir, host, julia_version, plugins, user) return Template(authors, dir, host, julia_version, plugins, user)
end end
@ -97,7 +96,7 @@ function (t::Template)(pkg::AbstractString)
try try
foreach((prehook, hook, posthook)) do h foreach((prehook, hook, posthook)) do h
@info "Running $(nameof(h))s" @info "Running $(nameof(h))s"
foreach(t.plugins) do p foreach(sort(t.plugins; by=p -> priority(p, h), rev=true)) do p
h(p, t, pkg_dir) h(p, t, pkg_dir)
end end
end end