blob: 72a9e8a2837b428e8f199fe4c36a46f9b4f9ced1 [file] [log] [blame]
package repo_manager
import (
"context"
"net/http"
"go.skia.org/infra/autoroll/go/codereview"
"go.skia.org/infra/autoroll/go/config"
"go.skia.org/infra/autoroll/go/config_vars"
"go.skia.org/infra/autoroll/go/revision"
"go.skia.org/infra/go/skerr"
)
// RepoManager is the interface used by different Autoroller implementations
// to manage checkouts.
type RepoManager interface {
// Create a new roll attempt.
CreateNewRoll(ctx context.Context, rollingFrom *revision.Revision, rollingTo *revision.Revision, revisions []*revision.Revision, reviewers []string, dryRun bool, commitMsg string) (int64, error)
// Update the RepoManager's view of the world. Depending on the
// implementation, this may sync repos and may take some time. Returns
// the currently-rolled Revision, the tip-of-tree Revision, and a list
// of all revisions which have not yet been rolled (ie. those between
// the current and tip-of-tree, including the latter), in reverse
// chronological order.
Update(context.Context) (*revision.Revision, *revision.Revision, []*revision.Revision, error)
// GetRevision returns a revision.Revision instance from the given
// revision ID.
GetRevision(context.Context, string) (*revision.Revision, error)
}
// New returns a RepoManager instance based on the given RepoManagerConfig.
func New(ctx context.Context, c config.RepoManagerConfig, reg *config_vars.Registry, workdir, rollerName, recipeCfgFile, serverURL, serviceAccount string, client *http.Client, cr codereview.CodeReview, isInternal bool, local bool) (RepoManager, error) {
if c == nil {
return nil, skerr.Fmt("No RepoManagerConfig was provided.")
}
if err := c.Validate(); err != nil {
return nil, skerr.Wrap(err)
}
if rmc, ok := c.(*config.AndroidRepoManagerConfig); ok {
return NewAndroidRepoManager(ctx, rmc, reg, workdir, serverURL, serviceAccount, client, cr, isInternal, local)
} else if rmc, ok := c.(*config.CommandRepoManagerConfig); ok {
return NewCommandRepoManager(ctx, rmc, reg, workdir, serverURL, cr)
} else if rmc, ok := c.(*config.FreeTypeRepoManagerConfig); ok {
return NewFreeTypeRepoManager(ctx, rmc, reg, workdir, serverURL, client, cr, local)
} else if rmc, ok := c.(*config.FuchsiaSDKAndroidRepoManagerConfig); ok {
return NewFuchsiaSDKAndroidRepoManager(ctx, rmc, reg, workdir, serverURL, client, cr, local)
} else if rmc, ok := c.(*config.ParentChildRepoManagerConfig); ok {
return newParentChildRepoManager(ctx, rmc, reg, workdir, rollerName, recipeCfgFile, serverURL, client, cr)
}
return nil, skerr.Fmt("Unknown RepoManager type.")
}