15
15
package cmd
16
16
17
17
import (
18
+ "flag"
18
19
"fmt"
19
20
"io"
20
21
"net/url"
@@ -29,6 +30,7 @@ import (
29
30
"e.coding.net/codingcorp/coding-cli/pkg/model"
30
31
31
32
"e.coding.net/codingcorp/coding-cli/pkg/request"
33
+ "github.com/golang/glog"
32
34
"github.com/spf13/cobra"
33
35
)
34
36
@@ -38,6 +40,7 @@ const (
38
40
diffURI = "/api/user/codingcorp/project/coding-dev/git/compare_v2?source=%s&target=%s&w=&prefix="
39
41
mergeURI = "/api/user/codingcorp/project/coding-dev/git/merge/%d"
40
42
gitBlobURI = "/api/user/codingcorp/project/coding-dev/git/blob/%s"
43
+ referURI = "/api/user/codingcorp/project/coding-dev/resource_reference/%d"
41
44
currentUserURI = "/api/current_user"
42
45
diffTemplate = "/p/coding-dev/git/compare/%s...%s"
43
46
)
@@ -110,26 +113,21 @@ var product string
110
113
111
114
// releaseCmd represents the release command
112
115
var releaseCmd = & cobra.Command {
113
- Use : "release [分支、提交或标签] " ,
116
+ Use : "release 目标分支 或 源分支 目标分支 " ,
114
117
Short : "创建版本发布" ,
115
118
Long : `创建版本发布
116
119
117
120
为分支、提交或标签(简称 ref)创建版本发布,版本发布分为常规发布和紧急修复两类。` ,
118
121
Args : cobra .MinimumNArgs (1 ),
119
122
Run : func (cmd * cobra.Command , args []string ) {
120
- if len (args ) == 0 {
121
- fmt .Fprintln (os .Stderr , "需提供分支名、提交或标签" )
122
- return
123
- }
124
- target := args [0 ]
125
- source , err := defaultBranchCommitID ()
123
+ source , target , err := parseArgs (args )
126
124
if err != nil {
127
- fmt . Fprintf ( os . Stderr , "无法获取默认分支, %v \n " , err )
125
+ glog . Error ( "解析目标分支参数异常,%v " , err )
128
126
return
129
127
}
130
128
r , err := release (source , target )
131
129
if err != nil {
132
- fmt . Fprintf ( os . Stderr , "无法创建版本发布, %v\n " , err )
130
+ glog . Error ( "无法创建版本发布, %v" , err )
133
131
return
134
132
}
135
133
// 计算发布版本号
@@ -141,7 +139,7 @@ var releaseCmd = &cobra.Command{
141
139
// 获取当前用户
142
140
user , err := currentUser ()
143
141
if err != nil {
144
- fmt . Fprintf ( os . Stderr , "获取负责人失败, %v\n " , err )
142
+ glog . Error ( "获取负责人失败, %v" , err )
145
143
return
146
144
}
147
145
r .Principal = user .Name
@@ -167,16 +165,35 @@ var releaseCmd = &cobra.Command{
167
165
err = r .save (f )
168
166
if err != nil {
169
167
if shouldSave {
170
- fmt . Fprintf ( os . Stderr , "文件保存失败, %v\n " , err )
168
+ glog . Error ( "文件保存失败, %v" , err )
171
169
} else {
172
- fmt . Fprintf ( os . Stderr , "%v" , err )
170
+ glog . Error ( "%v" , err )
173
171
}
174
172
} else if shouldSave {
175
- fmt . Printf ("版本发布 %s 已保存到 %s\n " , r .Release , output )
173
+ glog . Error ("版本发布 %s 已保存到 %s" , r .Release , output )
176
174
}
177
175
},
178
176
}
179
177
178
+ func parseArgs (args []string ) (source string , target string , err error ) {
179
+ argsSize := len (args )
180
+ if argsSize == 0 {
181
+ return "" , "" , fmt .Errorf ("需提供分支名、提交或标签" )
182
+ }
183
+ if argsSize == 1 {
184
+ target = args [0 ]
185
+ source , err = defaultBranchCommitID ()
186
+ if err != nil {
187
+ return "" , "" , fmt .Errorf ("无法获取默认分支, %v" , err )
188
+ }
189
+ }
190
+ if argsSize == 2 {
191
+ source = args [0 ]
192
+ target = args [1 ]
193
+ }
194
+ return
195
+ }
196
+
180
197
func contains (s interface {}, elem interface {}) bool {
181
198
arrV := reflect .ValueOf (s )
182
199
if arrV .Kind () == reflect .Slice {
@@ -190,15 +207,16 @@ func contains(s interface{}, elem interface{}) bool {
190
207
}
191
208
192
209
type createRelease struct {
193
- Changes []changelog
194
- Diff string
195
- Hotfix bool
196
- Principal string
197
- Milestone string
198
- Services []string
199
- Release string
200
- Migration []migration
201
- Master string
210
+ Changes []changelog
211
+ Diff string
212
+ Hotfix bool
213
+ Principal string
214
+ Milestone string
215
+ Services []string
216
+ Release string
217
+ Migration []migration
218
+ Master string
219
+ PostMaster string
202
220
}
203
221
204
222
var funcMap = template.FuncMap {
@@ -210,7 +228,7 @@ var funcMap = template.FuncMap{
210
228
func (release * createRelease ) save (o io.Writer ) error {
211
229
outputTpl , err := template .New ("output" ).Funcs (funcMap ).Parse (`## ChangeLog
212
230
213
- {{range .Changes}}- {{.Title}} #{{.MergeID}}
231
+ {{range .Changes}}- {{.Title}}{{range .TaskIDs}} #{{.}}{{end}} #{{.MergeID}}
214
232
{{end}}
215
233
216
234
## Diff
@@ -249,7 +267,7 @@ func (release *createRelease) save(o io.Writer) error {
249
267
### 发布后 master 指向
250
268
251
269
` + "`" + "`" + "`" + `
252
- {{.Master }}
270
+ {{.PostMaster }}
253
271
` + "`" + "`" + "`" + `
254
272
` )
255
273
@@ -289,17 +307,19 @@ func release(src string, target string) (r *createRelease, err error) {
289
307
if len (src ) != 40 {
290
308
s , err = commitID (src )
291
309
}
292
- r .Master = s
293
-
294
310
if err != nil {
295
311
return nil , err
296
312
}
313
+ r .Master = s
297
314
if len (target ) != 40 {
298
315
t , err = commitID (target )
299
316
}
300
317
if err != nil {
301
318
return nil , err
302
319
}
320
+ r .PostMaster = t
321
+
322
+ glog .Infof ("正在创建基于 %s(%s)...%s(%s) 的版本发布" , s , src , t , target )
303
323
304
324
// 变更记录
305
325
d , err := diff (s , t )
@@ -310,6 +330,7 @@ func release(src string, target string) (r *createRelease, err error) {
310
330
if err != nil {
311
331
return nil , err
312
332
}
333
+ glog .Infof ("此版本包含 %d 个主要改动" , len (r .Changes ))
313
334
314
335
// 网页版本对比链接
315
336
r .Diff , err = compareURL (s , t )
@@ -354,12 +375,7 @@ func file(c model.Commit, n string) (string, error) {
354
375
func migrationScripts (c []changelog ) ([]migration , error ) {
355
376
scripts := make ([]migration , 0 )
356
377
for _ , log := range c {
357
- req := request .NewGet (fmt .Sprintf (mergeURI , log .MergeID ))
358
- merge := model.Merge {}
359
- err := req .SendAndUnmarshal (& merge )
360
- if err != nil {
361
- return nil , fmt .Errorf ("获取合并请求失败, mergeID: %d, %v" , log .MergeID , err )
362
- }
378
+ merge := log .Merge
363
379
paths := merge .MergeRequest .DiffStat .Paths
364
380
for _ , path := range paths {
365
381
if path .Deletions == 0 && path .Insertions > 0 {
@@ -385,7 +401,7 @@ func findServices(names []string) []string {
385
401
for _ , name := range names {
386
402
index , err := matchPattern (name , patterns )
387
403
if err != nil {
388
- fmt . Println ( err )
404
+ glog . Infof ( "%v" , err )
389
405
continue
390
406
}
391
407
if index > servicesSize - 1 {
@@ -415,13 +431,15 @@ func matchPattern(file string, patterns []string) (int, error) {
415
431
return index , nil
416
432
}
417
433
}
418
- return - 1 , fmt .Errorf ("无匹配结果, 文件不包含以下前缀\n \ t 文件:%s\n \t 前缀:[%s]" , file , strings .Join (patterns , ", " ))
434
+ return - 1 , fmt .Errorf ("无匹配结果, 文件不包含以下前缀\t 文件:%s\t 前缀:[%s]" , file , strings .Join (patterns , ", " ))
419
435
}
420
436
421
437
// changelog 包含 Merge Request 标题、Merge Request 完整信息以及任务完整信息
422
438
type changelog struct {
423
439
Title string
424
440
MergeID int
441
+ TaskIDs []int
442
+ Merge model.Merge
425
443
}
426
444
427
445
func changelogs (commits []model.Commit ) ([]changelog , error ) {
@@ -438,11 +456,40 @@ func changelogs(commits []model.Commit) ([]changelog, error) {
438
456
if mergeID != 0 {
439
457
c .MergeID = mergeID
440
458
}
459
+ req := request .NewGet (fmt .Sprintf (mergeURI , mergeID ))
460
+ merge := model.Merge {}
461
+ err := req .SendAndUnmarshal (& merge )
462
+ if err != nil {
463
+ return nil , fmt .Errorf ("获取合并请求失败, mergeID: %d, %v" , mergeID , err )
464
+ }
465
+ c .Merge = merge
466
+ glog .Infof ("提取到合并请求 #%d - %s" , mergeID , merge .MergeRequest .Title )
467
+ ref , err := refer (mergeID )
468
+ if err != nil {
469
+ return nil , err
470
+ }
471
+ if ref .Task != nil {
472
+ taskIDs := make ([]int , 0 )
473
+ for _ , t := range ref .Task {
474
+ taskIDs = append (taskIDs , t .Code )
475
+ }
476
+ c .TaskIDs = taskIDs
477
+ }
441
478
changelogs = append (changelogs , c )
442
479
}
443
480
return changelogs , nil
444
481
}
445
482
483
+ func refer (resourceID int ) (* model.Refer , error ) {
484
+ req := request .NewGet (fmt .Sprintf (referURI , resourceID ))
485
+ refer := model.Refer {}
486
+ err := req .SendAndUnmarshal (& refer )
487
+ if err != nil {
488
+ return nil , fmt .Errorf ("获取资源引用请求失败, resourceID: %d, %v" , resourceID , err )
489
+ }
490
+ return & refer , nil
491
+ }
492
+
446
493
var mergeRequestIDReg = regexp .MustCompile (`merge/(\d+)` )
447
494
448
495
func mergeRequestID (msg string ) int {
@@ -519,4 +566,5 @@ func init() {
519
566
releaseCmd .Flags ().StringVarP (& output , "output" , "o" , "" , "保存到文件" )
520
567
releaseCmd .Flags ().StringVarP (& rtype , "type" , "t" , "normal" , "发布类型,hotfix - 紧急修复或者 normal - 常规更新" )
521
568
releaseCmd .Flags ().StringVarP (& product , "product" , "p" , "enterprise-saas" , "产品线,enterprise-saas 或者 professional" )
569
+ flag .Parse ()
522
570
}
0 commit comments