Skip to content

Commit 4c1352b

Browse files
committed
Merge branch 'continuous_compilation'
2 parents e41ca96 + 8467fe9 commit 4c1352b

File tree

9 files changed

+254
-31
lines changed

9 files changed

+254
-31
lines changed

.travis.yml

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
11
language: ruby
2+
sudo: false
23
git:
34
depth: false
45
cache: bundler
56
before_install:
6-
- bundle install
7-
after_success:
8-
- script/tag_on_master
7+
- wget https://raw.githubusercontent.com/progit/progit2-pub/master/bootstrap.sh
8+
- sh bootstrap.sh
99
script: bundle exec rake book:build
10-
env:
11-
secure: "O+YCTDgLfCYAJjjOv2sApDRV5NJe6pkhiYIkORFuf2flO8HE72fEtDRpSWh1vulnIH6AjRK2jH7C8qA3MVbUO8D0io+Ha+vnbMXIp1JPCptcJNEkJrW13VTR66SWOzsgLp3mCrIC+YdE2JoYWGcnDsRMQwdnrWnxBzSOd22ZKzU="
12-
13-
before_deploy: bundle install && bundle exec rake book:build
10+
after_success: bundle exec rake book:tag
1411
deploy:
1512
provider: releases
13+
file_glob: true
1614
file:
17-
- progit.epub
18-
- progit.mobi
19-
- progit.pdf
15+
- progit*.epub
16+
- progit*.mobi
17+
- progit*.pdf
2018
skip_cleanup: true
2119
on:
2220
tags: true
23-
api-key:
24-
secure: "l3XdupX6dT48IoTieJXrd7Yx8+KhiR2QYrNrDzT6RKxA7UyXGSP/axsVerg7OjKfIHWZgDJRVzcc2RswE+Xjw9sOY8r2h2q9uCwj8G0EqtFbtgGK0La5LB0euh0tNJN8GLFj1OdSZGY7dWWK88GXeHCua2WSify0V79R4ClIM+s="
21+
api-key: $GITHUB_API_TOKEN
2522
branches:
2623
only:
2724
- master
2825
- /^2\.1(\.\d+)+$/
2926

27+
addons:
28+
apt:
29+
packages:
30+
- epubcheck
3031
notifications:
3132
email:
3233
on_success: never

Gemfile

+5
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@ gem 'awesome_print'
88

99
gem 'asciidoctor-epub3', :git => 'https://github.com/asciidoctor/asciidoctor-epub3'
1010
gem 'asciidoctor-pdf', '1.5.0.alpha.16'
11+
gem 'asciidoctor-pdf-cjk', '~> 0.1.3'
12+
gem 'asciidoctor-pdf-cjk-kai_gen_gothic', '~> 0.1.1'
1113

1214
gem 'coderay'
1315
gem 'pygments.rb'
1416
gem 'thread_safe'
1517
gem 'epubcheck'
1618
gem 'kindlegen'
19+
20+
gem 'octokit'
21+
gem 'github_changelog_generator', github: 'Furtif/github-changelog-generator'

README.asc

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
image::https://travis-ci.org/progit/progit2-bg.svg?branch=master[]
12
= Pro Git, Второ издание
23

34
Това е второто издание на книгата Pro Git.

Rakefile

+226-9
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,243 @@
1+
# coding: utf-8
2+
require 'octokit'
3+
require 'github_changelog_generator'
4+
5+
def exec_or_raise(command)
6+
puts `#{command}`
7+
if (! $?.success?)
8+
raise "'#{command}' failed"
9+
end
10+
end
11+
12+
module GitHubChangelogGenerator
13+
14+
#OPTIONS = %w[ user project token date_format output
15+
# bug_prefix enhancement_prefix issue_prefix
16+
# header merge_prefix issues
17+
# add_issues_wo_labels add_pr_wo_labels
18+
# pulls filter_issues_by_milestone author
19+
# unreleased_only unreleased unreleased_label
20+
# compare_link include_labels exclude_labels
21+
# bug_labels enhancement_labels
22+
# between_tags exclude_tags exclude_tags_regex since_tag max_issues
23+
# github_site github_endpoint simple_list
24+
# future_release release_branch verbose release_url
25+
# base configure_sections add_sections]
26+
27+
def get_log(&task_block)
28+
options = Parser.default_options
29+
yield(options) if task_block
30+
31+
options[:user],options[:project] = ENV['TRAVIS_REPO_SLUG'].split('/')
32+
options[:token] = ENV['GITHUB_API_TOKEN']
33+
options[:unreleased] = false
34+
35+
generator = Generator.new options
36+
generator.compound_changelog
37+
end
38+
39+
module_function :get_log
40+
end
41+
142
namespace :book do
243
desc 'build basic book formats'
344
task :build do
445

546
puts "Generating contributors list"
6-
`git shortlog -s --all| grep -v -E "(Straub|Chacon)" | cut -f 2- | column -c 120 > book/contributors.txt`
47+
exec_or_raise("git shortlog -s --all| grep -v -E '(Straub|Chacon)' | cut -f 2- | column -c 120 > book/contributors.txt")
48+
49+
# detect if the deployment is using glob
50+
travis = File.read(".travis.yml")
51+
version_string = ENV['TRAVIS_TAG'] || '0'
52+
if travis.match(/file_glob/)
53+
progit_v = "progit_v#{version_string}"
54+
else
55+
progit_v = "progit"
56+
end
57+
text = File.read('progit.asc')
58+
new_contents = text.gsub("$$VERSION$$", version_string).gsub("$$DATE$$", Time.now.strftime("%Y-%m-%d"))
59+
File.open("#{progit_v}.asc", "w") {|file| file.puts new_contents }
760

861
puts "Converting to HTML..."
9-
`bundle exec asciidoctor progit.asc`
10-
puts " -- HTML output at progit.html"
62+
exec_or_raise("bundle exec asciidoctor #{progit_v}.asc")
63+
puts " -- HTML output at #{progit_v}.html"
1164

1265
puts "Converting to EPub..."
13-
`bundle exec asciidoctor-epub3 progit.asc`
14-
puts " -- Epub output at progit.epub"
66+
exec_or_raise("bundle exec asciidoctor-epub3 #{progit_v}.asc")
67+
puts " -- Epub output at #{progit_v}.epub"
68+
69+
exec_or_raise("epubcheck #{progit_v}.epub")
1570

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

77+
repo = ENV['TRAVIS_REPO_SLUG']
2078
puts "Converting to PDF... (this one takes a while)"
21-
`bundle exec asciidoctor-pdf progit.asc 2>/dev/null`
22-
puts " -- PDF output at progit.pdf"
79+
if (repo == "progit/progit2-zh")
80+
exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install")
81+
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")
82+
elsif (repo == "progit/progit2-ja")
83+
exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install")
84+
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")
85+
elsif (repo == "progit/progit2-zh-tw")
86+
exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install")
87+
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")
88+
else
89+
exec_or_raise("bundle exec asciidoctor-pdf #{progit_v}.asc 2>/dev/null")
90+
end
91+
puts " -- PDF output at #{progit_v}.pdf"
92+
end
93+
94+
desc 'tag the repo with the latest version'
95+
task :tag do
96+
api_token = ENV['GITHUB_API_TOKEN']
97+
if ((api_token) && (ENV['TRAVIS_PULL_REQUEST'] == 'false'))
98+
repo = ENV['TRAVIS_REPO_SLUG']
99+
@octokit = Octokit::Client.new(:access_token => api_token)
100+
begin
101+
last_version=@octokit.latest_release(repo).tag_name
102+
rescue
103+
last_version="2.1.-1"
104+
end
105+
new_patchlevel= last_version.split('.')[-1].to_i + 1
106+
new_version="2.1.#{new_patchlevel}"
107+
if (ENV['TRAVIS_BRANCH']=='master')
108+
obj = @octokit.create_tag(repo, new_version, "Version " + new_version,
109+
ENV['TRAVIS_COMMIT'], 'commit',
110+
'Automatic build', '[email protected]',
111+
Time.now.utc.iso8601)
112+
@octokit.create_ref(repo, "tags/#{new_version}", obj.sha)
113+
p "Created tag #{last_version}"
114+
elsif (ENV['TRAVIS_TAG'])
115+
version = ENV['TRAVIS_TAG']
116+
changelog = GitHubChangelogGenerator.get_log do |config|
117+
config[:since_tag] = last_version
118+
end
119+
credit_line = "*This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
120+
changelog.gsub!(credit_line, "")
121+
@octokit.create_release(repo, new_version, {:name => "v#{new_version}", :body => changelog})
122+
p "Created release #{new_version}"
123+
else
124+
p 'This only runs on a commit to master'
125+
end
126+
else
127+
p 'No interaction with GitHub'
128+
end
129+
end
130+
131+
desc 'convert book to asciidoctor compatibility'
132+
task:convert do
133+
`cp -aR ../progit2/images .`
134+
`sed -i -e 's!/images/!!' .gitignore`
135+
`git add images`
136+
`git rm -r book/*/images`
137+
138+
chapters = [
139+
["01", "introduction" ],
140+
["02", "git-basics" ],
141+
["03", "git-branching" ],
142+
["04", "git-server" ],
143+
["05", "distributed-git" ],
144+
["06", "github" ],
145+
["07", "git-tools" ],
146+
["08", "customizing-git" ],
147+
["09", "git-and-other-scms" ],
148+
["10", "git-internals" ],
149+
["A", "git-in-other-environments" ],
150+
["B", "embedding-git" ],
151+
["C", "git-commands" ]
152+
]
153+
154+
crossrefs = {}
155+
chapters.each { | num, title |
156+
if num =~ /[ABC]/
157+
chap = "#{num}-#{title}"
158+
else
159+
chap = "ch#{num}-#{title}"
160+
end
161+
Dir[File.join ["book","#{num}-#{title}" , "sections","*.asc"]].map { |filename|
162+
File.read(filename).scan(/\[\[(.*?)\]\]/)
163+
}.flatten.each { |ref|
164+
crossrefs[ref] = "#{chap}"
165+
}
166+
}
167+
168+
headrefs = {}
169+
chapters.each { | num, title |
170+
if num =~ /[ABC]/
171+
chap = "#{num}-#{title}"
172+
else
173+
chap = "ch#{num}-#{title}"
174+
end
175+
Dir[File.join ["book","#{num}-#{title}", "*.asc"]].map { |filename|
176+
File.read(filename).scan(/\[\[([_a-z0-9]*?)\]\]/)
177+
}.flatten.each { |ref|
178+
headrefs[ref] = "#{chap}"
179+
}
180+
}
181+
182+
# transform all internal cross refs
183+
chapters.each { | num, title |
184+
if num =~ /[ABC]/
185+
chap = "#{num}-#{title}"
186+
else
187+
chap = "ch#{num}-#{title}"
188+
end
189+
files = Dir[File.join ["book","#{num}-#{title}" , "sections","*.asc"]] +
190+
Dir[File.join ["book","#{num}-#{title}" ,"1-*.asc"]]
191+
p files
192+
files.each { |filename|
193+
content = File.read(filename)
194+
new_contents = content.gsub(/\[\[([_a-z0-9]*?)\]\]/, '[[r\1]]').gsub(
195+
"&rarr;", "→").gsub(/<<([_a-z0-9]*?)>>/) { |match|
196+
ch = crossrefs[$1]
197+
h = headrefs[$1]
198+
# p " #{match} -> #{ch}, #{h}"
199+
if ch
200+
# if local do not add the file
201+
if ch==chap
202+
"<<r#{$1}>>"
203+
else
204+
"<<#{ch}#r#{$1}>>"
205+
end
206+
elsif h
207+
if h==chap
208+
"<<#{chap}>>"
209+
else
210+
"<<#{h}##{h}>>"
211+
end
212+
else
213+
p "could not match xref #{$1}"
214+
"<<#{$1}>>"
215+
end
216+
}
217+
File.open(filename, "w") {|file| file.puts new_contents }
218+
}
219+
}
220+
221+
chapters.each { | num, title |
222+
if num =~ /[ABC]/
223+
chap = "#{num}-#{title}"
224+
else
225+
chap = "ch#{num}-#{title}"
226+
end
227+
Dir[File.join ["book","#{num}-#{title}" ,"1*.asc"]].map { |filename|
228+
content = File.read (filename)
229+
new_contents = content.gsub(/include::(.*?)asc/) {|match|
230+
"include::book/#{num}-#{title}/#{$1}asc"}
231+
`git rm -f #{filename}`
232+
File.open("#{chap}.asc", "w") {|file|
233+
file.puts "[##{chap}]\n"
234+
file.puts new_contents }
235+
`git add "#{chap}.asc"`
236+
}
237+
}
23238
end
24239
end
25240

241+
242+
26243
task :default => "book:build"

book/01-introduction/sections/basics.asc

-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ Staging областта представлява файл, който се па
9797
Един типичен Git работен процес изглежда по подобен начин:
9898

9999
1. Вие променяте файлове в работната област.
100-
2. Вие индексирате(stage-вате) файловете, добавяйки snapshot-и от тях към staging областта.
101100
2. Вие селективно индексирате (stage-вате) само промените, които искате да са част от следващия ви къмит.
102101
3. Вие правите къмит, при което файловете се вземат така както изглеждат в staging областта и този snapshot се записва за постоянно във вашата Git директория.
103102

book/02-git-basics/sections/undoing.asc

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ Changes to be committed:
132132
Важно е да се помни, че `git checkout -- <file>` е опасна команда.
133133
Всички промени, които сте правили по този файл ще изчезнат необратимо -- Git просто копира друг файл върху него.
134134
Никога не ползвайте тази команда, освен ако не сте абсолютно сигурни, че не желаете промените във файла.
135-
135+
=====
136136

137137
Ако желаете да запазите промените си по файла, но все още държите да пазите този файл настрани от проекта към дадения момент, има по-добри начини да го направите, ще ги разгледаме в материала за скриване (stashing) и клонове код (branching).<<ch03-git-branching#ch03-git-branching>>
138138

book/06-github/sections/2-contributing.asc

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
[NOTE]
1212
====
1313
В исторически план, понятието ``fork'' се е възприемало и като негативно действие, при което злонамерен потребител взема проект с отворен код и го насочва в друга посока създавайки понякога конкурентен проект и разделяйки участващите в проекта потребители.
14-
В GitHub, ``fork'' е просто същия проект преместен във вашия namespace, който можете да променяте, начин да дадете вашия принос към оригиналния проект в по-достъпен стил.
14+
В GitHub, ``fork'' е просто същия проект преместен във вашия namespace, който можете да променяте, начин да дадете вашия принос към оригиналния проект в по-достъпен стил.
1515
====
1616

1717
По този начин, собствениците на проектите са освободени от грижата да дават права за писане на потребителите-сътрудници.
@@ -25,7 +25,7 @@ image::images/forkbutton.png[Бутонът ``Fork''.]
2525

2626
След няколко секунди, ще бъдете прехвърлени към новата страница на проекта, където вече ще имате права за писане.
2727

28-
28+
[[_github_flow]]
2929
==== Работния процес в GitHub
3030

3131
(((GitHub, Flow)))

book/06-github/sections/3-maintaining.asc

+5-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ image::images/newrepoform.png[Формата ``new repository''.]
2424
Засега просто натиснете бутона ``Create Repository'' и вече разполагате с ново хранилище в GitHub, с име `<user>/<project_name>`.
2525

2626
Понеже все още нямате качен никакъв код, GitHub ще ви предложи инструкции как да създадете ново Git хранилище или да се свържете със съществуващ Git проект.
27-
Няма да навлизаме в детайли за това, ако имате нужда от припомняне, погледнете <<_git_basics_chapter#_git_basics_chapter>>.
27+
Няма да навлизаме в детайли за това, ако имате нужда от припомняне, погледнете <<ch02-git-basics-chapter#ch02-git-basics-chapter>>.
2828

2929
Сега проектът ви се хоства в GitHub и можете да изпратите URL-а на всеки, с който желаете да го споделите.
3030
Всеки GitHub проект е достъпен през HTTPS като `https://github.com/<user>/<project_name>`, а също и през SSH като `[email protected]:<user>/<project_name>`.
@@ -80,7 +80,7 @@ image::images/maint-01-email.png[Email известяване за нов Pull R
8080
Предоставят ви се и няколко URL-а, които можете да ползвате от командния ред.
8181

8282
Ако виждате ред `git pull <url> patch-1`, това е прост начин да слеете отдалечен клон без да трябва да добавяте remote.
83-
Видяхме това в <<_distributed_git#_checking_out_remotes>>.
83+
Видяхме това в <<ch05-distributed-git#_checking_out_remotes>>.
8484
Ако искате, можете да създадете и да превключите в topic клон и след това да изпълните тази команда за да слеете Pull Request-а.
8585

8686
Другите интересни URL-и са `.diff` и `.patch` URL-ите, които както можете да предположите, осигуряват unified diff и patch версии на Pull Request-а.
@@ -93,7 +93,7 @@ $ curl http://github.com/tonychacon/fade/pull/1.patch | git am
9393

9494
===== Съвместна работа по Pull Request
9595

96-
Както видяхме в <<_github#_github_flow>>, сега можете да проведете дискусия с човека, който е пуснал Pull Request-а.
96+
Както видяхме в <<ch06-github#_github_flow>>, сега можете да проведете дискусия с човека, който е пуснал Pull Request-а.
9797
Можете да коментирате специфични редове код, да коментирате цели къмити или целия Pull Request, използвайки GitHub Flavored Markdown където искате.
9898

9999
Всеки път, когато някой друг коментира Pull Request-а, ще продължавате да получавате имейл нотификации, така че да сте наясно какво се случва.
@@ -120,12 +120,12 @@ image::images/maint-02-merge.png[Merge бутон]
120120
===== Pull Request референции
121121

122122
Ако си имате работа с *много* Pull Request-и и не искате да добавяте цял куп remotes или да правите еднократни изтегляния всеки път, GitHub ви предоставя един хитър трик за улеснение в работата.
123-
Това е материал за напреднали и ще видим детайлите за него в <<_git_internals#_refspec>>, но може да е много полезен.
123+
Това е материал за напреднали и ще видим детайлите за него в <<ch10-git-internals#_refspec>>, но може да е много полезен.
124124

125125
GitHub в действителност представя Pull Request клоновете за дадено хранилище като вид псевдо-клонове на сървъра.
126126
По подразбиране, вие не ги получавате при клониране, но те са там по един маскиран начин и можете да получите достъп до тях лесно.
127127

128-
За да демонстрираме това, ще използваме low-level команда (често наричана ``plumbing'' команда, за която ще научим повече в <<_git_internals#_plumbing_porcelain>>) наречена `ls-remote`.
128+
За да демонстрираме това, ще използваме low-level команда (често наричана ``plumbing'' команда, за която ще научим повече в <<ch10-git-internals#_plumbing_porcelain>>) наречена `ls-remote`.
129129
Обикновено тази команда не се използва ежедневно в Git операциите, но е полезна защото ни показва какви референции съществуват на сървъра.
130130

131131
Ако стартираме тази команда за ``blink'' хранилището, което ползвахме по-рано, ще видим списък от всички клонове, тагове и други референции в него.

0 commit comments

Comments
 (0)