Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
116 lines
3.2 KiB
Go
116 lines
3.2 KiB
Go
package xgenny
|
|
|
|
import (
|
|
"path/filepath"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/ignite/cli/v29/ignite/pkg/cliui/colors"
|
|
"github.com/ignite/cli/v29/ignite/pkg/xfilepath"
|
|
)
|
|
|
|
var (
|
|
modifyPrefix = colors.Modified("modify ")
|
|
createPrefix = colors.Success("create ")
|
|
removePrefix = func(s string) string {
|
|
return strings.TrimPrefix(strings.TrimPrefix(s, modifyPrefix), createPrefix)
|
|
}
|
|
)
|
|
|
|
// SourceModification describes modified and created files in the source code after a run.
|
|
type SourceModification struct {
|
|
modified map[string]struct{}
|
|
created map[string]struct{}
|
|
}
|
|
|
|
func NewSourceModification() SourceModification {
|
|
return SourceModification{
|
|
make(map[string]struct{}),
|
|
make(map[string]struct{}),
|
|
}
|
|
}
|
|
|
|
// ModifiedFiles returns the modified files of the source modification.
|
|
func (sm SourceModification) ModifiedFiles() (modifiedFiles []string) {
|
|
for modified := range sm.modified {
|
|
modifiedFiles = append(modifiedFiles, modified)
|
|
}
|
|
return
|
|
}
|
|
|
|
// CreatedFiles returns the created files of the source modification.
|
|
func (sm SourceModification) CreatedFiles() (createdFiles []string) {
|
|
for created := range sm.created {
|
|
createdFiles = append(createdFiles, created)
|
|
}
|
|
return
|
|
}
|
|
|
|
// AppendModifiedFiles appends modified files in the source modification that are not already documented.
|
|
func (sm *SourceModification) AppendModifiedFiles(modifiedFiles ...string) {
|
|
for _, modifiedFile := range modifiedFiles {
|
|
_, alreadyModified := sm.modified[modifiedFile]
|
|
_, alreadyCreated := sm.created[modifiedFile]
|
|
if !alreadyModified && !alreadyCreated {
|
|
sm.modified[modifiedFile] = struct{}{}
|
|
}
|
|
}
|
|
}
|
|
|
|
// AppendCreatedFiles appends a created files in the source modification that are not already documented.
|
|
func (sm *SourceModification) AppendCreatedFiles(createdFiles ...string) {
|
|
for _, createdFile := range createdFiles {
|
|
_, alreadyModified := sm.modified[createdFile]
|
|
_, alreadyCreated := sm.created[createdFile]
|
|
if !alreadyModified && !alreadyCreated {
|
|
sm.created[createdFile] = struct{}{}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Merge merges a new source modification to an existing one.
|
|
func (sm *SourceModification) Merge(newSm SourceModification) {
|
|
sm.AppendModifiedFiles(newSm.ModifiedFiles()...)
|
|
sm.AppendCreatedFiles(newSm.CreatedFiles()...)
|
|
}
|
|
|
|
// String convert to string value.
|
|
func (sm *SourceModification) String() (string, error) {
|
|
appendPrefix := func(paths []string, prefix string) ([]string, error) {
|
|
files := make([]string, 0)
|
|
for _, path := range paths {
|
|
absPath, err := filepath.Abs(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// get the relative app path from the current directory
|
|
relPath, err := xfilepath.RelativePath(absPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
files = append(files, prefix+relPath)
|
|
}
|
|
return files, nil
|
|
}
|
|
|
|
files, err := appendPrefix(sm.CreatedFiles(), createPrefix)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
modified, err := appendPrefix(sm.ModifiedFiles(), modifyPrefix)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
files = append(files, modified...)
|
|
|
|
// sort filenames without a prefix
|
|
sort.Slice(files, func(i, j int) bool {
|
|
s1 := removePrefix(files[i])
|
|
s2 := removePrefix(files[j])
|
|
|
|
return strings.Compare(s1, s2) == -1
|
|
})
|
|
|
|
return "\n" + strings.Join(files, "\n"), nil
|
|
}
|