123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- package pacmanconf
- import (
- "fmt"
- "github.com/Morganamilo/go-pacmanconf/ini"
- "strconv"
- )
- type callbackData struct {
- conf *Config
- repo *Repository
- }
- func parseCallback(fileName string, line int, section string,
- key string, value string, data interface{}) error {
- if line < 0 {
- return fmt.Errorf("unable to read file: %s: %s", fileName, section)
- }
- d, ok := data.(*callbackData)
- if !ok {
- return fmt.Errorf("type assert failed when parsing: %s", fileName)
- }
- if key == "" && value == "" {
- if section == "options" {
- d.repo = nil
- } else {
- d.conf.Repos = append(d.conf.Repos, Repository{})
- d.repo = &d.conf.Repos[len(d.conf.Repos)-1]
- d.repo.Name = section
- }
- return nil
- }
- if section == "" {
- return fmt.Errorf("line %d is not in a section: %s", line, fileName)
- }
- if d.repo == nil {
- setOption(d.conf, key, value)
- } else {
- setRepo(d.repo, key, value)
- }
- return nil
- }
- func setRepo(repo *Repository, key string, value string) {
- switch key {
- case "Server":
- repo.Servers = append(repo.Servers, value)
- case "SigLevel":
- repo.SigLevel = append(repo.SigLevel, value)
- case "Usage":
- repo.Usage = append(repo.Usage, value)
- }
- }
- func setOption(conf *Config, key string, value string) {
- switch key {
- case "RootDir":
- conf.RootDir = value
- case "DBPath":
- conf.DBPath = value
- case "CacheDir":
- conf.CacheDir = append(conf.CacheDir, value)
- case "HookDir":
- conf.HookDir = append(conf.HookDir, value)
- case "GPGDir":
- conf.GPGDir = value
- case "LogFile":
- conf.LogFile = value
- case "HoldPkg":
- conf.HoldPkg = append(conf.HoldPkg, value)
- case "IgnorePkg":
- conf.IgnorePkg = append(conf.IgnorePkg, value)
- case "IgnoreGroup":
- conf.IgnoreGroup = append(conf.IgnoreGroup, value)
- case "Architecture":
- conf.Architecture = value
- case "XferCommand":
- conf.XferCommand = value
- case "NoUpgrade":
- conf.NoUpgrade = append(conf.NoUpgrade, value)
- case "NoExtract":
- conf.NoExtract = append(conf.NoExtract, value)
- case "CleanMethod":
- conf.CleanMethod = append(conf.CleanMethod, value)
- case "SigLevel":
- conf.SigLevel = append(conf.SigLevel, value)
- case "LocalFileSigLevel":
- conf.LocalFileSigLevel = append(conf.LocalFileSigLevel, value)
- case "RemoteFileSigLevel":
- conf.RemoteFileSigLevel = append(conf.RemoteFileSigLevel, value)
- case "UseSyslog":
- conf.UseSyslog = true
- case "Color":
- conf.Color = true
- case "UseDelta":
- f, err := strconv.ParseFloat(value, 64)
- if err == nil {
- conf.UseDelta = f
- }
- case "TotalDownload":
- conf.TotalDownload = true
- case "CheckSpace":
- conf.CheckSpace = true
- case "VerbosePkgLists":
- conf.VerbosePkgLists = true
- case "DisableDownloadTimeout":
- conf.DisableDownloadTimeout = true
- }
- }
- func Parse(iniData string) (*Config, error) {
- data := callbackData{&Config{}, nil}
- err := ini.Parse(iniData, parseCallback, &data)
- return data.conf, err
- }
- func PacmanConf(args ...string) (*Config, string, error) {
- stdout, stderr, err := pacmanconf(args)
- if err != nil {
- return nil, stderr, err
- }
- conf, err := Parse(stdout)
- return conf, "", err
- }
- func ParseFile(path string) (*Config, string, error) {
- return PacmanConf("--config", path)
- }
|