/
dput.go
133 lines (107 loc) · 2.21 KB
/
dput.go
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package main
import (
"bufio"
"errors"
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"regexp"
"strings"
)
var (
globalConf = "/etc/dput.cf"
peruserConf = filepath.Join(os.Getenv("HOME"), ".dput.cf")
)
func (t *task) dput() error {
if err := runDput(t.WorkingDir, t.PPA, t.Output); err != nil {
return err
}
return nil
}
func runDput(workingDir string, PPA string, output io.Writer) error {
if err := checkPPA(PPA); err != nil {
return err
}
var args = []string{"-d"}
args = append(args, "-f")
args = append(args, PPA)
// FIXME: Generate .changes name instead of iterate working
// dir
changesFile := findChangesFile(workingDir)
if changesFile == "" {
return errors.New("Can not find .changes file")
}
// target := filepath.Join(workingDir, changesFile)
// args = append(args, target)
args = append(args, changesFile)
cmd := exec.Command("dput", args...)
cmd.Dir = workingDir
cmd.Stdout = output
cmd.Stderr = output
return cmd.Run()
}
func checkPPA(PPA string) error {
if strings.HasPrefix(PPA, "ppa:") {
return nil
}
p3a := getPrivatePPA()
for _, p := range p3a {
if PPA == p {
return nil
}
}
return errors.New("unknown PPA")
}
func getPrivatePPA() (res []string) {
res = make([]string, 10)
// First, read global dput conf
gf, err := os.Open(globalConf)
if err != nil {
goto peruser
}
defer gf.Close()
res = append(res, getPrivatePPAFromConf(gf)...)
peruser:
pf, err := os.Open(peruserConf)
if err != nil {
return res
}
defer pf.Close()
res = append(res, getPrivatePPAFromConf(pf)...)
return res
}
func getPrivatePPAFromConf(f *os.File) (res []string) {
res = make([]string, 5)
reader := bufio.NewReader(f)
re := regexp.MustCompilePOSIX("^\\[(.+)\\]$")
for {
line, err := reader.ReadString('\n')
if err != nil && err != io.EOF {
break
}
if match := re.FindStringSubmatch(line); len(match) == 2 {
res = append(res, match[1])
}
if err == io.EOF {
break
}
}
return res
}
func findChangesFile(workingDir string) string {
fis, err := ioutil.ReadDir(workingDir)
if err != nil {
return ""
}
for _, fi := range fis {
if fi.IsDir() {
continue
}
if strings.HasSuffix(fi.Name(), ".changes") {
return fi.Name()
}
}
return ""
}