-
Notifications
You must be signed in to change notification settings - Fork 60
/
config.rb
158 lines (138 loc) · 5.18 KB
/
config.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# frozen_string_literal: true
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'ruby27_fix_uri'
require 'kramdown-parser-gfm'
set :markdown_engine, :kramdown
# rubocop:disable Layout/HashAlignment
set(
:markdown,
input: 'GFM',
layout_engine: :erb,
with_toc_data: true,
fenced_code_blocks: true,
no_intra_emphasis: true,
tables: true,
autolink: true,
quote: true,
lax_spacing: true,
relative_links: true
)
# rubocop:enable Layout/HashAlignment
set :build_dir, 'target/site'
set :css_dir, 'assets/css'
set :js_dir, 'assets/js'
set :images_dir, 'assets/img'
# Build-specific configuration
configure :build do
activate :relative_assets
end
activate :directory_indexes
activate :syntax
activate :livereload
# Per-page layout changes
page '/*.xml', layout: false
page '/*.json', layout: false
page '/*.txt', layout: false
page '.htaccess.apache', layout: false
# classes needed to publish our api docs
class CopyInPlaceResource < ::Middleman::Sitemap::Resource
def binary?
true
end
end
# Generate API documentation from the rest of the source tree
class ApiDocs
def initialize(sitemap, destination, source)
@sitemap = sitemap
@destination = destination
@source = source
end
def manipulate_resource_list(resources)
parent = Pathname.new(@source)
build = Pathname.new(@destination)
::Middleman::Util.all_files_under(@source).each do |path|
dest = build + path.relative_path_from(parent)
resources << CopyInPlaceResource.new(@sitemap, dest.to_s, path.to_s)
end
# to make clear what we return
resources
end
end
SHELLDOCS = File.absolute_path('../shelldocs/src/main/python/shelldocs.py')
def shelldocs(output, docs = [])
unless FileUtils.uptodate?(output, docs) &&
FileUtils.uptodate?(output, [SHELLDOCS])
inputs = docs.map { |entry| "--input=#{entry}" }
`#{SHELLDOCS} --skipprnorep --output #{output} #{inputs.join ' '}`
errmsg = $stderr
return if $CHILD_STATUS.exitstatus.zero?
puts(errmsg)
abort("shelldocs failed to generate docs for '#{docs}'")
end
end
def fetch_release_docs(output, version)
puts "Downloading and extracting #{version} from ASF archives"
`(cd #{output} \
&& mkdir -p site/documentation/#{version} \
&& curl --fail --location --output site-#{version}.tar.gz \
https://archive.apache.org/dist/yetus/#{version}/apache-yetus-#{version}-site.tar.gz \
&& tar -C site/documentation/#{version} \
--strip-components 3 -xzpf site-#{version}.tar.gz \
apache-yetus-#{version}-site/documentation/in-progress/ \
)`
end
def precommit_shelldocs(apidocs_dir, source_dir)
# core API
shelldocs("#{apidocs_dir}/core.html.md", Dir.glob("#{source_dir}/core.d/*.sh"))
# smart-apply-patch API
shelldocs("#{apidocs_dir}/smart-apply-patch.html.md", ["#{source_dir}/smart-apply-patch.sh"])
# primary API
shelldocs("#{apidocs_dir}/test-patch.html.md", ["#{source_dir}/test-patch.sh"])
# plugins API
shelldocs("#{apidocs_dir}/plugins.html.md", Dir.glob("#{source_dir}/plugins.d/*.sh"))
end
# Add in apidocs rendered by other parts of the repo
after_configuration do
# Since `after_configuration` runs twice in middleman 4,
# we will build twice if we don't skip the config run
next if app.config[:mode] == :config
# This allows us to set the style for tables.
::Middleman::Renderers::MiddlemanKramdownHTML.class_eval do
def convert_table(el, indent) # rubocop:disable Naming/MethodParameterName
el.attr['class'] = 'table table-bordered table-striped'
super
end
end
# For Precommit we regenerate source files so they can be rendered.
# we rely on a symlink. to avoid an error from the file watcher, our target
# has to be outside of the asf-site-src directory.
# TODO when we can, update to middleman 4 so we can use multiple source dirs
# instead of symlinks
FileUtils.mkdir_p 'target/in-progress/precommit/apidocs/'
precommit_shelldocs('target/in-progress/precommit/apidocs/', '../precommit/src/main/shell')
end
after_build do
File.rename 'target/site/.htaccess.apache', 'target/site/.htaccess'
File.rename(
'target/site/documentation/in-progress/precommit/apidocs-index/index.html',
'target/site/documentation/in-progress/precommit/apidocs/index.html'
)
app.data.versions.releases&.each do |release|
fetch_release_docs('target', release)
end
end