bug

package
v0.0.0-...-dac1202 Latest Latest
Warning

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

Go to latest
Published: Apr 12, 2024 License: GPL-3.0 Imports: 25 Imported by: 0

Documentation

Overview

Package bug contains the bug data model and low-level related functions

Index

Examples

Constants

View Source
const FirstStatus = ProposedStatus
View Source
const LastStatus = RejectedStatus
View Source
const NumStatuses = 8

Variables

View Source
var ClockLoader = repository.ClockLoader{
	Clocks: []string{creationClockName, editClockName},
	Witnesser: func(repo repository.ClockedRepo) error {
		for b := range ReadAllLocalBugs(repo) {
			if b.Err != nil {
				return b.Err
			}

			createClock, err := repo.GetOrCreateClock(creationClockName)
			if err != nil {
				return err
			}
			err = createClock.Witness(b.Bug.createTime)
			if err != nil {
				return err
			}

			editClock, err := repo.GetOrCreateClock(editClockName)
			if err != nil {
				return err
			}
			err = editClock.Witness(b.Bug.editTime)
			if err != nil {
				return err
			}
		}

		return nil
	},
}

ClockLoader is the repository.ClockLoader for the Bug entity

View Source
var ErrBugNotExist = errors.New("bug doesn't exist")

Functions

func ChangeLabels

func ChangeLabels(b Interface, author identity.Interface, unixTime int64, add, remove []string) ([]LabelChangeResult, *LabelChangeOperation, error)

ChangeLabels is a convenience function to apply the operation

func Create

func Create(author identity.Interface, unixTime int64, title, message string) (*Bug, *CreateOperation, error)

Convenience function to apply the operation

func CreateWithFiles

func CreateWithFiles(author identity.Interface, unixTime int64, title, message string, files []repository.Hash) (*Bug, *CreateOperation, error)

func Fetch

func Fetch(repo repository.Repo, remote string) (string, error)

Fetch retrieve updates from a remote This does not change the local bugs state

func FetchReviewInfo

func FetchReviewInfo(id string, since review2.PullRequest) (review2.PullRequest, error)

FetchReviewInfo exports review comments and status info from Phabricator or Gitea for the given differential ID and returns in a PullRequest struct. If a since review is specified then only updates since then are returned (only for Phabricator).

func IsCcbMember

func IsCcbMember(user identity.Interface) (bool, error)

IsCcbMember returns a flag indicating if the user is a ccb member, as defined in the repository configuration

func ListCcbMembers

func ListCcbMembers() ([]entity.Id, error)

ListCcbMembers returns a list of CCB members

func ListChecklists

func ListChecklists() (map[Label]Checklist, error)

ListChecklists returns the list of available checklists

func ListLocalIds

func ListLocalIds(repo repository.Repo) ([]entity.Id, error)

ListLocalIds list all the available local bug ids

func MergeAll

func MergeAll(repo repository.ClockedRepo, remote string) <-chan entity.MergeResult

MergeAll will merge all the available remote bug:

  • If the remote has new commit, the local bug is updated to match the same history (fast-forward update)
  • if the local bug has new commits but the remote don't, nothing is changed
  • if both local and remote bug have new commits (that is, we have a concurrent edition), new local commits are rewritten at the head of the remote history (that is, a rebase)

func NewErrMultipleMatchBug

func NewErrMultipleMatchBug(matching []entity.Id) *entity.ErrMultipleMatch

func NewErrMultipleMatchOp

func NewErrMultipleMatchOp(matching []entity.Id) *entity.ErrMultipleMatch

func PeekLocalBugEditTime

func PeekLocalBugEditTime(repo repository.ClockedRepo, id entity.Id) (time.Time, error)

PeekLocalBugEditTime will read the latest edit time of a bug without loading it

func Pull

func Pull(repo repository.ClockedRepo, remote string) error

Pull will do a Fetch + MergeAll This function will return an error if a merge fail

func Push

func Push(repo repository.Repo, remote string, out io.Writer) error

Push update a remote with all the local changes

func PushRef

func PushRef(repo repository.Repo, remote string, ref string, out io.Writer) error

PushRef update a remote with a local change

func ReadAllLocalBugs

func ReadAllLocalBugs(repo repository.ClockedRepo) <-chan StreamedBug

ReadAllLocalBugs read and parse all local bugs

func ReadAllRemoteBugs

func ReadAllRemoteBugs(repo repository.ClockedRepo, remote string) <-chan StreamedBug

ReadAllRemoteBugs read and parse all remote bugs for a given remote

func RemoveBug

func RemoveBug(repo repository.ClockedRepo, id entity.Id) error

RemoveBug will remove a local bug from its entity.Id

func ResetBug

func ResetBug(repo repository.ClockedRepo, id entity.Id) error

ResetBug will reset a local bug from its entity.Id

func ValidateAssigneeSet

func ValidateAssigneeSet(snap *Snapshot, next Status) error

ValidateAssigneeSet returns an error if the snapshot assignee is not set

func ValidateCcb

func ValidateCcb(snap *Snapshot, next Status) error

ValidateCcb returns an error if the snapshot does not have CCB set and approved for the next status

func ValidateChecklistsCompleted

func ValidateChecklistsCompleted(snap *Snapshot, next Status) error

ValidateChecklistsCompleted returns an error if at least one of the checklists attached to the snapshot has not been completed

Types

type AddCommentOperation

type AddCommentOperation struct {
	OpBase
	Message string `json:"message"`
	// TODO: change for a map[string]util.hash to store the filename ?
	Files []repository.Hash `json:"files"`
}

AddCommentOperation will add a new comment in the bug

func AddComment

func AddComment(b Interface, author identity.Interface, unixTime int64, message string) (*AddCommentOperation, error)

Convenience function to apply the operation

func AddCommentWithFiles

func AddCommentWithFiles(b Interface, author identity.Interface, unixTime int64, message string, files []repository.Hash) (*AddCommentOperation, error)

func NewAddCommentOp

func NewAddCommentOp(author identity.Interface, unixTime int64, message string, files []repository.Hash) *AddCommentOperation

func (*AddCommentOperation) Apply

func (op *AddCommentOperation) Apply(snapshot *Snapshot)

func (*AddCommentOperation) GetFiles

func (op *AddCommentOperation) GetFiles() []repository.Hash

func (*AddCommentOperation) Id

func (op *AddCommentOperation) Id() entity.Id

func (*AddCommentOperation) IsAuthored

func (op *AddCommentOperation) IsAuthored()

Sign post method for gqlgen

func (*AddCommentOperation) IsOperation

func (op *AddCommentOperation) IsOperation()

Sign-post method for gqlgen

func (*AddCommentOperation) UnmarshalJSON

func (op *AddCommentOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshalling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*AddCommentOperation) Validate

func (op *AddCommentOperation) Validate() error

type AddCommentTimelineItem

type AddCommentTimelineItem struct {
	CommentTimelineItem
}

CreateTimelineItem replace a AddComment operation in the Timeline and hold its edition history

func (*AddCommentTimelineItem) IsAuthored

func (a *AddCommentTimelineItem) IsAuthored()

Sign post method for gqlgen

func (AddCommentTimelineItem) String

func (a AddCommentTimelineItem) String() string

type Bug

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

Bug hold the data of a bug thread, organized in a way close to how it will be persisted inside Git. This is the data structure used to merge two different version of the same Bug.

func FindLocalBug

func FindLocalBug(repo repository.ClockedRepo, prefix string) (*Bug, error)

FindLocalBug find an existing Bug matching a prefix

func NewBug

func NewBug() *Bug

NewBug create a new Bug

func ReadLocalBug

func ReadLocalBug(repo repository.ClockedRepo, id entity.Id) (*Bug, error)

ReadLocalBug will read a local bug from its hash

func ReadRemoteBug

func ReadRemoteBug(repo repository.ClockedRepo, remote string, id entity.Id) (*Bug, error)

ReadRemoteBug will read a remote bug from its hash

func (*Bug) Append

func (bug *Bug) Append(op Operation)

Append an operation into the staging area, to be committed later

func (*Bug) Commit

func (bug *Bug) Commit(repo repository.ClockedRepo) error

Commit write the staging area in Git and move the operations to the packs

func (*Bug) CommitAsNeeded

func (bug *Bug) CommitAsNeeded(repo repository.ClockedRepo) error

func (*Bug) Compile

func (bug *Bug) Compile() Snapshot

Compile a bug in a easily usable snapshot

func (*Bug) CreateLamportTime

func (bug *Bug) CreateLamportTime() lamport.Time

CreateLamportTime return the Lamport time of creation

func (*Bug) EditLamportTime

func (bug *Bug) EditLamportTime() lamport.Time

EditLamportTime return the Lamport time of the last edit

func (*Bug) EnsureIdentities

func (bug *Bug) EnsureIdentities(resolver identity.Resolver) error

EnsureIdentities walk the graph of operations and make sure that all Identity are properly loaded. That is, it replace all the IdentityStub with the full Identity, loaded through a Resolver.

func (*Bug) FirstOp

func (bug *Bug) FirstOp() Operation

Lookup for the very first operation of the bug. For a valid Bug, this operation should be a CreateOp

func (*Bug) Id

func (bug *Bug) Id() entity.Id

Id return the Bug identifier

func (*Bug) LastOp

func (bug *Bug) LastOp() Operation

Lookup for the very last operation of the bug. For a valid Bug, should never be nil

func (*Bug) Merge

func (bug *Bug) Merge(repo repository.Repo, other Interface) (bool, error)

Merge a different version of the same bug by rebasing operations of this bug that are not present in the other on top of the chain of operations of the other version.

func (*Bug) NeedCommit

func (bug *Bug) NeedCommit() bool

func (*Bug) Validate

func (bug *Bug) Validate() error

Validate check if the Bug data is valid

type BugsByCreationTime

type BugsByCreationTime []*Bug

func (BugsByCreationTime) Len

func (b BugsByCreationTime) Len() int

func (BugsByCreationTime) Less

func (b BugsByCreationTime) Less(i, j int) bool

func (BugsByCreationTime) Swap

func (b BugsByCreationTime) Swap(i, j int)

type BugsByEditTime

type BugsByEditTime []*Bug

func (BugsByEditTime) Len

func (b BugsByEditTime) Len() int

func (BugsByEditTime) Less

func (b BugsByEditTime) Less(i, j int) bool

func (BugsByEditTime) Swap

func (b BugsByEditTime) Swap(i, j int)

type CcbInfo

type CcbInfo struct {
	User   identity.Interface // The approver
	Status Status             // The ticket status (e.g. vetted) that the approver is associated with
	State  CcbState           // The state of the approval
}

CcbInfo is stored in a ticket history every time an approver is added or removed, or has approved or blocked the ticket

type CcbInfoByStatus

type CcbInfoByStatus []CcbInfo

CcbInfoByStatus provides functions to fulfill the sort interface

func (CcbInfoByStatus) Len

func (a CcbInfoByStatus) Len() int

func (CcbInfoByStatus) Less

func (a CcbInfoByStatus) Less(i, j int) bool

func (CcbInfoByStatus) Swap

func (a CcbInfoByStatus) Swap(i, j int)

type CcbState

type CcbState int

CcbState represents the state of an approver with respect to a ticket status

const (
	AddedCcbState    CcbState // added to the ticket, but not set a state
	ApprovedCcbState          // approved the ticket
	BlockedCcbState           // blocked the ticket
	RemovedCcbState           // removed from the ticket
)

func (CcbState) ColorString

func (s CcbState) ColorString() string

Colored strings function for CcbState

func (CcbState) String

func (s CcbState) String() string

Stringify function for CcbState

type Checklist

type Checklist struct {
	Label    Label
	Title    string
	Sections []ChecklistSection
}

func GetChecklist

func GetChecklist(label Label) (Checklist, error)

GetChecklist returns a Checklist template out of the store

func (Checklist) CompoundState

func (c Checklist) CompoundState() ChecklistState

CompoundState returns an overall state for the checklist given the state of each of the questions. If any of the questions are Failed then the checklist Failed, else if any are TBD it's TBD, else it's Passed

func (Checklist) String

func (c Checklist) String() string

type ChecklistQuestion

type ChecklistQuestion struct {
	Question string
	Comment  string
	State    ChecklistState
}

type ChecklistSection

type ChecklistSection struct {
	Title     string
	Questions []ChecklistQuestion
}

type ChecklistSnapshot

type ChecklistSnapshot struct {
	Checklist
	LastEdit time.Time
}

type ChecklistState

type ChecklistState int
const (
	TBD ChecklistState = iota
	Passed
	Failed
	NotApplicable
)

func StateFromString

func StateFromString(str string) (ChecklistState, error)

func (ChecklistState) ColorString

func (s ChecklistState) ColorString() string

func (ChecklistState) ShortString

func (s ChecklistState) ShortString() string

func (ChecklistState) String

func (s ChecklistState) String() string

func (ChecklistState) Validate

func (s ChecklistState) Validate() error

type Comment

type Comment struct {
	Author  identity.Interface
	Message string
	Files   []repository.Hash
	Edited  bool

	// Creation time of the comment.
	// Should be used only for human display, never for ordering as we can't rely on it in a distributed system.
	UnixTime timestamp.Timestamp
	// contains filtered or unexported fields
}

Comment represent a comment in a Bug

func (Comment) FormatTime

func (c Comment) FormatTime() string

func (Comment) FormatTimeRel

func (c Comment) FormatTimeRel() string

FormatTimeRel format the UnixTime of the comment for human consumption

func (Comment) Id

func (c Comment) Id() entity.Id

Id return the Comment identifier

func (Comment) IsAuthored

func (c Comment) IsAuthored()

Sign post method for gqlgen

type CommentTimelineItem

type CommentTimelineItem struct {
	Index     int
	Author    identity.Interface
	Message   string
	Files     []repository.Hash
	CreatedAt timestamp.Timestamp
	// contains filtered or unexported fields
}

CommentTimelineItem is a TimelineItem that holds a Comment and its edition history

func NewCommentTimelineItem

func NewCommentTimelineItem(ID entity.Id, index int, comment Comment) CommentTimelineItem

func (*CommentTimelineItem) Id

func (c *CommentTimelineItem) Id() entity.Id

func (CommentTimelineItem) String

func (c CommentTimelineItem) String() string

func (CommentTimelineItem) When

type CreateOperation

type CreateOperation struct {
	OpBase
	Title   string            `json:"title"`
	Message string            `json:"message"`
	Files   []repository.Hash `json:"files"`
}

CreateOperation define the initial creation of a bug

func NewCreateOp

func NewCreateOp(author identity.Interface, unixTime int64, title, message string, files []repository.Hash) *CreateOperation

func (*CreateOperation) Apply

func (op *CreateOperation) Apply(snapshot *Snapshot)

func (*CreateOperation) GetFiles

func (op *CreateOperation) GetFiles() []repository.Hash

func (*CreateOperation) Id

func (op *CreateOperation) Id() entity.Id

func (*CreateOperation) IsAuthored

func (op *CreateOperation) IsAuthored()

Sign post method for gqlgen

func (*CreateOperation) IsOperation

func (op *CreateOperation) IsOperation()

Sign-post method for gqlgen

func (*CreateOperation) UnmarshalJSON

func (op *CreateOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*CreateOperation) Validate

func (op *CreateOperation) Validate() error

type CreateTimelineItem

type CreateTimelineItem struct {
	CommentTimelineItem
}

CreateTimelineItem replace a Create operation in the Timeline and hold its edition history

func (*CreateTimelineItem) IsAuthored

func (c *CreateTimelineItem) IsAuthored()

Sign post method for gqlgen

func (CreateTimelineItem) String

func (c CreateTimelineItem) String() string

type EditCommentOperation

type EditCommentOperation struct {
	OpBase
	Target  entity.Id         `json:"target"`
	Message string            `json:"message"`
	Files   []repository.Hash `json:"files"`
}

EditCommentOperation will change a comment in the bug

func EditComment

func EditComment(b Interface, author identity.Interface, unixTime int64, target entity.Id, message string) (*EditCommentOperation, error)

Convenience function to apply the operation

func EditCommentWithFiles

func EditCommentWithFiles(b Interface, author identity.Interface, unixTime int64, target entity.Id, message string, files []repository.Hash) (*EditCommentOperation, error)

func EditCreateComment

func EditCreateComment(b Interface, author identity.Interface, unixTime int64, message string) (*EditCommentOperation, error)

Convenience function to edit the body of a bug (the first comment)

func EditCreateCommentWithFiles

func EditCreateCommentWithFiles(b Interface, author identity.Interface, unixTime int64, message string, files []repository.Hash) (*EditCommentOperation, error)

Convenience function to edit the body of a bug (the first comment)

func NewEditCommentOp

func NewEditCommentOp(author identity.Interface, unixTime int64, target entity.Id, message string, files []repository.Hash) *EditCommentOperation

func (*EditCommentOperation) Apply

func (op *EditCommentOperation) Apply(snapshot *Snapshot)

func (*EditCommentOperation) GetFiles

func (op *EditCommentOperation) GetFiles() []repository.Hash

func (*EditCommentOperation) Id

func (op *EditCommentOperation) Id() entity.Id

func (*EditCommentOperation) IsAuthored

func (op *EditCommentOperation) IsAuthored()

Sign post method for gqlgen

func (*EditCommentOperation) IsOperation

func (op *EditCommentOperation) IsOperation()

Sign-post method for gqlgen

func (*EditCommentOperation) UnmarshalJSON

func (op *EditCommentOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*EditCommentOperation) Validate

func (op *EditCommentOperation) Validate() error

type EditCommentTimelineItem

type EditCommentTimelineItem struct {
	CommentTimelineItem
}

CreateTimelineItem replace a AddComment operation in the Timeline and hold its edition history

func (*EditCommentTimelineItem) IsAuthored

func (a *EditCommentTimelineItem) IsAuthored()

Sign post method for gqlgen

func (EditCommentTimelineItem) String

func (a EditCommentTimelineItem) String() string

type Interface

type Interface interface {
	// Id return the Bug identifier
	Id() entity.Id

	// Validate check if the Bug data is valid
	Validate() error

	// Append an operation into the staging area, to be committed later
	Append(op Operation)

	// Indicate that the in-memory state changed and need to be commit in the repository
	NeedCommit() bool

	// Commit write the staging area in Git and move the operations to the packs
	Commit(repo repository.ClockedRepo) error

	// Merge a different version of the same bug by rebasing operations of this bug
	// that are not present in the other on top of the chain of operations of the
	// other version.
	Merge(repo repository.Repo, other Interface) (bool, error)

	// Lookup for the very first operation of the bug.
	// For a valid Bug, this operation should be a CreateOp
	FirstOp() Operation

	// Lookup for the very last operation of the bug.
	// For a valid Bug, should never be nil
	LastOp() Operation

	// Compile a bug in a easily usable snapshot
	Compile() Snapshot

	// CreateLamportTime return the Lamport time of creation
	CreateLamportTime() lamport.Time

	// EditLamportTime return the Lamport time of the last edit
	EditLamportTime() lamport.Time
}

type Label

type Label string

func GetChecklistLabels

func GetChecklistLabels() []Label

GetChecklistLabels returns a slice of all the available checklist labels

func GetWorkflowLabels

func GetWorkflowLabels() []Label

GetWorkflowLabels returns a slice of all the available workflow labels

func (Label) Color

func (l Label) Color() LabelColor

RGBA from a Label computed in a deterministic way

func (Label) IsChecklist

func (l Label) IsChecklist() bool

func (Label) IsWorkflow

func (l Label) IsWorkflow() bool

func (Label) String

func (l Label) String() string

func (Label) Validate

func (l Label) Validate() error

type LabelChangeOperation

type LabelChangeOperation struct {
	OpBase
	Added   []Label `json:"added"`
	Removed []Label `json:"removed"`
}

LabelChangeOperation define a Bug operation to add or remove labels

func ForceChangeLabels

func ForceChangeLabels(b Interface, author identity.Interface, unixTime int64, add, remove []string) (*LabelChangeOperation, error)

ForceChangeLabels is a convenience function to apply the operation The difference with ChangeLabels is that no checks of deduplications are done. You are entirely responsible of what you are doing. In the general case, you want to use ChangeLabels instead. The intended use of this function is to allow importers to create legal but unexpected label changes, like removing a label with no information of when it was added before.

func NewLabelChangeOperation

func NewLabelChangeOperation(author identity.Interface, unixTime int64, added, removed []Label) *LabelChangeOperation

func (*LabelChangeOperation) Apply

func (op *LabelChangeOperation) Apply(snapshot *Snapshot)

Apply apply the operation

func (*LabelChangeOperation) Id

func (op *LabelChangeOperation) Id() entity.Id

func (*LabelChangeOperation) IsAuthored

func (op *LabelChangeOperation) IsAuthored()

Sign post method for gqlgen

func (*LabelChangeOperation) IsOperation

func (op *LabelChangeOperation) IsOperation()

Sign-post method for gqlgen

func (*LabelChangeOperation) UnmarshalJSON

func (op *LabelChangeOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*LabelChangeOperation) Validate

func (op *LabelChangeOperation) Validate() error

type LabelChangeResult

type LabelChangeResult struct {
	Label  Label
	Status LabelChangeStatus
}

func (LabelChangeResult) String

func (l LabelChangeResult) String() string

type LabelChangeStatus

type LabelChangeStatus int
const (
	LabelChangeAdded LabelChangeStatus
	LabelChangeRemoved
	LabelChangeDuplicateInOp
	LabelChangeAlreadySet
	LabelChangeDoesntExist
	LabelChangeInvalidWorkflow
	LabelChangeInvalidChecklist
)

type LabelChangeTimelineItem

type LabelChangeTimelineItem struct {
	Author   identity.Interface
	UnixTime timestamp.Timestamp
	Added    []Label
	Removed  []Label
	// contains filtered or unexported fields
}

func (LabelChangeTimelineItem) Id

func (*LabelChangeTimelineItem) IsAuthored

func (l *LabelChangeTimelineItem) IsAuthored()

Sign post method for gqlgen

func (LabelChangeTimelineItem) String

func (l LabelChangeTimelineItem) String() string

func (LabelChangeTimelineItem) When

type LabelColor

type LabelColor color.RGBA

func (LabelColor) RGBA

func (lc LabelColor) RGBA() color.RGBA

func (LabelColor) Term256

func (lc LabelColor) Term256() Term256

type NoOpOperation

type NoOpOperation struct {
	OpBase
}

NoOpOperation is an operation that does not change the bug state. It can however be used to store arbitrary metadata in the bug history, for example to support a bridge feature.

func NewNoOpOp

func NewNoOpOp(author identity.Interface, unixTime int64) *NoOpOperation

func NoOp

func NoOp(b Interface, author identity.Interface, unixTime int64, metadata map[string]string) (*NoOpOperation, error)

Convenience function to apply the operation

func (*NoOpOperation) Apply

func (op *NoOpOperation) Apply(snapshot *Snapshot)

func (*NoOpOperation) Id

func (op *NoOpOperation) Id() entity.Id

func (*NoOpOperation) IsAuthored

func (op *NoOpOperation) IsAuthored()

Sign post method for gqlgen

func (*NoOpOperation) IsOperation

func (op *NoOpOperation) IsOperation()

Sign-post method for gqlgen

func (*NoOpOperation) UnmarshalJSON

func (op *NoOpOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*NoOpOperation) Validate

func (op *NoOpOperation) Validate() error

type OpBase

type OpBase struct {
	OperationType OperationType      `json:"type"`
	Author        identity.Interface `json:"author"`
	// TODO: part of the data model upgrade, this should eventually be a timestamp + lamport
	UnixTime int64             `json:"timestamp"`
	Metadata map[string]string `json:"metadata,omitempty"`
	// contains filtered or unexported fields
}

OpBase implement the common code for all operations

func (*OpBase) AllMetadata

func (op *OpBase) AllMetadata() map[string]string

AllMetadata return all metadata for this operation

func (*OpBase) GetAuthor

func (op *OpBase) GetAuthor() identity.Interface

GetAuthor return author identity

func (*OpBase) GetFiles

func (op *OpBase) GetFiles() []repository.Hash

GetFiles return the files needed by this operation

func (*OpBase) GetMetadata

func (op *OpBase) GetMetadata(key string) (string, bool)

GetMetadata retrieve arbitrary metadata about the operation

func (*OpBase) SetMetadata

func (op *OpBase) SetMetadata(key string, value string)

SetMetadata store arbitrary metadata about the operation

func (*OpBase) Time

func (op *OpBase) Time() time.Time

Time return the time when the operation was added

func (*OpBase) UnmarshalJSON

func (op *OpBase) UnmarshalJSON(data []byte) error

type Operation

type Operation interface {

	// Id return the identifier of the operation, to be used for back references
	Id() entity.Id
	// Time return the time when the operation was added
	Time() time.Time
	// GetFiles return the files needed by this operation
	GetFiles() []repository.Hash
	// Apply the operation to a Snapshot to create the final state
	Apply(snapshot *Snapshot)
	// Validate check if the operation is valid (ex: a title is a single line)
	Validate() error
	// SetMetadata store arbitrary metadata about the operation
	SetMetadata(key string, value string)
	// GetMetadata retrieve arbitrary metadata about the operation
	GetMetadata(key string) (string, bool)
	// AllMetadata return all metadata for this operation
	AllMetadata() map[string]string
	// GetAuthor return the author identity
	GetAuthor() identity.Interface

	// sign-post method for gqlgen
	IsOperation()
	// contains filtered or unexported methods
}

Operation define the interface to fulfill for an edit operation of a Bug

type OperationIterator

type OperationIterator struct {
	// contains filtered or unexported fields
}
Example
b := NewBug()

// add operations

it := NewOperationIterator(b)

for it.Next() {
	// do something with each operations
	_ = it.Value()
}
Output:

func NewOperationIterator

func NewOperationIterator(bug Interface) *OperationIterator

func (*OperationIterator) Next

func (it *OperationIterator) Next() bool

func (*OperationIterator) Value

func (it *OperationIterator) Value() Operation

type OperationPack

type OperationPack struct {
	Operations []Operation
	// contains filtered or unexported fields
}

OperationPack represent an ordered set of operation to apply to a Bug. These operations are stored in a single Git commit.

These commits will be linked together in a linear chain of commits inside Git to form the complete ordered chain of operation to apply to get the final state of the Bug

func (*OperationPack) Append

func (opp *OperationPack) Append(op Operation)

Append a new operation to the pack

func (*OperationPack) Clone

func (opp *OperationPack) Clone() OperationPack

Make a deep copy

func (*OperationPack) IncludesStatusChange

func (opp *OperationPack) IncludesStatusChange() bool

IncludesStatusChange returns true of one of the operations in the pack has the type SetStatusOp

func (*OperationPack) IsEmpty

func (opp *OperationPack) IsEmpty() bool

IsEmpty tell if the OperationPack is empty

func (*OperationPack) MarshalJSON

func (opp *OperationPack) MarshalJSON() ([]byte, error)

func (*OperationPack) UnmarshalJSON

func (opp *OperationPack) UnmarshalJSON(data []byte) error

func (*OperationPack) Validate

func (opp *OperationPack) Validate() error

IsValid tell if the OperationPack is considered valid

func (*OperationPack) Write

Write will serialize and store the OperationPack as a git blob and return its hash

type OperationType

type OperationType int

OperationType is an operation type identifier

const (
	CreateOp OperationType
	SetTitleOp
	AddCommentOp
	SetStatusOp
	LabelChangeOp
	EditCommentOp
	NoOpOp
	SetMetadataOp
	SetChecklistOp
	SetAssigneeOp
	SetReviewOp
	SetCcbOp
)

type SetAssigneeOperation

type SetAssigneeOperation struct {
	OpBase
	Assignee identity.Interface `json:"assignee"`
}

SetAssigneeOperation will change the Assignee of a bug

func NewSetAssigneeOp

func NewSetAssigneeOp(author identity.Interface, unixTime int64, assignee identity.Interface) *SetAssigneeOperation

func SetAssignee

func SetAssignee(b Interface, author identity.Interface, unixTime int64, assignee identity.Interface) (*SetAssigneeOperation, error)

Convenience function to apply the operation

func (*SetAssigneeOperation) Apply

func (op *SetAssigneeOperation) Apply(snapshot *Snapshot)

func (*SetAssigneeOperation) Id

func (op *SetAssigneeOperation) Id() entity.Id

func (*SetAssigneeOperation) IsAuthored

func (op *SetAssigneeOperation) IsAuthored()

Sign post method for gqlgen

func (*SetAssigneeOperation) IsOperation

func (op *SetAssigneeOperation) IsOperation()

Sign-post method for gqlgen

func (*SetAssigneeOperation) UnmarshalJSON

func (op *SetAssigneeOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*SetAssigneeOperation) Validate

func (op *SetAssigneeOperation) Validate() error

type SetAssigneeTimelineItem

type SetAssigneeTimelineItem struct {
	Author   identity.Interface
	UnixTime timestamp.Timestamp
	Assignee identity.Interface
	// contains filtered or unexported fields
}

func (SetAssigneeTimelineItem) Id

func (*SetAssigneeTimelineItem) IsAuthored

func (s *SetAssigneeTimelineItem) IsAuthored()

Sign post method for gqlgen

func (SetAssigneeTimelineItem) String

func (s SetAssigneeTimelineItem) String() string

func (SetAssigneeTimelineItem) When

type SetCcbOperation

type SetCcbOperation struct {
	OpBase
	Ccb CcbInfo `json:"ccb"`
}

SetCcbOperation will change the CCB status of a bug

func NewSetCcbOp

func NewSetCcbOp(author identity.Interface, unixTime int64, user identity.Interface, status Status, state CcbState) *SetCcbOperation

func SetCcb

func SetCcb(b Interface, author identity.Interface, unixTime int64, user identity.Interface, status Status, state CcbState) (*SetCcbOperation, error)

Convenience function to apply the operation

func (*SetCcbOperation) Apply

func (op *SetCcbOperation) Apply(snapshot *Snapshot)

func (*SetCcbOperation) Id

func (op *SetCcbOperation) Id() entity.Id

func (*SetCcbOperation) IsAuthored

func (op *SetCcbOperation) IsAuthored()

Sign post method for gqlgen

func (*SetCcbOperation) IsOperation

func (op *SetCcbOperation) IsOperation()

Sign-post method for gqlgen

func (*SetCcbOperation) UnmarshalJSON

func (op *SetCcbOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*SetCcbOperation) Validate

func (op *SetCcbOperation) Validate() error

type SetCcbTimelineItem

type SetCcbTimelineItem struct {
	Author   identity.Interface
	UnixTime timestamp.Timestamp
	Ccb      CcbInfo
	// contains filtered or unexported fields
}

func (SetCcbTimelineItem) Id

func (s SetCcbTimelineItem) Id() entity.Id

func (*SetCcbTimelineItem) IsAuthored

func (s *SetCcbTimelineItem) IsAuthored()

Sign post method for gqlgen

func (SetCcbTimelineItem) String

func (s SetCcbTimelineItem) String() string

func (SetCcbTimelineItem) When

type SetChecklistOperation

type SetChecklistOperation struct {
	OpBase
	Checklist Checklist `json:"checklist"`
}

SetChecklistOperation will update the checklist associated with a ticket

func NewSetChecklistOp

func NewSetChecklistOp(author identity.Interface, unixTime int64, cl Checklist) *SetChecklistOperation

func SetChecklist

func SetChecklist(b Interface, author identity.Interface, unixTime int64, cl Checklist) (*SetChecklistOperation, error)

Convenience function to apply the operation

func (*SetChecklistOperation) Apply

func (op *SetChecklistOperation) Apply(snapshot *Snapshot)

func (*SetChecklistOperation) Id

func (op *SetChecklistOperation) Id() entity.Id

func (*SetChecklistOperation) IsAuthored

func (op *SetChecklistOperation) IsAuthored()

Sign post method for gqlgen

func (*SetChecklistOperation) IsOperation

func (op *SetChecklistOperation) IsOperation()

Sign-post method for gqlgen

func (*SetChecklistOperation) UnmarshalJSON

func (op *SetChecklistOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*SetChecklistOperation) Validate

func (op *SetChecklistOperation) Validate() error

type SetChecklistTimelineItem

type SetChecklistTimelineItem struct {
	Author    identity.Interface
	UnixTime  timestamp.Timestamp
	Checklist Checklist
	// contains filtered or unexported fields
}

func (SetChecklistTimelineItem) Id

func (*SetChecklistTimelineItem) IsAuthored

func (s *SetChecklistTimelineItem) IsAuthored()

Sign post method for gqlgen

func (SetChecklistTimelineItem) String

func (s SetChecklistTimelineItem) String() string

func (SetChecklistTimelineItem) When

type SetMetadataOperation

type SetMetadataOperation struct {
	OpBase
	Target      entity.Id         `json:"target"`
	NewMetadata map[string]string `json:"new_metadata"`
}

func NewSetMetadataOp

func NewSetMetadataOp(author identity.Interface, unixTime int64, target entity.Id, newMetadata map[string]string) *SetMetadataOperation

func SetMetadata

func SetMetadata(b Interface, author identity.Interface, unixTime int64, target entity.Id, newMetadata map[string]string) (*SetMetadataOperation, error)

Convenience function to apply the operation

func (*SetMetadataOperation) Apply

func (op *SetMetadataOperation) Apply(snapshot *Snapshot)

func (*SetMetadataOperation) Id

func (op *SetMetadataOperation) Id() entity.Id

func (*SetMetadataOperation) IsAuthored

func (op *SetMetadataOperation) IsAuthored()

Sign post method for gqlgen

func (*SetMetadataOperation) IsOperation

func (op *SetMetadataOperation) IsOperation()

Sign-post method for gqlgen

func (*SetMetadataOperation) UnmarshalJSON

func (op *SetMetadataOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*SetMetadataOperation) Validate

func (op *SetMetadataOperation) Validate() error

type SetReviewOperation

type SetReviewOperation struct {
	OpBase
	Review review2.PullRequest `json:"review"`
}

SetReviewOperation will update the review associated with a ticket

func NewSetReviewOp

func NewSetReviewOp(author identity.Interface, unixTime int64, review review2.PullRequest) *SetReviewOperation

func SetReview

func SetReview(b Interface, author identity.Interface, unixTime int64, review review2.PullRequest) (*SetReviewOperation, error)

Convenience function to apply the operation

func (*SetReviewOperation) Apply

func (op *SetReviewOperation) Apply(snapshot *Snapshot)

func (*SetReviewOperation) Id

func (op *SetReviewOperation) Id() entity.Id

func (*SetReviewOperation) IsAuthored

func (op *SetReviewOperation) IsAuthored()

Sign post method for gqlgen

func (*SetReviewOperation) IsOperation

func (op *SetReviewOperation) IsOperation()

Sign-post method for gqlgen

func (*SetReviewOperation) MarshalJSON

func (op *SetReviewOperation) MarshalJSON() ([]byte, error)

MarshalJSON serializes to json preserving type information

func (*SetReviewOperation) UnmarshalJSON

func (op *SetReviewOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*SetReviewOperation) Validate

func (op *SetReviewOperation) Validate() error

type SetReviewTimelineItem

type SetReviewTimelineItem struct {
	Author   identity.Interface
	UnixTime timestamp.Timestamp
	Review   review2.PullRequest
	Event    review2.TimelineEvent
	// contains filtered or unexported fields
}

func (SetReviewTimelineItem) Id

func (*SetReviewTimelineItem) IsAuthored

func (s *SetReviewTimelineItem) IsAuthored()

Sign post method for gqlgen

func (SetReviewTimelineItem) String

func (s SetReviewTimelineItem) String() string

func (SetReviewTimelineItem) When

type SetStatusOperation

type SetStatusOperation struct {
	OpBase
	Status Status `json:"status"`
}

SetStatusOperation will change the status of a bug

func Close

func Close(b Interface, author identity.Interface, unixTime int64) (*SetStatusOperation, error)

Convenience function to apply the operation

func NewSetStatusOp

func NewSetStatusOp(author identity.Interface, unixTime int64, status Status) *SetStatusOperation

func Open

func Open(b Interface, author identity.Interface, unixTime int64) (*SetStatusOperation, error)

Convenience function to apply the operation

func SetStatus

func SetStatus(b Interface, author identity.Interface, unixTime int64, status Status) (*SetStatusOperation, error)

Convenience function to apply the operation

func (*SetStatusOperation) Apply

func (op *SetStatusOperation) Apply(snapshot *Snapshot)

func (*SetStatusOperation) Id

func (op *SetStatusOperation) Id() entity.Id

func (*SetStatusOperation) IsAuthored

func (op *SetStatusOperation) IsAuthored()

Sign post method for gqlgen

func (*SetStatusOperation) IsOperation

func (op *SetStatusOperation) IsOperation()

Sign-post method for gqlgen

func (*SetStatusOperation) UnmarshalJSON

func (op *SetStatusOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*SetStatusOperation) Validate

func (op *SetStatusOperation) Validate() error

type SetStatusTimelineItem

type SetStatusTimelineItem struct {
	Author   identity.Interface
	UnixTime timestamp.Timestamp
	Status   Status
	// contains filtered or unexported fields
}

func (SetStatusTimelineItem) Id

func (*SetStatusTimelineItem) IsAuthored

func (s *SetStatusTimelineItem) IsAuthored()

Sign post method for gqlgen

func (SetStatusTimelineItem) String

func (s SetStatusTimelineItem) String() string

func (SetStatusTimelineItem) When

type SetTitleOperation

type SetTitleOperation struct {
	OpBase
	Title string `json:"title"`
	Was   string `json:"was"`
}

SetTitleOperation will change the title of a bug

func NewSetTitleOp

func NewSetTitleOp(author identity.Interface, unixTime int64, title string, was string) *SetTitleOperation

func SetTitle

func SetTitle(b Interface, author identity.Interface, unixTime int64, title string) (*SetTitleOperation, error)

Convenience function to apply the operation

func (*SetTitleOperation) Apply

func (op *SetTitleOperation) Apply(snapshot *Snapshot)

func (*SetTitleOperation) Id

func (op *SetTitleOperation) Id() entity.Id

func (*SetTitleOperation) IsAuthored

func (op *SetTitleOperation) IsAuthored()

Sign post method for gqlgen

func (*SetTitleOperation) IsOperation

func (op *SetTitleOperation) IsOperation()

Sign-post method for gqlgen

func (*SetTitleOperation) UnmarshalJSON

func (op *SetTitleOperation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a two step JSON unmarshaling This workaround is necessary to avoid the inner OpBase.MarshalJSON overriding the outer op's MarshalJSON

func (*SetTitleOperation) Validate

func (op *SetTitleOperation) Validate() error

type SetTitleTimelineItem

type SetTitleTimelineItem struct {
	Author   identity.Interface
	UnixTime timestamp.Timestamp
	Title    string
	Was      string
	// contains filtered or unexported fields
}

func (SetTitleTimelineItem) Id

func (*SetTitleTimelineItem) IsAuthored

func (s *SetTitleTimelineItem) IsAuthored()

Sign post method for gqlgen

func (SetTitleTimelineItem) String

func (s SetTitleTimelineItem) String() string

func (SetTitleTimelineItem) When

type Snapshot

type Snapshot struct {
	Status       Status
	Title        string
	Comments     []Comment
	Labels       []Label
	Checklists   map[Label]map[entity.Id]ChecklistSnapshot // label and reviewer id
	Reviews      map[string]review.PullRequest             // Pull request ID
	Author       identity.Interface
	Assignee     identity.Interface
	Actors       []identity.Interface
	Participants []identity.Interface
	Ccb          []CcbInfo
	CreateTime   time.Time

	Timeline []TimelineItem

	Operations []Operation
	// contains filtered or unexported fields
}

Snapshot is a compiled form of the Bug data structure used for storage and merge

func (*Snapshot) EditTime

func (snap *Snapshot) EditTime() time.Time

Return the last time a bug was modified

func (*Snapshot) GetCcbState

func (snap *Snapshot) GetCcbState(id entity.Id, status Status) CcbState

GetCcbState returns the state assocated with the id in the ticket CCB group

func (*Snapshot) GetChecklistCompoundStates

func (snap *Snapshot) GetChecklistCompoundStates() map[Label]ChecklistState

GetChecklistCompoundStates returns a map of checklist states mapped to label, associated with this snapshot

func (*Snapshot) GetComment

func (snap *Snapshot) GetComment(index int) (*Comment, error)

GetComment will return the comment for a given index

func (*Snapshot) GetCreateMetadata

func (snap *Snapshot) GetCreateMetadata(key string) (string, bool)

GetCreateMetadata return the creation metadata

func (*Snapshot) GetUserChecklists

func (snap *Snapshot) GetUserChecklists(reviewer entity.Id, blank bool) (map[Label]Checklist, error)

GetUserChecklists returns a map of checklists associated with this snapshot for the given reviewer id, if the blank flag is set then always return a clean set of checklists

func (*Snapshot) HasActor

func (snap *Snapshot) HasActor(id entity.Id) bool

HasActor return true if the id is a actor

func (*Snapshot) HasAnyActor

func (snap *Snapshot) HasAnyActor(ids ...entity.Id) bool

HasAnyActor return true if one of the ids is a actor

func (*Snapshot) HasAnyParticipant

func (snap *Snapshot) HasAnyParticipant(ids ...entity.Id) bool

HasAnyParticipant return true if one of the ids is a participant

func (*Snapshot) HasParticipant

func (snap *Snapshot) HasParticipant(id entity.Id) bool

HasParticipant return true if the id is a participant

func (*Snapshot) Id

func (snap *Snapshot) Id() entity.Id

Return the Bug identifier

func (*Snapshot) IsAuthored

func (snap *Snapshot) IsAuthored()

Sign post method for gqlgen

func (*Snapshot) NextStatuses

func (snap *Snapshot) NextStatuses() ([]Status, error)

NextStatuses returns a slice of next possible statuses for the assigned workflow

func (*Snapshot) SearchComment

func (snap *Snapshot) SearchComment(id entity.Id) (*Comment, error)

SearchComment will search for a comment matching the given hash

func (*Snapshot) ValidateTransition

func (snap *Snapshot) ValidateTransition(newStatus Status) error

ValidateTransition returns an error if the supplied state is an invalid destination from the current state for the assigned workflow

type Status

type Status int
const (
	ProposedStatus Status
	VettedStatus
	InProgressStatus
	InReviewStatus
	ReviewedStatus
	AcceptedStatus
	MergedStatus
	DoneStatus
	RejectedStatus
)

func ActiveStatuses

func ActiveStatuses() []Status

func AllStatuses

func AllStatuses() []Status

func StatusFromString

func StatusFromString(str string) (Status, error)

func (Status) Action

func (s Status) Action() string

func (Status) String

func (s Status) String() string

func (Status) Validate

func (s Status) Validate() error

type StreamedBug

type StreamedBug struct {
	Bug *Bug
	Err error
}

type Term256

type Term256 int

func (Term256) Escape

func (t Term256) Escape() string

func (Term256) Unescape

func (t Term256) Unescape() string

type TimelineItem

type TimelineItem interface {
	// ID return the identifier of the item
	Id() entity.Id
	// When returns the time of the item
	When() timestamp.Timestamp
	// Timeline specific print message
	String() string
}

type Transition

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

type ValidationFunc

type ValidationFunc func(snap *Snapshot, next Status) error

type WithSnapshot

type WithSnapshot struct {
	*Bug
	// contains filtered or unexported fields
}

WithSnapshot encapsulate a Bug and maintain the corresponding Snapshot efficiently

func (*WithSnapshot) Append

func (b *WithSnapshot) Append(op Operation)

Append intercept Bug.Append() to update the snapshot efficiently

func (*WithSnapshot) Commit

func (b *WithSnapshot) Commit(repo repository.ClockedRepo) error

Commit intercept Bug.Commit() to update the snapshot efficiently

func (*WithSnapshot) Merge

func (b *WithSnapshot) Merge(repo repository.Repo, other Interface) (bool, error)

Merge intercept Bug.Merge() and clear the snapshot

func (*WithSnapshot) Snapshot

func (b *WithSnapshot) Snapshot() *Snapshot

Snapshot return the current snapshot

type Workflow

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

func FindWorkflow

func FindWorkflow(names []Label) *Workflow

FindWorkflow searches a list of labels and attempts to match them to a workflow, returning the first found

func (*Workflow) NextStatuses

func (w *Workflow) NextStatuses(s Status) []Status

NextStatuses returns a slice of next possible statuses in the workflow for the given one

func (*Workflow) ValidateTransition

func (w *Workflow) ValidateTransition(snap *Snapshot, to Status) error

ValidateTransition checks if the transition is valid for a given start and end

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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