| /** |
| * 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 "" |
| } |