diff --git a/.github/.codecov.yml b/.github/.codecov.yml new file mode 100644 index 0000000..69cb760 --- /dev/null +++ b/.github/.codecov.yml @@ -0,0 +1 @@ +comment: false diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..563a9b5 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,63 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 90 + +# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 30 + +# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) +onlyLabels: [] + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - pinned + - security + - "type: maintenance" + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Set to true to ignore issues with an assignee (defaults to false) +exemptAssignees: false + +# Label to use when marking as stale +staleLabel: "status: stale" + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue or PR has been automatically marked as stale because it has not had + recent activity. Please add a comment bumping this if you're still + interested in it's resolution! Thanks for your help, please let us know + if you need anything else. + +# Comment to post when removing the stale label. +unmarkComment: > + This issue or PR has been bumped and is no longer marked as stale! Feel free + to bump it again in the future, if it's still relevant. + +# Comment to post when closing a stale Issue or Pull Request. +closeComment: > + Closing this as it has become stale. + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +# only: issues + +# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': +# pulls: +# daysUntilStale: 30 +# markComment: > +# This pull request has been automatically marked as stale because it has not had +# recent activity. It will be closed if no further activity occurs. Thank you +# for your contributions. + +# issues: +# exemptLabels: +# - confirmed diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml new file mode 100644 index 0000000..5601b19 --- /dev/null +++ b/.github/workflows/cli.yml @@ -0,0 +1,65 @@ +name: Run Tests + +on: + pull_request: + branches: + - master + - v1 + +env: + GO111MODULE: on + GOPROXY: https://proxy.golang.org + +jobs: + test: + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + go: [1.11, 1.12, 1.13] + name: ${{ matrix.os }} @ Go ${{ matrix.go }} + runs-on: ${{ matrix.os }} + steps: + - name: Set up Go ${{ matrix.go }} + uses: actions/setup-go@v1 + with: + go-version: ${{ matrix.go }} + + - name: Set GOPATH and PATH + run: | + echo "::set-env name=GOPATH::$(dirname $GITHUB_WORKSPACE)" + echo "::add-path::$(dirname $GITHUB_WORKSPACE)/bin" + shell: bash + + - name: Checkout Code + uses: actions/checkout@v1 + with: + ref: ${{ github.ref }} + + - name: Install Dependencies + run: | + mkdir -p $GOPATH/bin + curl -L -o $GOPATH/bin/gfmrun "https://github.com/urfave/gfmrun/releases/download/v1.2.14/gfmrun-$(go env GOOS)-amd64-v1.2.14" + chmod +x $GOPATH/bin/gfmrun + npm install markdown-toc + + - name: Run Tests (v1) + if: contains(github.base_ref, 'v1') + run: | + go run build.go vet + go run build.go test + go run build.go gfmrun docs/v1/manual.md + go run build.go toc docs/v1/manual.md + + - name: Run Tests (v2) + if: contains(github.base_ref, 'master') + run: | + go run build.go vet + go run build.go test + go run build.go gfmrun docs/v2/manual.md + go run build.go toc docs/v2/manual.md + + - name: Send Coverage Report + if: success() + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + run: bash <(curl -s https://codecov.io/bash) diff --git a/.gitignore b/.gitignore index 501b8e8..b013e4a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.orig node_modules/ vendor +.idea diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9f61c62..0000000 --- a/.travis.yml +++ /dev/null @@ -1,36 +0,0 @@ -language: go -sudo: false -dist: bionic -osx_image: xcode10 -go: - - 1.11.x - - 1.12.x - - 1.13.x - -os: - - linux - - osx - -env: - GO111MODULE=on GOPROXY=https://proxy.golang.org - -cache: - directories: - - node_modules - -before_script: - - go get github.com/urfave/gfmrun/cmd/gfmrun - - go get golang.org/x/tools/cmd/goimports - - npm install markdown-toc - - go mod tidy - -script: - - go run build.go vet - - go run build.go test - - go run build.go gfmrun docs/v1/manual.md - - go run build.go toc docs/v1/manual.md - - go run build.go gfmrun docs/v2/manual.md - - go run build.go toc docs/v2/manual.md - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/app.go b/app.go index a62aa23..09b13be 100644 --- a/app.go +++ b/app.go @@ -1,6 +1,7 @@ package cli import ( + "context" "flag" "fmt" "io" @@ -207,6 +208,13 @@ func (a *App) useShortOptionHandling() bool { // Run is the entry point to the cli app. Parses the arguments slice and routes // to the proper flag/args combination func (a *App) Run(arguments []string) (err error) { + return a.RunContext(context.Background(), arguments) +} + +// RunContext is like Run except it takes a Context that will be +// passed to its commands and sub-commands. Through this, you can +// propagate timeouts and cancellation requests +func (a *App) RunContext(ctx context.Context, arguments []string) (err error) { a.Setup() // handle the completion flag separately from the flagset since @@ -224,7 +232,7 @@ func (a *App) Run(arguments []string) (err error) { err = parseIter(set, a, arguments[1:], shellComplete) nerr := normalizeFlags(a.Flags, set) - context := NewContext(a, set, nil) + context := NewContext(a, set, &Context{Context: ctx}) if nerr != nil { _, _ = fmt.Fprintln(a.Writer, nerr) _ = ShowAppHelp(context) diff --git a/app_test.go b/app_test.go index bb0edb6..53e78b7 100644 --- a/app_test.go +++ b/app_test.go @@ -1451,7 +1451,6 @@ func TestApp_Run_CommandWithSubcommandHasHelpTopic(t *testing.T) { } output := buf.String() - //t.Logf("output: %q\n", buf.Bytes()) if strings.Contains(output, "No help topic for") { t.Errorf("expect a help topic, got none: \n%q", output) @@ -1718,7 +1717,6 @@ func TestApp_Run_Categories(t *testing.T) { } output := buf.String() - //t.Logf("output: %q\n", buf.Bytes()) if !strings.Contains(output, "1:\n command1") { t.Errorf("want buffer to include category %q, did not: \n%q", "1:\n command1", output) diff --git a/appveyor.yml b/appveyor.yml index d8f589b..6ae54b2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -26,4 +26,4 @@ install: build_script: - go run build.go vet - go run build.go test - - go run build.go gfmrun docs/v1/manual.md + - go run build.go gfmrun docs/v1/manual.md \ No newline at end of file diff --git a/context.go b/context.go index 13fb523..5b59e75 100644 --- a/context.go +++ b/context.go @@ -5,10 +5,7 @@ import ( "errors" "flag" "fmt" - "os" - "os/signal" "strings" - "syscall" ) // Context is a type that is passed through to @@ -36,14 +33,7 @@ func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { c.Command = &Command{} if c.Context == nil { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - defer cancel() - sigs := make(chan os.Signal, 1) - signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) - <-sigs - }() - c.Context = ctx + c.Context = context.Background() } return c