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