Skip to content

Commit

Permalink
Merge pull request #37 from progit/rework-files
Browse files Browse the repository at this point in the history
Rework files for automatic build of PDF and epub
  • Loading branch information
taichunmin authored Feb 24, 2018
2 parents 2a4da75 + 0f19ead commit 397b39a
Show file tree
Hide file tree
Showing 294 changed files with 901 additions and 608 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ progit.pdfmarks
progit.epub
progit-kf8.epub
progit.mobi
/images/

34 changes: 34 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
language: ruby
sudo: false
git:
depth: false
cache: bundler
before_install:
- wget https://raw.githubusercontent.com/progit/progit2-pub/master/bootstrap.sh
- sh bootstrap.sh
script: bundle exec rake book:build
after_success: bundle exec rake book:tag
deploy:
provider: releases
file_glob: true
file:
- progit*.epub
- progit*.mobi
- progit*.pdf
skip_cleanup: true
on:
tags: true
api-key: $GITHUB_API_TOKEN
branches:
only:
- master
- /^2\.1(\.\d+)+$/

addons:
apt:
packages:
- epubcheck
notifications:
email:
on_success: never
on_failure: always
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[#A-git-in-other-environments]
[appendix]
== Git in Other Environments

Expand All @@ -6,18 +7,18 @@ You can work with local files, connect your repository to others over a network,
But the story doesn't end there; Git is usually used as part of a larger ecosystem, and the terminal isn't always the best way to work with it.
Now we'll take a look at some of the other kinds of environments where Git can be useful, and how other applications (including yours) work alongside Git.

include::sections/guis.asc[]
include::book/A-git-in-other-environments/sections/guis.asc[]

include::sections/visualstudio.asc[]
include::book/A-git-in-other-environments/sections/visualstudio.asc[]

include::sections/eclipse.asc[]
include::book/A-git-in-other-environments/sections/eclipse.asc[]


include::sections/bash.asc[]
include::book/A-git-in-other-environments/sections/bash.asc[]

include::sections/zsh.asc[]
include::book/A-git-in-other-environments/sections/zsh.asc[]

include::sections/powershell.asc[]
include::book/A-git-in-other-environments/sections/powershell.asc[]

=== Summary

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[#B-embedding-git]
[appendix]
== Embedding Git in your Applications

Expand All @@ -6,8 +7,8 @@ Even non-developer applications, such as document editors, could potentially ben

If you need to integrate Git with your application, you have essentially three choices: spawning a shell and using the Git command-line tool; Libgit2; and JGit.

include::sections/command-line.asc[]
include::book/B-embedding-git/sections/command-line.asc[]

include::sections/libgit2.asc[]
include::book/B-embedding-git/sections/libgit2.asc[]

include::sections/jgit.asc[]
include::book/B-embedding-git/sections/jgit.asc[]
237 changes: 119 additions & 118 deletions book/C-git-commands/1-git-commands.asc → C-git-commands.asc

Large diffs are not rendered by default.

13 changes: 9 additions & 4 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
source 'https://rubygems.org'

gem 'rake'
gem 'asciidoctor', '1.5.0'
gem 'asciidoctor', '1.5.6.1'

gem 'json'
gem 'awesome_print'

gem 'asciidoctor-epub3', '1.0.0.alpha.2'
gem 'asciidoctor-pdf', '1.5.0.alpha.5'
gem 'asciidoctor-epub3', :git => 'https://github.com/asciidoctor/asciidoctor-epub3'
gem 'asciidoctor-pdf', '1.5.0.alpha.16'
gem 'asciidoctor-pdf-cjk', '~> 0.1.3'
gem 'asciidoctor-pdf-cjk-kai_gen_gothic', '~> 0.1.1'

gem 'coderay'
gem 'pygments.rb'
gem 'thread_safe'
gem 'epubcheck'
gem 'epubcheck-ruby'
gem 'kindlegen'

gem 'octokit'
gem 'github_changelog_generator', github: 'Furtif/github-changelog-generator'
3 changes: 2 additions & 1 deletion README.asc
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
image::https://travis-ci.org/progit/progit2-zh-tw.svg?branch=master[]
= Pro Git, 繁體中文第二版

歡迎您來到 Pro Git 繁體中文第二版
Expand Down Expand Up @@ -32,7 +33,7 @@

----
$ bundle install
$ bundle exec rake book:build
$ TRAVIS_REPO_SLUG="progit/progit2-zh-tw" bundle exec rake book:build
Converting to HTML...
-- HTML output at progit.html
Converting to EPub...
Expand Down
242 changes: 226 additions & 16 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,30 +1,240 @@
namespace :book do
desc 'prepare build'
task :prebuild do
Dir.mkdir 'images' unless Dir.exists? 'images'
Dir.glob("book/*/images/*").each do |image|
FileUtils.copy(image, "images/" + File.basename(image))
end
# coding: utf-8
require 'octokit'
require 'github_changelog_generator'

def exec_or_raise(command)
puts `#{command}`
if (! $?.success?)
raise "'#{command}' failed"
end
end

module GitHubChangelogGenerator

#OPTIONS = %w[ user project token date_format output
# bug_prefix enhancement_prefix issue_prefix
# header merge_prefix issues
# add_issues_wo_labels add_pr_wo_labels
# pulls filter_issues_by_milestone author
# unreleased_only unreleased unreleased_label
# compare_link include_labels exclude_labels
# bug_labels enhancement_labels
# between_tags exclude_tags exclude_tags_regex since_tag max_issues
# github_site github_endpoint simple_list
# future_release release_branch verbose release_url
# base configure_sections add_sections]

def get_log(&task_block)
options = Parser.default_options
yield(options) if task_block

options[:user],options[:project] = ENV['TRAVIS_REPO_SLUG'].split('/')
options[:token] = ENV['GITHUB_API_TOKEN']
options[:unreleased] = false

generator = Generator.new options
generator.compound_changelog
end

module_function :get_log
end

namespace :book do
desc 'build basic book formats'
task :build => :prebuild do
task :build do

puts "Generating contributors list"
exec_or_raise("git shortlog -s --all| grep -v -E '(Straub|Chacon)' | cut -f 2- | column -c 120 > book/contributors.txt")

# detect if the deployment is using glob
travis = File.read(".travis.yml")
version_string = ENV['TRAVIS_TAG'] || '0'
if travis.match(/file_glob/)
progit_v = "progit_v#{version_string}"
else
progit_v = "progit"
end
text = File.read('progit.asc')
new_contents = text.gsub("$$VERSION$$", version_string).gsub("$$DATE$$", Time.now.strftime("%Y-%m-%d"))
File.open("#{progit_v}.asc", "w") {|file| file.puts new_contents }

puts "Converting to HTML..."
`bundle exec asciidoctor progit.asc`
puts " -- HTML output at progit.html"
exec_or_raise("bundle exec asciidoctor #{progit_v}.asc")
puts " -- HTML output at #{progit_v}.html"

puts "Converting to EPub..."
`bundle exec asciidoctor-epub3 progit.asc`
puts " -- Epub output at progit.epub"
exec_or_raise("bundle exec asciidoctor-epub3 #{progit_v}.asc")
puts " -- Epub output at #{progit_v}.epub"

exec_or_raise("epubcheck #{progit_v}.epub")

puts "Converting to Mobi (kf8)..."
`bundle exec asciidoctor-epub3 -a ebook-format=kf8 progit.asc`
puts " -- Mobi output at progit.mobi"
exec_or_raise("bundle exec asciidoctor-epub3 -a ebook-format=kf8 #{progit_v}.asc")
# remove the fake epub that would shadow the really one
exec_or_raise("rm progit*kf8.epub")
puts " -- Mobi output at #{progit_v}.mobi"

repo = ENV['TRAVIS_REPO_SLUG']
puts "Converting to PDF... (this one takes a while)"
`bundle exec asciidoctor-pdf progit.asc 2>/dev/null`
puts " -- PDF output at progit.pdf"
if (repo == "progit/progit2-zh")
exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install")
exec_or_raise("bundle exec asciidoctor-pdf -r asciidoctor-pdf-cjk -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicCN #{progit_v}.asc")
elsif (repo == "progit/progit2-ja")
exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install")
exec_or_raise("bundle exec asciidoctor-pdf -r asciidoctor-pdf-cjk -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicJP #{progit_v}.asc")
elsif (repo == "progit/progit2-zh-tw")
exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install")
exec_or_raise("bundle exec asciidoctor-pdf -r asciidoctor-pdf-cjk -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicTW #{progit_v}.asc")
else
exec_or_raise("bundle exec asciidoctor-pdf #{progit_v}.asc 2>/dev/null")
end
puts " -- PDF output at #{progit_v}.pdf"
end

desc 'tag the repo with the latest version'
task :tag do
api_token = ENV['GITHUB_API_TOKEN']
if ((api_token) && (ENV['TRAVIS_PULL_REQUEST'] == 'false'))
repo = ENV['TRAVIS_REPO_SLUG']
@octokit = Octokit::Client.new(:access_token => api_token)
begin
last_version=@octokit.latest_release(repo).tag_name
rescue
last_version="2.1.-1"
end
new_patchlevel= last_version.split('.')[-1].to_i + 1
new_version="2.1.#{new_patchlevel}"
if (ENV['TRAVIS_BRANCH']=='master')
obj = @octokit.create_tag(repo, new_version, "Version " + new_version,
ENV['TRAVIS_COMMIT'], 'commit',
'Automatic build', 'automatic@no-domain.org',
Time.now.utc.iso8601)
@octokit.create_ref(repo, "tags/#{new_version}", obj.sha)
p "Created tag #{last_version}"
elsif (ENV['TRAVIS_TAG'])
version = ENV['TRAVIS_TAG']
changelog = GitHubChangelogGenerator.get_log do |config|
config[:since_tag] = last_version
end
credit_line = "*This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
changelog.gsub!(credit_line, "")
@octokit.create_release(repo, new_version, {:name => "v#{new_version}", :body => changelog})
p "Created release #{new_version}"
else
p 'This only runs on a commit to master'
end
else
p 'No interaction with GitHub'
end
end

desc 'convert book to asciidoctor compatibility'
task:convert do
`cp -aR ../progit2/images .`
`sed -i -e 's!/images/!!' .gitignore`
`git add images`
`git rm -r book/*/images`

chapters = [
["01", "introduction" ],
["02", "git-basics" ],
["03", "git-branching" ],
["04", "git-server" ],
["05", "distributed-git" ],
["06", "github" ],
["07", "git-tools" ],
["08", "customizing-git" ],
["09", "git-and-other-scms" ],
["10", "git-internals" ],
["A", "git-in-other-environments" ],
["B", "embedding-git" ],
["C", "git-commands" ]
]

crossrefs = {}
chapters.each { | num, title |
if num =~ /[ABC]/
chap = "#{num}-#{title}"
else
chap = "ch#{num}-#{title}"
end
Dir[File.join ["book","#{num}-#{title}" , "sections","*.asc"]].map { |filename|
File.read(filename).scan(/\[\[(.*?)\]\]/)
}.flatten.each { |ref|
crossrefs[ref] = "#{chap}"
}
}

headrefs = {}
chapters.each { | num, title |
if num =~ /[ABC]/
chap = "#{num}-#{title}"
else
chap = "ch#{num}-#{title}"
end
Dir[File.join ["book","#{num}-#{title}", "*.asc"]].map { |filename|
File.read(filename).scan(/\[\[(.*?)\]\]/)
}.flatten.each { |ref|
headrefs[ref] = "#{chap}"
}
}

# transform all internal cross refs
chapters.each { | num, title |
if num =~ /[ABC]/
chap = "#{num}-#{title}"
else
chap = "ch#{num}-#{title}"
end
files = Dir[File.join ["book","#{num}-#{title}" , "sections","*.asc"]] +
Dir[File.join ["book","#{num}-#{title}" ,"1-*.asc"]]
p files
files.each { |filename|
content = File.read(filename)
new_contents = content.gsub(/\[\[(.*?)\]\]/, '[[r\1]]').gsub(
"&rarr;", "→").gsub(/<<(.*?)>>/) { |match|
ch = crossrefs[$1]
h = headrefs[$1]
# p " #{match} -> #{ch}, #{h}"
if ch
# if local do not add the file
if ch==chap
"<<r#{$1}>>"
else
"<<#{ch}#r#{$1}>>"
end
elsif h
if h==chap
"<<#{chap}>>"
else
"<<#{h}##{h}>>"
end
end
}
File.open(filename, "w") {|file| file.puts new_contents }
}
}

chapters.each { | num, title |
if num =~ /[ABC]/
chap = "#{num}-#{title}"
else
chap = "ch#{num}-#{title}"
end
Dir[File.join ["book","#{num}-#{title}" ,"1*.asc"]].map { |filename|
content = File.read (filename)
new_contents = content.gsub(/include::(.*?)asc/) {|match|
"include::book/#{num}-#{title}/#{$1}asc"}
`git rm -f #{filename}`
File.open("#{chap}.asc", "w") {|file|
file.puts "[##{chap}]\n"
file.puts new_contents }
`git add "#{chap}.asc"`
}
}
end
end



task :default => "book:build"
Loading

0 comments on commit 397b39a

Please sign in to comment.