summaryrefslogtreecommitdiff
path: root/readControlFile.go
blob: 84008a4ae2890761d4c752feaffc6e2dd9296071 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package main

import (
	"bufio"
	"os"
	"strings"

	"go.wit.com/log"
)

// readGitConfig reads and parses the control file
func (c *controlBox) readControlFile() error {
	pairs := make(map[string]string)
	var key string

	file, err := os.Open("control")
	if err != nil {
		log.Warn("readControlFile() could not find the file")
		// return errors.New("'control': file not found")
		// if this happens, make up a fake control file
		pairs["Maintainer"] = "go-deb build"
		pairs["Architecture"] = "x86"
		pairs["Recommends"] = ""
		pairs["Source"] = "notsure"
		pairs["Description"] = "put something here"
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()

		// Skip empty lines and comments
		if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, ";") {
			continue
		}

		// if line starts with a space, it's part of the last key
		if strings.HasPrefix(line, " ") {
			pairs[key] = pairs[key] + "\n" + strings.TrimSpace(line)
			continue
		}

		partsNew := strings.SplitN(line, ":", 2)
		if len(partsNew) < 2 {
			log.Warn("error on line:", line)
			continue
		}

		key = strings.TrimSpace(partsNew[0])
		value := strings.TrimSpace(partsNew[1])
		pairs[key] = value
	}
	for key, value := range pairs {
		switch key {
		case "Source":
			// log.Info("FOUND Source!", value) c.Source.SetText(value)
		case "Build-Depends":
			c.BuildDepends.SetText(value)
		case "Description":
			c.Description.SetText(value)
		case "Maintainer":
			c.Maintainer.SetText(value)
		case "Depends":
			c.Depends.SetText(value)
		case "Recommends":
			c.Recommends.SetText(value)
		case "Version":
			c.Version.SetText(value)
		case "Package":
			c.Package.SetText(value)
			// if c.Package.String() != value {
			// 	log.Warn("not sure what to do with Package", c.Package.String(), value)
			// }
		case "Architecture":
			if c.Architecture.String() != value {
				log.Warn("not sure what to do with Architecture", c.Architecture.String(), value)
				if value == "noarch" {
					log.Warn("attempting to set noarch")
					c.Architecture.SetText(value)
				}

			}
		default:
			log.Warn("error unknown key", key, "value:", value)
		}
	}

	if err := scanner.Err(); err != nil {
		return err
	}

	return nil
}