123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- package main
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "github.com/mattermost/mattermost-server/v5/model"
- "github.com/pkg/errors"
- )
- const pluginIDGoFileTemplate = `// This file is automatically generated. Do not modify it manually.
- package main
- import (
- "strings"
- "github.com/mattermost/mattermost-server/v5/model"
- )
- var manifest *model.Manifest
- const manifestStr = ` + "`" + `
- %s
- ` + "`" + `
- func init() {
- manifest = model.ManifestFromJson(strings.NewReader(manifestStr))
- }
- `
- func main() {
- if len(os.Args) <= 1 {
- panic("no cmd specified")
- }
- manifest, err := findManifest()
- if err != nil {
- panic("failed to find manifest: " + err.Error())
- }
- cmd := os.Args[1]
- switch cmd {
- case "id":
- dumpPluginID(manifest)
- case "version":
- dumpPluginVersion(manifest)
- case "has_server":
- if manifest.HasServer() {
- fmt.Printf("true")
- }
- case "has_webapp":
- if manifest.HasWebapp() {
- fmt.Printf("true")
- }
- case "apply":
- if err := applyManifest(manifest); err != nil {
- panic("failed to apply manifest: " + err.Error())
- }
- default:
- panic("unrecognized command: " + cmd)
- }
- }
- func findManifest() (*model.Manifest, error) {
- _, manifestFilePath, err := model.FindManifest(".")
- if err != nil {
- return nil, errors.Wrap(err, "failed to find manifest in current working directory")
- }
- manifestFile, err := os.Open(manifestFilePath)
- if err != nil {
- return nil, errors.Wrapf(err, "failed to open %s", manifestFilePath)
- }
- defer manifestFile.Close()
- // Re-decode the manifest, disallowing unknown fields. When we write the manifest back out,
- // we don't want to accidentally clobber anything we won't preserve.
- var manifest model.Manifest
- decoder := json.NewDecoder(manifestFile)
- decoder.DisallowUnknownFields()
- if err = decoder.Decode(&manifest); err != nil {
- return nil, errors.Wrap(err, "failed to parse manifest")
- }
- return &manifest, nil
- }
- // dumpPluginId writes the plugin id from the given manifest to standard out
- func dumpPluginID(manifest *model.Manifest) {
- fmt.Printf("%s", manifest.Id)
- }
- // dumpPluginVersion writes the plugin version from the given manifest to standard out
- func dumpPluginVersion(manifest *model.Manifest) {
- fmt.Printf("%s", manifest.Version)
- }
- // applyManifest propagates the plugin_id into the server and webapp folders, as necessary
- func applyManifest(manifest *model.Manifest) error {
- if manifest.HasServer() {
- // generate JSON representation of Manifest.
- manifestBytes, err := json.MarshalIndent(manifest, "", " ")
- if err != nil {
- return err
- }
- manifestStr := string(manifestBytes)
- // write generated code to file by using Go file template.
- if err := ioutil.WriteFile(
- "server/manifest.go",
- []byte(fmt.Sprintf(pluginIDGoFileTemplate, manifestStr)),
- 0600,
- ); err != nil {
- return errors.Wrap(err, "failed to write server/manifest.go")
- }
- }
- return nil
- }
|