Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b3fb5fa87 | |||
| 5f7c17b900 | |||
| 9ade6d983e | |||
| f464b6dc11 | |||
| 8c811d5638 | |||
| 4229164197 | |||
| b6a063152f | |||
| 46c22a8b87 | |||
| 7e379cfab1 | |||
| 93d3d10453 | |||
| 98a0006c86 |
@@ -34,5 +34,5 @@ jobs:
|
|||||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
- name: docker state
|
- name: docker state
|
||||||
run: docker image ls
|
run: docker image ls
|
||||||
- name: Run tests
|
- name: Run gollum as test
|
||||||
run: docker run -e CI=true -w /app --entrypoint bundle ${{ env.CI_IMAGE }} exec rake
|
run: docker run -e CI=true ${{ env.CI_IMAGE }} --irb
|
||||||
|
|||||||
+27
-10
@@ -1,29 +1,46 @@
|
|||||||
name: Ruby Build
|
name: Ruby Build
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
jruby_build:
|
||||||
|
name: JRuby (${{ matrix.ruby }})
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ruby: [2.4.0, 2.6.0, 3.0.0, jruby-9.2.18.0]
|
ruby: [jruby-9.2.18]
|
||||||
steps:
|
steps:
|
||||||
- run: echo "The job was automatically triggered by a ${{ github.event_name }} event."
|
|
||||||
- run: echo "This job is now running on a ${{ runner.os }} server hosted by GitHub!"
|
|
||||||
- run: echo "The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- run: echo "The ${{ github.repository }} repository has been cloned to the runner."
|
|
||||||
- run: echo "The workflow is now ready to test your code on the runner."
|
|
||||||
- name: List files in the repository
|
- name: List files in the repository
|
||||||
run: |
|
run: |
|
||||||
ls ${{ github.workspace }}
|
ls ${{ github.workspace }}
|
||||||
- uses: actions/setup-java@v2
|
- name: Set up Java
|
||||||
|
uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
distribution: 'adopt'
|
distribution: 'adopt'
|
||||||
java-version: '11'
|
java-version: '11'
|
||||||
- uses: ruby/setup-ruby@v1
|
- name: Set up Ruby
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby }}
|
ruby-version: ${{ matrix.ruby }}
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
- name: exec rake
|
- name: Run tests
|
||||||
|
run: bundle exec rake
|
||||||
|
mri_build:
|
||||||
|
name: Ruby (${{ matrix.ruby }})
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
ruby: [2.6, 2.7, 3.0]
|
||||||
|
steps:
|
||||||
|
- name: Check out repository code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: List files in the repository
|
||||||
|
run: |
|
||||||
|
ls ${{ github.workspace }}
|
||||||
|
- name: Set up Ruby
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: ${{ matrix.ruby }}
|
||||||
|
bundler-cache: true
|
||||||
|
- name: Run tests
|
||||||
run: bundle exec rake
|
run: bundle exec rake
|
||||||
|
|||||||
+16
-5
@@ -1,9 +1,11 @@
|
|||||||
FROM ruby:2.7
|
FROM ruby:2.7-alpine AS builder
|
||||||
ENV DEBIAN_FRONTEND="noninteractive"
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apk add \
|
||||||
libicu-dev \
|
build-base \
|
||||||
cmake
|
cmake \
|
||||||
|
git \
|
||||||
|
icu-dev \
|
||||||
|
openssl-dev
|
||||||
|
|
||||||
COPY Gemfile* /tmp/
|
COPY Gemfile* /tmp/
|
||||||
COPY gollum.gemspec* /tmp/
|
COPY gollum.gemspec* /tmp/
|
||||||
@@ -23,6 +25,15 @@ WORKDIR /app
|
|||||||
COPY . /app
|
COPY . /app
|
||||||
RUN bundle exec rake install
|
RUN bundle exec rake install
|
||||||
|
|
||||||
|
|
||||||
|
FROM ruby:2.7-alpine
|
||||||
|
|
||||||
|
COPY --from=builder /usr/local/bundle/ /usr/local/bundle/
|
||||||
|
|
||||||
|
RUN apk add \
|
||||||
|
bash \
|
||||||
|
git
|
||||||
|
|
||||||
VOLUME /wiki
|
VOLUME /wiki
|
||||||
WORKDIR /wiki
|
WORKDIR /wiki
|
||||||
COPY docker-run.sh /docker-run.sh
|
COPY docker-run.sh /docker-run.sh
|
||||||
|
|||||||
@@ -1,9 +1,26 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
if RUBY_PLATFORM == 'java'
|
gem 'warbler', platforms: :jruby
|
||||||
gem 'warbler'
|
|
||||||
end
|
# FIXME:
|
||||||
|
#
|
||||||
|
# There's an issue in 1.12.5 that causes XHTML elements to be generated badly,
|
||||||
|
# causing Gollum's test suite to fail.[1] The issue has been fixed upstream,
|
||||||
|
# but we're still waiting for a new Nokogiri point release.
|
||||||
|
#
|
||||||
|
# However, 1.12.5 is a security patch, so we don't want end users to use an
|
||||||
|
# older version of Nokogiri. But this is safe to do in our CI environment.
|
||||||
|
#
|
||||||
|
# Once there's a new Nokogiri release, we can remove this dependency and JRuby
|
||||||
|
# CI should pass normally again.
|
||||||
|
#
|
||||||
|
# Note that Nokogiri 1.11+ does not support Ruby v2.4.x anymore. So to make our
|
||||||
|
# current CI workflows pass, we should only try to install this version of
|
||||||
|
# Nokogiri for newer Ruby versions.
|
||||||
|
#
|
||||||
|
# [1]: https://github.com/gollum/gollum/issues/1779
|
||||||
|
gem 'nokogiri', '1.12.4' unless RUBY_VERSION.include? '2.4'
|
||||||
|
|
||||||
gemspec
|
gemspec
|
||||||
|
|
||||||
gem 'rake', '~> 13.0'
|
gem 'rake', '~> 13.0'
|
||||||
|
|||||||
+1
-1
@@ -206,7 +206,7 @@ begin
|
|||||||
rescue OptionParser::InvalidOption => e
|
rescue OptionParser::InvalidOption => e
|
||||||
puts "gollum: #{e.message}"
|
puts "gollum: #{e.message}"
|
||||||
puts 'gollum: try \'gollum --help\' for more information'
|
puts 'gollum: try \'gollum --help\' for more information'
|
||||||
exit
|
exit 1
|
||||||
end
|
end
|
||||||
|
|
||||||
# --gollum-path wins over ARGV[0]
|
# --gollum-path wins over ARGV[0]
|
||||||
|
|||||||
+2
-1
@@ -6,4 +6,5 @@ if [ ! -d .git ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Start gollum service
|
# Start gollum service
|
||||||
gollum --mathjax
|
[[ "$@" != *--mathjax* ]] && echo "WARNING: Mathjax will soon be disabled by default. To explicitly enable it, use --mathjax" >&2
|
||||||
|
exec gollum $@ --mathjax
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ Gem::Specification.new do |s|
|
|||||||
s.add_development_dependency 'rack-test', '~> 0.6.3'
|
s.add_development_dependency 'rack-test', '~> 0.6.3'
|
||||||
s.add_development_dependency 'shoulda', '~> 3.6.0'
|
s.add_development_dependency 'shoulda', '~> 3.6.0'
|
||||||
s.add_development_dependency 'minitest-reporters', '~> 1.3.6'
|
s.add_development_dependency 'minitest-reporters', '~> 1.3.6'
|
||||||
s.add_development_dependency 'twitter_cldr', '~> 3.2.0'
|
|
||||||
s.add_development_dependency 'mocha', '~> 1.8.0'
|
s.add_development_dependency 'mocha', '~> 1.8.0'
|
||||||
s.add_development_dependency 'test-unit', '~> 3.3.0'
|
s.add_development_dependency 'test-unit', '~> 3.3.0'
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -20,6 +20,7 @@ require 'gollum/views/layout'
|
|||||||
require 'gollum/views/editable'
|
require 'gollum/views/editable'
|
||||||
require 'gollum/views/has_page'
|
require 'gollum/views/has_page'
|
||||||
require 'gollum/views/has_user_icons'
|
require 'gollum/views/has_user_icons'
|
||||||
|
require 'gollum/views/has_math'
|
||||||
require 'gollum/views/pagination'
|
require 'gollum/views/pagination'
|
||||||
require 'gollum/views/rss.rb'
|
require 'gollum/views/rss.rb'
|
||||||
require 'gollum/views/template_cascade'
|
require 'gollum/views/template_cascade'
|
||||||
@@ -125,6 +126,7 @@ module Precious
|
|||||||
@css = settings.wiki_options[:css]
|
@css = settings.wiki_options[:css]
|
||||||
@js = settings.wiki_options[:js]
|
@js = settings.wiki_options[:js]
|
||||||
@mathjax_config = settings.wiki_options[:mathjax_config]
|
@mathjax_config = settings.wiki_options[:mathjax_config]
|
||||||
|
@mathjax = settings.wiki_options[:mathjax]
|
||||||
|
|
||||||
@use_static_assets = settings.wiki_options.fetch(:static, settings.environment != :development)
|
@use_static_assets = settings.wiki_options.fetch(:static, settings.environment != :development)
|
||||||
@static_assets_path = settings.wiki_options.fetch(:static_assets_path, ::File.join(File.dirname(__FILE__), 'public/assets'))
|
@static_assets_path = settings.wiki_options.fetch(:static_assets_path, ::File.join(File.dirname(__FILE__), 'public/assets'))
|
||||||
@@ -217,7 +219,6 @@ module Precious
|
|||||||
if page = wikip.page
|
if page = wikip.page
|
||||||
@page = page
|
@page = page
|
||||||
@content = page.text_data
|
@content = page.text_data
|
||||||
@mathjax = wiki.mathjax
|
|
||||||
@etag = page.sha
|
@etag = page.sha
|
||||||
mustache :edit
|
mustache :edit
|
||||||
else
|
else
|
||||||
@@ -239,7 +240,7 @@ module Precious
|
|||||||
halt 500 unless tempfile.is_a? Tempfile
|
halt 500 unless tempfile.is_a? Tempfile
|
||||||
|
|
||||||
if wiki.per_page_uploads
|
if wiki.per_page_uploads
|
||||||
dir = request.referer.sub(request.base_url, '')
|
dir = request.referer.match(/^https?:\/\/#{request.host_with_port}\/(.*)/)[1]
|
||||||
# remove base path if it is set
|
# remove base path if it is set
|
||||||
dir.sub!(/^#{wiki.base_path}/, '') if wiki.base_path
|
dir.sub!(/^#{wiki.base_path}/, '') if wiki.base_path
|
||||||
# remove base_url and gollum/* subpath if necessary
|
# remove base_url and gollum/* subpath if necessary
|
||||||
@@ -613,7 +614,6 @@ module Precious
|
|||||||
# Extensions and layout data
|
# Extensions and layout data
|
||||||
@editable = true
|
@editable = true
|
||||||
@toc_content = wiki.universal_toc ? @page.toc_data : nil
|
@toc_content = wiki.universal_toc ? @page.toc_data : nil
|
||||||
@mathjax = wiki.mathjax
|
|
||||||
@h1_title = wiki.h1_title
|
@h1_title = wiki.h1_title
|
||||||
@bar_side = wiki.bar_side
|
@bar_side = wiki.bar_side
|
||||||
@allow_uploads = wiki.allow_uploads
|
@allow_uploads = wiki.allow_uploads
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ module Precious
|
|||||||
module Views
|
module Views
|
||||||
class Create < Layout
|
class Create < Layout
|
||||||
include Editable
|
include Editable
|
||||||
|
include HasMath
|
||||||
|
|
||||||
attr_reader :page, :name
|
attr_reader :page, :name
|
||||||
|
|
||||||
@@ -41,9 +42,9 @@ module Precious
|
|||||||
def content
|
def content
|
||||||
@template_page
|
@template_page
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def find_format
|
def find_format
|
||||||
@found_format ||= (Gollum::Page.format_for("#{@name}#{@ext}") || default_markup)
|
@found_format ||= (Gollum::Page.format_for("#{@name}#{@ext}") || default_markup)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ module Precious
|
|||||||
class Edit < Layout
|
class Edit < Layout
|
||||||
include Editable
|
include Editable
|
||||||
include HasPage
|
include HasPage
|
||||||
|
include HasMath
|
||||||
|
|
||||||
attr_reader :page, :content
|
attr_reader :page, :content
|
||||||
|
|
||||||
@@ -18,10 +19,6 @@ module Precious
|
|||||||
def page_name
|
def page_name
|
||||||
@name
|
@name
|
||||||
end
|
end
|
||||||
|
|
||||||
def mathjax
|
|
||||||
@mathjax
|
|
||||||
end
|
|
||||||
|
|
||||||
def header
|
def header
|
||||||
if @header.nil?
|
if @header.nil?
|
||||||
@@ -67,7 +64,7 @@ module Precious
|
|||||||
def etag
|
def etag
|
||||||
@etag
|
@etag
|
||||||
end
|
end
|
||||||
|
|
||||||
def allow_uploads
|
def allow_uploads
|
||||||
@allow_uploads
|
@allow_uploads
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
module Precious
|
||||||
|
module HasMath
|
||||||
|
def mathjax
|
||||||
|
@mathjax
|
||||||
|
end
|
||||||
|
|
||||||
|
def mathjax_config
|
||||||
|
@mathjax_config
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -2,9 +2,10 @@ module Precious
|
|||||||
module Views
|
module Views
|
||||||
class Page < Layout
|
class Page < Layout
|
||||||
include HasPage
|
include HasPage
|
||||||
|
include HasMath
|
||||||
|
|
||||||
attr_reader :content, :page, :header, :footer, :preview, :historical
|
attr_reader :content, :page, :header, :footer, :preview, :historical
|
||||||
|
|
||||||
VALID_COUNTER_STYLES = ['decimal', 'decimal-leading-zero', 'arabic-indic', 'armenian', 'upper-armenian',
|
VALID_COUNTER_STYLES = ['decimal', 'decimal-leading-zero', 'arabic-indic', 'armenian', 'upper-armenian',
|
||||||
'lower-armenian', 'bengali', 'cambodian', 'khmer', 'cjk-decimal', 'devanagari', 'georgian', 'gujarati', 'gurmukhi',
|
'lower-armenian', 'bengali', 'cambodian', 'khmer', 'cjk-decimal', 'devanagari', 'georgian', 'gujarati', 'gurmukhi',
|
||||||
'hebrew', 'kannada', 'lao', 'malayalam', 'mongolian', 'myanmar', 'oriya', 'persian', 'lower-roman', 'upper-roman',
|
'hebrew', 'kannada', 'lao', 'malayalam', 'mongolian', 'myanmar', 'oriya', 'persian', 'lower-roman', 'upper-roman',
|
||||||
@@ -61,11 +62,11 @@ module Precious
|
|||||||
def editable
|
def editable
|
||||||
@editable
|
@editable
|
||||||
end
|
end
|
||||||
|
|
||||||
def search
|
def search
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def history
|
def history
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
@@ -73,11 +74,11 @@ module Precious
|
|||||||
def latest_changes
|
def latest_changes
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def overview
|
def overview
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def allow_editing
|
def allow_editing
|
||||||
@allow_editing
|
@allow_editing
|
||||||
end
|
end
|
||||||
@@ -157,14 +158,6 @@ module Precious
|
|||||||
@toc_content
|
@toc_content
|
||||||
end
|
end
|
||||||
|
|
||||||
def mathjax
|
|
||||||
@mathjax
|
|
||||||
end
|
|
||||||
|
|
||||||
def mathjax_config
|
|
||||||
@mathjax_config
|
|
||||||
end
|
|
||||||
|
|
||||||
def use_identicon
|
def use_identicon
|
||||||
@page.wiki.user_icons == 'identicon'
|
@page.wiki.user_icons == 'identicon'
|
||||||
end
|
end
|
||||||
@@ -182,7 +175,7 @@ module Precious
|
|||||||
# Returns Hash.
|
# Returns Hash.
|
||||||
def metadata
|
def metadata
|
||||||
@page.metadata
|
@page.metadata
|
||||||
end
|
end
|
||||||
|
|
||||||
# Access to embedded metadata.
|
# Access to embedded metadata.
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ require 'mocha/setup'
|
|||||||
require 'fileutils'
|
require 'fileutils'
|
||||||
require 'minitest/reporters'
|
require 'minitest/reporters'
|
||||||
require 'minitest/spec'
|
require 'minitest/spec'
|
||||||
require 'twitter_cldr'
|
|
||||||
require 'tmpdir'
|
require 'tmpdir'
|
||||||
|
|
||||||
# Silence locale validation warning
|
# Silence locale validation warning
|
||||||
|
|||||||
+28
-15
@@ -39,31 +39,29 @@ context "Frontend" do
|
|||||||
assert_match /<pre><code>one\ntwo\nthree\nfour\n<\/code><\/pre>\n/m, last_response.body
|
assert_match /<pre><code>one\ntwo\nthree\nfour\n<\/code><\/pre>\n/m, last_response.body
|
||||||
end
|
end
|
||||||
|
|
||||||
def nfd utf8
|
|
||||||
TwitterCldr::Normalization.normalize(utf8, using: :nfd)
|
|
||||||
end
|
|
||||||
|
|
||||||
test 'mathjax assets are served' do
|
test 'mathjax assets are served' do
|
||||||
get '/gollum/assets/mathjax/MathJax.js'
|
get '/gollum/assets/mathjax/MathJax.js'
|
||||||
assert last_response.ok?
|
assert last_response.ok?
|
||||||
end
|
end
|
||||||
|
|
||||||
test "UTF-8 headers href preserved" do
|
test "UTF-8 headers href preserved" do
|
||||||
page = 'utfh1'
|
page_content = <<~TEXT
|
||||||
text = nfd('한글')
|
## 한글
|
||||||
|
|
||||||
# don't use h1 or it will be promoted to replace file name
|
Test page "utfh1" content.
|
||||||
# which doesn't generate a normal header link
|
TEXT
|
||||||
@wiki.write_page(page, :markdown, '## ' + text,
|
|
||||||
{ :name => 'user1', :email => 'user1' });
|
|
||||||
|
|
||||||
get page
|
@wiki.write_page('utfh1',
|
||||||
expected = "<h2 class=\"editable\"><a class=\"anchor\" (href|id)=\"(#)?#{text}\" (href|id)=\"(#)?#{text}\"></a>#{text}</h2>"
|
:markdown,
|
||||||
actual = nfd(last_response.body)
|
page_content,
|
||||||
|
{name: 'user1', email: 'user1'})
|
||||||
|
|
||||||
assert_match /#{expected}/, actual
|
get 'utfh1'
|
||||||
|
expected = "<h2 class=\"editable\"><a class=\"anchor\" (href|id)=\"(#)?한글\" (href|id)=\"(#)?한글\"></a>한글</h2>"
|
||||||
|
|
||||||
|
assert_match /#{expected}/, last_response.body
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'rss feed' do
|
test 'rss feed' do
|
||||||
channel_title = <<EOF
|
channel_title = <<EOF
|
||||||
<title>Gollum Wiki Latest Changes</title>
|
<title>Gollum Wiki Latest Changes</title>
|
||||||
@@ -447,6 +445,21 @@ EOF
|
|||||||
Precious::App.set(:wiki_options, {allow_uploads: false, per_page_uploads: false})
|
Precious::App.set(:wiki_options, {allow_uploads: false, per_page_uploads: false})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "upload a file with https referer" do
|
||||||
|
temp_upload_file = Tempfile.new(['https_upload', '.file']) << 'abc'
|
||||||
|
temp_upload_file.close
|
||||||
|
Precious::App.set(:wiki_options, {allow_uploads: true, per_page_uploads: true})
|
||||||
|
post "/gollum/upload_file", {:file => Rack::Test::UploadedFile.new(::File.open(temp_upload_file))}, {'HTTP_REFERER' => 'https://localhost:4567/Home.md', 'HTTP_HOST' => 'localhost:4567'}
|
||||||
|
|
||||||
|
assert_equal 302, last_response.status # redirect is expected
|
||||||
|
@wiki.clear_cache
|
||||||
|
# Find the file in a page-specific subdir (here: Home), based on referer
|
||||||
|
file = @wiki.file("uploads/Home/#{::File.basename(temp_upload_file.path)}")
|
||||||
|
assert_equal 'abc', file.raw_data
|
||||||
|
Precious::App.set(:wiki_options, {allow_uploads: false, per_page_uploads: false})
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
test "guard against uploading an existing file" do
|
test "guard against uploading an existing file" do
|
||||||
temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc'
|
temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc'
|
||||||
temp_upload_file.close
|
temp_upload_file.close
|
||||||
|
|||||||
Reference in New Issue
Block a user