internal/lsp/cmd: add licenses command
Add a "licenses" command that shows the licenses of included software.
As special cases, we print the Go license first, and the LSP
specification license second since we bundle a Go version of it.
Change-Id: I3575073766a458c214108643b2b550c407a118dd
Reviewed-on: https://go-review.googlesource.com/c/tools/+/282112
Trust: Heschi Kreinick <heschi@google.com>
Run-TryBot: Heschi Kreinick <heschi@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/gopls/internal/hooks/hooks.go b/gopls/internal/hooks/hooks.go
index c864aa3..50e8f71 100644
--- a/gopls/internal/hooks/hooks.go
+++ b/gopls/internal/hooks/hooks.go
@@ -17,6 +17,7 @@
)
func Options(options *source.Options) {
+ options.LicensesText = licensesText
if options.GoDiff {
options.ComputeEdits = ComputeEdits
}
diff --git a/internal/lsp/cmd/cmd.go b/internal/lsp/cmd/cmd.go
index 5f669f3..fd9d6f9 100644
--- a/internal/lsp/cmd/cmd.go
+++ b/internal/lsp/cmd/cmd.go
@@ -171,6 +171,7 @@
&version{app: app},
&bug{},
&apiJSON{},
+ &licenses{app: app},
}
}
diff --git a/internal/lsp/cmd/info.go b/internal/lsp/cmd/info.go
index f71f5db..fd53d8a 100644
--- a/internal/lsp/cmd/info.go
+++ b/internal/lsp/cmd/info.go
@@ -86,15 +86,15 @@
type apiJSON struct{}
-func (sj *apiJSON) Name() string { return "api-json" }
-func (sj *apiJSON) Usage() string { return "" }
-func (sj *apiJSON) ShortHelp() string { return "print json describing gopls API" }
-func (sj *apiJSON) DetailedHelp(f *flag.FlagSet) {
+func (j *apiJSON) Name() string { return "api-json" }
+func (j *apiJSON) Usage() string { return "" }
+func (j *apiJSON) ShortHelp() string { return "print json describing gopls API" }
+func (j *apiJSON) DetailedHelp(f *flag.FlagSet) {
fmt.Fprint(f.Output(), ``)
f.PrintDefaults()
}
-func (sj *apiJSON) Run(ctx context.Context, args ...string) error {
+func (j *apiJSON) Run(ctx context.Context, args ...string) error {
js, err := json.MarshalIndent(source.GeneratedAPIJSON, "", "\t")
if err != nil {
return err
@@ -102,3 +102,82 @@
fmt.Fprint(os.Stdout, string(js))
return nil
}
+
+type licenses struct {
+ app *Application
+}
+
+func (l *licenses) Name() string { return "licenses" }
+func (l *licenses) Usage() string { return "" }
+func (l *licenses) ShortHelp() string { return "print licenses of included software" }
+func (l *licenses) DetailedHelp(f *flag.FlagSet) {
+ fmt.Fprint(f.Output(), ``)
+ f.PrintDefaults()
+}
+
+const licensePreamble = `
+gopls is made available under the following BSD-style license:
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+gopls implements the LSP specification, which is made available under the following license:
+
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+gopls also includes software made available under these licenses:
+`
+
+func (l *licenses) Run(ctx context.Context, args ...string) error {
+ opts := source.DefaultOptions()
+ l.app.options(opts)
+ txt := licensePreamble
+ if opts.LicensesText == "" {
+ txt += "(development gopls, license information not available)"
+ } else {
+ txt += opts.LicensesText
+ }
+ fmt.Fprintf(os.Stdout, txt)
+ return nil
+}
diff --git a/internal/lsp/source/options.go b/internal/lsp/source/options.go
index 4e20893..bb42868 100644
--- a/internal/lsp/source/options.go
+++ b/internal/lsp/source/options.go
@@ -410,6 +410,7 @@
// Hooks contains configuration that is provided to the Gopls command by the
// main package.
type Hooks struct {
+ LicensesText string
GoDiff bool
ComputeEdits diff.ComputeEdits
URLRegexp *regexp.Regexp