bigkeeper 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
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