Documentation
¶
Overview ¶
Package bug contains the bug data model and low-level related functions
Index ¶
- Constants
- Variables
- func ChangeLabels(b Interface, author identity.Interface, unixTime int64, add, remove []string, ...) ([]LabelChangeResult, *LabelChangeOperation, error)
- func Create(author identity.Interface, unixTime int64, title, message string, ...) (*Bug, *CreateOperation, error)
- func Fetch(repo repository.Repo, remote string) (string, error)
- func ListLocalIds(repo repository.Repo) ([]entity.Id, error)
- func MergeAll(repo repository.ClockedRepo, resolvers entity.Resolvers, remote string, ...) <-chan entity.MergeResult
- func NewSetMetadataOp(author identity.Interface, unixTime int64, target entity.Id, ...) *dag.SetMetadataOperation[*Snapshot]
- func Pull(repo repository.ClockedRepo, resolvers entity.Resolvers, remote string, ...) error
- func Push(repo repository.Repo, remote string) (string, error)
- func ReadAll(repo repository.ClockedRepo) <-chan entity.StreamedEntity[*Bug]
- func ReadAllWithResolver(repo repository.ClockedRepo, resolvers entity.Resolvers) <-chan entity.StreamedEntity[*Bug]
- func Remove(repo repository.ClockedRepo, id entity.Id) error
- func RemoveAll(repo repository.ClockedRepo) error
- func SetMetadata(b Interface, author identity.Interface, unixTime int64, target entity.Id, ...) (*dag.SetMetadataOperation[*Snapshot], error)
- type AddCommentOperation
- type AddCommentTimelineItem
- type Bug
- type BugsByCreationTime
- type BugsByEditTime
- type Comment
- type CommentHistoryStep
- type CommentTimelineItem
- type CreateOperation
- type CreateTimelineItem
- type EditCommentOperation
- func EditComment(b Interface, author identity.Interface, unixTime int64, target entity.Id, ...) (entity.CombinedId, *EditCommentOperation, error)
- func EditCreateComment(b Interface, author identity.Interface, unixTime int64, message string, ...) (entity.CombinedId, *EditCommentOperation, error)
- func NewEditCommentOp(author identity.Interface, unixTime int64, target entity.Id, message string, ...) *EditCommentOperation
- type Interface
- type LabelChangeOperation
- type LabelChangeResult
- type LabelChangeStatus
- type LabelChangeTimelineItem
- type Operation
- type SetStatusOperation
- func Close(b Interface, author identity.Interface, unixTime int64, ...) (*SetStatusOperation, error)
- func NewSetStatusOp(author identity.Interface, unixTime int64, status common.Status) *SetStatusOperation
- func Open(b Interface, author identity.Interface, unixTime int64, ...) (*SetStatusOperation, error)
- type SetStatusTimelineItem
- type SetTitleOperation
- type SetTitleTimelineItem
- type SimpleResolver
- type Snapshot
- func (snap *Snapshot) AllOperations() []dag.Operation
- func (snap *Snapshot) AppendOperation(op dag.Operation)
- func (snap *Snapshot) EditTime() time.Time
- func (snap *Snapshot) GetCreateMetadata(key string) (string, bool)
- func (snap *Snapshot) HasActor(id entity.Id) bool
- func (snap *Snapshot) HasAnyActor(ids ...entity.Id) bool
- func (snap *Snapshot) HasAnyParticipant(ids ...entity.Id) bool
- func (snap *Snapshot) HasParticipant(id entity.Id) bool
- func (snap *Snapshot) Id() entity.Id
- func (snap *Snapshot) IsAuthored()
- func (snap *Snapshot) SearchComment(id entity.CombinedId) (*Comment, error)
- func (snap *Snapshot) SearchCommentByOpId(id entity.Id) (*Comment, error)
- func (snap *Snapshot) SearchTimelineItem(id entity.CombinedId) (TimelineItem, error)
- type TimelineItem
Constants ¶
const ( CreateOp dag.OperationType SetTitleOp AddCommentOp SetStatusOp LabelChangeOp EditCommentOp NoOpOp SetMetadataOp )
const Namespace = "bugs"
const Typename = "bug"
Variables ¶
var ClockLoader = dag.ClockLoader(def)
Functions ¶
func ChangeLabels ¶
func ChangeLabels(b Interface, author identity.Interface, unixTime int64, add, remove []string, metadata map[string]string) ([]LabelChangeResult, *LabelChangeOperation, error)
ChangeLabels is a convenience function to change labels on a bug
func Create ¶
func Create(author identity.Interface, unixTime int64, title, message string, files []repository.Hash, metadata map[string]string) (*Bug, *CreateOperation, error)
Create is a convenience function to create a bug
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 ListLocalIds ¶
func ListLocalIds(repo repository.Repo) ([]entity.Id, error)
ListLocalIds list all the available local bug ids
func MergeAll ¶
func MergeAll(repo repository.ClockedRepo, resolvers entity.Resolvers, remote string, mergeAuthor identity.Interface) <-chan entity.MergeResult
MergeAll will merge all the available remote bug Note: an author is necessary for the case where a merge commit is created, as this commit will have an author and may be signed if a signing key is available.
func NewSetMetadataOp ¶
func Pull ¶
func Pull(repo repository.ClockedRepo, resolvers entity.Resolvers, remote string, mergeAuthor identity.Interface) error
Pull will do a Fetch + MergeAll This function will return an error if a merge fail Note: an author is necessary for the case where a merge commit is created, as this commit will have an author and may be signed if a signing key is available.
func Push ¶
func Push(repo repository.Repo, remote string) (string, error)
Push update a remote with the local changes
func ReadAll ¶
func ReadAll(repo repository.ClockedRepo) <-chan entity.StreamedEntity[*Bug]
ReadAll read and parse all local bugs
func ReadAllWithResolver ¶
func ReadAllWithResolver(repo repository.ClockedRepo, resolvers entity.Resolvers) <-chan entity.StreamedEntity[*Bug]
ReadAllWithResolver read and parse all local bugs
func Remove ¶
func Remove(repo repository.ClockedRepo, id entity.Id) error
Remove will remove a local bug from its entity.Id
func RemoveAll ¶
func RemoveAll(repo repository.ClockedRepo) error
RemoveAll will remove all local bugs. RemoveAll is idempotent.
Types ¶
type AddCommentOperation ¶
type AddCommentOperation struct {
dag.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, files []repository.Hash, metadata map[string]string) (entity.CombinedId, *AddCommentOperation, error)
AddComment is a convenience function to add a comment to a bug
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) Validate ¶
func (op *AddCommentOperation) Validate() error
type AddCommentTimelineItem ¶
type AddCommentTimelineItem struct {
CommentTimelineItem
}
AddCommentTimelineItem replace a AddComment operation in the Timeline and hold its edition history
func (*AddCommentTimelineItem) IsAuthored ¶
func (a *AddCommentTimelineItem) IsAuthored()
IsAuthored is a sign post method for gqlgen
type Bug ¶
Bug holds 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 Read ¶
func Read(repo repository.ClockedRepo, id entity.Id) (*Bug, error)
Read will read a bug from a repository
func ReadWithResolver ¶
func ReadWithResolver(repo repository.ClockedRepo, resolvers entity.Resolvers, id entity.Id) (*Bug, error)
ReadWithResolver will read a bug from its Id, with custom resolvers
func (*Bug) FirstOp ¶
FirstOp lookup for the very first operation of the bug. For a valid Bug, this operation should be a CreateOp
func (*Bug) LastOp ¶
LastOp lookup for the very last operation of the bug. For a valid Bug, should never be nil
func (*Bug) Operations ¶
Operations return the ordered operations
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 Comment ¶
type Comment struct {
Author identity.Interface
Message string
Files []repository.Hash
// contains filtered or unexported fields
}
Comment represent a comment in a Bug
func (Comment) CombinedId ¶
func (c Comment) CombinedId() entity.CombinedId
func (Comment) FormatTime ¶
func (Comment) FormatTimeRel ¶
FormatTimeRel format the unixTime of the comment for human consumption
func (Comment) IsAuthored ¶
func (c Comment) IsAuthored()
IsAuthored is a sign post method for gqlgen
type CommentHistoryStep ¶
type CommentHistoryStep struct {
// The author of the edition, not necessarily the same as the author of the
// original comment
Author identity.Interface
// The new message
Message string
UnixTime timestamp.Timestamp
}
CommentHistoryStep hold one version of a message in the history
type CommentTimelineItem ¶
type CommentTimelineItem struct {
Author identity.Interface
Message string
Files []repository.Hash
CreatedAt timestamp.Timestamp
LastEdit timestamp.Timestamp
History []CommentHistoryStep
// contains filtered or unexported fields
}
CommentTimelineItem is a TimelineItem that holds a Comment and its edition history
func NewCommentTimelineItem ¶
func NewCommentTimelineItem(comment Comment) CommentTimelineItem
func (*CommentTimelineItem) Append ¶
func (c *CommentTimelineItem) Append(comment Comment)
Append will append a new comment in the history and update the other values
func (*CommentTimelineItem) CombinedId ¶
func (c *CommentTimelineItem) CombinedId() entity.CombinedId
func (*CommentTimelineItem) Edited ¶
func (c *CommentTimelineItem) Edited() bool
Edited say if the comment was edited
func (*CommentTimelineItem) MessageIsEmpty ¶
func (c *CommentTimelineItem) MessageIsEmpty() bool
MessageIsEmpty return true is the message is empty or only made of spaces
type CreateOperation ¶
type CreateOperation struct {
dag.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) 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()
IsAuthored is a sign post method for gqlgen
type EditCommentOperation ¶
type EditCommentOperation struct {
dag.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, files []repository.Hash, metadata map[string]string) (entity.CombinedId, *EditCommentOperation, error)
EditComment is a convenience function to apply the operation
func EditCreateComment ¶
func EditCreateComment(b Interface, author identity.Interface, unixTime int64, message string, files []repository.Hash, metadata map[string]string) (entity.CombinedId, *EditCommentOperation, error)
EditCreateComment is a 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) Validate ¶
func (op *EditCommentOperation) Validate() error
type LabelChangeOperation ¶
type LabelChangeOperation struct {
dag.OpBase
Added []common.Label `json:"added"`
Removed []common.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, metadata map[string]string) (*LabelChangeOperation, error)
ForceChangeLabels is a convenience function to apply the operation The difference with ChangeLabels is that no checks for deduplication are done. You are entirely responsible for 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 (*LabelChangeOperation) Apply ¶
func (op *LabelChangeOperation) Apply(snapshot *Snapshot)
Apply applies the operation
func (*LabelChangeOperation) Id ¶
func (op *LabelChangeOperation) Id() entity.Id
func (*LabelChangeOperation) Validate ¶
func (op *LabelChangeOperation) Validate() error
type LabelChangeResult ¶
type LabelChangeResult struct {
Label common.Label
Status LabelChangeStatus
}
func (LabelChangeResult) String ¶
func (l LabelChangeResult) String() string
type LabelChangeStatus ¶
type LabelChangeStatus int
const ( LabelChangeAdded LabelChangeStatus LabelChangeRemoved LabelChangeDuplicateInOp LabelChangeAlreadySet LabelChangeDoesntExist )
func (LabelChangeStatus) MarshalGQL ¶
func (l LabelChangeStatus) MarshalGQL(w io.Writer)
func (*LabelChangeStatus) UnmarshalGQL ¶
func (l *LabelChangeStatus) UnmarshalGQL(v interface{}) error
type LabelChangeTimelineItem ¶
type LabelChangeTimelineItem struct {
Author identity.Interface
UnixTime timestamp.Timestamp
Added []common.Label
Removed []common.Label
// contains filtered or unexported fields
}
func (LabelChangeTimelineItem) CombinedId ¶
func (l LabelChangeTimelineItem) CombinedId() entity.CombinedId
func (*LabelChangeTimelineItem) IsAuthored ¶
func (l *LabelChangeTimelineItem) IsAuthored()
IsAuthored is a sign post method for gqlgen
type Operation ¶
type Operation = dag.OperationWithApply[*Snapshot]
Operation define the interface to fulfill for an edit operation of a Bug
type SetStatusOperation ¶
SetStatusOperation will change the status of a bug
func Close ¶
func Close(b Interface, author identity.Interface, unixTime int64, metadata map[string]string) (*SetStatusOperation, error)
Close is a convenience function to change a bugs state to Close
func NewSetStatusOp ¶
func Open ¶
func Open(b Interface, author identity.Interface, unixTime int64, metadata map[string]string) (*SetStatusOperation, error)
Open is a convenience function to change a bugs state to Open
func (*SetStatusOperation) Apply ¶
func (op *SetStatusOperation) Apply(snapshot *Snapshot)
func (*SetStatusOperation) Id ¶
func (op *SetStatusOperation) Id() entity.Id
func (*SetStatusOperation) Validate ¶
func (op *SetStatusOperation) Validate() error
type SetStatusTimelineItem ¶
type SetStatusTimelineItem struct {
Author identity.Interface
UnixTime timestamp.Timestamp
Status common.Status
// contains filtered or unexported fields
}
func (SetStatusTimelineItem) CombinedId ¶
func (s SetStatusTimelineItem) CombinedId() entity.CombinedId
func (*SetStatusTimelineItem) IsAuthored ¶
func (s *SetStatusTimelineItem) IsAuthored()
IsAuthored is a sign post method for gqlgen
type SetTitleOperation ¶
SetTitleOperation will change the title of a bug
func NewSetTitleOp ¶
func SetTitle ¶
func SetTitle(b Interface, author identity.Interface, unixTime int64, title string, metadata map[string]string) (*SetTitleOperation, error)
SetTitle is a convenience function to change a bugs title
func (*SetTitleOperation) Apply ¶
func (op *SetTitleOperation) Apply(snapshot *Snapshot)
func (*SetTitleOperation) Id ¶
func (op *SetTitleOperation) Id() entity.Id
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) CombinedId ¶
func (s SetTitleTimelineItem) CombinedId() entity.CombinedId
func (*SetTitleTimelineItem) IsAuthored ¶
func (s *SetTitleTimelineItem) IsAuthored()
IsAuthored is a sign post method for gqlgen
type SimpleResolver ¶
type SimpleResolver struct {
// contains filtered or unexported fields
}
SimpleResolver is a Resolver loading Bugs directly from a Repo
func NewSimpleResolver ¶
func NewSimpleResolver(repo repository.ClockedRepo) *SimpleResolver
type Snapshot ¶
type Snapshot struct {
Status common.Status
Title string
Comments []Comment
Labels []common.Label
Author identity.Interface
Actors []identity.Interface
Participants []identity.Interface
CreateTime time.Time
Timeline []TimelineItem
Operations []dag.Operation
// contains filtered or unexported fields
}
Snapshot is a compiled form of the Bug data structure used for storage and merge
func (*Snapshot) AllOperations ¶
func (*Snapshot) AppendOperation ¶
func (*Snapshot) GetCreateMetadata ¶
GetCreateMetadata return the creation metadata
func (*Snapshot) HasAnyActor ¶
HasAnyActor return true if one of the ids is a actor
func (*Snapshot) HasAnyParticipant ¶
HasAnyParticipant return true if one of the ids is a participant
func (*Snapshot) HasParticipant ¶
HasParticipant return true if the id is a participant
func (*Snapshot) IsAuthored ¶
func (snap *Snapshot) IsAuthored()
IsAuthored is a sign post method for gqlgen
func (*Snapshot) SearchComment ¶
func (snap *Snapshot) SearchComment(id entity.CombinedId) (*Comment, error)
SearchComment will search for a comment matching the given id
func (*Snapshot) SearchCommentByOpId ¶
SearchCommentByOpId will search for a comment generated by the given operation Id
func (*Snapshot) SearchTimelineItem ¶
func (snap *Snapshot) SearchTimelineItem(id entity.CombinedId) (TimelineItem, error)
SearchTimelineItem will search in the timeline for an item matching the given hash
type TimelineItem ¶
type TimelineItem interface {
// CombinedId returns the global identifier of the item
CombinedId() entity.CombinedId
}