-
Notifications
You must be signed in to change notification settings - Fork 4
/
diffs.go
98 lines (90 loc) · 2.55 KB
/
diffs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package action
import (
"path"
"path/filepath"
"strings"
"github.com/pkg/errors"
"github.com/samber/lo"
"projectforge.dev/projectforge/app/file"
"projectforge.dev/projectforge/app/file/diff"
"projectforge.dev/projectforge/app/util"
)
const (
delimStart = "{{{"
delimEnd = "}}}"
)
func diffs(pm *PrjAndMods) (file.Files, diff.Diffs, error) {
srcFiles, err := pm.MSvc.GetFiles(pm.Mods, true, pm.Logger)
if err != nil {
return nil, nil, errors.Wrapf(err, "unable to get files from [%d] modules", len(pm.Mods))
}
if pm.Mods.Get("export") != nil && len(srcFiles) > 0 {
linebreak := util.StringDetectLinebreak(srcFiles[0].Content)
args, e := pm.Prj.ModuleArgExport(pm.PSvc, pm.Logger)
if e != nil {
return nil, nil, errors.Wrap(e, "export module arguments are invalid")
}
args.Modules = pm.Mods.Keys()
files, e := pm.ESvc.Files(pm.Prj, args, true, linebreak)
if e != nil {
return nil, nil, errors.Wrap(e, "unable to export code")
}
srcFiles = lo.UniqBy(append(files, srcFiles...), func(f *file.File) string {
return f.FullPath()
})
}
configVars, portOffsets := parse(pm)
pm.Prj.ExportArgs, _ = pm.Prj.ModuleArgExport(pm.PSvc, pm.Logger)
lb := util.StringDetectLinebreak(string(pm.File))
tCtx := pm.Prj.ToTemplateContext(configVars, portOffsets, lb)
tgt, err := pm.PSvc.GetFilesystem(pm.Prj)
if err != nil {
return nil, nil, err
}
for _, f := range srcFiles {
origPath := f.FullPath()
if strings.Contains(origPath, delimStart) {
newPath, e := runTemplate("filename", origPath, tCtx)
if e != nil {
return nil, nil, e
}
p, n := path.Split(newPath)
f.Path = strings.Split(p, string(filepath.ListSeparator))
f.Name = n
}
err = file.ReplaceSections(f, tgt)
if err != nil {
return nil, nil, err
}
}
for _, f := range srcFiles {
f.Content, err = runTemplateFile(f, tCtx)
if err != nil {
return nil, nil, err
}
}
dfs, err := diff.FileLoader(pm.Mods.Keys(), srcFiles, tgt, false, pm.Logger)
if err != nil {
return nil, nil, err
}
return srcFiles, dfs, nil
}
func parse(pm *PrjAndMods) (util.KeyTypeDescs, map[string]int) {
var configVars util.KeyTypeDescs
portOffsets := map[string]int{}
lo.ForEach(pm.Prj.Modules, func(m string, _ int) {
mod := pm.Mods.Get(m)
lo.ForEach(mod.ConfigVars, func(src *util.KeyTypeDesc, _ int) {
hit := lo.ContainsBy(configVars, func(tgt *util.KeyTypeDesc) bool {
return src.Matches(tgt)
})
if !hit {
configVars = append(configVars, src)
}
})
for k, v := range mod.PortOffsets {
portOffsets[k] = v
}
})
return configVars.Sort(), portOffsets
}