summaryrefslogtreecommitdiff
path: root/control.read.go
blob: ee0673a560bc21c68153791d68f0c1803bfd9c4d (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
95
96
97
98
99
100
101
102
103
104
package main

import (
	"bufio"
	"os"
	"path/filepath"
	"strings"
	"unicode"

	"go.wit.com/lib/protobuf/gitpb"
	"go.wit.com/log"
)

func trimNonNumericPrefix(s string) string {
	// Find the index of the first character that IS a digit.
	firstDigitIndex := strings.IndexFunc(s, unicode.IsDigit)

	// If no digit is found, IndexFunc returns -1.
	// In this case, the result should be an empty string.
	if firstDigitIndex == -1 {
		return ""
	}

	// Return the substring starting from the first digit.
	return s[firstDigitIndex:]
}

// readGitConfig reads and parses the control file
func readControlFile(repo *gitpb.Repo) 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["Architecture"] = argv.Arch
		pairs["Recommends"] = ""
		pairs["Source"] = "notsure"
		if me.repo == nil {
			pairs["Description"] = "put something here"
		} else {
			pairs["Description"] = me.repo.GetGoPath()
		}
		if repo.Control == nil {
			repo.Control = make(map[string]string)
		}
		for key, value := range pairs {
			repo.Control[key] = value
		}
		if os.Getenv("GIT_AUTHOR_NAME") != "" {
			author := log.Sprintf("%s <%s>", os.Getenv("GIT_AUTHOR_NAME"), os.Getenv("GIT_AUTHOR_EMAIL"))
			repo.Control["Packager"] = author
		}
		_, fname := filepath.Split(repo.GetFullPath())
		repo.Control["Package"] = fname
		repo.Control["Version"] = trimNonNumericPrefix(repo.GetCurrentVersion())
		repo.Control["URL"] = repo.URL
		return nil
	}
	defer file.Close()

	pairs["Version"] = trimNonNumericPrefix(repo.GetCurrentVersion())

	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
	}
	if repo.Control == nil {
		repo.Control = make(map[string]string)
	}
	for key, value := range pairs {
		repo.Control[key] = value
	}
	pairs["Architecture"] = argv.Arch

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

	return nil
}