symflower-fix.go
 1  package task
 2  
 3  import (
 4  	"context"
 5  	"time"
 6  
 7  	pkgerrors "github.com/pkg/errors"
 8  	"github.com/symflower/eval-dev-quality/language"
 9  	"github.com/symflower/eval-dev-quality/log"
10  	evaltask "github.com/symflower/eval-dev-quality/task"
11  	"github.com/symflower/eval-dev-quality/tools"
12  	"github.com/symflower/eval-dev-quality/util"
13  )
14  
15  // symflowerFix runs the "symflower fix" command and returns its execution time in milliseconds.
16  func symflowerFix(logger *log.Logger, repositoryPath string, language language.Language) (duration uint64, err error) {
17  	start := time.Now()
18  	_, err = util.CommandWithResult(context.Background(), logger, &util.Command{
19  		Command: []string{
20  			tools.SymflowerPath, "fix",
21  			"--language", language.ID(),
22  			"--workspace", repositoryPath,
23  		},
24  
25  		Directory: repositoryPath,
26  	})
27  	if err != nil {
28  		return 0, pkgerrors.WithStack(err)
29  	}
30  
31  	return uint64(time.Since(start).Milliseconds()), nil
32  }
33  
34  // ExecuteWithSymflowerFix runs the "symflower fix" command and calculates the new assessments.
35  func ExecuteWithSymflowerFix(ctx evaltask.Context, logger *log.Logger, packagePath string) (testResult *language.TestResult, processingTime uint64, problems []error, err error) {
36  	// Run "symflower fix"  if the model response fails to execute.
37  	logger.Print("model response alone failed execution, attempting to fix with \"symflower fix \"")
38  
39  	duration, err := symflowerFix(logger, packagePath, ctx.Language)
40  	if err != nil {
41  		return nil, 0, nil, pkgerrors.WithStack(err)
42  	}
43  
44  	testResult, ps, err := ctx.Language.ExecuteTests(logger, packagePath)
45  	problems = append(problems, ps...)
46  	if err != nil {
47  		return testResult, duration, problems, pkgerrors.WithMessage(err, "symflower fix")
48  	}
49  
50  	return testResult, duration, problems, nil
51  }