/
getpan.go
92 lines (75 loc) · 2.11 KB
/
getpan.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
package main
import (
"fmt"
"github.com/ian-kent/gopan/getpan/getpan"
"strings"
)
func getpan_import(job *ImportJob, msg func(string)) (*getpan.CPANFile, []*getpan.Module) {
cfg := getpan.DefaultConfig()
cfg.CacheDir = config.CacheDir
if len(job.Form.CPANMirror) > 0 {
msg("Adding CPAN mirror: " + job.Form.CPANMirror)
cfg.Sources = append(cfg.Sources, getpan.NewSource("CPAN", job.Form.CPANMirror+"/modules/02packages.details.txt.gz", job.Form.CPANMirror))
}
defer func(job *ImportJob) {
job.Complete = true
msg("GetPAN import complete")
}(job)
for _, source := range cfg.Sources {
err := source.Load()
if err != nil {
m := fmt.Sprintf("Error loading sources: %s", err)
msg(m)
return nil, nil
}
}
m := "Loaded sources"
msg(m)
deps, err := getpan.ParseCPANLines(strings.Split(job.Form.Cpanfile, "\n"))
if err != nil {
m := fmt.Sprintf("Error parsing cpanfile: %s", err)
msg(m)
return nil, nil
}
m = "Parsed cpanfile"
msg(m)
err = deps.Resolve()
if err != nil {
m := fmt.Sprintf("Error resolving dependencies: %s", err)
msg(m)
return deps, nil
}
m = "Resolved dependency tree:"
msg(m)
modules := make([]*getpan.Module, 0)
PrintCPANFile(job, deps, 0, msg, &modules)
return deps, modules
}
func PrintCPANFile(job *ImportJob, deps *getpan.CPANFile, d int, msg func(string), modules *[]*getpan.Module) {
for _, dep := range deps.Dependencies {
if dep.Module == nil {
m := fmt.Sprintf("%s not found", dep.Name)
msg(m)
continue
}
PrintModDeps(job, dep.Module, d+1, msg, modules)
}
}
func PrintDeps(job *ImportJob, deps *getpan.DependencyList, d int, msg func(string), modules *[]*getpan.Module) {
for _, dep := range deps.Dependencies {
if dep.Module == nil {
m := fmt.Sprintf("%s not found", dep.Name)
msg(m)
continue
}
PrintModDeps(job, dep.Module, d+1, msg, modules)
}
}
func PrintModDeps(job *ImportJob, m *getpan.Module, d int, msg func(string), modules *[]*getpan.Module) {
ms := fmt.Sprintf("%s (%s): %s", m.Name, m.Version, m.Cached)
*modules = append(*modules, m)
msg(ms)
if m.Deps != nil {
PrintDeps(job, m.Deps, d+1, msg, modules)
}
}