1ba991379Sopenharmony_ci/*
2ba991379Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3ba991379Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ba991379Sopenharmony_ci * you may not use this file except in compliance with the License.
5ba991379Sopenharmony_ci * You may obtain a copy of the License at
6ba991379Sopenharmony_ci *
7ba991379Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ba991379Sopenharmony_ci *
9ba991379Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ba991379Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ba991379Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ba991379Sopenharmony_ci * See the License for the specific language governing permissions and
13ba991379Sopenharmony_ci * limitations under the License.
14ba991379Sopenharmony_ci */
15ba991379Sopenharmony_ci
16ba991379Sopenharmony_cipackage gitee_common
17ba991379Sopenharmony_ci
18ba991379Sopenharmony_ciimport (
19ba991379Sopenharmony_ci	"encoding/json"
20ba991379Sopenharmony_ci	"fmt"
21ba991379Sopenharmony_ci	"fotff/utils"
22ba991379Sopenharmony_ci	"github.com/sirupsen/logrus"
23ba991379Sopenharmony_ci	"net/http"
24ba991379Sopenharmony_ci	"os"
25ba991379Sopenharmony_ci	"path/filepath"
26ba991379Sopenharmony_ci	"sort"
27ba991379Sopenharmony_ci	"time"
28ba991379Sopenharmony_ci)
29ba991379Sopenharmony_ci
30ba991379Sopenharmony_citype TagQueryParam struct {
31ba991379Sopenharmony_ci	ProjectName  string `json:"projectName"`
32ba991379Sopenharmony_ci	Branch       string `json:"branch"`
33ba991379Sopenharmony_ci	ManifestFile string `json:"manifestFile"`
34ba991379Sopenharmony_ci	StartTime    string `json:"startTime"`
35ba991379Sopenharmony_ci	EndTime      string `json:"endTime"`
36ba991379Sopenharmony_ci	PageNum      int    `json:"pageNum"`
37ba991379Sopenharmony_ci	PageSize     int    `json:"pageSize"`
38ba991379Sopenharmony_ci}
39ba991379Sopenharmony_ci
40ba991379Sopenharmony_citype TagResp struct {
41ba991379Sopenharmony_ci	Result struct {
42ba991379Sopenharmony_ci		TagList []*Tag `json:"tagList"`
43ba991379Sopenharmony_ci		Total   int    `json:"total"`
44ba991379Sopenharmony_ci	} `json:"result"`
45ba991379Sopenharmony_ci}
46ba991379Sopenharmony_ci
47ba991379Sopenharmony_citype Tag struct {
48ba991379Sopenharmony_ci	Id         string   `json:"id"`
49ba991379Sopenharmony_ci	Issue      string   `json:"issue"`
50ba991379Sopenharmony_ci	PrList     []string `json:"prList"`
51ba991379Sopenharmony_ci	TagFileURL string   `json:"tagFileUrl"`
52ba991379Sopenharmony_ci	Timestamp  string   `json:"timestamp"`
53ba991379Sopenharmony_ci}
54ba991379Sopenharmony_ci
55ba991379Sopenharmony_cifunc (m *Manager) stepsFromCI(from, to string) (pkgs []string, err error) {
56ba991379Sopenharmony_ci	startTime, err := parseTime(from)
57ba991379Sopenharmony_ci	if err != nil {
58ba991379Sopenharmony_ci		return nil, err
59ba991379Sopenharmony_ci	}
60ba991379Sopenharmony_ci	endTime, err := parseTime(to)
61ba991379Sopenharmony_ci	if err != nil {
62ba991379Sopenharmony_ci		return nil, err
63ba991379Sopenharmony_ci	}
64ba991379Sopenharmony_ci	return m.getAllStepsFromTags(startTime, endTime)
65ba991379Sopenharmony_ci}
66ba991379Sopenharmony_ci
67ba991379Sopenharmony_cifunc (m *Manager) getAllStepsFromTags(from, to time.Time) (pkgs []string, err error) {
68ba991379Sopenharmony_ci	tags, err := m.getAllTags(from, to)
69ba991379Sopenharmony_ci	if err != nil {
70ba991379Sopenharmony_ci		return nil, err
71ba991379Sopenharmony_ci	}
72ba991379Sopenharmony_ci	for _, tag := range tags {
73ba991379Sopenharmony_ci		pkg, err := m.genTagPackage(tag)
74ba991379Sopenharmony_ci		if err != nil {
75ba991379Sopenharmony_ci			return nil, err
76ba991379Sopenharmony_ci		}
77ba991379Sopenharmony_ci		pkgs = append(pkgs, pkg)
78ba991379Sopenharmony_ci	}
79ba991379Sopenharmony_ci	return pkgs, nil
80ba991379Sopenharmony_ci}
81ba991379Sopenharmony_ci
82ba991379Sopenharmony_cifunc (m *Manager) getAllTags(from, to time.Time) (ret []*Tag, err error) {
83ba991379Sopenharmony_ci	var deDup = make(map[string]*Tag)
84ba991379Sopenharmony_ci	var pageNum = 1
85ba991379Sopenharmony_ci	for {
86ba991379Sopenharmony_ci		var q = TagQueryParam{
87ba991379Sopenharmony_ci			ProjectName:  "openharmony",
88ba991379Sopenharmony_ci			Branch:       m.ManifestBranch,
89ba991379Sopenharmony_ci			ManifestFile: "default.xml",
90ba991379Sopenharmony_ci			StartTime:    from.Local().Format("2006-01-02"),
91ba991379Sopenharmony_ci			EndTime:      to.Local().Format("2006-01-02"),
92ba991379Sopenharmony_ci			PageNum:      pageNum,
93ba991379Sopenharmony_ci			PageSize:     10000,
94ba991379Sopenharmony_ci		}
95ba991379Sopenharmony_ci		data, err := json.Marshal(q)
96ba991379Sopenharmony_ci		if err != nil {
97ba991379Sopenharmony_ci			return nil, err
98ba991379Sopenharmony_ci		}
99ba991379Sopenharmony_ci		resp, err := utils.DoSimpleHttpReq(http.MethodPost, "http://ci.openharmony.cn/api/ci-backend/ci-portal/v1/build/tag", data, map[string]string{"Content-Type": "application/json;charset=UTF-8"})
100ba991379Sopenharmony_ci		if err != nil {
101ba991379Sopenharmony_ci			return nil, err
102ba991379Sopenharmony_ci		}
103ba991379Sopenharmony_ci		var tagResp TagResp
104ba991379Sopenharmony_ci		if err := json.Unmarshal(resp, &tagResp); err != nil {
105ba991379Sopenharmony_ci			return nil, err
106ba991379Sopenharmony_ci		}
107ba991379Sopenharmony_ci		for _, tag := range tagResp.Result.TagList {
108ba991379Sopenharmony_ci			if _, ok := deDup[tag.Id]; ok {
109ba991379Sopenharmony_ci				continue
110ba991379Sopenharmony_ci			}
111ba991379Sopenharmony_ci			deDup[tag.Id] = tag
112ba991379Sopenharmony_ci			date, err := time.ParseInLocation("2006-01-02 15:04:05", tag.Timestamp, time.Local)
113ba991379Sopenharmony_ci			if err != nil {
114ba991379Sopenharmony_ci				return nil, err
115ba991379Sopenharmony_ci			}
116ba991379Sopenharmony_ci			if date.After(from) && date.Before(to) {
117ba991379Sopenharmony_ci				ret = append(ret, tag)
118ba991379Sopenharmony_ci			}
119ba991379Sopenharmony_ci		}
120ba991379Sopenharmony_ci		if len(deDup) == tagResp.Result.Total {
121ba991379Sopenharmony_ci			break
122ba991379Sopenharmony_ci		}
123ba991379Sopenharmony_ci		pageNum++
124ba991379Sopenharmony_ci	}
125ba991379Sopenharmony_ci	sort.Slice(ret, func(i, j int) bool {
126ba991379Sopenharmony_ci		return ret[i].Timestamp < ret[j].Timestamp
127ba991379Sopenharmony_ci	})
128ba991379Sopenharmony_ci	return ret, nil
129ba991379Sopenharmony_ci}
130ba991379Sopenharmony_ci
131ba991379Sopenharmony_cifunc (m *Manager) genTagPackage(tag *Tag) (pkg string, err error) {
132ba991379Sopenharmony_ci	defer func() {
133ba991379Sopenharmony_ci		logrus.Infof("package dir %s for tag %v generated", pkg, tag.TagFileURL)
134ba991379Sopenharmony_ci	}()
135ba991379Sopenharmony_ci	if err := os.MkdirAll(filepath.Join(m.Workspace, tag.Id), 0750); err != nil {
136ba991379Sopenharmony_ci		return "", err
137ba991379Sopenharmony_ci	}
138ba991379Sopenharmony_ci	var issues []string
139ba991379Sopenharmony_ci	if len(tag.Issue) == 0 {
140ba991379Sopenharmony_ci		issues = tag.PrList
141ba991379Sopenharmony_ci	} else {
142ba991379Sopenharmony_ci		issues = []string{tag.Issue}
143ba991379Sopenharmony_ci	}
144ba991379Sopenharmony_ci	if err := os.WriteFile(filepath.Join(m.Workspace, tag.Id, "__last_issue__"), []byte(fmt.Sprintf("%v", issues)), 0640); err != nil {
145ba991379Sopenharmony_ci		return "", err
146ba991379Sopenharmony_ci	}
147ba991379Sopenharmony_ci	resp, err := utils.DoSimpleHttpReq(http.MethodGet, tag.TagFileURL, nil, nil)
148ba991379Sopenharmony_ci	if err != nil {
149ba991379Sopenharmony_ci		return "", err
150ba991379Sopenharmony_ci	}
151ba991379Sopenharmony_ci	err = os.WriteFile(filepath.Join(m.Workspace, tag.Id, "manifest_tag.xml"), resp, 0640)
152ba991379Sopenharmony_ci	if err != nil {
153ba991379Sopenharmony_ci		return "", err
154ba991379Sopenharmony_ci	}
155ba991379Sopenharmony_ci	return tag.Id, nil
156ba991379Sopenharmony_ci}
157