/* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package gitee_common import ( "encoding/json" "fmt" "fotff/utils" "github.com/sirupsen/logrus" "net/http" "os" "path/filepath" "sort" "time" ) type TagQueryParam struct { ProjectName string `json:"projectName"` Branch string `json:"branch"` ManifestFile string `json:"manifestFile"` StartTime string `json:"startTime"` EndTime string `json:"endTime"` PageNum int `json:"pageNum"` PageSize int `json:"pageSize"` } type TagResp struct { Result struct { TagList []*Tag `json:"tagList"` Total int `json:"total"` } `json:"result"` } type Tag struct { Id string `json:"id"` Issue string `json:"issue"` PrList []string `json:"prList"` TagFileURL string `json:"tagFileUrl"` Timestamp string `json:"timestamp"` } func (m *Manager) stepsFromCI(from, to string) (pkgs []string, err error) { startTime, err := parseTime(from) if err != nil { return nil, err } endTime, err := parseTime(to) if err != nil { return nil, err } return m.getAllStepsFromTags(startTime, endTime) } func (m *Manager) getAllStepsFromTags(from, to time.Time) (pkgs []string, err error) { tags, err := m.getAllTags(from, to) if err != nil { return nil, err } for _, tag := range tags { pkg, err := m.genTagPackage(tag) if err != nil { return nil, err } pkgs = append(pkgs, pkg) } return pkgs, nil } func (m *Manager) getAllTags(from, to time.Time) (ret []*Tag, err error) { var deDup = make(map[string]*Tag) var pageNum = 1 for { var q = TagQueryParam{ ProjectName: "openharmony", Branch: m.ManifestBranch, ManifestFile: "default.xml", StartTime: from.Local().Format("2006-01-02"), EndTime: to.Local().Format("2006-01-02"), PageNum: pageNum, PageSize: 10000, } data, err := json.Marshal(q) if err != nil { return nil, err } 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"}) if err != nil { return nil, err } var tagResp TagResp if err := json.Unmarshal(resp, &tagResp); err != nil { return nil, err } for _, tag := range tagResp.Result.TagList { if _, ok := deDup[tag.Id]; ok { continue } deDup[tag.Id] = tag date, err := time.ParseInLocation("2006-01-02 15:04:05", tag.Timestamp, time.Local) if err != nil { return nil, err } if date.After(from) && date.Before(to) { ret = append(ret, tag) } } if len(deDup) == tagResp.Result.Total { break } pageNum++ } sort.Slice(ret, func(i, j int) bool { return ret[i].Timestamp < ret[j].Timestamp }) return ret, nil } func (m *Manager) genTagPackage(tag *Tag) (pkg string, err error) { defer func() { logrus.Infof("package dir %s for tag %v generated", pkg, tag.TagFileURL) }() if err := os.MkdirAll(filepath.Join(m.Workspace, tag.Id), 0750); err != nil { return "", err } var issues []string if len(tag.Issue) == 0 { issues = tag.PrList } else { issues = []string{tag.Issue} } if err := os.WriteFile(filepath.Join(m.Workspace, tag.Id, "__last_issue__"), []byte(fmt.Sprintf("%v", issues)), 0640); err != nil { return "", err } resp, err := utils.DoSimpleHttpReq(http.MethodGet, tag.TagFileURL, nil, nil) if err != nil { return "", err } err = os.WriteFile(filepath.Join(m.Workspace, tag.Id, "manifest_tag.xml"), resp, 0640) if err != nil { return "", err } return tag.Id, nil }