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