Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Development Tooling #377

Merged
merged 104 commits into from
Apr 30, 2019
Merged
Show file tree
Hide file tree
Changes from 98 commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
11385bf
dev: Rewrite Golang Make targets to Mage
htdvisser Mar 7, 2019
8537259
dev: Rewrite headers check Make targets to Mage
htdvisser Mar 7, 2019
3ada573
dev: Rewrite git Make targets to Mage
htdvisser Mar 7, 2019
3c1142c
dev: Run pre-commit checks on staged files
htdvisser Mar 7, 2019
c0d20c1
dev: Log Mage actions in verbose mode
htdvisser Apr 5, 2019
5371763
dev: Make js.deps require Mage
htdvisser Mar 28, 2019
62927fe
ci: Keep compiled mage binary in cached dir
htdvisser Apr 3, 2019
3b0b301
ci: Only install release tooling on release runtype
htdvisser Apr 5, 2019
240c563
ci: Pull os out of matrix
htdvisser Apr 3, 2019
5c99e53
ci: Rename js.test to js
htdvisser Apr 3, 2019
926aa73
ci: Move coveralls from after_success to script
htdvisser Apr 3, 2019
c986b8a
ci: Move parts of script to install and before_script
htdvisser Apr 5, 2019
f773940
ci: Update build conditions for release builds
htdvisser Apr 3, 2019
2b11a35
ci: Use RUN_GOARCH because gimme overwrites GOARCH
htdvisser Apr 3, 2019
7abfbeb
dev: Update to github.com/magefile/mage@master
htdvisser Apr 3, 2019
7e1a19a
dev: Add pb.validate.go to coverage ignores
htdvisser Apr 3, 2019
a7e8cb6
dev: Add webpack targets
kschiffer Apr 3, 2019
77533d6
dev: Add binary helper functions
kschiffer Apr 3, 2019
519d8ba
dev: Add translation targets
kschiffer Apr 3, 2019
b9a5098
dev: Add js target dependencies
kschiffer Apr 3, 2019
ba1c728
dev: Add target source file checks
kschiffer Apr 3, 2019
43ecac7
dev: Add main build target
kschiffer Apr 3, 2019
5ae847b
dev: Add serve targets
kschiffer Apr 3, 2019
c456494
dev: Add js clean targets
kschiffer Apr 3, 2019
d578bd6
dev: Make node commands silent
kschiffer Apr 3, 2019
ec216ab
dev: Fix target descriptions
kschiffer Apr 3, 2019
fa35933
dev: Add js test target
kschiffer Apr 3, 2019
346bb24
dev: Add js lint target
kschiffer Apr 3, 2019
f58d882
dev: Add js vulnerabilities target
kschiffer Apr 3, 2019
1cd4e41
dev: Move yarn commands into global scope
kschiffer Apr 3, 2019
401a956
dev: Add styl targets
kschiffer Apr 3, 2019
79a8b0a
dev: Add more lint functions
kschiffer Apr 3, 2019
f6de9b0
ci: Restore branch builds and caching
htdvisser Apr 3, 2019
d8f748c
ci: Clean caches before master builds
htdvisser Apr 3, 2019
4a3a63e
dev: Simplify running nodebin programs
htdvisser Apr 3, 2019
0c74d32
dev: Improve verbosity options on node binaries
kschiffer Apr 4, 2019
41d0810
dev: Fix webpack deprecation warnings
kschiffer Apr 4, 2019
8296814
dev: Add storybook targets
kschiffer Apr 4, 2019
ee9b059
dev: Add js sdk targets
kschiffer Apr 4, 2019
96b3e4e
dev: Remove replaced make files
kschiffer Apr 4, 2019
2c2dbdd
dev: Upgrade to babel 7
kschiffer Apr 4, 2019
4a5ba6a
dev: Fix babel flags in mage target
kschiffer Apr 4, 2019
4d95920
console: Remove breaking statement in fake data after babel update
kschiffer Apr 4, 2019
99bd17a
dev: Move babel config
kschiffer Apr 5, 2019
54ced57
dev: Fix JS filename and comments
htdvisser Apr 5, 2019
456ddb8
dev: Install mage on "make mage"
htdvisser Apr 5, 2019
0070e92
Merge branch 'master' into feature/11-mage-dev-tooling
htdvisser Apr 23, 2019
f621ab9
dev: Define Mage aliases in Make
htdvisser Apr 23, 2019
20b30d2
dev: Remove old bump script
htdvisser Apr 23, 2019
88d5ad4
dev: Remove old git rules
htdvisser Apr 23, 2019
08b96f3
dev: Fix dev.certs dependencies
htdvisser Apr 23, 2019
f055ada
dev: Rename sdk rules to sdk.js
htdvisser Apr 23, 2019
5c11eda
dev: Add js sdk proto targets
kschiffer Apr 24, 2019
537ea84
dev: Add proto clean target
kschiffer Apr 24, 2019
efb7f7c
dev: Replace make targets with mage aliases
kschiffer Apr 24, 2019
916c6b3
dev: Update js target dependencies
kschiffer Apr 24, 2019
5e10245
dev: Add sdk package linking target
kschiffer Apr 24, 2019
37ab493
dev: Support vim
Apr 17, 2019
e4ce93d
dev: Move go.protos to Mage
Apr 24, 2019
6901158
dev: Switch to pkg/errors in Mage
Apr 25, 2019
f4b51ac
dev: Improve formatting of proto targets in Mage
Apr 25, 2019
cc0eae8
dev: Add proto:clean to Mage
Apr 25, 2019
767d94a
dev: Remove redundant targets from SdkJs in Mage, move definition gen…
Apr 25, 2019
f38dfa7
dev: Improve consistency in sdkJs in Mage
Apr 25, 2019
e642eee
dev: Check modtimes in Mage proto namespace, add docs
Apr 25, 2019
6365b72
dev: Check modtime in Mage sdkJs namespace
Apr 25, 2019
8aa2759
dev: Use filepath.Join in Mage sdkJs namespace
Apr 25, 2019
27306cd
Merge branch 'master' into feature/11-mage-dev-tooling
htdvisser Apr 25, 2019
3d444a8
ci,dev: Alias proto rules
htdvisser Apr 25, 2019
7bc7ecd
dev: Fix directory creation and check for errors in JS
htdvisser Apr 25, 2019
4de0151
dev: Migrate "make messages" to Mage
htdvisser Apr 25, 2019
36cafcb
dev: Remove redundant sdkJs:devDeps
Apr 25, 2019
96fb13f
dev: Rename sdkJs to jsSDK
Apr 25, 2019
e10491a
ci: Adapt travis to mage
Apr 25, 2019
0588dd5
dev: Rename sdkjs.go to js_sdk.go
Apr 25, 2019
b321f28
dev: Passthrough `make` commands to `mage`
Apr 25, 2019
9943f9a
dev: Fix JsSDK references in Mage
Apr 25, 2019
1060481
dev: Run babel without stdout
htdvisser Apr 25, 2019
14dfce3
dev: Remove redundant dependency in Makefile
Apr 25, 2019
56351ad
ci: Fix mage compilation
Apr 25, 2019
cf3d8f7
dev: Add golang.org/x/exp/errors dependency
Apr 25, 2019
27ecef6
dev: Use golang.org/x/exp/errors in Mage
Apr 25, 2019
0d2293b
dev: Simplify sdk api definition generation
kschiffer Apr 25, 2019
07345e5
dev: Update jest
kschiffer Apr 25, 2019
ac634b1
dev: Update snapshots
kschiffer Apr 25, 2019
cd7f60c
dev: Update eslintrc
kschiffer Apr 25, 2019
10ee0ce
dev: Add proto:image target
htdvisser Apr 26, 2019
b1faba7
dev: Final cleanup
htdvisser Apr 26, 2019
ce11f6f
dev,doc: Update DEVELOPMENT.md
htdvisser Apr 26, 2019
09597f6
dev: Add target source file checks
kschiffer Apr 28, 2019
f929f16
dev: Add necessity check to link target
kschiffer Apr 28, 2019
b7354c7
dev: Improve js target output
kschiffer Apr 28, 2019
fdb7892
dev: Add js clean deps targets
kschiffer Apr 28, 2019
1d6c019
dev: Remove unnecessary target dependency
kschiffer Apr 28, 2019
82c670f
dev: Ensure protoc is available, do not update
Apr 29, 2019
d27bfe3
dev: Fix sdk production builds
kschiffer Apr 29, 2019
a7816aa
dev: Fix webpack config on production builds
kschiffer Apr 29, 2019
234bf2b
dev: Fix production build warning
kschiffer Apr 29, 2019
68a29c6
dev: Move repo init to Mage and mage to root
htdvisser Apr 30, 2019
6b4aff0
ci: Fix release script
htdvisser Apr 30, 2019
30a5fe3
doc: Update development documentation
htdvisser Apr 30, 2019
c7d5e68
Merge branch 'ttn-master' into feature/11-mage-dev-tooling
htdvisser Apr 30, 2019
dbc4d37
dev,doc: Fix typo
htdvisser Apr 30, 2019
61eac7d
dev: Fix dev:certificates target
htdvisser Apr 30, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .mage/filter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright © 2019 The Things Network Foundation, The Things Industries B.V.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package ttnmage

var selectedDirs map[string]bool

var selectedFiles map[string]bool
215 changes: 215 additions & 0 deletions .mage/git.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
// Copyright © 2019 The Things Network Foundation, The Things Industries B.V.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package ttnmage

import (
"bufio"
"fmt"
"os"
"path/filepath"
"strings"

"github.com/TheThingsIndustries/magepkg/git"
"github.com/magefile/mage/mg"
"golang.org/x/exp/errors"
)

// Git namespace.
type Git mg.Namespace

func (Git) installHook(name string) (err error) {
if mg.Verbose() {
fmt.Printf("Installing %s hook\n", name)
}
f, err := os.OpenFile(filepath.Join(".git", "hooks", name), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
if err != nil {
return err
}
defer func() {
if closeErr := f.Close(); err == nil && closeErr != nil {
err = closeErr
}
}()
if _, err = fmt.Fprintf(f, "ARGS=\"$@\" make git.%s\n", name); err != nil {
return err
}
return nil
}

var gitHooks = []string{"pre-commit", "commit-msg", "pre-push"}

// InstallHooks installs git hooks that help developers follow our best practices.
func (g Git) InstallHooks() error {
for _, hook := range gitHooks {
if err := g.installHook(hook); err != nil {
return err
}
}
return nil
}

// UninstallHooks uninstalls git hooks.
func (g Git) UninstallHooks() error {
for _, hook := range gitHooks {
if mg.Verbose() {
fmt.Printf("Uninstalling %s hook\n", hook)
}
if err := os.Remove(filepath.Join(".git", "hooks", hook)); err != nil && !os.IsNotExist(err) {
return err
}
}
return nil
}

func (Git) selectStaged() error {
staged, err := git.StagedFiles()
if err != nil {
return err
}
selectedFiles, selectedDirs = make(map[string]bool), make(map[string]bool)
for _, file := range staged {
selectedFiles[file] = true
selectedDirs[filepath.Dir(file)] = true
}
return nil
}

var preCommitChecks []interface{}

func (g Git) preCommit() error {
if mg.Verbose() {
fmt.Println("Running pre-commit hook")
}
mg.Deps(g.selectStaged)
mg.Deps(preCommitChecks...)
return nil
}

var gitCommitPrefixes = []string{
"all",
"api",
"as",
"ci",
"cli",
"console",
"dev",
"doc",
"gcs",
"gs",
"is",
"js",
"ns",
"oauth",
"util",
}

func (Git) commitMsg(messageFile string) error {
if mg.Verbose() {
fmt.Println("Running commit-msg hook")
}
if messageFile == "" {
messageFile = ".git/COMMIT_EDITMSG"
}
f, err := os.Open(messageFile)
if err != nil {
return err
}
defer f.Close()
s := bufio.NewScanner(f)
s.Scan()
commitMsg := s.Text()

if commitMsg == "" {
return errors.New("commit message must not be empty")
}

if strings.HasPrefix(commitMsg, "fixup! ") || strings.HasPrefix(commitMsg, "Merge ") {
return nil
}

// Check length:
switch {
case len(commitMsg) > 72:
return errors.New("commit message must be shorter than 72 characters")
case len(commitMsg) > 50:
// TODO: Warn.
}

// Check topics: Message structure:
split := strings.SplitN(commitMsg, ": ", 2)
if len(split) != 2 {
return fmt.Errorf("commit message must contain topics from %s",
strings.Join(gitCommitPrefixes, ","))
}

// Check topics:
topics := strings.Split(split[0], ",")
var unknownTopics []string
nextTopic:
for _, topic := range topics {
for _, allowed := range gitCommitPrefixes {
if strings.TrimSpace(topic) == allowed {
continue nextTopic
}
}
unknownTopics = append(unknownTopics, topic)
}
if len(unknownTopics) > 0 {
return fmt.Errorf("commit messages must only topics from %s (and not %s)",
strings.Join(gitCommitPrefixes, ","),
strings.Join(unknownTopics, ","))
}

words := strings.Fields(split[1])

// Casing:
if words[0][0] < 'A' || words[0][0] > 'Z' {
return fmt.Errorf("commit messages must start with a capital letter (and %s doesn't)", words[0])
}

// Punctuation:
if strings.HasSuffix(commitMsg, ".") {
return fmt.Errorf("commit messages must not end with punctuation")
}

// Imperative
if strings.HasSuffix(words[0], "ed") || strings.HasSuffix(words[0], "ing") {
// TODO: Warn that Commit messages should use imperative mood
}

return nil
}

// RunHook runs the Git hook for $HOOK, arguments are taken from $ARGS.
func (g Git) RunHook() error {
hook, args := os.Getenv("HOOK"), strings.Fields(os.Getenv("ARGS"))
switch hook {
case "pre-commit":
return g.preCommit()
case "commit-msg":
var messageFile string
if len(args) > 0 {
messageFile = args[0]
}
return g.commitMsg(messageFile)
case "pre-push":
if mg.Verbose() {
fmt.Println("Running pre-push hook with", args)
}
return nil
default:
return fmt.Errorf("Unknown hook %s", hook)
}
}
Loading