maptool 17.12.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +66 -0
- data/bin/maptool +16 -0
- data/lib/maptool.rb +13 -0
- data/lib/maptool/command.rb +38 -0
- data/lib/maptool/dependency/dependency.rb +167 -0
- data/lib/maptool/dependency/product_class.rb +24 -0
- data/lib/maptool/gem_version.rb +15 -0
- data/lib/maptool/log/log.rb +74 -0
- data/lib/maptool/release/release.rb +141 -0
- data/lib/maptool/tag/tag.rb +110 -0
- data/lib/maptool/test.rb +12 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c17454daf4c02e6b26fab0ecda5d4e101df625dc
|
4
|
+
data.tar.gz: a7c4db2727da2fc3b9bba4b6eb568b1866bcdb34
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3a6e72495f1b8c9c8a5bd607f2db9fc0708b86f590e342657bc3ebcbe8cc0404db0009f15a03e7321d05682415740b63e880f0ac24ea0659b2de3b64093d4d81
|
7
|
+
data.tar.gz: ded851b75fc799e82351de12a2e8ac034d727ca846d54e714e65a5bf92794950c2509fbac41908648e95636cfc26a1b665cb934341302de54712f847ca50b4f8
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2017 阳君
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# MapTool
|
2
|
+
|
3
|
+
[![Language: Ruby](https://img.shields.io/badge/language-Ruby-orange.svg?style=flat)](https://www.ruby-lang.org/zh_cn/)
|
4
|
+
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/937447974/YJCocoaGem/blob/master/LICENSE)
|
5
|
+
[![](https://img.shields.io/badge/gem-17.11.17-orange.svg?style=flat)](http://apparch.xiaojukeji.com:9292/gems/maptool)
|
6
|
+
|
7
|
+
地图事业部 iOS 脚本工具,使用 gem 安装。
|
8
|
+
|
9
|
+
```vim
|
10
|
+
gem install maptool
|
11
|
+
```
|
12
|
+
|
13
|
+
## 1 Dependency 命令
|
14
|
+
|
15
|
+
Dependency 命令主要用于代码依赖分析。支持如下两个功能:
|
16
|
+
|
17
|
+
1. 分析库之间的依赖关系;
|
18
|
+
2. 搜索不符合规范的 import 导入,库正确导入方式为 `#import <Foundation/Foundation.h>`,错误的方式是 `#import "Foundation.h"`。
|
19
|
+
|
20
|
+
执行 Dependency 命令指定库文件夹即可,分析完毕会自动生成日志并打开。
|
21
|
+
|
22
|
+
```
|
23
|
+
maptool dependency --dir=/Users/didi/Desktop/Pods/MapAnalogNavigation/Pod
|
24
|
+
```
|
25
|
+
|
26
|
+
## 2 Release 命令
|
27
|
+
|
28
|
+
Release 命令主要用于发版时收集 pod 内 tag,并使用[飞歌服务](http://wiki.intra.xiaojukeji.com/pages/viewpage.action?pageId=111910871)推送到钉钉群。
|
29
|
+
|
30
|
+
执行 Tag 收集命令
|
31
|
+
|
32
|
+
```
|
33
|
+
maptool release --sender=员工号 --podfile=/Users/didi/Desktop/DiDi/one-integration/OnePods.rb
|
34
|
+
```
|
35
|
+
|
36
|
+
## 3 Tag 命令
|
37
|
+
|
38
|
+
Tag 命令主要用于规范开发人员的 tag。生成 tag 的样式:库名-version-stage-时间戳-suffix
|
39
|
+
|
40
|
+
首次打tag或升级版本号
|
41
|
+
|
42
|
+
```
|
43
|
+
maptool tag --version=x.xx.xxx --stage=阶段 --suffix=后缀
|
44
|
+
```
|
45
|
+
|
46
|
+
只更新时间戳打 Tag:
|
47
|
+
|
48
|
+
```
|
49
|
+
maptool tag
|
50
|
+
```
|
51
|
+
|
52
|
+
----------
|
53
|
+
|
54
|
+
# Appendix
|
55
|
+
|
56
|
+
## Author
|
57
|
+
|
58
|
+
阳君 <yangjunyang@didichuxing.com>
|
59
|
+
|
60
|
+
## GitLab
|
61
|
+
|
62
|
+
[https://git.xiaojukeji.com/mapkit-ios/maptool](https://git.xiaojukeji.com/mapkit-ios/maptool)
|
63
|
+
|
64
|
+
## Copyright
|
65
|
+
|
66
|
+
maptool 是滴滴内部项目,默认不对外开源。
|
data/bin/maptool
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby_executable_hooks
|
2
|
+
#
|
3
|
+
# maptool
|
4
|
+
# maptool
|
5
|
+
#
|
6
|
+
# Created by 阳君 on 17/11/8.
|
7
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
8
|
+
#
|
9
|
+
|
10
|
+
if $PROGRAM_NAME == __FILE__
|
11
|
+
lib = File.expand_path('../../lib', __FILE__)
|
12
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'maptool'
|
16
|
+
MapTool::Command.run(ARGV)
|
data/lib/maptool.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#
|
2
|
+
# command.rb
|
3
|
+
#
|
4
|
+
# Created by 阳君 on 17/11/8.
|
5
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'maptool/gem_version'
|
9
|
+
|
10
|
+
module MapTool
|
11
|
+
|
12
|
+
# Usage
|
13
|
+
class Command < CLAide::Command
|
14
|
+
|
15
|
+
DEFAULT_OPTIONS = [['--help', 'Show help banner of specified command'],]
|
16
|
+
|
17
|
+
self.abstract_command = true
|
18
|
+
self.command = 'maptool'
|
19
|
+
self.version = VERSION
|
20
|
+
self.description = 'MapTool, the Map developer managment tool.'
|
21
|
+
|
22
|
+
def self.options
|
23
|
+
if root_command?
|
24
|
+
DEFAULT_ROOT_OPTIONS + DEFAULT_OPTIONS
|
25
|
+
else
|
26
|
+
DEFAULT_OPTIONS
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Commands
|
32
|
+
require 'maptool/dependency/dependency'
|
33
|
+
require 'maptool/log/log'
|
34
|
+
require 'maptool/release/release'
|
35
|
+
require 'maptool/tag/tag'
|
36
|
+
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,167 @@
|
|
1
|
+
#
|
2
|
+
# dependency.rb
|
3
|
+
#
|
4
|
+
# Created by 阳君 on 17/11/15.
|
5
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'maptool/dependency/product_class'
|
9
|
+
|
10
|
+
module MapTool
|
11
|
+
|
12
|
+
# Usage
|
13
|
+
class Dependency < Command
|
14
|
+
|
15
|
+
self.command = 'dependency'
|
16
|
+
self.summary = '代码依赖分析'
|
17
|
+
self.description = <<-DESC
|
18
|
+
代码依赖分析\n
|
19
|
+
1. 分析库之间的依赖关系;\n
|
20
|
+
2. 搜索不符合规范的 import 导入,库正确导入方式为 '#import <Foundation/Foundation.h>',错误的方式是'#import "Foundation.h"'.
|
21
|
+
DESC
|
22
|
+
|
23
|
+
def self.options
|
24
|
+
[['--dir', '库路径,多个库用’,‘号分割'],
|
25
|
+
['--output', '日志存放路径,默认当前路径']] + super
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_accessor :dir_array # 目录
|
29
|
+
attr_accessor :output # 输出地址
|
30
|
+
attr_accessor :ignore_frameworks # 忽略的外部库
|
31
|
+
|
32
|
+
def initialize(argv)
|
33
|
+
super
|
34
|
+
self.dir_array = argv.option('dir')
|
35
|
+
self.output = argv.option('output')
|
36
|
+
if self.dir_array
|
37
|
+
self.dir_array = self.dir_array.split(",").reject {|i|
|
38
|
+
i.empty? || !Dir.exist?(i)
|
39
|
+
}
|
40
|
+
end
|
41
|
+
self.output = Dir.pwd unless self.output
|
42
|
+
self.output << "/MapToolDependency.log"
|
43
|
+
self.ignore_frameworks = ["AppKit", "Foundation", "UIKit", "WatchKit"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def validate!
|
47
|
+
super
|
48
|
+
unless self.dir_array && !self.dir_array.empty?
|
49
|
+
puts "库路径为空或不存在".red
|
50
|
+
self.banner!
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def run
|
55
|
+
log = "MapTool 代码依赖分析\n"
|
56
|
+
files = self.search_files
|
57
|
+
log << "文件数:#{files.size}\n"
|
58
|
+
products = self.parsing_files(files)
|
59
|
+
log << "class数:#{products.size}\n"
|
60
|
+
log << self.parsing_class(products)
|
61
|
+
puts "\n分析完毕,打开日志:#{self.output}".green
|
62
|
+
File.write(self.output, log)
|
63
|
+
`open #{self.output}`
|
64
|
+
end
|
65
|
+
|
66
|
+
def search_files
|
67
|
+
puts "\n搜索文件...".green
|
68
|
+
files = []
|
69
|
+
for dir in self.dir_array do
|
70
|
+
Dir.chdir(dir) {
|
71
|
+
puts dir
|
72
|
+
for path in Dir["**/*.{h,m,mm}"] do
|
73
|
+
files << "#{dir}/#{path}"
|
74
|
+
end
|
75
|
+
}
|
76
|
+
end
|
77
|
+
files.uniq!
|
78
|
+
files.sort!
|
79
|
+
end
|
80
|
+
|
81
|
+
def parsing_files(files)
|
82
|
+
puts "\n分析文件...".green
|
83
|
+
hash = {}
|
84
|
+
for file in files
|
85
|
+
puts file
|
86
|
+
fileName = File.basename(file).split(".").first
|
87
|
+
product_class = hash[fileName]
|
88
|
+
unless product_class
|
89
|
+
product_class = ProductClass.new(fileName)
|
90
|
+
hash[fileName] = product_class
|
91
|
+
end
|
92
|
+
case File.extname(file)
|
93
|
+
when ".h"
|
94
|
+
product_class.h_path = file
|
95
|
+
when ".m"
|
96
|
+
product_class.m_path = file
|
97
|
+
when ".mm"
|
98
|
+
product_class.mm_path = file
|
99
|
+
end
|
100
|
+
end
|
101
|
+
return hash
|
102
|
+
end
|
103
|
+
|
104
|
+
def parsing_class(products)
|
105
|
+
puts "\n分析文件内容...".green
|
106
|
+
log = ""
|
107
|
+
all_frameworks = []
|
108
|
+
for project in products.values
|
109
|
+
puts project.name
|
110
|
+
templog = ""
|
111
|
+
hlog = self.parsing_content(project.h_path, all_frameworks, products) if project.h_path
|
112
|
+
templog << hlog if hlog
|
113
|
+
mlog = self.parsing_content(project.m_path, all_frameworks, products) if project.m_path
|
114
|
+
templog << mlog if mlog
|
115
|
+
mmlog = self.parsing_content(project.mm_path, all_frameworks, products) if project.mm_path
|
116
|
+
templog << mmlog if mmlog
|
117
|
+
log << "\n#{project.name}\n#{templog}" unless templog.empty?
|
118
|
+
end
|
119
|
+
all_frameworks.uniq!
|
120
|
+
all_frameworks.sort!
|
121
|
+
return "外部依赖汇总:#{all_frameworks.size} #{all_frameworks.to_s}\n\n" + log
|
122
|
+
end
|
123
|
+
|
124
|
+
def parsing_content(file, all_frameworks, products)
|
125
|
+
frameworks = []
|
126
|
+
warning = []
|
127
|
+
error = []
|
128
|
+
File.open(file, "r") { |file|
|
129
|
+
while line = file.gets
|
130
|
+
if line.include?("#import")
|
131
|
+
if line.include?("<")
|
132
|
+
import = line[/<.*>/][/<.*\//]
|
133
|
+
if import
|
134
|
+
import[0] = ""
|
135
|
+
import[-1] = ""
|
136
|
+
frameworks << import unless self.ignore_frameworks.include?(import)
|
137
|
+
else
|
138
|
+
error << line.chomp
|
139
|
+
end
|
140
|
+
elsif line.include?(".h\"")
|
141
|
+
import = line[/".*.h"/]
|
142
|
+
import[0] = ""
|
143
|
+
import[-1] = ""
|
144
|
+
warning << import unless products[import[0..import.size-3]]
|
145
|
+
end
|
146
|
+
elsif line.include?("@protocol") || line.include?("@interface") || line.include?("@implementation")
|
147
|
+
break
|
148
|
+
end
|
149
|
+
end
|
150
|
+
}
|
151
|
+
all_frameworks.concat(frameworks)
|
152
|
+
frameworks.uniq!
|
153
|
+
frameworks.sort!
|
154
|
+
if !frameworks.empty? || !warning.empty? || !error.empty?
|
155
|
+
log = "#{file}\n"
|
156
|
+
log << "外部依赖:#{frameworks.to_s}\n" unless frameworks.empty?
|
157
|
+
log << "错误依赖:#{error.to_s}\n" unless error.empty?
|
158
|
+
log << "不合理依赖:#{warning.to_s}\n" unless warning.empty?
|
159
|
+
return log
|
160
|
+
end
|
161
|
+
return nil
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# dependency.rb
|
3
|
+
#
|
4
|
+
# Created by 阳君 on 17/11/15.
|
5
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
6
|
+
#
|
7
|
+
|
8
|
+
module MapTool
|
9
|
+
|
10
|
+
# Usage
|
11
|
+
class ProductClass
|
12
|
+
|
13
|
+
attr_accessor :name
|
14
|
+
attr_accessor :h_path
|
15
|
+
attr_accessor :m_path
|
16
|
+
attr_accessor :mm_path
|
17
|
+
|
18
|
+
def initialize(name)
|
19
|
+
self.name = name
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#
|
2
|
+
# gem_version.rb
|
3
|
+
#
|
4
|
+
# Created by 阳君 on 17/11/8.
|
5
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'date'
|
9
|
+
|
10
|
+
module MapTool
|
11
|
+
|
12
|
+
# %y.%m.%d.%H
|
13
|
+
VERSION = Time.now.strftime("%y.%m.%d").freeze unless defined? MapTool::VERSION
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#
|
2
|
+
# log.rb
|
3
|
+
#
|
4
|
+
# Created by 阳君 on 17/12/12.
|
5
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'date'
|
9
|
+
require 'json'
|
10
|
+
|
11
|
+
module MapTool
|
12
|
+
|
13
|
+
# Usage
|
14
|
+
class Log < Command
|
15
|
+
|
16
|
+
self.command = 'log'
|
17
|
+
self.summary = 'log 日志解析,并保留需要的记录'
|
18
|
+
self.description = <<-DESC
|
19
|
+
log 日志解析,并保留需要的记录\n
|
20
|
+
1. 以文件夹的方式解析,并将解析后的日志存放在文件夹内。\n
|
21
|
+
2. 解析时使用字符串匹配,匹配成功的记录会保留 MapTool.log 中。
|
22
|
+
DESC
|
23
|
+
|
24
|
+
def self.options
|
25
|
+
[['--dir', '文件夹地址'],
|
26
|
+
['--match', '匹配的字符串']] + super
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_accessor :dir # 文件夹地址
|
30
|
+
attr_accessor :match # 匹配的字符串
|
31
|
+
|
32
|
+
# 初始化
|
33
|
+
def initialize(argv)
|
34
|
+
super
|
35
|
+
self.dir = argv.option('dir')
|
36
|
+
self.match = argv.option('match')
|
37
|
+
end
|
38
|
+
|
39
|
+
# businrss
|
40
|
+
def validate!
|
41
|
+
super
|
42
|
+
unless self.dir && Dir.exist?(dir) {
|
43
|
+
puts "dir:#{dir} 文件夹不存在".red
|
44
|
+
self.banner!
|
45
|
+
}
|
46
|
+
unless self.match && self.match.length > 0 {
|
47
|
+
puts "match 为空".red
|
48
|
+
self.banner!
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def run
|
53
|
+
Dir.chdir(dir) {
|
54
|
+
log = ""
|
55
|
+
File.delete(LOG_FILE) if File.exist?(LOG_FILE)
|
56
|
+
for path in Dir["**/*.log"] do
|
57
|
+
puts "解析 #{path}"
|
58
|
+
File.open(path, "r") { |file|
|
59
|
+
while line = file.gets
|
60
|
+
if line.include?(match)
|
61
|
+
log << line
|
62
|
+
end
|
63
|
+
end
|
64
|
+
}
|
65
|
+
end
|
66
|
+
File.write(LOG_FILE, log)
|
67
|
+
`open #{LOG_FILE}`
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,141 @@
|
|
1
|
+
#
|
2
|
+
# release.rb
|
3
|
+
#
|
4
|
+
# Created by 阳君 on 17/11/14.
|
5
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'json'
|
9
|
+
require 'net/https'
|
10
|
+
require 'uri'
|
11
|
+
|
12
|
+
module MapTool
|
13
|
+
|
14
|
+
# Usage
|
15
|
+
class Release < Command
|
16
|
+
|
17
|
+
self.command = 'release'
|
18
|
+
self.summary = '收集 pod 的 tag 并发送到钉钉群'
|
19
|
+
self.description = <<-DESC
|
20
|
+
收集 pod 的 tag 并发送到钉钉群。
|
21
|
+
|
22
|
+
注意事项: podfil 和 sender 不可为空。
|
23
|
+
DESC
|
24
|
+
|
25
|
+
def self.options
|
26
|
+
[['--sender', '发送者员工号,如D11221,必须是群内人员'],
|
27
|
+
['--podfile', '包含 pods 库的 Podfile 路径'],
|
28
|
+
['--pods', "pods 库,“,”分割。默认地图事业部的库"],
|
29
|
+
['--content', "内容,默认“@所有人 有更新吗?今天发版,请尽快确认 Tag。”"]] + super
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_accessor :podfile # 文件路径
|
33
|
+
attr_accessor :pods # pod 库
|
34
|
+
attr_accessor :sender # 发送者员工号
|
35
|
+
attr_accessor :content # 默认内容
|
36
|
+
|
37
|
+
# 初始化
|
38
|
+
def initialize(argv)
|
39
|
+
super
|
40
|
+
self.podfile = argv.option('podfile')
|
41
|
+
self.pods = argv.option('pods')
|
42
|
+
self.sender = argv.option('sender')
|
43
|
+
self.content = argv.option('content')
|
44
|
+
self.pods = self.pods.split(",").reject {|i| i.empty? } if self.pods
|
45
|
+
# default
|
46
|
+
self.content = "@所有人 有更新吗?今天发版,请尽快确认 Tag。" unless self.content
|
47
|
+
self.content << "\n\n"
|
48
|
+
unless self.pods
|
49
|
+
self.pods = ['DiDiHomePageMapManager',
|
50
|
+
'DiDiLocationMiddleware',
|
51
|
+
'DiDiMapBusiness',
|
52
|
+
'DMPoiService',
|
53
|
+
'OneKeyReport',
|
54
|
+
'ONEPassengerOrderMap',
|
55
|
+
'ONESelectAddressModule',
|
56
|
+
'ONESTakeCarPlaceBusiness',
|
57
|
+
'DiDiMap',
|
58
|
+
'DiDiLocation',
|
59
|
+
'MapAnalogNavigation',
|
60
|
+
'DMap',
|
61
|
+
'ONESOSOMap',
|
62
|
+
'DiMapKit']
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# businrss
|
67
|
+
def validate!
|
68
|
+
super
|
69
|
+
puts "podfile 为空".red unless self.podfile
|
70
|
+
puts "sender 为空".red unless self.sender
|
71
|
+
self.banner! unless self.podfile && self.sender
|
72
|
+
end
|
73
|
+
|
74
|
+
def run
|
75
|
+
if File.exist?(self.podfile)
|
76
|
+
self.gitPull
|
77
|
+
File.open(self.podfile, "r") { |file|
|
78
|
+
while line = file.gets #标准输入流
|
79
|
+
result = check(line)
|
80
|
+
self.content << "#{result}\n" if result
|
81
|
+
end
|
82
|
+
}
|
83
|
+
self.send
|
84
|
+
else
|
85
|
+
puts "文件# {filePath} 不存在".red
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def gitPull
|
90
|
+
puts "#{self.podfile} git pull".green
|
91
|
+
Dir.chdir(File.dirname(self.podfile)) {| path |
|
92
|
+
system("yjcocoa git pull")
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
private def check (line)
|
97
|
+
pods.each { |pod|
|
98
|
+
if line.include?(pod)
|
99
|
+
pods.delete(pod)
|
100
|
+
line.split(',').each { |item|
|
101
|
+
if item.include?("tag")
|
102
|
+
return "#{pod}, #{item.chomp}"
|
103
|
+
end
|
104
|
+
}
|
105
|
+
end
|
106
|
+
}
|
107
|
+
return nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def send
|
111
|
+
params = {}
|
112
|
+
params["token"] = 'y2uxndvkoweyndixmdaw'
|
113
|
+
# 测试 chat206c428d46590571b24cb54b1318a040
|
114
|
+
# 发版 chat326235a84efbc799daaf5d72522cb8fd
|
115
|
+
params["chatId"] = 'chat326235a84efbc799daaf5d72522cb8fd'
|
116
|
+
params["retry"] = 'false'
|
117
|
+
params["sender"] = self.sender
|
118
|
+
params["content"] = self.content
|
119
|
+
puts "\nsend 钉钉".green
|
120
|
+
puts self.content
|
121
|
+
# send
|
122
|
+
base_path = 'http://api-kylin.intra.xiaojukeji.com/prod_feige_service'
|
123
|
+
uri = URI.parse("#{base_path}/feige/sendDingGroup")
|
124
|
+
req = Net::HTTP::Post.new(uri.path, {'Content-Type' => 'application/json'})
|
125
|
+
req.body = params.to_json
|
126
|
+
res = Net::HTTP.new(uri.host, uri.port).start{|http|
|
127
|
+
http.request(req)
|
128
|
+
}
|
129
|
+
# resbody
|
130
|
+
resbody = JSON.parse(res.body)
|
131
|
+
puts resbody
|
132
|
+
if resbody["code"].to_s == "0"
|
133
|
+
puts "send succeed: #{resbody['message']}".green
|
134
|
+
else
|
135
|
+
puts "send error: #{resbody['message']}".red
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
#
|
2
|
+
# tag.rb
|
3
|
+
#
|
4
|
+
# Created by 阳君 on 17/11/14.
|
5
|
+
# Copyright © 2017年 DiDiChuXing. All rights reserved.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'date'
|
9
|
+
require 'json'
|
10
|
+
|
11
|
+
module MapTool
|
12
|
+
|
13
|
+
# Usage
|
14
|
+
class Tag < Command
|
15
|
+
|
16
|
+
self.command = 'tag'
|
17
|
+
self.summary = '生成 tag 并推送到 GitLab'
|
18
|
+
self.description = <<-DESC
|
19
|
+
生成 tag 并推送到 GitLab。\n
|
20
|
+
生成的 tag 样式: 库名-version-stage-时间戳-suffix\n
|
21
|
+
使用方式:首次或更新版本提交“maptool tag --version=? --stage=? --suffix=?”;只更新时间戳提交“maptool tag”。\n
|
22
|
+
注意事项: version标准写法: x.xx.xxx。重大需求和重构升级第一位,第二位和第三位设为00.000;pm 一般需求升级第二位,第三位设为000;bug 修复升级第三位。
|
23
|
+
DESC
|
24
|
+
|
25
|
+
def self.options
|
26
|
+
[['--version', '版本号:x.xx.xxx,默认 1.00.000'],
|
27
|
+
['--stage', '用于区分是否正式: 开发阶段/提测后 (dev/release),默认 release'],
|
28
|
+
['--suffix', '可扩展的后缀']] + super
|
29
|
+
end
|
30
|
+
|
31
|
+
TAG_FILE = ".tagfile"
|
32
|
+
|
33
|
+
attr_accessor :name # 名称
|
34
|
+
attr_accessor :version # 版本号
|
35
|
+
attr_accessor :stage # 阶段
|
36
|
+
attr_accessor :suffix # 后缀
|
37
|
+
|
38
|
+
# 初始化
|
39
|
+
def initialize(argv)
|
40
|
+
super
|
41
|
+
self.version = argv.option('version')
|
42
|
+
self.stage = argv.option('stage')
|
43
|
+
self.suffix = argv.option('suffix')
|
44
|
+
end
|
45
|
+
|
46
|
+
# businrss
|
47
|
+
def validate!
|
48
|
+
super
|
49
|
+
unless File.exist?('.git')
|
50
|
+
puts "需在项目根目录执行".red
|
51
|
+
self.banner!
|
52
|
+
end
|
53
|
+
if self.version && self.version.size < 8 #x.xx.xxx
|
54
|
+
puts "版本号 #{self.version} 不符合规范 x.xx.xxx".red
|
55
|
+
self.banner!
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def run
|
60
|
+
if File.exist?(TAG_FILE) # 文件存在
|
61
|
+
save = self.version || self.stage || self.suffix
|
62
|
+
self.read_file
|
63
|
+
self.commit_file if save
|
64
|
+
else
|
65
|
+
self.name = File.basename(Dir.pwd)
|
66
|
+
self.version = "1.00.000" unless self.version
|
67
|
+
self.stage = "release" unless self.stage
|
68
|
+
self.commit_file
|
69
|
+
end
|
70
|
+
self.commit_tag
|
71
|
+
end
|
72
|
+
|
73
|
+
def read_file
|
74
|
+
hash = JSON.parse(File.read(TAG_FILE))
|
75
|
+
self.name = hash["name"]
|
76
|
+
self.version = hash["version"] unless self.version
|
77
|
+
self.stage = hash["stage"] unless self.stage
|
78
|
+
self.suffix = hash["suffix"] unless self.suffix
|
79
|
+
end
|
80
|
+
|
81
|
+
def commit_file
|
82
|
+
puts "update #{TAG_FILE}".green
|
83
|
+
localChanges = !(`git stash` =~ /No local changes to save/)
|
84
|
+
self.write_file
|
85
|
+
`git add .`
|
86
|
+
`git commit -m "update #{TAG_FILE}"`
|
87
|
+
`git push`
|
88
|
+
`git stash pop` if localChanges
|
89
|
+
end
|
90
|
+
|
91
|
+
def write_file
|
92
|
+
params = {}
|
93
|
+
params["name"] = self.name
|
94
|
+
params["version"] = self.version
|
95
|
+
params["stage"] = self.stage
|
96
|
+
params["suffix"] = self.suffix
|
97
|
+
File.write(TAG_FILE, JSON.pretty_generate(params))
|
98
|
+
end
|
99
|
+
|
100
|
+
def commit_tag
|
101
|
+
tag = "#{self.name}-#{self.version}-"
|
102
|
+
tag << "#{self.stage}-" if self.stage && self.stage.size > 0
|
103
|
+
tag << Time.now.strftime("%Y%m%d%H%M")
|
104
|
+
tag << "-#{self.suffix}" if self.suffix && self.suffix.size > 0
|
105
|
+
puts "build tag #{tag}".green
|
106
|
+
system("yjcocoa git tag --add=#{tag}")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
data/lib/maptool/test.rb
ADDED
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: maptool
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 17.12.12
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- 阳君
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-12-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: claide
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.2
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.0.2
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: colored2
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 3.1.2
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '3.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 3.1.2
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: yjcocoa
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '17.8'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 17.8.26
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '17.8'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 17.8.26
|
73
|
+
description: 地图事业部 iOS 脚本工具
|
74
|
+
email:
|
75
|
+
- yangjunyang@didichuxing.com
|
76
|
+
executables:
|
77
|
+
- maptool
|
78
|
+
extensions: []
|
79
|
+
extra_rdoc_files: []
|
80
|
+
files:
|
81
|
+
- LICENSE
|
82
|
+
- README.md
|
83
|
+
- bin/maptool
|
84
|
+
- lib/maptool.rb
|
85
|
+
- lib/maptool/command.rb
|
86
|
+
- lib/maptool/dependency/dependency.rb
|
87
|
+
- lib/maptool/dependency/product_class.rb
|
88
|
+
- lib/maptool/gem_version.rb
|
89
|
+
- lib/maptool/log/log.rb
|
90
|
+
- lib/maptool/release/release.rb
|
91
|
+
- lib/maptool/tag/tag.rb
|
92
|
+
- lib/maptool/test.rb
|
93
|
+
homepage: https://git.xiaojukeji.com/mapkit-ios/maptool
|
94
|
+
licenses:
|
95
|
+
- MIT
|
96
|
+
metadata: {}
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 2.0.0
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 2.4.8
|
114
|
+
signing_key:
|
115
|
+
specification_version: 3
|
116
|
+
summary: MapTool, the Map developer managment tool.
|
117
|
+
test_files: []
|