Skip to content

Commit

Permalink
Fix: Build only selected contexts
Browse files Browse the repository at this point in the history
  • Loading branch information
soumeh01 committed Nov 14, 2023
1 parent af854a1 commit 3ac4737
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 20 deletions.
4 changes: 2 additions & 2 deletions cmd/cbuild/commands/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ func NewRootCmd() *cobra.Command {
logFile, _ := cmd.Flags().GetString("log")
generator, _ := cmd.Flags().GetString("generator")
target, _ := cmd.Flags().GetString("target")
context, _ := cmd.Flags().GetStringSlice("context")
contexts, _ := cmd.Flags().GetStringSlice("context")
load, _ := cmd.Flags().GetString("load")
output, _ := cmd.Flags().GetString("output")
jobs, _ := cmd.Flags().GetInt("jobs")
Expand Down Expand Up @@ -145,7 +145,7 @@ func NewRootCmd() *cobra.Command {
Packs: packs,
Rebuild: rebuild,
UpdateRte: updateRte,
Context: context,
Contexts: contexts,
UseContextSet: useContextSet,
Load: load,
Output: output,
Expand Down
35 changes: 22 additions & 13 deletions pkg/builder/csolution/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ func (b CSolutionBuilder) formulateArgs(command []string) (args []string, err er
if !b.Options.UpdateRte {
args = append(args, "--no-update-rte")
}
if len(b.Options.Context) != 0 {
for _, context := range b.Options.Context {
if len(b.Options.Contexts) != 0 {
for _, context := range b.Options.Contexts {
args = append(args, "--context="+context)
}
}
Expand Down Expand Up @@ -178,7 +178,7 @@ func (b CSolutionBuilder) getIdxFilePath() (string, error) {
return idxFilePath, nil
}

func (b CSolutionBuilder) getCbuildSetFilePath() (string, error) {
func (b CSolutionBuilder) getSetFilePath() (string, error) {
projName, err := utils.GetProjectName(b.InputFile)
if err != nil {
return "", err
Expand Down Expand Up @@ -390,19 +390,28 @@ func (b CSolutionBuilder) Build() (err error) {
return err
}

var filePath string
if b.Options.UseContextSet {
filePath, err = b.getCbuildSetFilePath()
} else {
filePath, err = b.getIdxFilePath()
}
var allContexts, selectedContexts []string

if err != nil {
return err
if len(b.Options.Contexts) != 0 && !b.Options.UseContextSet {
allContexts, err = b.listContexts(true, true)
if err != nil {
log.Error("error getting list of contexts: \"" + err.Error() + "\"")
return err
}
selectedContexts, err = utils.ResolveContexts(allContexts, b.Options.Contexts)
} else {
var filePath string
if b.Options.UseContextSet {
filePath, err = b.getSetFilePath()
} else {
filePath, err = b.getIdxFilePath()
}
if err != nil {
return err
}
selectedContexts, err = b.getSelectedContexts(filePath)
}

// get list of selected contexts
selectedContexts, err := b.getSelectedContexts(filePath)
if err != nil {
return err
}
Expand Down
8 changes: 4 additions & 4 deletions pkg/builder/csolution/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ func TestBuild(t *testing.T) {
})

t.Run("test build csolution with context", func(t *testing.T) {
b.Options.Context = []string{"test.Debug+CM0"}
b.Options.Contexts = []string{"test.Debug+CM0"}
err := b.Build()
assert.Error(err)
})
Expand Down Expand Up @@ -453,7 +453,7 @@ func TestFormulateArg(t *testing.T) {
t.Run("test context-set arg", func(t *testing.T) {
b.Options = builder.Options{
OutDir: testRoot + "/run/OutDir",
Context: []string{"test.Debug+Target", "test.Release+Target"},
Contexts: []string{"test.Debug+Target", "test.Release+Target"},
UseContextSet: true,
}
args, err := b.formulateArgs([]string{"convert"})
Expand All @@ -475,15 +475,15 @@ func TestGetCbuildSetFilePath(t *testing.T) {
t.Run("test invalid input file", func(t *testing.T) {
b.InputFile = "run/TestSolution/invalid_file.yml"

path, err := b.getCbuildSetFilePath()
path, err := b.getSetFilePath()
assert.Error(err)
assert.Equal(path, "")
})

t.Run("test get cbuild-set file path", func(t *testing.T) {
b.InputFile = "run/TestSolution/test.csolution.yml"

path, err := b.getCbuildSetFilePath()
path, err := b.getSetFilePath()
assert.Nil(err)
assert.Equal(path, "run/TestSolution/test.cbuild-set.yml")
})
Expand Down
2 changes: 1 addition & 1 deletion pkg/builder/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type Options struct {
LogFile string
Generator string
Target string
Context []string
Contexts []string
Filter string
Load string
Output string
Expand Down
54 changes: 54 additions & 0 deletions pkg/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,3 +249,57 @@ func GetProjectName(csolutionFile string) (projectName string, err error) {
}
return nameTokens[0], nil
}

func ResolveContexts(allContext []string, contextFilters []string) ([]string, error) {
var selectedContexts []string

for _, filter := range contextFilters {
filterContextItem, err := ParseContext(filter)
if err != nil {
return nil, err
}
matchFound := false
for _, context := range allContext {
availableContextItem, err := ParseContext(context)
if err != nil {
return nil, err
}

var contextPattern string
if filterContextItem.ProjectName != "" {
contextPattern = filterContextItem.ProjectName
} else {
contextPattern = "*"
}

if availableContextItem.BuildType != "" {
contextPattern += "."
if filterContextItem.BuildType != "" {
contextPattern += filterContextItem.BuildType
} else {
contextPattern += "*"
}
}

contextPattern += "+"
if filterContextItem.TargetType != "" {
contextPattern += filterContextItem.TargetType
} else {
contextPattern += "*"
}

match, err := MatchString(context, contextPattern)
if err != nil {
return nil, err
}
if match && !Contains(selectedContexts, context) {
matchFound = match
selectedContexts = append(selectedContexts, context)
}
}
if !matchFound {
return nil, errors.New("no suitable match found for \"" + filter + "\"")
}
}
return selectedContexts, nil
}
76 changes: 76 additions & 0 deletions pkg/utils/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,3 +259,79 @@ func TestGetProjectName(t *testing.T) {
assert.Equal(projName, "")
})
}

func TestResolveContexts(t *testing.T) {
assert := assert.New(t)

allContexts := []string{
"Project1.Debug+Target",
"Project1.Release+Target",
"Project1.Debug+Target2",
"Project1.Release+Target2",
"Project2.Debug+Target",
"Project2.Release+Target",
"Project2.Debug+Target2",
"Project2.Release+Target2",
}

testCases := []struct {
contextFilters []string
expectedResolvedContexts []string
ExpectError bool
}{
{[]string{"Project1"}, []string{"Project1.Debug+Target", "Project1.Release+Target", "Project1.Debug+Target2", "Project1.Release+Target2"}, false},
{[]string{".Debug"}, []string{"Project1.Debug+Target", "Project1.Debug+Target2", "Project2.Debug+Target", "Project2.Debug+Target2"}, false},
{[]string{"+Target"}, []string{"Project1.Debug+Target", "Project1.Release+Target", "Project2.Debug+Target", "Project2.Release+Target"}, false},
{[]string{"Project1.Debug"}, []string{"Project1.Debug+Target", "Project1.Debug+Target2"}, false},
{[]string{"Project1+Target"}, []string{"Project1.Debug+Target", "Project1.Release+Target"}, false},
{[]string{".Release+Target2"}, []string{"Project1.Release+Target2", "Project2.Release+Target2"}, false},
{[]string{"Project1.Release+Target2"}, []string{"Project1.Release+Target2"}, false},

{[]string{"*"}, allContexts, false},
{[]string{"*.*+*"}, allContexts, false},
{[]string{"*.*"}, allContexts, false},
{[]string{"Proj*"}, allContexts, false},
{[]string{".De*"}, []string{"Project1.Debug+Target", "Project1.Debug+Target2", "Project2.Debug+Target", "Project2.Debug+Target2"}, false},
{[]string{"+Tar*"}, allContexts, false},
{[]string{"Proj*.D*g"}, []string{"Project1.Debug+Target", "Project1.Debug+Target2", "Project2.Debug+Target", "Project2.Debug+Target2"}, false},
{[]string{"Proj*+Tar*"}, allContexts, false},
{[]string{"Project2.Rel*+Tar*"}, []string{"Project2.Release+Target", "Project2.Release+Target2"}, false},
{[]string{".Rel*+*2"}, []string{"Project1.Release+Target2", "Project2.Release+Target2"}, false},
{[]string{"Project*.Release+*"}, []string{"Project1.Release+Target", "Project1.Release+Target2", "Project2.Release+Target", "Project2.Release+Target2"}, false},

// negative tests
{[]string{"Unknown"}, nil, true},
{[]string{".UnknownBuild"}, nil, true},
{[]string{"+UnknownTarget"}, nil, true},
{[]string{"Project.UnknownBuild"}, nil, true},
{[]string{"Project+UnknownTarget"}, nil, true},
{[]string{".UnknownBuild+Target"}, nil, true},
{[]string{"TestProject*"}, nil, true},
{[]string{"Project.*Build"}, nil, true},
{[]string{"Project.Debug+*H"}, nil, true},
{[]string{"Project1.Release.Debug+Target"}, nil, true},
{[]string{"Project1.Debug+Target+Target2"}, nil, true},

// {
// []string{"test.Debug*", "test.Release+target1"},
// []string{"test.Debug+target1", "test.Debug+target2", "test.Release+target1"}, false
// },
// {[]string{"*.Debug+tar*"}, []string{"test.Debug+target1", "test.Debug+target2"}, false},
// {[]string{"+target1"}, []string{"test.Debug+target1", "test.Release+target1"}, false},
// {[]string{"*"}, allContexts, false},
// {[]string{"test"}, allContexts, false},
// {[]string{".Debug*", "*+AVH"}, nil, true},
// {[]string{"test.debug*"}, nil, true},
// {[]string{"*de"}, nil, true},
}

for _, test := range testCases {
outResolvedContexts, err := ResolveContexts(allContexts, test.contextFilters)
if test.ExpectError {
assert.Error(err)
} else {
assert.Nil(err)
}
assert.Equal(test.expectedResolvedContexts, outResolvedContexts)
}
}

0 comments on commit 3ac4737

Please sign in to comment.