From 3a04085d3a4a04a9f8b8c847a1bb21df0347c3a7 Mon Sep 17 00:00:00 2001 From: Yves Biener Date: Thu, 19 Oct 2023 22:29:29 +0200 Subject: [PATCH] add(repository): discover repository informations This implemtation determines the git remote origin url and extracts the information for the owner and repo names for the api url's. WIP for #2. --- cmd/gitw/main.go | 17 ++++++++++++++++- internal/gitea/repository.go | 24 ++++++++++++++++++++++- internal/gitw/discover.go | 37 ++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 internal/gitw/discover.go diff --git a/cmd/gitw/main.go b/cmd/gitw/main.go index ebc88e4..6a1629c 100644 --- a/cmd/gitw/main.go +++ b/cmd/gitw/main.go @@ -5,11 +5,26 @@ import ( "os" "gitea.yves-biener.de/yves-biener/gitwarrior/internal/gitea" + "gitea.yves-biener.de/yves-biener/gitwarrior/internal/gitw" ) func main() { - repository := gitea.NewRepository("gitwarrior", "yves-biener") + // TODO: server url may be also be derived from the git configuration? server := gitea.NewGitea("https://gitea.yves-biener.de") + + repository, err := gitw.Discover() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + repository, err = server.VerifyRepository(repository) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + fmt.Printf("%#v\n", repository) + fmt.Println("---") + issue, err := server.GetIssue(repository, 1) if err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/internal/gitea/repository.go b/internal/gitea/repository.go index 6cd5f68..32dc2f1 100644 --- a/internal/gitea/repository.go +++ b/internal/gitea/repository.go @@ -1,6 +1,10 @@ package gitea -import "fmt" +import ( + "encoding/json" + "fmt" + "net/http" +) type Repository struct { Id uint @@ -15,3 +19,21 @@ func NewRepository(name, owner string) (repo Repository) { repo.Full_name = fmt.Sprintf("%s/%s", owner, name) return } + +func (gitea *Gitea) VerifyRepository(repository Repository) (Repository, error) { + url := fmt.Sprintf("%s/repos/%s", gitea.Url(), repository.Full_name) + response, err := http.Get(url) + if err != nil { + return repository, err + } + defer response.Body.Close() + var data map[string]interface{} + decoder := json.NewDecoder(response.Body) + if err = decoder.Decode(&data); err != nil { + return repository, err + } + // extract the id value to the current repository + // NOTE: there may be other informations we also want to capture here as well + repository.Id = uint(data["id"].(float64)) + return repository, nil +} diff --git a/internal/gitw/discover.go b/internal/gitw/discover.go new file mode 100644 index 0000000..6e4a7ce --- /dev/null +++ b/internal/gitw/discover.go @@ -0,0 +1,37 @@ +package gitw + +import ( + "errors" + "fmt" + "os/exec" + "regexp" + "strings" + + "gitea.yves-biener.de/yves-biener/gitwarrior/internal/gitea" +) + +func Discover() (gitea.Repository, error) { + var repository gitea.Repository + cmd := exec.Command("git", "remote", "get-url", "origin") + out, err := cmd.Output() + if err != nil { + return repository, err + } + re := regexp.MustCompile("^git@.*:(.*).git") + matches := re.FindAllStringSubmatch(string(out), -1) + var match string + if len(matches) > 0 && len(matches[0]) == 2 { + match = matches[0][1] // get the first match which is the Full_name of the repository + if len(match) <= 0 { + return repository, errors.New("No matching group found. Are you in a git repository?") + } + } else { + return repository, errors.New("No matching group found. Are you in a git repository?") + } + repo := strings.Split(match, "/") + if len(repo) != 2 { + msg := fmt.Sprintf("Expected remote url to contain {owner}/{repo}, but found: %#v", repo) + return repository, errors.New(msg) + } + return gitea.NewRepository(repo[1], repo[0]), nil +}