dngg 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d89252c4d511fbf2c7d1430f96f988258fd30e01f472b0752d25ecafc4605314
4
+ data.tar.gz: 0d3e6baa8f093d8fd35a79e80ceb691cddec7f07e1a4ae55ab6b2bd51994ee5e
5
+ SHA512:
6
+ metadata.gz: f9061d9ee4d13281d26b8c0cbed1d3be5838b3dd97545168e415d7fe85fa532dcdbbbe44a93a7bbd3eb01d3bd568552f93ec33ad1bf95d16ac45dc9711bc30c6
7
+ data.tar.gz: 45a01ba0259eef2ccf01e6db69f2a0c5d3c1de35e51d21dfa2236bbffb588a052e04308c0947eac91fa85e7c7418e7ad08ccd4341344651edd2d1fd0f2a534c2
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in dngg.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,25 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dngg (0.0.1)
5
+ colorize (= 0.8.1)
6
+ oj (= 3.8.0)
7
+ thor (= 1.0.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ colorize (0.8.1)
13
+ oj (3.8.0)
14
+ rake (13.0.6)
15
+ thor (1.0.0)
16
+
17
+ PLATFORMS
18
+ universal-darwin-19
19
+
20
+ DEPENDENCIES
21
+ dngg!
22
+ rake (~> 13.0)
23
+
24
+ BUNDLED WITH
25
+ 2.2.23
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Dngg
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/dngg`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'dngg'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install dngg
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/dngg.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "dngg"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/dngg.gemspec ADDED
@@ -0,0 +1,32 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "dngg/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'dngg'
8
+ spec.version = DNGG::VERSION
9
+ spec.authors = 'iSnow'
10
+ spec.email = 'schnee1109@163.com'
11
+
12
+ spec.summary = 'dngg'
13
+ spec.description = 'A submodule tools for Guang-Teams'
14
+ spec.homepage = 'http://rubygems.org/gems/dngg'
15
+ spec.license = 'MIT'
16
+
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
23
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
+ spec.require_paths = ['lib']
25
+
26
+ # spec.add_development_dependency 'bundler', '~> 1.14'
27
+ # spec.add_development_dependency 'rake', '~> 10.0'
28
+
29
+ spec.add_dependency 'thor', '1.0.0'
30
+ spec.add_dependency 'colorize', '0.8.1'
31
+ spec.add_dependency 'oj', '3.8.0'
32
+ end
data/lib/dngg.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'thor'
2
+ require_relative 'dngg/version'
3
+ require_relative 'dngg/command/start'
4
+ require_relative 'dngg/command/sync'
5
+ require_relative 'dngg/command/switch'
6
+ require_relative 'dngg/command/delete'
7
+ require_relative 'dngg/command/foreach'
8
+ require_relative 'dngg/command/merge'
9
+ require_relative 'dngg/command/finish'
10
+ require_relative 'dngg/command/mr'
11
+
12
+ module DNGG
13
+ class Cli < Thor
14
+ include Start
15
+ include Sync
16
+ include Switch
17
+ include Delete
18
+ include Foreach
19
+ include Merge
20
+ include Finish
21
+ include MR
22
+
23
+ desc 'sync', '当前分支同步(拉取)远程代码'
24
+ def sync
25
+ sync_flow
26
+ end
27
+
28
+ desc 'start <branch> [<commit>] [<origin>]', '检出新分支,新功能、修bug务必使用该命令'
29
+ def start(branch, action='')
30
+ start_flow(branch, action)
31
+ end
32
+
33
+ desc 'merge <branch> [-r|--rebase]', 'Merge,开发完成后执行; -r:主工程强制rebase'
34
+ option :rebase, :default => false, :type => :boolean, aliases: '-r'
35
+ def merge(branch)
36
+ rebase = options[:rebase]
37
+ merge_flow(branch, rebase)
38
+ end
39
+
40
+ desc 'finish [-f|--force]', 'Merge后并解决冲突后执行; -f:主工程强制推送'
41
+ option :force, :default => false, :type => :boolean, aliases: '-f'
42
+ def finish
43
+ force = options[:force]
44
+ finish_flow(force)
45
+ end
46
+
47
+ desc 'mr <branch> <title>', '创建MR'
48
+ def mr(branch, title)
49
+ mr_flow(branch, title)
50
+ end
51
+
52
+ desc 'switch <branch>', '切换分支'
53
+ def switch(branch)
54
+ switch_flow(branch)
55
+ end
56
+
57
+ desc 'delete <branch> [-r|--remote] [-a|--all]', '删除指定分支'
58
+ option :remote, :default => false, :type => :boolean, aliases: '-r'
59
+ option :all, :default => false, :type => :boolean, aliases: '-a'
60
+ def delete(branch)
61
+ remote = options[:remote]
62
+ all = options[:all]
63
+ delete_flow(branch, remote, all)
64
+ end
65
+
66
+ desc 'foreach [<commands>...]', '所有模块执行git命令(foreach后跟git命令)'
67
+ def foreach(*commands)
68
+ foreach_flow(*commands)
69
+ end
70
+
71
+ desc 'v', '查看版本'
72
+ def version
73
+ puts VERSION
74
+ end
75
+ end
76
+ # Cli.start(ARGV)
77
+ end
@@ -0,0 +1,57 @@
1
+ require_relative '../util/submodule'
2
+ require_relative '../util/stash'
3
+
4
+ module DNGG
5
+ module Delete
6
+ include Submodule
7
+ include Stash
8
+
9
+ def delete_flow(branch, remote, all)
10
+ check_submodule
11
+
12
+ puts '==> 进入主工程:'.yellow
13
+
14
+ delete_branch(all, branch, remote)
15
+
16
+ foreach_module {
17
+ delete_branch(all, branch, remote)
18
+ }
19
+ end
20
+
21
+ def delete_branch(all, branch, remote)
22
+ if branch == get_current_branch
23
+ puts "无法删除当前所在分支:#{branch},请switch其他分支后再执行\"dngg delete\"".red
24
+ exit 0
25
+ end
26
+
27
+ if all
28
+ delete_local_branch(branch)
29
+ delete_remote_branch(branch)
30
+ elsif remote
31
+ delete_remote_branch(branch)
32
+ else
33
+ delete_local_branch(branch)
34
+ end
35
+ end
36
+
37
+ def delete_local_branch(branch)
38
+ if `git branch | grep -e '\s|*#{branch}$'`.strip == ''
39
+ puts "warning: branch '#{branch}' not found"
40
+ else
41
+ info = `git branch -D #{branch}`
42
+ if info.strip != ''
43
+ puts "✓ #{info}"
44
+ end
45
+ end
46
+ end
47
+
48
+ def delete_remote_branch(branch)
49
+ if `git branch -r | grep -e '\s|*origin/#{branch}$'`.strip == ''
50
+ puts "warning: remote branch '#{branch}' not found"
51
+ else
52
+ system "git push origin -d #{branch}"
53
+ `git fetch -p origin`
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,86 @@
1
+ require 'colorize'
2
+ require_relative '../util/submodule'
3
+
4
+ module DNGG
5
+ module Finish
6
+ include Submodule
7
+
8
+ def finish_flow(force)
9
+ check_submodule
10
+
11
+ foreach_module {
12
+ process_finish(false)
13
+ }
14
+
15
+ puts '==> 进入主工程:'.yellow
16
+ process_finish(force, get_main_project_msg)
17
+
18
+ puts 'Modules执行:git add & commit & push'.blue
19
+ end
20
+
21
+ def process_finish(force, msg='')
22
+ system 'git add .'
23
+
24
+ branch = get_current_branch
25
+ if branch.include?('rebas')
26
+ system 'git rebase --continue'
27
+ else
28
+ stage = `git diff --cached --name-only`.strip
29
+ if stage == ''
30
+ `git commit`
31
+ else
32
+ if msg == ''
33
+ result = system 'git commit'
34
+ else
35
+ result = system "git commit -m \"#{msg}\""
36
+ end
37
+ unless result
38
+ exit 1
39
+ end
40
+ end
41
+ end
42
+
43
+ `git push -u origin #{get_current_branch} #{force ? '-f' : ''}`
44
+ end
45
+
46
+ def get_main_project_msg()
47
+ system 'git add .'
48
+
49
+ pattern = /[A-Z]\s*(.*)/
50
+ result = `git status -s | grep -e '[A-Z].*'`.split(/\n/).delete_if do |r|
51
+ r == ''
52
+ end
53
+ modified = []
54
+ result.each do |r|
55
+ if match = r.match(pattern)
56
+ module_name = match[1].strip
57
+ if is_submodule(module_name)
58
+ modified.push(match[1].strip)
59
+ end
60
+ end
61
+ end
62
+
63
+ whole_files = `git status -s`.split(/\n/).delete_if do |w|
64
+ w == ''
65
+ end
66
+ return '' if whole_files.length != modified.length
67
+
68
+ outputs = ''
69
+ modified.each_with_index do |m, index|
70
+ msg = get_lastest_msg_of_module(m)
71
+ outputs += msg.insert(msg.index(':') + 1, "[#{get_module_name(m)}]")
72
+ if index != modified.length - 1
73
+ outputs += "\n"
74
+ end
75
+ end
76
+
77
+ puts outputs
78
+ outputs
79
+ end
80
+
81
+ def get_module_name(module_name)
82
+ module_name.split(/\//).last.downcase
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,35 @@
1
+ require 'colorize'
2
+ require_relative '../util/submodule'
3
+ require_relative '../util/stash'
4
+
5
+ module DNGG
6
+ module Foreach
7
+ include Submodule
8
+ include Stash
9
+
10
+ def foreach_flow(*commands)
11
+ check_submodule
12
+
13
+ cmd = ''
14
+ if commands.size == 0
15
+ puts '请输入正确git命令 foreach [<commands>...]'.red
16
+ return
17
+ elsif commands.fetch(0) == 'git'
18
+ commands.delete_at(0)
19
+ end
20
+
21
+ commands.each do |arg|
22
+ cmd = "#{cmd} #{arg}"
23
+ end
24
+
25
+ foreach_module {
26
+ system "git #{cmd}"
27
+ }
28
+
29
+ puts '==> *进入主工程:'.yellow
30
+ system "git #{cmd}"
31
+
32
+ puts "Modules执行:git#{cmd}".blue
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,108 @@
1
+ require 'colorize'
2
+ require_relative '../util/submodule'
3
+
4
+ module DNGG
5
+ module Merge
6
+ include Submodule
7
+
8
+ def merge_flow(branch, force_rebase)
9
+ check_submodule
10
+ check_un_commit_code
11
+
12
+ arry_conflict = []
13
+
14
+ foreach_module {|sub|
15
+ if branch.start_with?('origin/')
16
+ `git fetch | grep 'ignored'`
17
+ end
18
+ process_merge(arry_conflict, sub, branch)
19
+ }
20
+
21
+ puts '==> 进入主工程:'.yellow
22
+
23
+ main_rebase = false
24
+ if force_rebase
25
+ main_rebase = true
26
+ end
27
+
28
+ if branch.start_with?('origin/')
29
+ `git fetch | grep 'ignored'`
30
+ end
31
+
32
+ if need_rebase(branch) || force_rebase
33
+ process_rebase(arry_conflict, branch)
34
+ puts 'Tip: 主工程rebase模式'.blue
35
+ else
36
+ process_merge(arry_conflict, '主工程', branch)
37
+ puts 'Tip: 主工程merge模式'.blue
38
+ end
39
+
40
+ if arry_conflict.size > 0
41
+ tip = "==> #{arry_conflict.size}个模块冲突:"
42
+ arry_conflict.reverse.each do |sub|
43
+ tip = "#{tip} #{sub}"
44
+ end
45
+ puts tip.red
46
+ puts "Tip: 当你解决冲突后,执行\"git add .\",如需推送远程,在主工程执行\"dngg finish\"".blue
47
+ else
48
+
49
+ if main_rebase
50
+ puts "Tip: 如需推送远程,执行\"dngg finish -f|--force\"".blue
51
+ else
52
+ puts "Tip: 如需推送远程,执行\"dngg finish\"".blue
53
+ end
54
+ end
55
+ end
56
+
57
+ def process_merge(arry_conflict, module_name, branch)
58
+ result_merge = `git merge #{branch}`
59
+ puts result_merge
60
+
61
+ if result_merge.include? 'Merge conflict'
62
+ arry_conflict.push(module_name)
63
+ end
64
+ end
65
+
66
+ def process_rebase(arry_conflict, branch)
67
+ result_merge = `git rebase #{branch}`
68
+ puts result_merge
69
+
70
+ if result_merge.include? 'Merge conflict'
71
+ arry_conflict.push('主工程')
72
+ end
73
+ end
74
+
75
+ def need_rebase(branch)
76
+ pattern = /[0-9a-z]{7}(?=\s)/
77
+ current_branch = get_current_branch
78
+
79
+ can_rebase(current_branch) {|remote|
80
+ diff_logs = `git log --oneline #{branch}..#{current_branch}`.split("\n").reverse
81
+
82
+ if diff_logs.length > 0
83
+ commit = pattern.match(diff_logs[0].strip)[0]
84
+ result = `git log #{remote}/#{current_branch} |grep #{commit}`
85
+ if `git log --oneline #{current_branch}..#{branch}`.split("\n").length > 0 && result.strip != ''
86
+ return false
87
+ end
88
+ end
89
+ }
90
+ end
91
+
92
+ def can_rebase(current_branch)
93
+ remote = `git config --get branch.#{current_branch}.remote`
94
+
95
+ if remote == ''
96
+ `git branch -r`.split("\n").each do |branch|
97
+ if branch.strip == "origin/#{current_branch}"
98
+ remote = 'origin'
99
+ yield remote
100
+ end
101
+ end
102
+ else
103
+ yield remote
104
+ end
105
+ true
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,133 @@
1
+ require 'colorize'
2
+ require 'oj'
3
+ require 'net/http'
4
+ require_relative '../util/submodule'
5
+ require_relative '../mr/token'
6
+ require_relative '../mr/email'
7
+
8
+ module DNGG
9
+ module MR
10
+ include Submodule
11
+ include Token
12
+ include Email
13
+
14
+ @@current_branch = ''
15
+ @@target_branch = ''
16
+ @@pwd = ''
17
+ @@token = ''
18
+ @@msg = ''
19
+ @@urls = {}
20
+ @@user = ''
21
+
22
+ def mr_flow(target_branch, msg)
23
+ check_submodule(false)
24
+
25
+ @@current_branch = get_current_branch
26
+ @@target_branch = target_branch
27
+
28
+ if target_branch.start_with?('origin/')
29
+ @@target_branch = target_branch.split('origin/')[1]
30
+ end
31
+
32
+ @@pwd = Dir.pwd
33
+ @@token = init_check_token
34
+ @@msg = msg
35
+
36
+ foreach_module {|sub|
37
+ create_mr(sub)
38
+ }
39
+
40
+ puts '==> 进入主工程:'.yellow
41
+ create_mr('主工程')
42
+
43
+ content = ''
44
+ @@urls.each do |sub, url|
45
+ content = " #{content}\n #{sub}: #{url}"
46
+ end
47
+
48
+ if content != ''
49
+ send_email(@@user, @@msg, content)
50
+ end
51
+ end
52
+
53
+ def init_check_token
54
+ token = ''
55
+ path = '.git/dngg/TOKEN'
56
+ unless check_token
57
+ system "vim #{path}"
58
+
59
+ result = IO.read(path).split('# 请输入GitLab private-token')
60
+
61
+ if result.length > 1
62
+ token = result[0]
63
+ end
64
+ end
65
+
66
+ if token == ''
67
+ token = IO.read(path).split('# 请输入GitLab private-token')[0]
68
+ end
69
+
70
+ if token == ''
71
+ puts '请输入GitLab private-token'.red
72
+ exit 1
73
+ end
74
+
75
+ return token
76
+ end
77
+
78
+ def create_mr(sub)
79
+ current_branch_head_commit = get_head_commit("origin/#{@@current_branch}").chomp
80
+
81
+ if current_branch_head_commit!="origin/#{@@current_branch}" && # 判断远程分支是否存在
82
+ get_head_commit("origin/#{@@current_branch}") != get_head_commit("origin/#{@@target_branch}")
83
+ # origin git@git.souche.com:Destiny_Android/Destiny_Android.git (push)
84
+ # origin http://git.souche.com/Destiny_Android/Mine.git (push)
85
+ result = `git remote -v | grep push`
86
+ project_name = result.split('.com/')[1]
87
+ if project_name == nil || project_name.strip == ''
88
+ project_name = result.split('.com:')[1]
89
+ end
90
+
91
+ if project_name != nil
92
+ project_name = project_name.split('.git')[0].gsub('/', '%2F')
93
+
94
+ begin
95
+ params = {}
96
+ params['source_branch'] = @@current_branch
97
+ params['target_branch'] = @@target_branch
98
+ params['title'] = @@msg
99
+ # params['remove_source_branch'] = true
100
+ uri = URI.parse("https://git.souche-inc.com/api/v4/projects/#{project_name}/merge_requests?private_token=#{@@token}")
101
+ response = Net::HTTP.post_form(uri, params)
102
+ result = Oj.load(response.body)
103
+
104
+ case response
105
+ when Net::HTTPSuccess then
106
+ mr_url = result['web_url']
107
+
108
+ if @@user == ''
109
+ @@user = result['author']['username']
110
+ end
111
+
112
+ if mr_url != nil
113
+ @@urls[sub] = mr_url
114
+ puts mr_url.blue
115
+ end
116
+ when Net::HTTPConflict then
117
+ puts 'Merge Request已存在!'
118
+ when Net::HTTPNotFound, Net::HTTPUnauthorized
119
+ Dir.chdir @@pwd
120
+ `rm -rf .git/dngg/TOKEN`
121
+ @@token = init_check_token
122
+ create_mr(sub)
123
+ return
124
+ end
125
+ rescue => e
126
+ puts "error: #{e}".red
127
+ exit 1
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,62 @@
1
+ require 'colorize'
2
+ require_relative '../util/submodule'
3
+ require_relative '../util/stash'
4
+
5
+ module DNGG
6
+ module Start
7
+ include Submodule
8
+ include Stash
9
+
10
+ def dd(x)
11
+ puts 89
12
+ end
13
+
14
+ def start_flow(branch, action)
15
+ check_submodule
16
+
17
+ puts '==> 进入主工程:'.yellow
18
+
19
+ arry_conflict = []
20
+ current_branch = get_current_branch
21
+
22
+ need_stash = try_stash
23
+ if action.start_with?('origin/')
24
+ need_fetch = `git fetch`
25
+ if need_fetch != ''
26
+ `git submodule foreach git fetch | grep 'ignored'`
27
+ end
28
+ end
29
+ result = system "git checkout -b #{branch} #{action}"
30
+ if need_stash
31
+ stash_pop(arry_conflict, '主工程')
32
+ end
33
+
34
+ unless result
35
+ return
36
+ end
37
+
38
+ result = system 'git submodule update --init --recursive'
39
+ unless result
40
+ tip_contact_author
41
+ `git checkout #{current_branch};git branch -D #{branch}`
42
+ return
43
+ end
44
+
45
+ foreach_module {|sub|
46
+ need_stash = try_stash
47
+ system "git checkout -b #{branch}"
48
+ if need_stash
49
+ stash_pop(arry_conflict, sub)
50
+ end
51
+ }
52
+
53
+ if arry_conflict.size > 0
54
+ tip = "==> #{arry_conflict.size}个模块冲突:"
55
+ arry_conflict.each do |sub|
56
+ tip = "#{tip} #{sub}"
57
+ end
58
+ puts tip.red
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,76 @@
1
+ require 'colorize'
2
+ require_relative '../util/submodule'
3
+ require_relative '../util/stash'
4
+
5
+ module DNGG
6
+ module Switch
7
+ include Submodule
8
+ include Stash
9
+
10
+ def switch_flow(branch, is_sync = false)
11
+ check_submodule
12
+ check_submodule_status(is_sync)
13
+
14
+ puts '==> 进入主工程:'.yellow
15
+
16
+ arry_conflict = []
17
+ arry_commit_not_exist = []
18
+
19
+ need_stash = try_stash
20
+ `git checkout #{branch}`; result=$?.success?
21
+
22
+ if need_stash
23
+ stash_pop(arry_conflict, '主工程')
24
+ end
25
+
26
+ unless result
27
+ return
28
+ end
29
+
30
+ sub_commits = get_submodule_commit
31
+
32
+ foreach_module {|sub, index|
33
+ if is_sync
34
+ `git fetch | grep 'ignored'`
35
+ end
36
+ process_switch(arry_commit_not_exist, arry_conflict, branch, index, sub, sub_commits)
37
+ }
38
+
39
+ if arry_conflict.size > 0
40
+ tip = "==> #{arry_conflict.size}个模块冲突:"
41
+ arry_conflict.each do |sub|
42
+ tip = "#{tip} #{sub}"
43
+ end
44
+ puts tip.red
45
+ end
46
+
47
+ if arry_commit_not_exist.size > 0
48
+ arry_commit_not_exist.each do |tip|
49
+ puts tip.red
50
+ end
51
+ tip_contact_author
52
+ end
53
+ end
54
+
55
+ def process_switch(commit_not_exist, arry_conflict, branch, index, sub, sub_commits)
56
+ need_stash = try_stash
57
+
58
+ `git checkout #{branch}`; result=$?.success?
59
+
60
+ if result
61
+ commit = sub_commits.fetch(index);
62
+ `git reset --hard #{commit}`; result=$?.success?
63
+ unless result
64
+ commit_not_exist.push("==> #{sub}模块不存在远程commit:#{commit}")
65
+ end
66
+ else
67
+ puts "[#{sub}] 没有#{branch}分支,创建并切换到#{branch}".blue
68
+ system "git checkout -b #{branch}"
69
+ end
70
+
71
+ if need_stash
72
+ stash_pop(arry_conflict, sub)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,19 @@
1
+ require 'colorize'
2
+ require_relative 'switch'
3
+
4
+ module DNGG
5
+ module Sync
6
+ include Switch
7
+
8
+ def sync_flow
9
+ check_submodule
10
+
11
+ result = system 'git pull'
12
+ unless result
13
+ return
14
+ end
15
+
16
+ switch_flow(get_current_branch, true)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ require 'colorize'
3
+
4
+ @msg = IO.read(ARGV[0]).force_encoding('UTF-8')
5
+
6
+ def commit_check
7
+ standards = %w(fix: fix: feat: feat: style: style: doc: doc: docs: docs: ref: ref: refactor: refactor: chore: chore: test: test: Merge merge Revert revert)
8
+ standards.each do |standard|
9
+ check(standard)
10
+ end
11
+ puts '====> commit message不符合规范,请查看规范'.red
12
+ exit 1
13
+ end
14
+
15
+ def check(keyword)
16
+ if @msg.start_with? keyword
17
+ exit 0
18
+ end
19
+ end
20
+
21
+ commit_check
@@ -0,0 +1,52 @@
1
+ module DNGG
2
+ module Hooks
3
+ def check_hooks
4
+ if update_hooks
5
+ install_billow
6
+ subs = get_submodule
7
+ subs.each do |sub|
8
+ cp_hooks(sub)
9
+ end
10
+ end
11
+ end
12
+
13
+ def install_billow
14
+ path = `gem which dngg`.split('/dngg.rb')[0]
15
+ `sudo sh #{path}/res/install_billow.sh`
16
+ end
17
+
18
+ def update_hooks
19
+ version = `dngg v`
20
+ ggsm_path = '.git/dngg'
21
+ unless File.exist?(ggsm_path)
22
+ Dir.mkdir(ggsm_path)
23
+ end
24
+
25
+ config_path = "#{ggsm_path}/VERSION"
26
+ target_path = '.git/hooks'
27
+
28
+ if !File.exist?(config_path) || version != IO.read(config_path)
29
+ cp_files(target_path)
30
+
31
+ file = File.new(config_path, 'w')
32
+ file << version
33
+ file.close
34
+
35
+ puts '已更新Hooks'.blue
36
+ return true
37
+ end
38
+ false
39
+ end
40
+
41
+ def cp_hooks(sub)
42
+ target_path = ".git/modules/#{sub}/hooks"
43
+ cp_files(target_path)
44
+ end
45
+
46
+ def cp_files(target_path)
47
+ path = `gem which dngg`.split('/dngg.rb')[0]
48
+ `cp #{path}/dngg/hook/commit-msg #{target_path}/commit-msg`
49
+ `cp #{path}/dngg/hook/pre-commit #{target_path}/pre-commit`
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ require 'colorize'
3
+
4
+ def switch_dir
5
+ if File.directory?('.git')
6
+ return
7
+ end
8
+
9
+ Dir.chdir '..'
10
+ switch_dir
11
+ end
12
+
13
+ begin
14
+ stage = `git diff --cached --name-only`.strip
15
+ if stage == ''
16
+ exit 0
17
+ end
18
+
19
+ @pass = true
20
+
21
+ files = stage.split("\n")
22
+
23
+ count = 0
24
+
25
+ files.each do |file|
26
+ if File.extname(file) == '.java'
27
+
28
+ current_path = Dir.pwd
29
+ switch_dir
30
+
31
+ result = `java -jar #{Dir.pwd}/_script/checkstyle-7.0.jar -c #{Dir.pwd}/_script/checkstyle.xml #{Dir.pwd}/#{file}`
32
+ result = result.gsub("Starting audit...\n", '')
33
+ result = result.gsub("Audit done.\n", '')
34
+ result = result.force_encoding('UTF-8')
35
+
36
+ if result.include?('WARN') || result.include?('ERROR')
37
+ count = count + 1
38
+ puts "#{count}、 #{result}\n".red
39
+ @pass = false
40
+ elsif result.strip != ''
41
+ puts result
42
+ end
43
+
44
+ Dir.chdir current_path
45
+ end
46
+ end
47
+
48
+ unless @pass
49
+ exit 1
50
+ end
51
+ rescue => e
52
+ puts "error: #{e}".red
53
+ exit 1
54
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'net/smtp'
3
+
4
+ module DNGG
5
+ module Email
6
+ def send_email(user,title,msg)
7
+ message = <<END_OF_MESSAGE
8
+ DNGG Merge Request <android.dev@guang.com>
9
+ To: Guang Android Team
10
+ Subject: [#{user}] #{title}
11
+
12
+ #{msg}
13
+ END_OF_MESSAGE
14
+
15
+ Net::SMTP.start('smtp.exmail.qq.com', 25, 'iSnow',
16
+ 'zhuruixue@aiguang.com', 'wwL9RS9cLeBxv7co') do |smtp|
17
+ smtp.send_message message,
18
+ 'android.dev@guang.com'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ module DNGG
2
+ module Token
3
+ def check_token
4
+ ggsm_path = '.git/dngg'
5
+ unless File.exist?(ggsm_path)
6
+ Dir.mkdir(ggsm_path)
7
+ end
8
+
9
+ config_path = "#{ggsm_path}/TOKEN"
10
+
11
+ if !File.exist?(config_path) || '' == IO.read(config_path).strip || IO.readlines(config_path)[0].strip == ''
12
+ file = File.new(config_path, 'w')
13
+ file << "\n# 请输入GitLab private-token"
14
+ file.close
15
+ return false
16
+ end
17
+
18
+ return true
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module DNGG
2
+ module Stash
3
+ def try_stash
4
+ status = `git status --ignore-submodules | grep 'nothing to commit'`
5
+ need_stash = false
6
+ if status.strip == ''
7
+ need_stash = true
8
+ `git stash`
9
+ end
10
+ need_stash
11
+ end
12
+
13
+ def stash_pop(arry_conflict, module_name)
14
+ stash_pop = `git stash pop | grep 'CONFLICT'`
15
+ if stash_pop.strip != ''
16
+ arry_conflict.push(module_name)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,184 @@
1
+ require_relative '../hook/hooks'
2
+
3
+ module DNGG
4
+ module Submodule
5
+ include Hooks
6
+
7
+ def check_submodule(check=true)
8
+ sub_str = `git submodule`
9
+ if check && sub_str.empty?
10
+ puts '所在目录工程下不存在Submodule,请检查所在目录!'.red
11
+ exit 1
12
+ end
13
+
14
+ correct_dir
15
+ check_hooks
16
+ end
17
+
18
+ def get_submodule
19
+ pattern = /(?<=\s)[\/0-9a-zA-Z]*(?=\s)/
20
+
21
+ sub_status = `git submodule`
22
+ sub_status = sub_status.split(/\n/)
23
+ match = pattern.match(sub_status[0])
24
+
25
+ if match==nil
26
+ puts '==> 初始化子模块'.yellow
27
+ `git submodule update --init --recursive`
28
+ sub_status = `git submodule`
29
+ sub_status = sub_status.split(/\n/)
30
+ end
31
+
32
+ result = []
33
+ sub_status.each do |sub|
34
+ match = pattern.match(sub.strip)
35
+ result.push(match[0])
36
+ end
37
+ result
38
+ end
39
+
40
+ def check_submodule_status(is_sync)
41
+ modified_sub = get_modified_submodule
42
+ if !is_sync && modified_sub.size > 0
43
+ subs = ''
44
+ modified_sub.each do |sub|
45
+ subs = "#{sub} , #{subs}"
46
+ end
47
+ puts "\n存在未跟踪的子模块提交: #{subs[0...subs.size-2]} \n\n请选择操作:\n1 丢弃子模块的改动
48
+ 2 追踪子模块(仅追踪子模块)\n3 追踪所有改变\n4 取消".red
49
+
50
+ input = STDIN.gets.chomp.upcase
51
+ if input == '1'
52
+ elsif input == '2'
53
+ add = 'git add'
54
+ modified_sub.each do |sub|
55
+ add = "#{add} #{sub}"
56
+ end
57
+ system "#{add};git commit"
58
+ elsif input == '3'
59
+ system 'git add .;git commit'
60
+ else
61
+ puts '==> 取消操作'.blue
62
+ exit 0
63
+ end
64
+ end
65
+ end
66
+
67
+ def get_modified_submodule
68
+ result = []
69
+
70
+ status = `git status -s`.split(/\n/)
71
+ subs = get_submodule
72
+
73
+ status.each do |sub|
74
+ array_name = sub.split(' ')
75
+ name = array_name[array_name.size-1]
76
+ if subs.include? name
77
+ result.push(name)
78
+ end
79
+ end
80
+ result
81
+ end
82
+
83
+ def get_submodule_commit
84
+ sub_tree = 'git ls-tree HEAD | grep "160000"'
85
+ sub_commits = `#{sub_tree}`
86
+ if sub_commits.strip == '' && (File.directory? 'submodules')
87
+ Dir.chdir 'submodules'
88
+ sub_commits = `#{sub_tree}`
89
+ Dir.chdir '..'
90
+ end
91
+ pattern = /(?<=\s)[0-9a-zA-Z]{40}(?=\s)/
92
+ sub_commits = sub_commits.split(/\n/)
93
+ result = []
94
+ sub_commits.each do |sub|
95
+ match = pattern.match(sub.strip)
96
+ result.push(match[0][0...7])
97
+ end
98
+ result
99
+ end
100
+
101
+ def check_un_commit_code
102
+ subs = get_submodule
103
+ project_path = Dir.pwd
104
+ subs.each do |sub|
105
+ Dir.chdir sub
106
+ status = `git status --ignore-submodules | grep 'nothing to commit'`
107
+ if status.strip == ''
108
+ puts "#{sub} 有未提交的代码".red
109
+ exit 1
110
+ end
111
+ Dir.chdir project_path
112
+ end
113
+
114
+ status = `git status --ignore-submodules | grep 'nothing to commit'`
115
+ if status.strip == ''
116
+ puts '主工程 有未提交的代码'.red
117
+ exit 1
118
+ end
119
+ end
120
+
121
+ def foreach_module
122
+ subs = get_submodule
123
+ project_path = Dir.pwd
124
+ subs.each do |sub|
125
+ Dir.chdir sub
126
+ puts "==> 进入#{sub}:".yellow
127
+ yield sub, subs.index(sub)
128
+ Dir.chdir project_path
129
+ end
130
+ end
131
+
132
+ def get_lastest_msg_of_module(module_name)
133
+ msg = ''
134
+ project_path = Dir.pwd
135
+ if is_submodule(module_name)
136
+ Dir.chdir module_name
137
+ msg = get_lastest_msg_not_merge
138
+ Dir.chdir project_path
139
+ end
140
+ msg
141
+ end
142
+
143
+ def is_submodule(module_name)
144
+ get_submodule.include?(module_name)
145
+ end
146
+
147
+ def get_lastest_msg_not_merge
148
+ depth = 1
149
+ while (msg = get_lastest_msg(depth)).start_with?('Merge branch') do
150
+ depth += 1
151
+ end
152
+ msg
153
+ end
154
+
155
+ def get_lastest_msg(depth)
156
+ msg = `git log --format=%B -n #{depth}`.split(/\n\n/)
157
+ msg[depth - 1].strip
158
+ end
159
+
160
+ def get_current_branch
161
+ `git branch | grep "*"`.split('* ')[1].split("\n")[0]
162
+ end
163
+
164
+ def tip_contact_author
165
+ latest_commit = `git log test -1 --oneline | grep ''`.split(' ')[0]
166
+ author = `git show #{latest_commit}|grep "Author:"`.chomp
167
+ puts "请联系#{author} 推送远程缺失的commit".red
168
+ end
169
+
170
+ def correct_dir
171
+ if File.exist?('.git')
172
+ return
173
+ end
174
+
175
+ Dir.chdir '..'
176
+ correct_dir
177
+ end
178
+
179
+ # 获取#{branch}上HEAD的commit id
180
+ def get_head_commit(branch)
181
+ `git rev-parse #{branch}`
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,3 @@
1
+ module DNGG
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,33 @@
1
+ # # 下载
2
+ # curl -o ~/billow.zip http://7xq884.com1.z0.glb.clouddn.com/Billow.zip
3
+
4
+ # pushd ~/Library/Application\ Support
5
+
6
+ # # 解压到Application Support/AS
7
+ # for file in ./AndroidStudio*
8
+ # do
9
+ # if test -d $file
10
+ # then
11
+ # pushd ~/Library/Application\ Support/$file
12
+ # unzip -o ~/billow.zip
13
+ # popd
14
+ # fi
15
+ # done
16
+
17
+ # popd
18
+
19
+ # # 修改Preferences,开启插件
20
+ # for file in ~/Library/Preferences/AndroidStudio*
21
+ # do
22
+ # if test -d $file
23
+ # then
24
+ # sed '/^com.souche.plugin.billow/'d $file/disabled_plugins.txt > disabled_plugins_billow.txt
25
+ # cp disabled_plugins_billow.txt $file/disabled_plugins.txt
26
+ # rm -rf disabled_plugins_billow.txt
27
+ # fi
28
+ # done
29
+
30
+ # rm -rf ~/billow.zip
31
+
32
+ # echo Billow安装成功,请重新启动AndroidStudio
33
+
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dngg
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - iSnow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-07-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: colorize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.8.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.8.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: oj
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 3.8.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 3.8.0
55
+ description: A submodule tools for Guang-Teams
56
+ email: schnee1109@163.com
57
+ executables:
58
+ - console
59
+ - setup
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - Gemfile
65
+ - Gemfile.lock
66
+ - README.md
67
+ - Rakefile
68
+ - bin/console
69
+ - bin/setup
70
+ - dngg.gemspec
71
+ - lib/dngg.rb
72
+ - lib/dngg/command/delete.rb
73
+ - lib/dngg/command/finish.rb
74
+ - lib/dngg/command/foreach.rb
75
+ - lib/dngg/command/merge.rb
76
+ - lib/dngg/command/mr.rb
77
+ - lib/dngg/command/start.rb
78
+ - lib/dngg/command/switch.rb
79
+ - lib/dngg/command/sync.rb
80
+ - lib/dngg/hook/commit-msg
81
+ - lib/dngg/hook/hooks.rb
82
+ - lib/dngg/hook/pre-commit
83
+ - lib/dngg/mr/email.rb
84
+ - lib/dngg/mr/token.rb
85
+ - lib/dngg/util/stash.rb
86
+ - lib/dngg/util/submodule.rb
87
+ - lib/dngg/version.rb
88
+ - lib/res/install_billow.sh
89
+ homepage: http://rubygems.org/gems/dngg
90
+ licenses:
91
+ - MIT
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubygems_version: 3.0.3
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: dngg
112
+ test_files: []