From 98436fb644a872a181e9b83f15b4e80cdf8581ed Mon Sep 17 00:00:00 2001 From: Enver Bisevac Date: Wed, 9 Nov 2022 03:32:01 +0100 Subject: [PATCH] clone url implemented (#63) Clone URL (http) used for clone/pull/push git operations --- cli/server/harness.wire_gen.go | 1 + cli/server/standalone.wire_gen.go | 1 + internal/api/controller/repo/find.go | 19 ++++++++++++----- internal/api/handler/repo/find.go | 31 +++++++++++++++++++++++----- internal/router/api.go | 10 ++++----- types/config.go | 1 + types/repo.go | 3 +++ 7 files changed, 51 insertions(+), 15 deletions(-) diff --git a/cli/server/harness.wire_gen.go b/cli/server/harness.wire_gen.go index 41e2ae477..8f27f562f 100644 --- a/cli/server/harness.wire_gen.go +++ b/cli/server/harness.wire_gen.go @@ -7,6 +7,7 @@ package server import ( "context" + "github.com/harness/gitness/gitrpc" server2 "github.com/harness/gitness/gitrpc/server" "github.com/harness/gitness/harness/auth/authn" diff --git a/cli/server/standalone.wire_gen.go b/cli/server/standalone.wire_gen.go index c774dec93..060412cf9 100644 --- a/cli/server/standalone.wire_gen.go +++ b/cli/server/standalone.wire_gen.go @@ -7,6 +7,7 @@ package server import ( "context" + "github.com/harness/gitness/gitrpc" server2 "github.com/harness/gitness/gitrpc/server" "github.com/harness/gitness/internal/api/controller/repo" diff --git a/internal/api/controller/repo/find.go b/internal/api/controller/repo/find.go index 12ac6ee21..521d8dc8a 100644 --- a/internal/api/controller/repo/find.go +++ b/internal/api/controller/repo/find.go @@ -6,6 +6,9 @@ package repo import ( "context" + "net/url" + "path" + "strings" apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" @@ -13,10 +16,9 @@ import ( "github.com/harness/gitness/types/enum" ) -/* -* Find finds a repo. - */ -func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef string) (*types.Repository, error) { +// Find finds a repo. +func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef string, + cfg *types.Config) (*types.Repository, error) { repo, err := findRepoFromRef(ctx, c.repoStore, repoRef) if err != nil { return nil, err @@ -25,6 +27,13 @@ func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef st if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, true); err != nil { return nil, err } - + repoPath := path.Clean(repo.Path) + if !strings.HasSuffix(repoPath, ".git") { + repoPath += ".git" + } + repo.URL, err = url.JoinPath(cfg.Git.BaseURL, repoPath) + if err != nil { + return nil, err + } return repo, nil } diff --git a/internal/api/handler/repo/find.go b/internal/api/handler/repo/find.go index a713727e2..0f9577483 100644 --- a/internal/api/handler/repo/find.go +++ b/internal/api/handler/repo/find.go @@ -6,16 +6,18 @@ package repo import ( "net/http" + "net/url" + "strings" + + "github.com/harness/gitness/types" "github.com/harness/gitness/internal/api/controller/repo" "github.com/harness/gitness/internal/api/render" "github.com/harness/gitness/internal/api/request" ) -/* - * Writes json-encoded repository information to the http response body. - */ -func HandleFind(repoCtrl *repo.Controller) http.HandlerFunc { +// HandleFind writes json-encoded repository information to the http response body. +func HandleFind(repoCtrl *repo.Controller, config *types.Config) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() session, _ := request.AuthSessionFrom(ctx) @@ -25,12 +27,31 @@ func HandleFind(repoCtrl *repo.Controller) http.HandlerFunc { return } - repo, err := repoCtrl.Find(ctx, session, repoRef) + repo, err := repoCtrl.Find(ctx, session, repoRef, config) if err != nil { render.TranslatedUserError(w, err) return } + parse, err := url.Parse(repo.URL) + if err != nil { + render.TranslatedUserError(w, err) + return + } + + if parse.Host == "" { + parse.Host = r.Host + } + + if parse.Scheme == "" { + parse.Scheme = "http" + if !strings.Contains(parse.Host, "localhost") { + parse.Scheme = "https" + } + } + + repo.URL = parse.String() + render.JSON(w, http.StatusOK, repo) } } diff --git a/internal/router/api.go b/internal/router/api.go index 60e18b82c..f216f0e61 100644 --- a/internal/router/api.go +++ b/internal/router/api.go @@ -78,7 +78,7 @@ func NewAPIHandler( r.Use(middlewareauthn.Attempt(authenticator)) r.Route("/v1", func(r chi.Router) { - setupRoutesV1(r, repoCtrl, spaceCtrl, saCtrl, userCtrl) + setupRoutesV1(r, repoCtrl, spaceCtrl, saCtrl, userCtrl, config) }) // wrap router in terminatedPath encoder. @@ -99,9 +99,9 @@ func corsHandler(config *types.Config) func(http.Handler) http.Handler { } func setupRoutesV1(r chi.Router, repoCtrl *repo.Controller, spaceCtrl *space.Controller, - saCtrl *serviceaccount.Controller, userCtrl *user.Controller) { + saCtrl *serviceaccount.Controller, userCtrl *user.Controller, config *types.Config) { setupSpaces(r, spaceCtrl) - setupRepos(r, repoCtrl) + setupRepos(r, repoCtrl, config) setupUsers(r, userCtrl) setupServiceAccounts(r, saCtrl) setupAdmin(r, userCtrl) @@ -140,13 +140,13 @@ func setupSpaces(r chi.Router, spaceCtrl *space.Controller) { }) } -func setupRepos(r chi.Router, repoCtrl *repo.Controller) { +func setupRepos(r chi.Router, repoCtrl *repo.Controller, config *types.Config) { r.Route("/repos", func(r chi.Router) { // Create takes path and parentId via body, not uri r.Post("/", handlerrepo.HandleCreate(repoCtrl)) r.Route(fmt.Sprintf("/{%s}", request.PathParamRepoRef), func(r chi.Router) { // repo level operations - r.Get("/", handlerrepo.HandleFind(repoCtrl)) + r.Get("/", handlerrepo.HandleFind(repoCtrl, config)) r.Put("/", handlerrepo.HandleUpdate(repoCtrl)) r.Delete("/", handlerrepo.HandleDelete(repoCtrl)) diff --git a/types/config.go b/types/config.go index b3a07ee3a..6331ff926 100644 --- a/types/config.go +++ b/types/config.go @@ -13,6 +13,7 @@ type Config struct { // Git defines the git configuration parameters Git struct { + BaseURL string `envconfig:"GITNESS_GIT_BASE_URL"` // clone url Root string `envconfig:"GITNESS_GIT_ROOT"` DefaultBranch string `envconfig:"GITNESS_GIT_DEFAULTBRANCH" default:"main"` } diff --git a/types/repo.go b/types/repo.go index a71dd30d8..5dfd2c322 100644 --- a/types/repo.go +++ b/types/repo.go @@ -31,6 +31,9 @@ type Repository struct { NumPulls int `db:"repo_numPulls" json:"numPulls"` NumClosedPulls int `db:"repo_numClosedPulls" json:"numClosedPulls"` NumOpenPulls int `db:"repo_numOpenPulls" json:"numOpenPulls"` + + // git urls + URL string `db:"-" json:"url"` } // RepoFilter stores repo query parameters.