fix(gitea-api): authorize for issues in private repositories / organizations

This also fixes an issue with the taskwarrior filters to not overwrite
existing other tasks from other repositories.
This commit is contained in:
2023-10-27 16:42:33 +02:00
parent 489faae58b
commit aae91aa4e7
6 changed files with 48 additions and 28 deletions

View File

@@ -25,16 +25,17 @@ type Comment struct {
} }
func (gitea *Gitea) GetComments(repo Repository) ([]Comment, error) { func (gitea *Gitea) GetComments(repo Repository) ([]Comment, error) {
client := &http.Client{}
url := fmt.Sprintf("%s/repos/%s/issues/comments", gitea.Url(), repo.Full_name) url := fmt.Sprintf("%s/repos/%s/issues/comments", gitea.Url(), repo.Full_name)
response, err := http.Get(url) request, err := http.NewRequest(http.MethodGet, url, nil)
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
response, err := client.Do(request)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer response.Body.Close() defer response.Body.Close()
var data []Comment var data []Comment
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&data); err != nil { if err = decoder.Decode(&data); err != nil {
return nil, err return nil, err
} }
@@ -45,16 +46,17 @@ func (gitea *Gitea) GetComments(repo Repository) ([]Comment, error) {
} }
func (gitea *Gitea) GetComment(repo Repository, id uint) (Comment, error) { func (gitea *Gitea) GetComment(repo Repository, id uint) (Comment, error) {
client := &http.Client{}
url := fmt.Sprintf("%s/repos/%s/issues/comments/%d", gitea.Url(), repo.Full_name, id) url := fmt.Sprintf("%s/repos/%s/issues/comments/%d", gitea.Url(), repo.Full_name, id)
response, err := http.Get(url) request, err := http.NewRequest(http.MethodGet, url, nil)
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
response, err := client.Do(request)
var comment Comment var comment Comment
if err != nil { if err != nil {
return comment, err return comment, err
} }
defer response.Body.Close() defer response.Body.Close()
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&comment); err != nil { if err = decoder.Decode(&comment); err != nil {
return comment, err return comment, err
} }
@@ -113,8 +115,6 @@ func (gitea *Gitea) NewComment(repo Repository, issue Issue, comment Comment) (C
return res, errors.New(fmt.Sprintf("\tRequest returned status: %s\n", result.Status)) return res, errors.New(fmt.Sprintf("\tRequest returned status: %s\n", result.Status))
} }
decoder := json.NewDecoder(result.Body) decoder := json.NewDecoder(result.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&res); err != nil { if err = decoder.Decode(&res); err != nil {
return res, err return res, err
} }

View File

@@ -48,16 +48,17 @@ type Issue struct {
} }
func (gitea *Gitea) GetIssues(repo Repository) ([]Issue, error) { func (gitea *Gitea) GetIssues(repo Repository) ([]Issue, error) {
client := &http.Client{}
url := fmt.Sprintf("%s/repos/%s/issues?state=all", gitea.Url(), repo.Full_name) url := fmt.Sprintf("%s/repos/%s/issues?state=all", gitea.Url(), repo.Full_name)
response, err := http.Get(url) request, err := http.NewRequest(http.MethodGet, url, nil)
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
response, err := client.Do(request)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer response.Body.Close() defer response.Body.Close()
var data []Issue var data []Issue
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&data); err != nil { if err = decoder.Decode(&data); err != nil {
return nil, err return nil, err
} }
@@ -66,15 +67,16 @@ func (gitea *Gitea) GetIssues(repo Repository) ([]Issue, error) {
func (gitea *Gitea) GetIssue(repo Repository, id uint) (Issue, error) { func (gitea *Gitea) GetIssue(repo Repository, id uint) (Issue, error) {
var issue Issue var issue Issue
client := &http.Client{}
url := fmt.Sprintf("%s/repos/%s/issues/%d", gitea.Url(), repo.Full_name, id) url := fmt.Sprintf("%s/repos/%s/issues/%d", gitea.Url(), repo.Full_name, id)
response, err := http.Get(url) request, err := http.NewRequest(http.MethodGet, url, nil)
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
response, err := client.Do(request)
if err != nil { if err != nil {
return issue, err return issue, err
} }
defer response.Body.Close() defer response.Body.Close()
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&issue); err != nil { if err = decoder.Decode(&issue); err != nil {
return issue, err return issue, err
} }
@@ -132,14 +134,16 @@ func (gitea *Gitea) NewIssue(repo Repository, issue Issue) (Issue, error) {
if err != nil { if err != nil {
return res, err return res, err
} }
response, err := http.Post(url, "appliaction/json", bytes.NewBuffer(json_payload)) client := &http.Client{}
request, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(json_payload))
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
request.Header.Set("content-type", "application/json")
response, err := client.Do(request)
if err != nil { if err != nil {
return res, err return res, err
} }
defer response.Body.Close() defer response.Body.Close()
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&res); err != nil { if err = decoder.Decode(&res); err != nil {
return res, err return res, err
} }

View File

@@ -81,16 +81,17 @@ func (milestone *Milestone) MergeTask(task taskwarrior.Task) taskwarrior.Task {
} }
func (gitea *Gitea) GetMilestones(repo Repository) ([]Milestone, error) { func (gitea *Gitea) GetMilestones(repo Repository) ([]Milestone, error) {
client := &http.Client{}
url := fmt.Sprintf("%s/repos/%s/milestones?state=all", gitea.Url(), repo.Full_name) url := fmt.Sprintf("%s/repos/%s/milestones?state=all", gitea.Url(), repo.Full_name)
response, err := http.Get(url) request, err := http.NewRequest(http.MethodGet, url, nil)
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
response, err := client.Do(request)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer response.Body.Close() defer response.Body.Close()
var data []Milestone var data []Milestone
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&data); err != nil { if err = decoder.Decode(&data); err != nil {
return nil, err return nil, err
} }
@@ -98,16 +99,17 @@ func (gitea *Gitea) GetMilestones(repo Repository) ([]Milestone, error) {
} }
func (gitea *Gitea) GetMilestone(repo Repository, id uint) (Milestone, error) { func (gitea *Gitea) GetMilestone(repo Repository, id uint) (Milestone, error) {
client := &http.Client{}
url := fmt.Sprintf("%s/repos/%s/milestones/%d", gitea.Url(), repo.Full_name, id) url := fmt.Sprintf("%s/repos/%s/milestones/%d", gitea.Url(), repo.Full_name, id)
response, err := http.Get(url) request, err := http.NewRequest(http.MethodGet, url, nil)
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
response, err := client.Do(request)
var milestone Milestone var milestone Milestone
if err != nil { if err != nil {
return milestone, err return milestone, err
} }
defer response.Body.Close() defer response.Body.Close()
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to store everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&milestone); err != nil { if err = decoder.Decode(&milestone); err != nil {
return milestone, err return milestone, err
} }
@@ -155,14 +157,16 @@ func (gitea *Gitea) NewMilestone(repo Repository, milestone Milestone) (Mileston
if err != nil { if err != nil {
return res, err return res, err
} }
response, err := http.Post(url, "application/json", bytes.NewBuffer(payload)) client := &http.Client{}
request, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(payload))
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
request.Header.Set("content-type", "application/json")
response, err := client.Do(request)
if err != nil { if err != nil {
return res, err return res, err
} }
defer response.Body.Close() defer response.Body.Close()
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
// NOTE: remove this if I do not want to stare everything from the json result in the struct
decoder.DisallowUnknownFields() // remain if every field shall be extracted
if err = decoder.Decode(&res); err != nil { if err = decoder.Decode(&res); err != nil {
return res, err return res, err
} }

View File

@@ -2,6 +2,7 @@ package gitea
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"net/http" "net/http"
) )
@@ -22,11 +23,20 @@ func NewRepository(name, owner string) (repo Repository) {
func (gitea *Gitea) VerifyRepository(repository Repository) (Repository, error) { func (gitea *Gitea) VerifyRepository(repository Repository) (Repository, error) {
url := fmt.Sprintf("%s/repos/%s", gitea.Url(), repository.Full_name) url := fmt.Sprintf("%s/repos/%s", gitea.Url(), repository.Full_name)
response, err := http.Get(url) client := &http.Client{}
request, err := http.NewRequest(http.MethodGet, url, nil)
request.SetBasicAuth(gitea.User_name, gitea.Access_code)
if err != nil {
return repository, err
}
response, err := client.Do(request)
if err != nil { if err != nil {
return repository, err return repository, err
} }
defer response.Body.Close() defer response.Body.Close()
if response.StatusCode != 200 {
return repository, errors.New(fmt.Sprintf("\tCould not verify repository with returned status: %s\n", response.Status))
}
var data map[string]interface{} var data map[string]interface{}
decoder := json.NewDecoder(response.Body) decoder := json.NewDecoder(response.Body)
if err = decoder.Decode(&data); err != nil { if err = decoder.Decode(&data); err != nil {

View File

@@ -233,6 +233,7 @@ func (project *Project) merge(dry_run bool) error {
// NOTE: merge tasks // NOTE: merge tasks
for _, issue := range project.issues { for _, issue := range project.issues {
filter.Reset() filter.Reset()
filter.IncludeProjects(project.repository.Name)
filter.IncludeGitNumber(issue.git_issue.Number) filter.IncludeGitNumber(issue.git_issue.Number)
filter.IncludeGitType(taskwarrior.ISSUE) filter.IncludeGitType(taskwarrior.ISSUE)
git_tasks, err := taskwarrior.GetTasks(filter) git_tasks, err := taskwarrior.GetTasks(filter)
@@ -275,6 +276,7 @@ func (project *Project) merge(dry_run bool) error {
// TODO: merge milestones // TODO: merge milestones
for _, milestone := range project.milestones { for _, milestone := range project.milestones {
filter.Reset() filter.Reset()
filter.IncludeProjects(project.repository.Name)
filter.IncludeGitNumber(milestone.Id) filter.IncludeGitNumber(milestone.Id)
filter.IncludeGitType(taskwarrior.MILESTONE) filter.IncludeGitType(taskwarrior.MILESTONE)
git_tasks, err := taskwarrior.GetTasks(filter) git_tasks, err := taskwarrior.GetTasks(filter)
@@ -296,6 +298,7 @@ func (project *Project) merge(dry_run bool) error {
} }
// link to the corresponding task // link to the corresponding task
filter.Reset() filter.Reset()
filter.IncludeProjects(project.repository.Name)
filter.IncludeGitNumber(issue.git_issue.Number) filter.IncludeGitNumber(issue.git_issue.Number)
filter.IncludeGitType(taskwarrior.ISSUE) filter.IncludeGitType(taskwarrior.ISSUE)
tasks, err := taskwarrior.GetTasks(filter) tasks, err := taskwarrior.GetTasks(filter)

View File

@@ -113,7 +113,6 @@ func GetTasks(filter Filter) ([]Task, error) {
} }
var tasks []Task var tasks []Task
decoder := json.NewDecoder(bytes.NewBuffer(out)) decoder := json.NewDecoder(bytes.NewBuffer(out))
decoder.DisallowUnknownFields()
if err = decoder.Decode(&tasks); err != nil { if err = decoder.Decode(&tasks); err != nil {
return nil, err return nil, err
} }