blob: 7508bc0b598efdf8ca92ea2927fd8dd68ad75716 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 manifest
import (
"encoding/json"
"io"
"io/ioutil"
"strings"
"github.com/apache/mynewt-artifact/errors"
)
/*
* Data that's going to go to build manifest file
*/
type ManifestSizeArea struct {
Name string `json:"name"`
Size uint32 `json:"size"`
}
type ManifestSizeSym struct {
Name string `json:"name"`
Areas []*ManifestSizeArea `json:"areas"`
}
type ManifestSizeFile struct {
Name string `json:"name"`
Syms []*ManifestSizeSym `json:"sym"`
}
type ManifestSizePkg struct {
Name string `json:"name"`
Files []*ManifestSizeFile `json:"files"`
}
type ManifestPkg struct {
Name string `json:"name"`
Repo string `json:"repo"`
}
type ManifestRepo struct {
Name string `json:"name"`
Commit string `json:"commit"`
Dirty bool `json:"dirty,omitempty"`
URL string `json:"url,omitempty"`
}
type Manifest struct {
Name string `json:"name"`
Date string `json:"build_time"`
Version string `json:"build_version"`
BuildID string `json:"id"`
Image string `json:"image"`
ImageHash string `json:"image_hash"`
Loader string `json:"loader"`
LoaderHash string `json:"loader_hash"`
Pkgs []*ManifestPkg `json:"pkgs"`
LoaderPkgs []*ManifestPkg `json:"loader_pkgs,omitempty"`
TgtVars []string `json:"target"`
Repos []*ManifestRepo `json:"repos"`
Syscfg map[string]string `json:"syscfg"`
PkgSizes []*ManifestSizePkg `json:"pkgsz"`
LoaderPkgSizes []*ManifestSizePkg `json:"loader_pkgsz,omitempty"`
}
// ReadManifest reads a JSON manifest from a file.
func ReadManifest(path string) (Manifest, error) {
m := Manifest{}
content, err := ioutil.ReadFile(path)
if err != nil {
return m, errors.Wrapf(err, "failed to read manifest file")
}
if err := json.Unmarshal(content, &m); err != nil {
return m, errors.Wrapf(
err, "failure decoding manifest with path \"%s\"", path)
}
return m, nil
}
// Write serializes a manifest as JSON and writes it to the given writer.
func (m *Manifest) Write(w io.Writer) (int, error) {
buffer, err := json.MarshalIndent(m, "", " ")
if err != nil {
return 0, errors.Wrapf(err, "Cannot encode manifest")
}
cnt, err := w.Write(buffer)
if err != nil {
return 0, errors.Wrapf(err, "Cannot write manifest")
}
return cnt, nil
}
// FindTargetVar searches a manifest's target definition for a setting with
// the specified key. Examples of keys are: "app", "bsp", and "syscfg".
func (m *Manifest) FindTargetVar(key string) string {
for _, tv := range m.TgtVars {
parts := strings.SplitN(tv, "=", 2)
if len(parts) == 2 && parts[0] == key {
return parts[1]
}
}
return ""
}