From 5173b9704a44e31def01290c9efaa91e4444fc6a Mon Sep 17 00:00:00 2001 From: Matthew Draper Date: Thu, 3 Dec 2015 08:45:06 +1030 Subject: [PATCH] Maintain a versions.json file tracking the latest per series Also keep a version.js ("static JSONP"), for simple cross-domain access. --- lib/docs_generator.rb | 29 ++++++++++++++++++++++++++++- lib/git_manager.rb | 6 ++++++ test/test_docs_generator.rb | 25 +++++++++++++++++++++++++ test/test_git_manager.rb | 18 ++++++++++++++++++ 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/lib/docs_generator.rb b/lib/docs_generator.rb index 78716c3..08dbd47 100644 --- a/lib/docs_generator.rb +++ b/lib/docs_generator.rb @@ -1,5 +1,6 @@ require 'set' require 'logging' +require 'json' require 'docs_compressor' require 'git_manager' @@ -86,7 +87,10 @@ def generate_stable_docs end end - adjust_symlinks_for_series if new_stable_docs + if new_stable_docs + adjust_symlinks_for_series + adjust_json_for_series + end end def generate_stable_docs_for?(tag) @@ -163,6 +167,29 @@ def adjust_symlinks_for_series end end + def adjust_json_for_series + entries = series.map { |series, tag| + next if series == STABLE + { series: series.delete('v'), version: tag.delete('v'), date: git_manager.tag_date(tag) } + }.compact.sort { |a, b| compare_tags(b[:version], a[:version]) } + + json_content = JSON.dump(entries) + js_content = 'currentRailsVersions(' + json_content + ');' + + [API, GUIDES].each do |_| + Dir.chdir(_) do + ensure_file 'versions.json', json_content + ensure_file 'versions.js', js_content + end + end + end + + def ensure_file(filename, content) + unless File.exist?(filename) && File.read(filename) == content + File.open(filename, 'w') { |f| f.write(content) } + end + end + def series sds = stable_directories diff --git a/lib/git_manager.rb b/lib/git_manager.rb index 8471cd2..7de92d5 100644 --- a/lib/git_manager.rb +++ b/lib/git_manager.rb @@ -51,6 +51,12 @@ def release_tags end end + def tag_date(tag) + Dir.chdir("#{basedir}/master") do + `git for-each-ref --format="%(taggerdate:iso8601)" refs/tags/#{tag}`.chomp + end + end + def short_sha1 sha1[0, 7] end diff --git a/test/test_docs_generator.rb b/test/test_docs_generator.rb index 8c51dd0..664ac63 100644 --- a/test/test_docs_generator.rb +++ b/test/test_docs_generator.rb @@ -32,6 +32,31 @@ def test_series end end + def test_version_json + stable_directories = %w(v3.1.2 v3.1.0 v4.2.1 v4.2.7 v5.0.0) + expected = '[{"series":"5.0","version":"5.0.0","date":"2000-01-01 01:12:23 +0100"},'\ + '{"series":"4.2","version":"4.2.7","date":"2000-01-01 01:12:23 +0100"},'\ + '{"series":"3.1","version":"3.1.2","date":"2000-01-01 01:12:23 +0100"}]' + + in_tmpdir do + mkdir 'basedir' + mkdir 'api' + mkdir 'guides' + + Dir.chdir('basedir') do + stable_directories.each {|sd| mkdir sd} + end + + git_manager = GitManager.new('basedir') + + git_manager.stub(:tag_date, '2000-01-01 01:12:23 +0100') do + DocsGenerator.new('basedir', git_manager).adjust_json_for_series + end + + assert_equal expected, File.read('api/versions.json') + end + end + def test_stable_directories stable_directories = %w(v4.0.1 v4.1.7 v4.11.2 v3.1.2) diff --git a/test/test_git_manager.rb b/test/test_git_manager.rb index 88b0ac2..618e66c 100644 --- a/test/test_git_manager.rb +++ b/test/test_git_manager.rb @@ -52,6 +52,24 @@ def test_release_tags end end + def test_tag_date + in_tmpdir do + mkdir_p 'basedir/master' + + chdir 'basedir/master' do + create_repository + %w(0.9.4.1 2.3.9.pre 3.0.0_RC2 3.2.8.rc1 3.2.14 v4.0.0.beta1 4.0.1).each_with_index do |version, idx| + system "GIT_COMMITTER_DATE='2000-01-#{10 + idx} 01:23:45 -0200' git tag -a -m 'Release' v#{version}" + end + end + + git_manager = GitManager.new('basedir') + assert_equal '2000-01-10 01:23:45 -0200', git_manager.tag_date('v0.9.4.1') + assert_equal '2000-01-14 01:23:45 -0200', git_manager.tag_date('v3.2.14') + assert_equal '2000-01-16 01:23:45 -0200', git_manager.tag_date('v4.0.1') + end + end + def test_sha1_and_short_sha1 in_tmpdir do mkdir_p 'basedir/master'