bigkeeper 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +20 -0
  3. data/.gitignore +50 -0
  4. data/.travis.yml +17 -0
  5. data/CODE_OF_CONDUCT.md +46 -0
  6. data/CONTRIBUTING.md +70 -0
  7. data/Gemfile +10 -0
  8. data/Gemfile.lock +114 -0
  9. data/LICENSE +21 -0
  10. data/README.md +109 -0
  11. data/Rakefile +2 -0
  12. data/big_keeper.gemspec +47 -0
  13. data/bin/big +14 -0
  14. data/bin/setup +8 -0
  15. data/docs/en-US/FEATURE.md +0 -0
  16. data/docs/en-US/README.md +50 -0
  17. data/docs/zh-CN/BIGKEEPER_FILE.md +62 -0
  18. data/docs/zh-CN/FEATURE&HOTFIX.md +121 -0
  19. data/docs/zh-CN/PODFILE.md +43 -0
  20. data/docs/zh-CN/README.md +107 -0
  21. data/docs/zh-CN/RECOMMEND.md +22 -0
  22. data/docs/zh-CN/RELEASE.md +43 -0
  23. data/lib/big_keeper.rb +295 -0
  24. data/lib/big_keeper/command/feature&hotfix/delete.rb +33 -0
  25. data/lib/big_keeper/command/feature&hotfix/finish.rb +56 -0
  26. data/lib/big_keeper/command/feature&hotfix/pull.rb +24 -0
  27. data/lib/big_keeper/command/feature&hotfix/push.rb +25 -0
  28. data/lib/big_keeper/command/feature&hotfix/rebase.rb +27 -0
  29. data/lib/big_keeper/command/feature&hotfix/start.rb +67 -0
  30. data/lib/big_keeper/command/feature&hotfix/switch.rb +47 -0
  31. data/lib/big_keeper/command/feature&hotfix/update.rb +69 -0
  32. data/lib/big_keeper/command/pod/podfile.rb +69 -0
  33. data/lib/big_keeper/command/release/home.rb +66 -0
  34. data/lib/big_keeper/command/release/module.rb +106 -0
  35. data/lib/big_keeper/model/gitflow_type.rb +31 -0
  36. data/lib/big_keeper/model/operate_type.rb +19 -0
  37. data/lib/big_keeper/model/podfile_model.rb +33 -0
  38. data/lib/big_keeper/model/podfile_type.rb +44 -0
  39. data/lib/big_keeper/service/git_service.rb +186 -0
  40. data/lib/big_keeper/service/module_service.rb +124 -0
  41. data/lib/big_keeper/service/stash_service.rb +45 -0
  42. data/lib/big_keeper/util/bigkeeper_parser.rb +198 -0
  43. data/lib/big_keeper/util/git_operator.rb +142 -0
  44. data/lib/big_keeper/util/gitflow_operator.rb +51 -0
  45. data/lib/big_keeper/util/info_plist_operator.rb +46 -0
  46. data/lib/big_keeper/util/logger.rb +40 -0
  47. data/lib/big_keeper/util/pod_operator.rb +15 -0
  48. data/lib/big_keeper/util/podfile_detector.rb +108 -0
  49. data/lib/big_keeper/util/podfile_module.rb +64 -0
  50. data/lib/big_keeper/util/podfile_operator.rb +166 -0
  51. data/lib/big_keeper/util/xcode_operator.rb +13 -0
  52. data/lib/big_keeper/version.rb +3 -0
  53. data/resources/banner.png +0 -0
  54. data/resources/keynote/big-keeper-readme-example.key +0 -0
  55. data/resources/keynote/big-keeper-readme-feature.key +0 -0
  56. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.001.jpeg +0 -0
  57. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.002.jpeg +0 -0
  58. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.003.jpeg +0 -0
  59. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.004.jpeg +0 -0
  60. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.005.jpeg +0 -0
  61. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.006.jpeg +0 -0
  62. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.007.jpeg +0 -0
  63. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.008.jpeg +0 -0
  64. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.009.jpeg +0 -0
  65. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.010.jpeg +0 -0
  66. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.011.jpeg +0 -0
  67. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.012.jpeg +0 -0
  68. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.013.jpeg +0 -0
  69. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.014.jpeg +0 -0
  70. data/resources/keynote/big-keeper-readme-release.key +0 -0
  71. data/resources/readme/big-keeper-readme.001.png +0 -0
  72. data/resources/readme/big-keeper-readme.002.png +0 -0
  73. data/resources/readme/big-keeper-readme.003.png +0 -0
  74. data/resources/readme/big-keeper-readme.004.png +0 -0
  75. data/resources/readme/big-keeper-readme.005.png +0 -0
  76. data/resources/readme/big-keeper-readme.006.png +0 -0
  77. data/resources/readme/big-keeper-readme.007.png +0 -0
  78. data/resources/readme/big-keeper-readme.008.png +0 -0
  79. data/resources/readme/big-keeper-readme.009.png +0 -0
  80. data/resources/readme/big-keeper-readme.010.png +0 -0
  81. data/resources/readme/big-keeper-readme.011.png +0 -0
  82. data/resources/readme/big-keeper-readme.012.png +0 -0
  83. metadata +311 -0
@@ -0,0 +1,198 @@
1
+ require 'big_keeper/util/logger'
2
+
3
+ # Bigkeeper module
4
+ module BigKeeper
5
+ def self.version(name)
6
+ BigkeeperParser.parse_version(name)
7
+ end
8
+
9
+ def self.user(name)
10
+ BigkeeperParser.parse_user(name)
11
+ yield if block_given?
12
+ end
13
+
14
+ def self.home(name, params)
15
+ BigkeeperParser.parse_home(name, params)
16
+ end
17
+
18
+ def self.pod(name, params)
19
+ BigkeeperParser.parse_pod(name, params)
20
+ end
21
+
22
+ def self.modules
23
+ BigkeeperParser.parse_modules
24
+ yield if block_given?
25
+ end
26
+
27
+ def self.source(name)
28
+ BigkeeperParser.parse_source(name)
29
+ end
30
+
31
+ # Bigkeeper file parser
32
+ class BigkeeperParser
33
+ @@config = {}
34
+ @@current_user = ''
35
+
36
+ def self.parse(bigkeeper)
37
+ if @@config.empty?
38
+
39
+ Logger.error("Can't find a Bigkeeper file in current directory.") if !BigkeeperParser.definitely_exists?(bigkeeper)
40
+
41
+ content = File.read bigkeeper
42
+ content.gsub!(/version\s/, 'BigKeeper::version ')
43
+ content.gsub!(/user\s/, 'BigKeeper::user ')
44
+ content.gsub!(/home\s/, 'BigKeeper::home ')
45
+ content.gsub!(/pod\s/, 'BigKeeper::pod ')
46
+ content.gsub!(/modules\s/, 'BigKeeper::modules ')
47
+ content.gsub!(/source\s/, 'BigKeeper::source ')
48
+ eval content
49
+ # p @@config
50
+ end
51
+ end
52
+
53
+ def self.definitely_exists? path
54
+ folder = File.dirname path
55
+ filename = File.basename path
56
+ # Unlike Ruby IO, ls, and find -f, this technique will fail to locate the file if the case is wrong:
57
+ not %x( find "#{folder}" -name "#{filename}" ).empty?
58
+ end
59
+
60
+ def self.parse_version(name)
61
+ @@config[:version] = name
62
+ end
63
+
64
+ def self.parse_source(name)
65
+ sources = []
66
+ sources << @@config[:source]
67
+ sources << name
68
+ @@config[:source] = sources
69
+ end
70
+
71
+ def self.parse_user(name)
72
+ @@current_user = name
73
+ users = @@config[:users]
74
+ users = {} if users.nil?
75
+ users[name] = {}
76
+ @@config[:users] = users
77
+ end
78
+
79
+ def self.parse_home(name, params)
80
+ @@config[:home] = params
81
+ @@config[:name] = name
82
+ end
83
+
84
+ def self.parse_pod(name, params)
85
+ if params[:path]
86
+ parse_user_pod(name, params)
87
+ elsif params[:git]
88
+ parse_modules_pod(name, params)
89
+ else
90
+ Logger.error(%(There should be ':path =>' or ':git =>' for pod #{name}))
91
+ end
92
+ end
93
+
94
+ def self.parse_user_pod(name, params)
95
+ users = @@config[:users]
96
+ user = users[@@current_user]
97
+ pods = user[:pods]
98
+ pods = {} if pods.nil?
99
+ pods[name] = params
100
+ user[:pods] = pods
101
+ @@config[:users] = users
102
+ end
103
+
104
+ def self.parse_modules_pod(name, params)
105
+ modules = @@config[:modules]
106
+ modules[name] = params
107
+ @@config[:modules] = modules
108
+ end
109
+
110
+ def self.parse_modules
111
+ modules = @@config[:modules]
112
+ modules = {} if modules.nil?
113
+ @@config[:modules] = modules
114
+ end
115
+
116
+ def self.version
117
+ @@config[:version]
118
+ end
119
+
120
+ def self.home_name
121
+ @@config[:name]
122
+ end
123
+
124
+ def self.home_git()
125
+ @@config[:home][:git]
126
+ end
127
+
128
+ def self.home_pulls()
129
+ @@config[:home][:pulls]
130
+ end
131
+
132
+ def self.sourcemodule_path
133
+ if @@config[:source] == nil
134
+ return ""
135
+ else
136
+ @@config[:source].join(",").reverse.chop.reverse
137
+ end
138
+ end
139
+
140
+ def self.module_full_path(home_path, user_name, module_name)
141
+ if @@config[:users] \
142
+ && @@config[:users][user_name] \
143
+ && @@config[:users][user_name][:pods] \
144
+ && @@config[:users][user_name][:pods][module_name] \
145
+ && @@config[:users][user_name][:pods][module_name][:path]
146
+ @@config[:users][user_name][:pods][module_name][:path]
147
+ else
148
+ File.expand_path("#{home_path}/../#{module_name}")
149
+ end
150
+ end
151
+
152
+ def self.module_path(user_name, module_name)
153
+ if @@config[:users] \
154
+ && @@config[:users][user_name] \
155
+ && @@config[:users][user_name][:pods] \
156
+ && @@config[:users][user_name][:pods][module_name] \
157
+ && @@config[:users][user_name][:pods][module_name][:path]
158
+ @@config[:users][user_name][:pods][module_name][:path]
159
+ else
160
+ "../#{module_name}"
161
+ end
162
+ end
163
+
164
+ def self.module_git(module_name)
165
+ @@config[:modules][module_name][:git]
166
+ end
167
+
168
+ def self.module_pulls(module_name)
169
+ @@config[:modules][module_name][:pulls]
170
+ end
171
+
172
+ def self.verify_modules(modules)
173
+ modules.each do |item|
174
+ Logger.error("Can not find module #{item} in Bigkeeper file") unless @@config[:modules][item]
175
+ end
176
+ end
177
+
178
+ def self.module_names
179
+ @@config[:modules].keys
180
+ end
181
+
182
+ def self.config
183
+ @@config
184
+ end
185
+ end
186
+
187
+ # BigkeeperParser.parse('/Users/mmoaay/Documents/eleme/BigKeeperMain/Bigkeeper')
188
+ # BigkeeperParser.parse('/Users/mmoaay/Documents/eleme/BigKeeperMain/Bigkeeper')
189
+ #
190
+ # p BigkeeperParser.home_git()
191
+ # p BigkeeperParser.home_pulls()
192
+ # p BigkeeperParser.module_path('perry', 'BigKeeperModular')
193
+ # p BigkeeperParser.module_path('', 'BigKeeperModular')
194
+ # p BigkeeperParser.module_git('BigKeeperModular')
195
+ # pulls = BigkeeperParser.module_pulls('BigKeeperModular')
196
+ # `open #{pulls}`
197
+ # p BigkeeperParser.module_names
198
+ end
@@ -0,0 +1,142 @@
1
+ require 'big_keeper/util/logger'
2
+
3
+ module BigKeeper
4
+ # Operator for got
5
+ class GitOperator
6
+ def current_branch(path)
7
+ Dir.chdir(path) do
8
+ `git rev-parse --abbrev-ref HEAD`.chop
9
+ end
10
+ end
11
+
12
+ def has_remote_branch(path, branch_name)
13
+ has_branch = false
14
+ IO.popen("cd #{path}; git branch -r") do |io|
15
+ io.each do |line|
16
+ has_branch = true if line.include? branch_name
17
+ end
18
+ end
19
+ has_branch
20
+ end
21
+
22
+ def has_local_branch(path, branch_name)
23
+ has_branch = false
24
+ IO.popen("cd #{path}; git branch") do |io|
25
+ io.each do |line|
26
+ has_branch = true if line.include? branch_name
27
+ end
28
+ end
29
+ has_branch
30
+ end
31
+
32
+ def has_branch(path, branch_name)
33
+ has_branch = false
34
+ IO.popen("cd #{path}; git branch -a") do |io|
35
+ io.each do |line|
36
+ has_branch = true if line.include? branch_name
37
+ end
38
+ end
39
+ has_branch
40
+ end
41
+
42
+ def checkout(path, branch_name)
43
+ Dir.chdir(path) do
44
+ IO.popen("git checkout #{branch_name}") do |io|
45
+ io.each do |line|
46
+ Logger.error("Checkout #{branch_name} failed.") if line.include? 'error'
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ def fetch(path)
53
+ Dir.chdir(path) do
54
+ `git fetch origin`
55
+ end
56
+ end
57
+
58
+ def rebase(path, branch_name)
59
+ Dir.chdir(path) do
60
+ `git rebase origin/#{branch_name}`
61
+ end
62
+ end
63
+
64
+ def clone(path, git_base)
65
+ Dir.chdir(path) do
66
+ `git clone #{git_base}`
67
+ end
68
+ end
69
+
70
+ def commit(path, message)
71
+ Dir.chdir(path) do
72
+ `git add .`
73
+ `git commit -m "#{message}"`
74
+ end
75
+ end
76
+
77
+ def push_to_remote(path, branch_name)
78
+ Dir.chdir(path) do
79
+ `git push -u origin #{branch_name}`
80
+ end
81
+ end
82
+
83
+ def pull(path)
84
+ Dir.chdir(path) do
85
+ `git pull`
86
+ end
87
+ end
88
+
89
+ def has_commits(path, branch_name)
90
+ has_commits = false
91
+ IO.popen("cd #{path}; git log --branches --not --remotes") do |io|
92
+ io.each do |line|
93
+ has_commits = true if line.include? branch_name
94
+ end
95
+ end
96
+ has_commits
97
+ end
98
+
99
+ def has_changes(path)
100
+ has_changes = true
101
+ clear_flag = 'nothing to commit, working tree clean'
102
+ IO.popen("cd #{path}; git status") do |io|
103
+ io.each do |line|
104
+ has_changes = false if line.include? clear_flag
105
+ end
106
+ end
107
+ has_changes
108
+ end
109
+
110
+ def dicard(path)
111
+ Dir.chdir(path) do
112
+ `git checkout . && git clean -xdf`
113
+ end
114
+ end
115
+
116
+ def del_local(path, branch_name)
117
+ Dir.chdir(path) do
118
+ `git branch -D #{branch_name}`
119
+ end
120
+ end
121
+
122
+ def del_remote(path, branch_name)
123
+ Dir.chdir(path) do
124
+ `git push origin --delete #{branch_name}`
125
+ end
126
+ end
127
+
128
+ def user
129
+ `git config user.name`.chop
130
+ end
131
+
132
+ def tag(path, version)
133
+ Dir.chdir(path) do
134
+ `git tag -a #{version} -m "release: V #{version}" master`
135
+ `git push --tags`
136
+ end
137
+ end
138
+ end
139
+
140
+ # p GitOperator.new.user
141
+ # BigStash::StashOperator.new("/Users/mmoaay/Documents/eleme/BigKeeperMain").list
142
+ end
@@ -0,0 +1,51 @@
1
+ require 'big_keeper/model/gitflow_type'
2
+
3
+ module BigKeeper
4
+ # Operator for gitflow
5
+ class GitflowOperator
6
+ def start(path, name, type)
7
+ Dir.chdir(path) do
8
+ gitflow_type_name = GitflowType.name(type)
9
+ `git flow #{gitflow_type_name} start #{name}`
10
+ end
11
+ end
12
+
13
+ def verify_git_flow_command
14
+ has_git_flow_command = false
15
+ IO.popen('command -v git-flow') do |io|
16
+ io.each do |line|
17
+ has_git_flow_command = true
18
+ end
19
+ end
20
+ has_git_flow_command
21
+ end
22
+
23
+ def verify_git_flow(path)
24
+ has_git_flow = false
25
+ Dir.chdir(path) do
26
+ clear_flag = 'Already initialized for gitflow'
27
+ IO.popen('git flow init -d') do |io|
28
+ io.each do |line|
29
+ if line.include? clear_flag
30
+ has_git_flow = true
31
+ break
32
+ end
33
+ end
34
+ end
35
+ end
36
+ has_git_flow
37
+ end
38
+
39
+ def finish_release(path, release_name)
40
+ Dir.chdir(path) do
41
+ p `git checkout master`
42
+ p `git merge release/#{release_name}`
43
+ p `git push`
44
+ p `git checkout develop`
45
+ p `git merge release/#{release_name}`
46
+ p `git push`
47
+ p `git branch -d release/#{release_name}`
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/ruby
2
+ require 'plist' # gem install plist
3
+ require 'big_stash/stash_operator'
4
+ require 'pathname'
5
+
6
+ module BigKeeper
7
+ # Operator for Info.plist
8
+ class InfoPlistOperator
9
+ def change_version_build(path, version)
10
+ if find_infoPlist_filePath(path) == ''
11
+ raise %(Not find be Info.plist at #{path})
12
+ end
13
+ info_plist_path = find_infoPlist_filePath(path)
14
+ result = Plist.parse_xml(info_plist_path)
15
+ result['CFBundleVersion'] = getBuildVersion(version, result['CFBundleShortVersionString'], result['CFBundleVersion']).to_s
16
+ result['CFBundleShortVersionString'] = version.to_s
17
+ Plist::Emit.save_plist(result, info_plist_path)
18
+ puts %Q('Version has changed to #{version}')
19
+ end
20
+
21
+ # Find Info.plist file path
22
+ # @return [String] pathName of info.plist
23
+ def find_infoPlist_filePath(path)
24
+ paths = Pathname.new(path).children.select { |pn| pn.extname == '.xcodeproj' }
25
+ xcodePath = paths[0].to_s.split('/')[-1]
26
+ projectName = xcodePath.split('.')[0]
27
+ projectPath = ''
28
+ Pathname.new("#{path}/#{projectName}").children.select { |pn|
29
+ if pn.to_s == "#{path}/#{projectName}/Info.plist"
30
+ projectPath = "#{path}/#{projectName}/Info.plist"
31
+ end
32
+ }
33
+ projectPath
34
+ end
35
+
36
+ private
37
+ def getBuildVersion(build_string, old_build_string, old_build_version)
38
+ if build_string == old_build_string
39
+ return old_build_version.to_i + 1
40
+ else
41
+ version_arr = build_string.split('.')
42
+ return version_arr[0].to_i * 1000 + version_arr[1].to_i * 100 + version_arr[2].to_i * 10
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,40 @@
1
+ require 'colorize'
2
+
3
+ module BigKeeper
4
+ DEFAULT_LOG = 1
5
+ HIGHLIGHT_LOG = 2
6
+ ERROR_LOG = 3
7
+ WARNING_LOG = 4
8
+
9
+ class Logger
10
+
11
+ def self.log_with_type(sentence,type)
12
+ case type
13
+ when DEFAULT_LOG then puts sentence.to_s.colorize(:default)
14
+ when HIGHLIGHT_LOG then puts sentence.to_s.colorize(:green)
15
+ when ERROR_LOG then raise sentence.to_s.colorize(:red)
16
+ when WARNING_LOG then puts sentence.to_s.colorize(:yellow)
17
+ end
18
+ end
19
+
20
+ def self.default(sentence)
21
+ puts sentence.to_s.colorize(:default)
22
+ end
23
+
24
+ def self.highlight(sentence)
25
+ puts sentence.to_s.colorize(:green)
26
+ end
27
+
28
+ def self.error(sentence)
29
+ raise sentence.to_s.colorize(:red)
30
+ end
31
+
32
+ def self.warning(sentence)
33
+ puts sentence.to_s.colorize(:yellow)
34
+ end
35
+
36
+ def self.separator
37
+ puts "- - - - - - - - - - - - - - - - - - - - - - - - - - -".colorize(:light_blue)
38
+ end
39
+ end
40
+ end