lib

package
v0.0.0-...-42a13c3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 19, 2020 License: Apache-2.0 Imports: 22 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// LogLevelNormal logs info and above
	LogLevelNormal = iota
	// LogLevelDebug logs debug and above
	LogLevelDebug
)
View Source
const (
	// ErrClassNone Not specified
	ErrClassNone = iota
	// ErrClassUser is a user error that can be corrected
	ErrClassUser
	// ErrClassInternal is an internal error potentially due to a bug
	ErrClassInternal
)
View Source
const (
	// CmdStageBeforeBuild is the stage before executing module build command
	CmdStageBeforeBuild = iota

	// CmdStageAfterBuild is the stage after executing the module build command
	CmdStageAfterBuild

	// CmdStageSkipBuild is when module building is skipped due to lack of matching building command
	CmdStageSkipBuild

	// CmdStageFailedBuild is when module command is failed
	CmdStageFailedBuild
)

Variables

View Source
var NoFilter = &FilterOptions{}

NoFilter is built-in filter that represents no filtering

Functions

func GitRepoRoot

func GitRepoRoot(dir string) (string, error)

GitRepoRoot returns path to a git repo reachable from the specified directory. If the specified directory itself is not a git repo, this function searches for it in the parent directory path.

Types

type Blob

type Blob interface {
	// ID of the blob.
	ID() string
	// Name of the blob.
	Name() string
	// Path (relative) to the blob.
	Path() string
	//String returns a printable id.
	String() string
}

Blob stored in git.

type BlobWalkCallback

type BlobWalkCallback func(Blob) error

BlobWalkCallback used for discovering blobs in a commit tree.

type BuildResult

type BuildResult struct {
	// Module of the build result
	Module *Module
}

BuildResult is summary for a single module build

type BuildSummary

type BuildSummary struct {
	// Manifest used to trigger the build
	Manifest *Manifest
	// Completed list of the modules built. This list does not
	// include the modules that were skipped due to
	// the unavailability of a build command for the
	// host platform.
	Completed []*BuildResult
	// Skipped modules due to the unavailability of a build command for
	// the host platform
	Skipped []*Module
}

BuildSummary is a summary of a successful build.

type Cmd

type Cmd struct {
	Cmd  string
	Args []string `yaml:",flow"`
}

Cmd represents the structure of a command appears in .mbt.yml.

type CmdFailure

type CmdFailure struct {
	Module *Module
	Err    error
}

CmdFailure contains the failures occurred while running a user defined command.

type CmdOptions

type CmdOptions struct {
	Stdin          io.Reader
	Stdout, Stderr io.Writer
	Callback       CmdStageCallback
	FailFast       bool
}

CmdOptions defines various options required by methods executing user defined commands.

func CmdOptionsWithStdIO

func CmdOptionsWithStdIO(callback CmdStageCallback) *CmdOptions

CmdOptionsWithStdIO creates an instance of CmdOptions with its streams pointing to std io streams.

type CmdStage

type CmdStage = int

CmdStage is an enum to indicate various stages of a command.

type CmdStageCallback

type CmdStageCallback func(mod *Module, s CmdStage, err error)

CmdStageCallback is the callback function used to notify various build stages

type Commit

type Commit interface {
	ID() string
	String() string
}

Commit in the repo. All commit based APIs in Repo interface accepts this interface. It gives the implementations the ability to optimise the access to commits. For example, a libgit2 based Repo implementation we use by default caches the access to commit tree.

type DiffDelta

type DiffDelta struct {
	// NewFile path of the delta
	NewFile string
	// OldFile path of the delta
	OldFile string
}

DiffDelta is a single delta in a git diff.

type Discover

type Discover interface {
	// ModulesInCommit walks the git tree at a specific commit looking for
	// directories with .mbt.yml file. Returns discovered Modules.
	ModulesInCommit(commit Commit) (Modules, error)
	// ModulesInWorkspace walks current workspace looking for
	// directories with .mbt.yml file. Returns discovered Modules.
	ModulesInWorkspace() (Modules, error)
}

Discover module metadata for various conditions

func NewDiscover

func NewDiscover(repo Repo, l Log) Discover

NewDiscover creates an instance of standard discover implementation.

type FilterOptions

type FilterOptions struct {
	Name       string
	Fuzzy      bool
	Dependents bool
}

FilterOptions describe how to filter the modules in a manifest

func ExactMatchDependentsFilter

func ExactMatchDependentsFilter(name string) *FilterOptions

ExactMatchDependentsFilter is a helper to create an exact match FilterOptions

func ExactMatchFilter

func ExactMatchFilter(name string) *FilterOptions

ExactMatchFilter is a helper to create an exact match FilterOptions

func FuzzyDependentsFilter

func FuzzyDependentsFilter(name string) *FilterOptions

FuzzyDependentsFilter is a helper to create a fuzzy match FilterOptions

func FuzzyFilter

func FuzzyFilter(name string) *FilterOptions

FuzzyFilter is a helper to create a fuzzy match FilterOptions

type KVP

type KVP struct {
	Key   string
	Value interface{}
}

KVP is a key value pair.

type Log

type Log interface {
	Info(args ...interface{})
	Infof(format string, args ...interface{})
	Warn(args ...interface{})
	Warnf(format string, args ...interface{})
	Error(error)
	Errorf(format string, args ...interface{})
	Debug(format string, args ...interface{})
}

Log used to write system events

func NewStdLog

func NewStdLog(level int) Log

NewStdLog creates a standared logger

type Manifest

type Manifest struct {
	Dir     string
	Sha     string
	Modules Modules
}

Manifest represents a collection modules in the repository.

func (*Manifest) ApplyFilters

func (m *Manifest) ApplyFilters(filterOptions *FilterOptions) (*Manifest, error)

ApplyFilters will filter the modules in the manifest to the ones that matches the specified filter. If filter is not specified, original manifest is returned.

func (*Manifest) FilterByName

func (m *Manifest) FilterByName(filterOptions *FilterOptions) *Manifest

FilterByName reduces the modules in a Manifest to the ones that are matching the terms specified in filter. Multiple terms can be specified as a comma separated string. If fuzzy argument is true, comparison is a case insensitive subsequence comparison. Otherwise, it's a case insensitive exact match.

type ManifestBuilder

type ManifestBuilder interface {
	// ByDiff creates the manifest for diff between two commits
	ByDiff(from, to Commit) (*Manifest, error)
	// ByPr creates the manifest for diff between two branches
	ByPr(src, dst string) (*Manifest, error)
	// ByCommit creates the manifest for the specified commit
	ByCommit(sha Commit) (*Manifest, error)
	// ByCommitContent creates the manifest for the content of the
	// specified commit.
	ByCommitContent(sha Commit) (*Manifest, error)
	// ByBranch creates the manifest for the specified branch
	ByBranch(name string) (*Manifest, error)
	// ByCurrentBranch creates the manifest for the current branch
	ByCurrentBranch() (*Manifest, error)
	// ByWorkspace creates the manifest for the current workspace
	ByWorkspace() (*Manifest, error)
	// ByWorkspaceChanges creates the manifest for the changes in workspace
	ByWorkspaceChanges() (*Manifest, error)
}

ManifestBuilder builds Manifest for various conditions

func NewManifestBuilder

func NewManifestBuilder(repo Repo, reducer Reducer, discover Discover, log Log) ManifestBuilder

NewManifestBuilder creates a new ManifestBuilder

type Module

type Module struct {
	// contains filtered or unexported fields
}

Module represents a single module in the repository.

func (*Module) Build

func (a *Module) Build() map[string]*Cmd

Build returns the build configuration for the module.

func (*Module) Commands

func (a *Module) Commands() map[string]*UserCmd

Commands returns a list of user defined commands in the spec.

func (*Module) FileDependencies

func (a *Module) FileDependencies() []string

FileDependencies returns the list of file dependencies this module has.

func (*Module) Hash

func (a *Module) Hash() string

Hash for the content of this module.

func (*Module) Name

func (a *Module) Name() string

Name returns the name of the module.

func (*Module) Path

func (a *Module) Path() string

Path returns the relative path to module.

func (*Module) Properties

func (a *Module) Properties() map[string]interface{}

Properties returns the custom properties in the configuration.

func (*Module) RequiredBy

func (a *Module) RequiredBy() Modules

RequiredBy returns an array of modules requires this module.

func (*Module) Requires

func (a *Module) Requires() Modules

Requires returns an array of modules required by this module.

func (*Module) Version

func (a *Module) Version() string

Version returns the content based version SHA for the module.

type Modules

type Modules []*Module

Modules is an array of Module.

func (Modules) GroupedSerializeAsDot

func (mods Modules) GroupedSerializeAsDot() string

GroupedSerializeAsDot converts specified modules into a dot graph that can be used for visualization with gv package.

This variant groups impacted modules in red, while plotting the rest of the graph in powderblue

func (Modules) SerializeAsDot

func (mods Modules) SerializeAsDot() string

SerializeAsDot converts specified modules into a dot graph that can be used for visualization with gv package.

type ProcessManager

type ProcessManager interface {
	// Exec runs an external command in the context of a module in a manifest.
	// Following actions are performed prior to executing the command:
	// - Current working directory of the target process is set to module path
	// - Initialises important information in the target process environment
	Exec(manifest *Manifest, module *Module, options *CmdOptions, command string, args ...string) error
}

ProcessManager manages the execution of build and user defined commands.

func NewProcessManager

func NewProcessManager(log Log) ProcessManager

NewProcessManager creates an instance of ProcessManager.

type Reducer

type Reducer interface {
	Reduce(modules Modules, deltas []*DiffDelta) (Modules, error)
}

Reducer reduces a given modules set to impacted set from a diff delta

func NewReducer

func NewReducer(log Log) Reducer

NewReducer creates a new reducer

type Reference

type Reference interface {
	Name() string
	SymbolicName() string
}

Reference to a tree in the repository. For example, if you consider a git repository this could be pointing to a branch, tag or commit.

type Repo

type Repo interface {
	// GetCommit returns the commit object for the specified SHA.
	GetCommit(sha string) (Commit, error)
	// Path of the repository.
	Path() string
	// Diff gets the diff between two commits.
	Diff(a, b Commit) ([]*DiffDelta, error)
	// DiffMergeBase gets the diff between the merge base of from and to and, to.
	// In other words, diff contains the deltas of changes occurred in 'to' commit tree
	// since it diverged from 'from' commit tree.
	DiffMergeBase(from, to Commit) ([]*DiffDelta, error)
	// DiffWorkspace gets the changes in current workspace.
	// This should include untracked changes.
	DiffWorkspace() ([]*DiffDelta, error)
	// Changes returns a an array of DiffDelta objects representing the changes
	// in the specified commit.
	// Return an empty array if the specified commit is the first commit
	// in the repo.
	Changes(c Commit) ([]*DiffDelta, error)
	// WalkBlobs invokes the callback for each blob reachable from the commit tree.
	WalkBlobs(a Commit, callback BlobWalkCallback) error
	// BlobContents of specified blob.
	BlobContents(blob Blob) ([]byte, error)
	// BlobContentsByPath gets the blob contents from a specific git tree.
	BlobContentsFromTree(commit Commit, path string) ([]byte, error)
	// EntryID of a git object in path.
	// ID is resolved from the commit tree of the specified commit.
	EntryID(commit Commit, path string) (string, error)
	// BranchCommit returns the last commit for the specified branch.
	BranchCommit(name string) (Commit, error)
	// CurrentBranch returns the name of current branch.
	CurrentBranch() (string, error)
	// CurrentBranchCommit returns the last commit for the current branch.
	CurrentBranchCommit() (Commit, error)
	// IsEmpty informs if the current repository is empty or not.
	IsEmpty() (bool, error)
	// FindAllFilesInWorkspace returns all files in repository matching given pathSpec, including untracked files.
	FindAllFilesInWorkspace(pathSpec []string) ([]string, error)
	// EnsureSafeWorkspace returns an error workspace is in a safe state
	// for operations requiring a checkout.
	// For example, in git repositories we consider uncommitted changes or
	// a detached head is an unsafe state.
	EnsureSafeWorkspace() error
	// Checkout specified commit into workspace.
	// Also returns a reference to the previous tree pointed by current workspace.
	Checkout(commit Commit) (Reference, error)
	// CheckoutReference checks out the specified reference into workspace.
	CheckoutReference(Reference) error
	// MergeBase returns the merge base of two commits.
	MergeBase(a, b Commit) (Commit, error)
}

Repo defines the set of interactions with the git repository.

func NewLibgitRepo

func NewLibgitRepo(path string, log Log) (Repo, error)

NewLibgitRepo creates a libgit2 repo instance

type RunResult

type RunResult struct {
	Manifest  *Manifest
	Completed []*Module
	Skipped   []*Module
	Failures  []*CmdFailure
}

RunResult is the result of running a user defined command.

type Spec

type Spec struct {
	Name             string                 `yaml:"name"`
	Build            map[string]*Cmd        `yaml:"build"`
	Commands         map[string]*UserCmd    `yaml:"commands"`
	Properties       map[string]interface{} `yaml:"properties"`
	Dependencies     []string               `yaml:"dependencies"`
	FileDependencies []string               `yaml:"fileDependencies"`
}

Spec represents the structure of .mbt.yml contents.

type System

type System interface {
	// ApplyBranch applies the manifest of specified branch over a template.
	// Template is retrieved from the commit tree of last commit of that branch.
	ApplyBranch(templatePath, branch string, output io.Writer) error

	// ApplyCommit applies the manifest of specified commit over a template.
	// Template is retrieved from the commit tree of the specified commit.
	ApplyCommit(sha, templatePath string, output io.Writer) error

	// ApplyHead applies the manifest of current branch over a template.
	// Template is retrieved from the commit tree of last commit current branch.
	ApplyHead(templatePath string, output io.Writer) error

	// ApplyLocal applies the manifest of local workspace.
	// Template is retrieved from the current workspace.
	ApplyLocal(templatePath string, output io.Writer) error

	// BuildBranch builds the specified branch.
	// This function accepts FilterOptions to specify which modules to be built
	// within that branch.
	BuildBranch(name string, filterOptions *FilterOptions, options *CmdOptions) (*BuildSummary, error)

	// BuildPr builds changes in 'src' branch since it diverged from 'dst' branch.
	BuildPr(src, dst string, options *CmdOptions) (*BuildSummary, error)

	// Build builds changes between two commits
	BuildDiff(from, to string, options *CmdOptions) (*BuildSummary, error)

	// BuildCurrentBranch builds the current branch.
	// This function accepts FilterOptions to specify which modules to be built
	// within that branch.
	BuildCurrentBranch(filterOptions *FilterOptions, options *CmdOptions) (*BuildSummary, error)

	// BuildCommit builds specified commit.
	// This function accepts FilterOptions to specify which modules to be built
	// within that branch.
	BuildCommit(commit string, filterOptions *FilterOptions, options *CmdOptions) (*BuildSummary, error)

	// BuildCommitChanges builds the changes in specified commit
	BuildCommitContent(commit string, options *CmdOptions) (*BuildSummary, error)

	// BuildWorkspace builds the current workspace.
	// This function accepts FilterOptions to specify which modules to be built
	// within that branch.
	BuildWorkspace(filterOptions *FilterOptions, options *CmdOptions) (*BuildSummary, error)

	// BuildWorkspace builds changes in current workspace.
	BuildWorkspaceChanges(options *CmdOptions) (*BuildSummary, error)

	// IntersectionByCommit returns the manifest of intersection of modules modified
	// between two commits.
	// If we consider M as the merge base of first and second commits,
	// intersection contains the modules that have been changed
	// between M and first and M and second.
	IntersectionByCommit(first, second string) (Modules, error)

	// IntersectionByBranch returns the manifest of intersection of modules modified
	// between two branches.
	// If we consider M as the merge base of first and second branches,
	// intersection contains the modules that have been changed
	// between M and first and M and second.
	IntersectionByBranch(first, second string) (Modules, error)

	// ManifestByDiff creates the manifest for diff between two commits
	ManifestByDiff(from, to string) (*Manifest, error)

	// ManifestByPr creates the manifest for diff between two branches
	ManifestByPr(src, dst string) (*Manifest, error)

	// ManifestByCommit creates the manifest for the specified commit
	ManifestByCommit(sha string) (*Manifest, error)

	// ManifestByCommitContent creates the manifest for the content in specified commit
	ManifestByCommitContent(sha string) (*Manifest, error)

	// ByBranch creates the manifest for the specified branch
	ManifestByBranch(name string) (*Manifest, error)

	// ByCurrentBranch creates the manifest for the current branch
	ManifestByCurrentBranch() (*Manifest, error)

	// ByWorkspace creates the manifest for the current workspace
	ManifestByWorkspace() (*Manifest, error)

	// ByWorkspaceChanges creates the manifest for the changes in workspace
	ManifestByWorkspaceChanges() (*Manifest, error)

	// RunInBranch runs a command in a branch.
	// This function accepts FilterOptions to specify a subset of modules.
	RunInBranch(command, name string, filterOptions *FilterOptions, options *CmdOptions) (*RunResult, error)

	// RunInPr runs a command in modules that have been changed in
	// 'src' branch since it diverged from 'dst' branch.
	RunInPr(command, src, dst string, options *CmdOptions) (*RunResult, error)

	// RunInDiff runs a command in modules that have been changed in 'from'
	// commit since it diverged from 'to' commit.
	RunInDiff(command, from, to string, options *CmdOptions) (*RunResult, error)

	// RunInCurrentBranch runs a command in modules in the current branch.
	// This function accepts FilterOptions to filter the modules included in this
	// operation.
	RunInCurrentBranch(command string, filterOptions *FilterOptions, options *CmdOptions) (*RunResult, error)

	// RunInCommit runs a command in all modules in a commit.
	// This function accepts FilterOptions to filter the modules included in this
	// operation.
	RunInCommit(command, commit string, filterOptions *FilterOptions, options *CmdOptions) (*RunResult, error)

	// RunInCommitContent runs a command in modules modified in a commit.
	RunInCommitContent(command, commit string, options *CmdOptions) (*RunResult, error)

	// RunInWorkspace runs a command in all modules in workspace.
	// This function accepts FilterOptions to filter the modules included in this
	// operation.
	RunInWorkspace(command string, filterOptions *FilterOptions, options *CmdOptions) (*RunResult, error)

	// RunInWorkspaceChanges runs a command in modules modified in workspace.
	RunInWorkspaceChanges(command string, options *CmdOptions) (*RunResult, error)
}

System is the interface used by users to invoke the core functionality of this package

func NewSystem

func NewSystem(path string, logLevel int) (System, error)

NewSystem creates a new instance of core mbt system

type TemplateData

type TemplateData struct {
	Args           map[string]interface{}
	Sha            string
	Env            map[string]string
	Modules        map[string]*Module
	ModulesList    []*Module
	OrderedModules []*Module
}

TemplateData is the data passed into template.

type UserCmd

type UserCmd struct {
	Cmd  string
	Args []string `yaml:",flow"`
	OS   []string `yaml:"os"`
}

UserCmd represents the structure of a user defined command in .mbt.yml

type WorkspaceManager

type WorkspaceManager interface {
	// CheckoutAndRun checks out the given commit and executes the specified function.
	// Returns an error if current workspace is dirty.
	// Otherwise returns the output from fn.
	CheckoutAndRun(commit string, fn func() (interface{}, error)) (interface{}, error)
}

WorkspaceManager contains various functions to manipulate workspace.

func NewWorkspaceManager

func NewWorkspaceManager(log Log, repo Repo) WorkspaceManager

NewWorkspaceManager creates a new workspace manager.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL