diff --git a/README.asc b/README.asc index 98b568465..53ed6f75f 100644 --- a/README.asc +++ b/README.asc @@ -29,6 +29,27 @@ Converting to PDF... -- PDF output at progit.pdf ---- +You can generate just one of the supported formats (HTML, EPUB, or PDF). +Use one of the following commands: + +To generate the HTML book: + +---- +$ bundle exec rake book:build_html +---- + +To generate the EPUB book: + +---- +$ bundle exec rake book:build_epub +---- + +To generate the PDF book: + +---- +$ bundle exec rake book:build_pdf +---- + == Signaling an Issue Before signaling an issue, please check that there isn't already a similar one in the bug tracking system. diff --git a/Rakefile b/Rakefile index bfd5f68be..3be04e0be 100644 --- a/Rakefile +++ b/Rakefile @@ -6,31 +6,84 @@ namespace :book do end end - desc 'build basic book formats' - task :build do + # Variables referenced for build + version_string = ENV['TRAVIS_TAG'] || `git describe --tags`.chomp + if version_string.empty? + version_string = '0' + end + date_string = Time.now.strftime('%Y-%m-%d') + params = "--attribute revnumber='#{version_string}' --attribute revdate='#{date_string}'" + header_hash = `git rev-parse --short HEAD`.strip - begin - version_string = ENV['TRAVIS_TAG'] || `git describe --tags`.chomp - if version_string.empty? - version_string = '0' + # Check contributors list + # This checks commit hash stored in the header of list against current HEAD + def check_contrib + if File.exist?('book/contributors.txt') + current_head_hash = `git rev-parse --short HEAD`.strip + header = `head -n 1 book/contributors.txt`.strip + # Match regex, then coerce resulting array to string by join + header_hash = header.scan(/[a-f0-9]{7,}/).join + + if header_hash == current_head_hash + puts "Hash on header of contributors list (#{header_hash}) matches the current HEAD (#{current_head_hash})" + else + puts "Hash on header of contributors list (#{header_hash}) does not match the current HEAD (#{current_head_hash}), refreshing" + `rm book/contributors.txt` + # Reenable and invoke task again + Rake::Task['book/contributors.txt'].reenable + Rake::Task['book/contributors.txt'].invoke end - date_string = Time.now.strftime("%Y-%m-%d") - params = "--attribute revnumber='#{version_string}' --attribute revdate='#{date_string}'" - puts "Generating contributors list" - `git shortlog -s | grep -v -E "(Straub|Chacon|dependabot)" | cut -f 2- | column -c 120 > book/contributors.txt` + end + end + + desc 'build basic book formats' + task :build => [:build_html, :build_epub, :build_pdf] do + begin + # Run check + Rake::Task['book:check'].invoke - puts "Converting to HTML..." + # Rescue to ignore checking errors + rescue => e + puts e.message + puts 'Error when checking books (ignored)' + end + end + + desc 'build basic book formats (for ci)' + task :ci => [:build_html, :build_epub, :build_pdf] do + # Run check, but don't ignore any errors + Rake::Task['book:check'].invoke + end + + desc 'generate contributors list' + file 'book/contributors.txt' do + puts 'Generating contributors list' + `echo "Contributors as of #{header_hash}:\n" > book/contributors.txt` + `git shortlog -s | grep -v -E "(Straub|Chacon|dependabot)" | cut -f 2- | column -c 120 >> book/contributors.txt` + end + + desc 'build HTML format' + task :build_html => 'book/contributors.txt' do + check_contrib() + + puts 'Converting to HTML...' `bundle exec asciidoctor #{params} -a data-uri progit.asc` - puts " -- HTML output at progit.html" + puts ' -- HTML output at progit.html' - exec_or_raise('htmlproofer --check-html progit.html') + end + + desc 'build Epub format' + task :build_epub => 'book/contributors.txt' do + check_contrib() - puts "Converting to EPub..." + puts 'Converting to EPub...' `bundle exec asciidoctor-epub3 #{params} progit.asc` - puts " -- Epub output at progit.epub" + puts ' -- Epub output at progit.epub' - exec_or_raise('epubcheck progit.epub') + end + desc 'build Mobi format' + task :build_mobi => 'book/contributors.txt' do # Commented out the .mobi file creation because the kindlegen dependency is not available. # For more information on this see: #1496. # This is a (hopefully) temporary fix until upstream asciidoctor-epub3 is fixed and we can offer .mobi files again. @@ -39,12 +92,47 @@ namespace :book do # `bundle exec asciidoctor-epub3 #{params} -a ebook-format=kf8 progit.asc` # puts " -- Mobi output at progit.mobi" - puts "Converting to PDF... (this one takes a while)" + # FIXME: If asciidoctor-epub3 supports Mobi again, uncomment these lines below + puts "Converting to Mobi isn't supported yet." + puts "For more information see issue #1496 at https://github.com/progit/progit2/issues/1496." + exit(127) + end + + desc 'build PDF format' + task :build_pdf => 'book/contributors.txt' do + check_contrib() + + puts 'Converting to PDF... (this one takes a while)' `bundle exec asciidoctor-pdf #{params} progit.asc 2>/dev/null` - puts " -- PDF output at progit.pdf" + puts ' -- PDF output at progit.pdf' + end + + desc 'Check generated books' + task :check => [:build_html, :build_epub] do + puts 'Checking generated books' + exec_or_raise('htmlproofer --check-html progit.html') + exec_or_raise('epubcheck progit.epub') + end + + desc 'Clean all generated files' + task :clean do + begin + puts 'Removing generated files' + + FileList['book/contributors.txt', 'progit.html', 'progit.epub', 'progit.pdf'].each do |file| + rm file + + # Rescue if file not found + rescue Errno::ENOENT => e + begin + puts e.message + puts 'Error removing files (ignored)' + end + end end end + end task :default => "book:build"