From fdeca2cd6b386bb4a9dc92101fa2ecd8d587fda4 Mon Sep 17 00:00:00 2001 From: Stephane Odul Date: Tue, 22 Feb 2022 14:58:55 -0800 Subject: [PATCH 1/4] Skip rewriting output files if unchanged When running mockgen with the output option this checks if the existing file content already exists and skips writing if there is nothing to change. This will help reduce i/o when changing lots of files, but also reduce the re-indexing triggering in IDEs. Solves #604 --- .gitignore | 3 +++ mockgen/mockgen.go | 37 +++++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 2a866d88..40776a14 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ mockgen/mockgen # Editors .vscode .idea + +# vendor directory used for IDEs +/vendor diff --git a/mockgen/mockgen.go b/mockgen/mockgen.go index 72a1c960..bae0d121 100644 --- a/mockgen/mockgen.go +++ b/mockgen/mockgen.go @@ -21,6 +21,7 @@ package main import ( "bytes" "encoding/json" + "errors" "flag" "fmt" "go/token" @@ -107,19 +108,6 @@ func main() { return } - dst := os.Stdout - if len(*destination) > 0 { - if err := os.MkdirAll(filepath.Dir(*destination), os.ModePerm); err != nil { - log.Fatalf("Unable to create directory: %v", err) - } - f, err := os.Create(*destination) - if err != nil { - log.Fatalf("Failed opening destination file: %v", err) - } - defer f.Close() - dst = f - } - outputPackageName := *packageOut if outputPackageName == "" { // pkg.Name in reflect mode is the base name of the import path, @@ -171,7 +159,28 @@ func main() { if err := g.Generate(pkg, outputPackageName, outputPackagePath); err != nil { log.Fatalf("Failed generating mock: %v", err) } - if _, err := dst.Write(g.Output()); err != nil { + output := g.Output() + dst := os.Stdout + if len(*destination) > 0 { + if err := os.MkdirAll(filepath.Dir(*destination), os.ModePerm); err != nil { + log.Fatalf("Unable to create directory: %v", err) + } + existing, err := os.ReadFile(*destination) + if err != nil && !errors.Is(err, os.ErrNotExist) { + log.Fatalf("Failed reading pre-exiting destination file: %v", err) + } + if len(existing) == len(output) && bytes.Compare(existing, output) == 0 { + log.Println("Pre-existing file is already up to date.") + return + } + f, err := os.Create(*destination) + if err != nil { + log.Fatalf("Failed opening destination file: %v", err) + } + defer f.Close() + dst = f + } + if _, err := dst.Write(output); err != nil { log.Fatalf("Failed writing to destination: %v", err) } } From 9ea60b3f1eb424206167825fa535e480fef88a27 Mon Sep 17 00:00:00 2001 From: Stephane Odul Date: Thu, 11 Aug 2022 14:03:56 -0700 Subject: [PATCH 2/4] Use ioutil.ReadFile() for backward compatibility with Go 1.15. --- mockgen/mockgen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mockgen/mockgen.go b/mockgen/mockgen.go index bae0d121..29a01539 100644 --- a/mockgen/mockgen.go +++ b/mockgen/mockgen.go @@ -165,7 +165,7 @@ func main() { if err := os.MkdirAll(filepath.Dir(*destination), os.ModePerm); err != nil { log.Fatalf("Unable to create directory: %v", err) } - existing, err := os.ReadFile(*destination) + existing, err := ioutil.ReadFile(*destination) if err != nil && !errors.Is(err, os.ErrNotExist) { log.Fatalf("Failed reading pre-exiting destination file: %v", err) } From 2c2dc39d63bb1a98fbb519a2dad5e60a058c6f11 Mon Sep 17 00:00:00 2001 From: Stephane Odul Date: Thu, 11 Aug 2022 14:20:52 -0700 Subject: [PATCH 3/4] ran `go generate ./...` on the mockgen directory. --- mockgen/internal/tests/mock_in_test_package/mock_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mockgen/internal/tests/mock_in_test_package/mock_test.go b/mockgen/internal/tests/mock_in_test_package/mock_test.go index f17a49ed..08bc27b0 100644 --- a/mockgen/internal/tests/mock_in_test_package/mock_test.go +++ b/mockgen/internal/tests/mock_in_test_package/mock_test.go @@ -8,7 +8,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - mock_in_test_package "github.com/golang/mock/mockgen/internal/tests/mock_in_test_package" + users "github.com/golang/mock/mockgen/internal/tests/mock_in_test_package" ) // MockFinder is a mock of Finder interface. @@ -35,7 +35,7 @@ func (m *MockFinder) EXPECT() *MockFinderMockRecorder { } // Add mocks base method. -func (m *MockFinder) Add(u mock_in_test_package.User) { +func (m *MockFinder) Add(u users.User) { m.ctrl.T.Helper() m.ctrl.Call(m, "Add", u) } @@ -47,10 +47,10 @@ func (mr *MockFinderMockRecorder) Add(u interface{}) *gomock.Call { } // FindUser mocks base method. -func (m *MockFinder) FindUser(name string) mock_in_test_package.User { +func (m *MockFinder) FindUser(name string) users.User { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FindUser", name) - ret0, _ := ret[0].(mock_in_test_package.User) + ret0, _ := ret[0].(users.User) return ret0 } From ccdde54a5b475500061097300e6b361526398cb8 Mon Sep 17 00:00:00 2001 From: Stephane Odul Date: Fri, 12 Aug 2022 10:10:30 -0700 Subject: [PATCH 4/4] Remove superfluous log line. --- mockgen/mockgen.go | 1 - 1 file changed, 1 deletion(-) diff --git a/mockgen/mockgen.go b/mockgen/mockgen.go index 29a01539..79cb921c 100644 --- a/mockgen/mockgen.go +++ b/mockgen/mockgen.go @@ -170,7 +170,6 @@ func main() { log.Fatalf("Failed reading pre-exiting destination file: %v", err) } if len(existing) == len(output) && bytes.Compare(existing, output) == 0 { - log.Println("Pre-existing file is already up to date.") return } f, err := os.Create(*destination)