12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- package manifest
- import (
- "bufio"
- "fmt"
- "io"
- "strings"
- )
- const DefaultLineBasedFetch = "refs/heads/*" // backwards compatibility
- // TODO write more of a proper parser? (probably not worthwhile given that 2822 is the preferred format)
- func ParseLineBasedLine(line string, defaults Manifest2822Entry) (*Manifest2822Entry, error) {
- entry := defaults.Clone()
- parts := strings.SplitN(line, ":", 2)
- if len(parts) < 2 {
- return nil, fmt.Errorf("manifest line missing ':': %s", line)
- }
- entry.Tags = []string{strings.TrimSpace(parts[0])}
- parts = strings.SplitN(parts[1], "@", 2)
- if len(parts) < 2 {
- return nil, fmt.Errorf("manifest line missing '@': %s", line)
- }
- entry.GitRepo = strings.TrimSpace(parts[0])
- parts = strings.SplitN(parts[1], " ", 2)
- entry.GitCommit = strings.TrimSpace(parts[0])
- if len(parts) > 1 {
- entry.Directory = strings.TrimSpace(parts[1])
- }
- if entry.GitFetch == DefaultLineBasedFetch && !GitCommitRegex.MatchString(entry.GitCommit) {
- // doesn't look like a commit, must be a tag
- entry.GitFetch = "refs/tags/" + entry.GitCommit
- entry.GitCommit = "FETCH_HEAD"
- }
- return &entry, nil
- }
- func ParseLineBased(readerIn io.Reader) (*Manifest2822, error) {
- reader := bufio.NewReader(readerIn)
- manifest := &Manifest2822{
- Global: DefaultManifestEntry.Clone(),
- }
- manifest.Global.GitFetch = DefaultLineBasedFetch
- for {
- line, err := reader.ReadString('\n')
- line = strings.TrimSpace(line)
- if len(line) > 0 {
- if line[0] == '#' {
- maintainerLine := strings.TrimPrefix(line, "# maintainer: ")
- if line != maintainerLine {
- // if the prefix was removed, it must be a maintainer line!
- manifest.Global.Maintainers = append(manifest.Global.Maintainers, maintainerLine)
- }
- } else {
- entry, parseErr := ParseLineBasedLine(line, manifest.Global)
- if parseErr != nil {
- return nil, parseErr
- }
- err = manifest.AddEntry(*entry)
- if err != nil {
- return nil, err
- }
- }
- }
- if err == io.EOF {
- break
- }
- if err != nil {
- return nil, err
- }
- }
- if len(manifest.Global.Maintainers) < 1 {
- return nil, fmt.Errorf("missing Maintainers")
- }
- if invalidMaintainers := manifest.Global.InvalidMaintainers(); len(invalidMaintainers) > 0 {
- return nil, fmt.Errorf("invalid Maintainers: %q (expected format %q)", strings.Join(invalidMaintainers, ", "), MaintainersFormat)
- }
- return manifest, nil
- }
|