From 67245407aa80e4143b555cdf7a2853a5006dd9b9 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 6 May 2016 13:49:13 +0200 Subject: [PATCH 1/2] Removed sketch name from regexp. Do not full-rebuild if only sketch path changed. This commit fix two problems: 1) the sketch path is used as-is in a regexp: this causes troubles if the path contains regexp control chars like `[-]().\` etc. 2) the sketch is not fully rebuild if the only thing that changes is the sketch path. Signed-off-by: Cristian Maglie --- src/arduino.cc/builder/props/properties.go | 5 +++++ ...out_build_path_if_build_options_changed.go | 21 +++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/arduino.cc/builder/props/properties.go b/src/arduino.cc/builder/props/properties.go index e1132f3e..c75d747a 100644 --- a/src/arduino.cc/builder/props/properties.go +++ b/src/arduino.cc/builder/props/properties.go @@ -35,6 +35,7 @@ import ( "github.com/go-errors/errors" "io/ioutil" "os" + "reflect" "regexp" "runtime" "strings" @@ -170,6 +171,10 @@ func (aMap PropertiesMap) Clone() PropertiesMap { return newMap } +func (aMap PropertiesMap) Equals(anotherMap PropertiesMap) bool { + return reflect.DeepEqual(aMap, anotherMap) +} + func MergeMapsOfProperties(target map[string]PropertiesMap, sources ...map[string]PropertiesMap) map[string]PropertiesMap { for _, source := range sources { for key, value := range source { diff --git a/src/arduino.cc/builder/wipeout_build_path_if_build_options_changed.go b/src/arduino.cc/builder/wipeout_build_path_if_build_options_changed.go index e60d6472..1a400222 100644 --- a/src/arduino.cc/builder/wipeout_build_path_if_build_options_changed.go +++ b/src/arduino.cc/builder/wipeout_build_path_if_build_options_changed.go @@ -33,10 +33,11 @@ import ( "arduino.cc/builder/constants" "arduino.cc/builder/gohasissues" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/types" + "encoding/json" "os" "path/filepath" - "regexp" ) type WipeoutBuildPathIfBuildOptionsChanged struct{} @@ -49,16 +50,18 @@ func (s *WipeoutBuildPathIfBuildOptionsChanged) Run(ctx *types.Context) error { previousBuildOptionsJson := ctx.BuildOptionsJsonPrevious logger := ctx.GetLogger() - if buildOptionsJson == previousBuildOptionsJson { - return nil - } + var opts props.PropertiesMap + var prevOpts props.PropertiesMap + json.Unmarshal([]byte(buildOptionsJson), &opts) + json.Unmarshal([]byte(previousBuildOptionsJson), &prevOpts) - re := regexp.MustCompile("(?m)^.*" + ctx.SketchLocation + ".*$[\r\n]+") - buildOptionsJson = re.ReplaceAllString(buildOptionsJson, "") - previousBuildOptionsJson = re.ReplaceAllString(previousBuildOptionsJson, "") + // If SketchLocation path is different but filename is the same, consider it equal + if filepath.Base(opts["sketchLocation"]) == filepath.Base(prevOpts["sketchLocation"]) { + delete(opts, "sketchLocation") + delete(prevOpts, "sketchLocation") + } - // if the only difference is the sketch path skip deleting everything - if buildOptionsJson == previousBuildOptionsJson { + if opts.Equals(prevOpts) { return nil } From 35786f9a98e7c9db86be8e019201f733ca5385e6 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 6 May 2016 14:08:16 +0200 Subject: [PATCH 2/2] WipeoutBuildPathIfBuildOptionsChanged now requires correct json for testing Signed-off-by: Cristian Maglie --- ...wipeout_build_path_if_build_options_changed_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/arduino.cc/builder/test/wipeout_build_path_if_build_options_changed_test.go b/src/arduino.cc/builder/test/wipeout_build_path_if_build_options_changed_test.go index b6bd6c4a..9354e2d2 100644 --- a/src/arduino.cc/builder/test/wipeout_build_path_if_build_options_changed_test.go +++ b/src/arduino.cc/builder/test/wipeout_build_path_if_build_options_changed_test.go @@ -46,8 +46,8 @@ func TestWipeoutBuildPathIfBuildOptionsChanged(t *testing.T) { buildPath := SetupBuildPath(t, ctx) defer os.RemoveAll(buildPath) - ctx.BuildOptionsJsonPrevious = "old" - ctx.BuildOptionsJson = "new" + ctx.BuildOptionsJsonPrevious = "{ \"old\":\"old\" }" + ctx.BuildOptionsJson = "{ \"new\":\"new\" }" utils.TouchFile(filepath.Join(buildPath, "should_be_deleted.txt")) @@ -77,7 +77,7 @@ func TestWipeoutBuildPathIfBuildOptionsChangedNoPreviousBuildOptions(t *testing. buildPath := SetupBuildPath(t, ctx) defer os.RemoveAll(buildPath) - ctx.BuildOptionsJson = "new" + ctx.BuildOptionsJson = "{ \"new\":\"new\" }" utils.TouchFile(filepath.Join(buildPath, "should_not_be_deleted.txt")) @@ -107,8 +107,8 @@ func TestWipeoutBuildPathIfBuildOptionsChangedBuildOptionsMatch(t *testing.T) { buildPath := SetupBuildPath(t, ctx) defer os.RemoveAll(buildPath) - ctx.BuildOptionsJsonPrevious = "options" - ctx.BuildOptionsJson = "options" + ctx.BuildOptionsJsonPrevious = "{ \"old\":\"old\" }" + ctx.BuildOptionsJson = "{ \"old\":\"old\" }" utils.TouchFile(filepath.Join(buildPath, "should_not_be_deleted.txt"))