mirror of
https://gitea.com/gitea/tea.git
synced 2026-06-05 18:58:43 +02:00
a664449282
Remove go git library because it doesn't support sha256 repository but have an interface so that we could have other backend for the future. Reviewed-on: https://gitea.com/gitea/tea/pulls/1005 Reviewed-by: Zettat123 <39446+zettat123@noreply.gitea.com>
95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
// Copyright 2020 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"sort"
|
|
)
|
|
|
|
// TeaRepo wraps a local git repository behind a swappable backend.
|
|
type TeaRepo struct {
|
|
backend RepositoryBackend
|
|
}
|
|
|
|
func newTeaRepo(backend RepositoryBackend) *TeaRepo {
|
|
return &TeaRepo{backend: backend}
|
|
}
|
|
|
|
// RepoForWorkdir tries to open the git repository in the local directory
|
|
// for reading or modification.
|
|
func RepoForWorkdir() (*TeaRepo, error) {
|
|
return RepoFromPath("")
|
|
}
|
|
|
|
// RepoFromPath tries to open the git repository by path.
|
|
func RepoFromPath(path string) (*TeaRepo, error) {
|
|
backend, err := currentBackend().Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return newTeaRepo(backend), nil
|
|
}
|
|
|
|
// WorkTree returns the repository work tree path.
|
|
func (r TeaRepo) WorkTree() string {
|
|
return r.backend.WorkTree()
|
|
}
|
|
|
|
// Config returns the repository config values tea needs.
|
|
func (r TeaRepo) Config() (*Config, error) {
|
|
return r.backend.Config()
|
|
}
|
|
|
|
// Remote returns the configured remote by name.
|
|
func (r TeaRepo) Remote(remoteName string) (*Remote, error) {
|
|
cfg, err := r.Config()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
remoteCfg, ok := cfg.Remotes[remoteName]
|
|
if !ok {
|
|
return nil, fmt.Errorf("remote %s not found", remoteName)
|
|
}
|
|
return &Remote{repo: &r, config: remoteCfg}, nil
|
|
}
|
|
|
|
// Remotes returns all configured remotes sorted by name.
|
|
func (r TeaRepo) Remotes() ([]*Remote, error) {
|
|
cfg, err := r.Config()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
remoteNames := make([]string, 0, len(cfg.Remotes))
|
|
for name := range cfg.Remotes {
|
|
remoteNames = append(remoteNames, name)
|
|
}
|
|
sort.Strings(remoteNames)
|
|
|
|
remotes := make([]*Remote, 0, len(remoteNames))
|
|
for _, name := range remoteNames {
|
|
remotes = append(remotes, &Remote{repo: &r, config: cfg.Remotes[name]})
|
|
}
|
|
return remotes, nil
|
|
}
|
|
|
|
// Head returns the currently checked out ref.
|
|
func (r TeaRepo) Head() (*Reference, error) {
|
|
return r.backend.Head()
|
|
}
|
|
|
|
// RemoteURL returns the URL of the given remote.
|
|
func (r TeaRepo) RemoteURL(remoteName string) (*url.URL, error) {
|
|
remote, err := r.Remote(remoteName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(remote.Config().URLs) == 0 {
|
|
return nil, fmt.Errorf("remote %s has no URL configured", remoteName)
|
|
}
|
|
return ParseURL(remote.Config().URLs[0])
|
|
}
|