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 17ba991379Sopenharmony_ci 18ba991379Sopenharmony_ciimport ( 19ba991379Sopenharmony_ci "encoding/json" 20ba991379Sopenharmony_ci "fmt" 21ba991379Sopenharmony_ci "fotff/utils" 22ba991379Sopenharmony_ci "net/http" 23ba991379Sopenharmony_ci "time" 24ba991379Sopenharmony_ci) 25ba991379Sopenharmony_ci 26ba991379Sopenharmony_citype CompareParam struct { 27ba991379Sopenharmony_ci Head string 28ba991379Sopenharmony_ci Base string 29ba991379Sopenharmony_ci Repo string 30ba991379Sopenharmony_ci Owner string 31ba991379Sopenharmony_ci} 32ba991379Sopenharmony_ci 33ba991379Sopenharmony_citype CompareResp struct { 34ba991379Sopenharmony_ci Commits []*Commit `json:"commits"` 35ba991379Sopenharmony_ci} 36ba991379Sopenharmony_ci 37ba991379Sopenharmony_citype Commit struct { 38ba991379Sopenharmony_ci CommitExtend `json:"-"` 39ba991379Sopenharmony_ci URL string `json:"url"` 40ba991379Sopenharmony_ci SHA string `json:"sha"` 41ba991379Sopenharmony_ci Commit struct { 42ba991379Sopenharmony_ci Committer struct { 43ba991379Sopenharmony_ci Date string `json:"date"` 44ba991379Sopenharmony_ci } `json:"committer"` 45ba991379Sopenharmony_ci Message string `json:"message"` 46ba991379Sopenharmony_ci } `json:"commit"` 47ba991379Sopenharmony_ci Parents []struct { 48ba991379Sopenharmony_ci SHA string `json:"sha"` 49ba991379Sopenharmony_ci URL string `json:"url"` 50ba991379Sopenharmony_ci } `json:"parents"` 51ba991379Sopenharmony_ci Files []struct { 52ba991379Sopenharmony_ci Filename string `json:"filename"` 53ba991379Sopenharmony_ci Status string `json:"status"` 54ba991379Sopenharmony_ci Patch string `json:"patch,omitempty"` 55ba991379Sopenharmony_ci } `json:"files,omitempty"` 56ba991379Sopenharmony_ci} 57ba991379Sopenharmony_ci 58ba991379Sopenharmony_citype CommitExtend struct { 59ba991379Sopenharmony_ci Owner string 60ba991379Sopenharmony_ci Repo string 61ba991379Sopenharmony_ci} 62ba991379Sopenharmony_ci 63ba991379Sopenharmony_cifunc GetLatestMRBefore(owner, repo, branch string, before string) (ret *Commit, err error) { 64ba991379Sopenharmony_ci branchResp, err := GetBranch(owner, repo, branch) 65ba991379Sopenharmony_ci if err != nil { 66ba991379Sopenharmony_ci return nil, err 67ba991379Sopenharmony_ci } 68ba991379Sopenharmony_ci head := branchResp.Commit 69ba991379Sopenharmony_ci head.Owner = owner 70ba991379Sopenharmony_ci head.Repo = repo 71ba991379Sopenharmony_ci for head.Commit.Committer.Date > before { 72ba991379Sopenharmony_ci if head, err = GetCommit(owner, repo, head.Parents[0].SHA); err != nil { 73ba991379Sopenharmony_ci return nil, err 74ba991379Sopenharmony_ci } 75ba991379Sopenharmony_ci } 76ba991379Sopenharmony_ci return head, nil 77ba991379Sopenharmony_ci} 78ba991379Sopenharmony_ci 79ba991379Sopenharmony_cifunc GetBetweenTimeMRs(owner, repo, branch string, from, to time.Time) (ret []*Commit, err error) { 80ba991379Sopenharmony_ci branchResp, err := GetBranch(owner, repo, branch) 81ba991379Sopenharmony_ci if err != nil { 82ba991379Sopenharmony_ci return nil, err 83ba991379Sopenharmony_ci } 84ba991379Sopenharmony_ci fromStr := from.UTC().Format(time.RFC3339) 85ba991379Sopenharmony_ci toStr := to.UTC().Format(time.RFC3339) 86ba991379Sopenharmony_ci head := branchResp.Commit 87ba991379Sopenharmony_ci head.Owner = owner 88ba991379Sopenharmony_ci head.Repo = repo 89ba991379Sopenharmony_ci for head.Commit.Committer.Date > fromStr { 90ba991379Sopenharmony_ci if head.Commit.Committer.Date < toStr { 91ba991379Sopenharmony_ci ret = append(ret, head) 92ba991379Sopenharmony_ci } 93ba991379Sopenharmony_ci if head, err = GetCommit(owner, repo, head.Parents[0].SHA); err != nil { 94ba991379Sopenharmony_ci return nil, err 95ba991379Sopenharmony_ci } 96ba991379Sopenharmony_ci } 97ba991379Sopenharmony_ci return ret, nil 98ba991379Sopenharmony_ci} 99ba991379Sopenharmony_ci 100ba991379Sopenharmony_cifunc GetBetweenMRs(param CompareParam) ([]*Commit, error) { 101ba991379Sopenharmony_ci commits, err := GetBetweenCommits(param) 102ba991379Sopenharmony_ci if err != nil { 103ba991379Sopenharmony_ci return nil, err 104ba991379Sopenharmony_ci } 105ba991379Sopenharmony_ci var ret []*Commit 106ba991379Sopenharmony_ci head := param.Head 107ba991379Sopenharmony_ci for head != param.Base { 108ba991379Sopenharmony_ci for _, commit := range commits { 109ba991379Sopenharmony_ci if commit.SHA != head { 110ba991379Sopenharmony_ci continue 111ba991379Sopenharmony_ci } 112ba991379Sopenharmony_ci commit.Owner = param.Owner 113ba991379Sopenharmony_ci commit.Repo = param.Repo 114ba991379Sopenharmony_ci ret = append(ret, commit) 115ba991379Sopenharmony_ci head = commit.Parents[0].SHA 116ba991379Sopenharmony_ci } 117ba991379Sopenharmony_ci } 118ba991379Sopenharmony_ci return ret, nil 119ba991379Sopenharmony_ci} 120ba991379Sopenharmony_ci 121ba991379Sopenharmony_cifunc GetBetweenCommits(param CompareParam) ([]*Commit, error) { 122ba991379Sopenharmony_ci url := fmt.Sprintf("https://gitee.com/api/v5/repos/%s/%s/compare/%s...%s", param.Owner, param.Repo, param.Base, param.Head) 123ba991379Sopenharmony_ci var resp []byte 124ba991379Sopenharmony_ci if c, found := utils.CacheGet("gitee", url); found { 125ba991379Sopenharmony_ci resp = c.([]byte) 126ba991379Sopenharmony_ci } else { 127ba991379Sopenharmony_ci var err error 128ba991379Sopenharmony_ci resp, err = utils.DoSimpleHttpReq(http.MethodGet, url, nil, nil) 129ba991379Sopenharmony_ci if err != nil { 130ba991379Sopenharmony_ci return nil, err 131ba991379Sopenharmony_ci } 132ba991379Sopenharmony_ci utils.CacheSet("gitee", url, resp) 133ba991379Sopenharmony_ci } 134ba991379Sopenharmony_ci var compareResp CompareResp 135ba991379Sopenharmony_ci if err := json.Unmarshal(resp, &compareResp); err != nil { 136ba991379Sopenharmony_ci return nil, err 137ba991379Sopenharmony_ci } 138ba991379Sopenharmony_ci return compareResp.Commits, nil 139ba991379Sopenharmony_ci} 140