diff --git a/app/api/controller/repo/controller.go b/app/api/controller/repo/controller.go index 7f9074d76..d60ab0e59 100644 --- a/app/api/controller/repo/controller.go +++ b/app/api/controller/repo/controller.go @@ -395,16 +395,11 @@ func (c *Controller) fetchUpstreamObjects( repoForkCore *types.RepositoryCore, getSHA func(params git.ReadParams) (sha.SHA, error), ) (sha.SHA, *types.RepositoryCore, error) { - repoFork, err := c.repoStore.Find(ctx, repoForkCore.ID) - if err != nil { - return sha.None, nil, fmt.Errorf("failed to find fork repo: %w", err) - } - - if repoFork.ForkID == 0 { + if repoForkCore.ForkID == 0 { return sha.None, nil, errors.InvalidArgument("Repository is not a fork.") } - repoUpstreamCore, err := c.repoFinder.FindByID(ctx, repoFork.ForkID) + repoUpstreamCore, err := c.repoFinder.FindByID(ctx, repoForkCore.ForkID) if err != nil { return sha.None, nil, fmt.Errorf("failed to find upstream repo: %w", err) } @@ -445,6 +440,57 @@ func (c *Controller) fetchUpstreamObjects( return upstreamSHA, repoUpstreamCore, nil } +func (c *Controller) fetchCommitDivergenceObjectsFromUpstream( + ctx context.Context, + session *auth.Session, + repo *types.RepositoryCore, + div *git.CommitDivergenceRequest, +) error { + dot, err := makeDotRange(div.To, div.From, true) + if err != nil { + return fmt.Errorf("failed to make dot range: %w", err) + } + + err = c.fetchDotRangeObjectsFromUpstream(ctx, session, repo, &dot) + if err != nil { + return fmt.Errorf("failed to fetch dot range objects: %w", err) + } + + div.To = dot.BaseRef + div.From = dot.HeadRef + + return nil +} + +func (c *Controller) fetchDotRangeObjectsFromUpstream( + ctx context.Context, + session *auth.Session, + repoForkCore *types.RepositoryCore, + dotRange *DotRange, +) error { + if dotRange.BaseUpstream { + refSHA, _, err := c.fetchUpstreamRevision(ctx, session, repoForkCore, dotRange.BaseRef) + if err != nil { + return fmt.Errorf("failed to fetch upstream objects: %w", err) + } + + dotRange.BaseUpstream = false + dotRange.BaseRef = refSHA.String() + } + + if dotRange.HeadUpstream { + refSHA, _, err := c.fetchUpstreamRevision(ctx, session, repoForkCore, dotRange.HeadRef) + if err != nil { + return fmt.Errorf("failed to fetch upstream objects: %w", err) + } + + dotRange.HeadUpstream = false + dotRange.HeadRef = refSHA.String() + } + + return nil +} + const dotRangeUpstreamMarker = "upstream:" type DotRange struct { diff --git a/app/api/controller/repo/diff.go b/app/api/controller/repo/diff.go index ba7fafb7f..56de02f04 100644 --- a/app/api/controller/repo/diff.go +++ b/app/api/controller/repo/diff.go @@ -159,32 +159,3 @@ func (c *Controller) Diff( return reader, nil } - -func (c *Controller) fetchDotRangeObjectsFromUpstream( - ctx context.Context, - session *auth.Session, - repoForkCore *types.RepositoryCore, - dotRange *DotRange, -) error { - if dotRange.BaseUpstream { - refSHA, _, err := c.fetchUpstreamRevision(ctx, session, repoForkCore, dotRange.BaseRef) - if err != nil { - return fmt.Errorf("failed to fetch upstream objects: %w", err) - } - - dotRange.BaseUpstream = false - dotRange.BaseRef = refSHA.String() - } - - if dotRange.HeadUpstream { - refSHA, _, err := c.fetchUpstreamRevision(ctx, session, repoForkCore, dotRange.HeadRef) - if err != nil { - return fmt.Errorf("failed to fetch upstream objects: %w", err) - } - - dotRange.HeadUpstream = false - dotRange.HeadRef = refSHA.String() - } - - return nil -} diff --git a/app/api/controller/repo/get_commit_divergences.go b/app/api/controller/repo/get_commit_divergences.go index 065328089..b642675ba 100644 --- a/app/api/controller/repo/get_commit_divergences.go +++ b/app/api/controller/repo/get_commit_divergences.go @@ -16,6 +16,7 @@ package repo import ( "context" + "fmt" "github.com/harness/gitness/app/api/request" "github.com/harness/gitness/app/api/usererror" @@ -75,6 +76,11 @@ func (c *Controller) GetCommitDivergences(ctx context.Context, if len(options.Requests[i].To) == 0 { options.Requests[i].To = repo.DefaultBranch } + + err = c.fetchCommitDivergenceObjectsFromUpstream(ctx, session, repo, &options.Requests[i]) + if err != nil { + return nil, fmt.Errorf("failed to fetch object from upstream: %w", err) + } } // TODO: We should cache the responses as times can reach multiple seconds diff --git a/app/api/controller/repo/purge.go b/app/api/controller/repo/purge.go index 55c3d3ed8..aaf283e5a 100644 --- a/app/api/controller/repo/purge.go +++ b/app/api/controller/repo/purge.go @@ -98,6 +98,8 @@ func (c *Controller) PurgeNoAuth( return fmt.Errorf("failed to delete repo from db: %w", err) } + c.repoFinder.MarkChanged(ctx, repo.Core()) + if err := c.DeleteGitRepository(ctx, session, repo.GitUID); err != nil { log.Ctx(ctx).Err(err).Msg("failed to remove git repository") } diff --git a/types/repo.go b/types/repo.go index ceb04e3a5..e25e3e708 100644 --- a/types/repo.go +++ b/types/repo.go @@ -29,6 +29,7 @@ type RepositoryCore struct { Path string `json:"path" yaml:"path"` GitUID string `json:"-" yaml:"-"` DefaultBranch string `json:"default_branch" yaml:"default_branch"` + ForkID int64 `json:"fork_id" yaml:"fork_id"` State enum.RepoState `json:"-" yaml:"-"` Type enum.RepoType `json:"type,omitempty" yaml:"type,omitempty"` } @@ -88,6 +89,7 @@ func (r *Repository) Core() *RepositoryCore { Identifier: r.Identifier, Path: r.Path, GitUID: r.GitUID, + ForkID: r.ForkID, DefaultBranch: r.DefaultBranch, State: r.State, Type: r.Type,