2021-06-05 15:08:36 +10:00
package cherrypicking
import (
2023-03-23 11:51:40 +11:00
"github.com/jesseduffield/generics/set"
2021-06-05 15:08:36 +10:00
"github.com/jesseduffield/lazygit/pkg/commands/models"
2023-07-24 13:06:42 +10:00
"github.com/samber/lo"
2021-06-05 15:08:36 +10:00
)
type CherryPicking struct {
CherryPickedCommits [ ] * models . Commit
// we only allow cherry picking from one context at a time, so you can't copy a commit from the local commits context and then also copy a commit in the reflog context
ContextKey string
}
2022-01-30 20:03:08 +11:00
func New ( ) * CherryPicking {
return & CherryPicking {
2021-06-05 15:08:36 +10:00
CherryPickedCommits : make ( [ ] * models . Commit , 0 ) ,
ContextKey : "" ,
}
}
2023-03-23 11:51:40 +11:00
func ( self * CherryPicking ) Active ( ) bool {
return len ( self . CherryPickedCommits ) > 0
}
func ( self * CherryPicking ) SelectedShaSet ( ) * set . Set [ string ] {
2023-07-24 13:06:42 +10:00
shas := lo . Map ( self . CherryPickedCommits , func ( commit * models . Commit , _ int ) string {
2023-03-23 11:51:40 +11:00
return commit . Sha
} )
return set . NewFromSlice ( shas )
}
func ( self * CherryPicking ) Add ( selectedCommit * models . Commit , commitsList [ ] * models . Commit ) {
commitSet := self . SelectedShaSet ( )
commitSet . Add ( selectedCommit . Sha )
self . update ( commitSet , commitsList )
}
func ( self * CherryPicking ) Remove ( selectedCommit * models . Commit , commitsList [ ] * models . Commit ) {
commitSet := self . SelectedShaSet ( )
commitSet . Remove ( selectedCommit . Sha )
self . update ( commitSet , commitsList )
}
func ( self * CherryPicking ) update ( selectedShaSet * set . Set [ string ] , commitsList [ ] * models . Commit ) {
2023-07-24 13:06:42 +10:00
cherryPickedCommits := lo . Filter ( commitsList , func ( commit * models . Commit , _ int ) bool {
2023-03-23 11:51:40 +11:00
return selectedShaSet . Includes ( commit . Sha )
} )
2023-07-24 13:06:42 +10:00
self . CherryPickedCommits = lo . Map ( cherryPickedCommits , func ( commit * models . Commit , _ int ) * models . Commit {
2023-03-23 11:51:40 +11:00
return & models . Commit { Name : commit . Name , Sha : commit . Sha }
} )
2021-06-05 15:08:36 +10:00
}