blob: 363fb36b0e18acb91203269b817a385551dd155a [file] [log] [blame]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Package jiri contains jiri manifest schema definitions copied from Jiri's
// source code.
//
// Only fields relevant to roller configuration are included, others are
// omitted.
package jiri
import (
"encoding/xml"
"errors"
"fmt"
"io"
"os"
)
type Manifest struct {
Projects []Project `xml:"projects>project"`
Packages []Package `xml:"packages>package"`
XMLName struct{} `xml:"manifest"`
}
// Project represents a jiri project.
type Project struct {
// Name is the project name.
Name string `xml:"name,attr,omitempty"`
// Remote is the project remote.
Remote string `xml:"remote,attr,omitempty"`
// RemoteBranch is the name of the remote branch to track.
RemoteBranch string `xml:"remotebranch,attr,omitempty"`
}
// Package struct represents the <package> tag in manifest files.
type Package struct {
// Name represents the remote cipd path of the package.
Name string `xml:"name,attr"`
// Version represents the version tag of the cipd package.
Version string `xml:"version,attr"`
}
// LoadManifest reads a Jiri manifest from disk.
func LoadManifest(path string) (*Manifest, error) {
b, err := os.ReadFile(path)
if err != nil {
return nil, err
}
var manifest Manifest
if err := xml.Unmarshal(b, &manifest); err != nil {
if errors.Is(err, io.EOF) {
return nil, fmt.Errorf("invalid XML in %s", path)
}
return nil, err
}
return &manifest, nil
}