You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by ke...@apache.org on 2023/05/17 00:06:13 UTC
[skywalking-eyes] branch main updated: Dependency resolve with default template and specified output of license file (#163)
This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-eyes.git
The following commit(s) were added to refs/heads/main by this push:
new 5dfa68f Dependency resolve with default template and specified output of license file (#163)
5dfa68f is described below
commit 5dfa68f93380a5e57259faaf95088b7f133b5778
Author: Rasmus Holm <c....@gmail.com>
AuthorDate: Wed May 17 02:06:07 2023 +0200
Dependency resolve with default template and specified output of license file (#163)
---
.licenserc.yaml | 1 +
README.md | 10 ++++++----
assets/assets.go | 4 ++++
assets/default-license.tpl | 9 +++++++++
commands/deps_resolve.go | 34 ++++++++++++++++++++++++++++++----
commands/header_check.go | 2 +-
dependency/action.yml | 6 +++++-
pkg/deps/summary.go | 6 +++---
8 files changed, 59 insertions(+), 13 deletions(-)
diff --git a/.licenserc.yaml b/.licenserc.yaml
index c15acff..df06c9e 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -71,6 +71,7 @@ header: # `header` section is configurations for source codes license header.
- '**/assets/header-templates/**'
- '**/assets/lcs-templates/**'
- '**/assets/languages.yaml'
+ - '**/assets/default-license.tpl'
- '**/assets/assets.gen.go'
- 'docs/**.svg'
diff --git a/README.md b/README.md
index 9292c54..1b3d849 100644
--- a/README.md
+++ b/README.md
@@ -99,6 +99,7 @@ To check dependencies license in GitHub Actions, add a step in your GitHub workf
# log: debug # optional: set the log level. The default value is `info`.
# config: .licenserc.yaml # optional: set the config file. The default value is `.licenserc.yaml`.
# mode: # optional: Which mode License-Eye should be run in. Choices are `check` or `resolve`. The default value is `check`.
+ # flags: # optional: Extra flags appended to the command, for example, `--summary=path/to/template.tmpl`
```
### Docker Image
@@ -189,10 +190,11 @@ This command assists human audits of the dependencies licenses. It's exit code i
It supports two flags:
-|Flag name|Short name|Description|
-|---------|----------|-----------|
-|`--output`|`-o`|Save the dependencies' `LICENSE` files to a specified directory so that you can put them in distribution package if needed.|
-|`--summary`|`-s`|Based on the template, aggregate all dependency information and generate a `LICENSE` file.|
+| Flag name | Short name | Description |
+|-------------|------------|----------------------------------------------------------------------------------------------------------------------------------------|
+| `--output` | `-o` | Save the dependencies' `LICENSE` files to a specified directory so that you can put them in distribution package if needed. |
+| `--summary` | `-s` | Based on the template, aggregate all dependency information and generate a `LICENSE` file. |
+| `--license` | `-l` | The output path to the LICENSE file to be generated. The default summary format will be used if summary template file is not specified |
```bash
license-eye -c test/testdata/.licenserc_for_test_check.yaml dep resolve -o ./dependencies/licenses -s LICENSE.tpl
diff --git a/assets/assets.go b/assets/assets.go
index 68c32d0..37f9152 100644
--- a/assets/assets.go
+++ b/assets/assets.go
@@ -26,6 +26,10 @@ import (
//go:embed *
var assets embed.FS
+func FS() fs.FS {
+ return assets
+}
+
func Asset(file string) ([]byte, error) {
return assets.ReadFile(filepath.ToSlash(file))
}
diff --git a/assets/default-license.tpl b/assets/default-license.tpl
new file mode 100644
index 0000000..2f1c679
--- /dev/null
+++ b/assets/default-license.tpl
@@ -0,0 +1,9 @@
+{{.LicenseContent }}
+{{ range .Groups }}
+========================================================================
+{{.LicenseID}} licenses
+========================================================================
+{{range .Deps}}
+ {{.Name}} {{.Version}} {{.LicenseID}}
+{{- end }}
+{{ end }}
diff --git a/commands/deps_resolve.go b/commands/deps_resolve.go
index a130377..2a5e8fe 100644
--- a/commands/deps_resolve.go
+++ b/commands/deps_resolve.go
@@ -25,6 +25,8 @@ import (
"strings"
"text/template"
+ "github.com/apache/skywalking-eyes/assets"
+
"github.com/spf13/cobra"
"github.com/apache/skywalking-eyes/internal/logger"
@@ -32,6 +34,7 @@ import (
)
var outDir string
+var licensePath string
var summaryTplPath string
var summaryTpl *template.Template
@@ -41,6 +44,8 @@ func init() {
DepsResolveCommand.PersistentFlags().StringVarP(&summaryTplPath, "summary", "s", "",
"the template file to write the summary of dependencies' licenses, a new file named \"LICENSE\" will be "+
"created in the same directory as the template file, to save the final summary.")
+ DepsResolveCommand.PersistentFlags().StringVarP(&licensePath, "license", "l", "",
+ "the path to the LICENSE file to be generated. The default summary format will be used if summary template file is not specified")
}
var fileNamePattern = regexp.MustCompile(`[^a-zA-Z0-9\\.\-]`)
@@ -66,12 +71,30 @@ var DepsResolveCommand = &cobra.Command{
return err
}
summaryTplPath = absPath
- tpl, err := deps.ParseTemplate(summaryTplPath)
+ tpl, err := deps.ParseTemplate(os.DirFS(filepath.Dir(absPath)), filepath.Base(absPath))
if err != nil {
return err
}
summaryTpl = tpl
}
+ if licensePath != "" {
+ absPath, err := filepath.Abs(licensePath)
+ if err != nil {
+ return err
+ }
+ licensePath = absPath
+ if err := os.MkdirAll(filepath.Dir(outDir), 0o700); err != nil && !os.IsExist(err) {
+ return err
+ }
+
+ if summaryTpl == nil {
+ tpl, err := deps.ParseTemplate(assets.FS(), "default-license.tpl")
+ if err != nil {
+ return err
+ }
+ summaryTpl = tpl
+ }
+ }
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
@@ -83,7 +106,7 @@ var DepsResolveCommand = &cobra.Command{
}
if summaryTpl != nil {
- if err := writeSummary(&report); err != nil {
+ if err := writeSummary(&report, licensePath); err != nil {
return err
}
}
@@ -131,8 +154,11 @@ func writeLicense(result *deps.Result) {
}
}
-func writeSummary(rep *deps.Report) error {
- file, err := os.Create(filepath.Join(filepath.Dir(summaryTplPath), "LICENSE"))
+func writeSummary(rep *deps.Report, path string) error {
+ if path == "" {
+ path = filepath.Join(filepath.Dir(summaryTplPath), "LICENSE")
+ }
+ file, err := os.Create(path)
if err != nil {
return err
}
diff --git a/commands/header_check.go b/commands/header_check.go
index 19f0e97..19644ad 100644
--- a/commands/header_check.go
+++ b/commands/header_check.go
@@ -74,7 +74,7 @@ func writeSummaryQuietly(result *header.Result) {
if result.HasFailure() {
_, _ = summaryFile.WriteString(", the following files are lack of license headers:\n")
for _, failure := range result.Failure {
- _, _ = summaryFile.WriteString(fmt.Sprintf("- %s\n", failure))
+ _, _ = fmt.Fprintf(summaryFile, "- %s\n", failure)
}
}
}
diff --git a/dependency/action.yml b/dependency/action.yml
index 8999902..2c5a97d 100644
--- a/dependency/action.yml
+++ b/dependency/action.yml
@@ -35,6 +35,10 @@ inputs:
default value is `check`.
required: false
default: check
+ flags:
+ description: |
+ Extra flags appended to the command, for example, --summary=path/to/template.tmpl
+ required: false
runs:
using: "composite"
steps:
@@ -48,4 +52,4 @@ runs:
- shell: bash
env:
GITHUB_TOKEN: ${{ inputs.token }}
- run: license-eye -v ${{ inputs.log }} -c ${{ inputs.config }} dependency ${{ inputs.mode }}
+ run: license-eye -v ${{ inputs.log }} -c ${{ inputs.config }} dependency ${{ inputs.mode }} ${{ inputs.flags }}
diff --git a/pkg/deps/summary.go b/pkg/deps/summary.go
index a025a44..494443a 100644
--- a/pkg/deps/summary.go
+++ b/pkg/deps/summary.go
@@ -19,7 +19,7 @@ package deps
import (
"bytes"
- "os"
+ "io/fs"
"sort"
"text/template"
@@ -45,8 +45,8 @@ type SummaryRenderLicense struct {
LicenseID string // License ID
}
-func ParseTemplate(path string) (*template.Template, error) {
- tpl, err := os.ReadFile(path)
+func ParseTemplate(f fs.FS, path string) (*template.Template, error) {
+ tpl, err := fs.ReadFile(f, path)
if err != nil {
return nil, err
}