Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Commit 0fa775c

Browse files
committed
First pass
1 parent 911cd22 commit 0fa775c

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed

cmd/dep/gb_importer.go

+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// Copyright 2017 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package main
6+
7+
import (
8+
"encoding/json"
9+
"io/ioutil"
10+
"log"
11+
"os"
12+
"path/filepath"
13+
14+
"github.com/golang/dep"
15+
fb "github.com/golang/dep/internal/feedback"
16+
"github.com/golang/dep/internal/gps"
17+
"github.com/pkg/errors"
18+
)
19+
20+
// gbImporter imports gb configuration into the dep configuration format.
21+
type gbImporter struct {
22+
manifest gbManifest
23+
logger *log.Logger
24+
verbose bool
25+
sm gps.SourceManager
26+
}
27+
28+
func newGbImporter(logger *log.Logger, verbose bool, sm gps.SourceManager) *gbImporter {
29+
return &gbImporter{
30+
logger: logger,
31+
verbose: verbose,
32+
sm: sm,
33+
}
34+
}
35+
36+
// gbManifest represents the manifest file for GB projects
37+
type gbManifest struct {
38+
Version int `json:"version"`
39+
Dependencies []gbDependency `json:"dependencies"`
40+
}
41+
42+
type gbDependency struct {
43+
Importpath string `json:"importpath"`
44+
Repository string `json:"repository"`
45+
46+
Revision string `json:"revision"`
47+
Branch string `json:"branch"`
48+
49+
Path string `json:"path,omitempty"`
50+
}
51+
52+
func (i *gbImporter) Name() string {
53+
return "gb"
54+
}
55+
56+
func (i *gbImporter) HasDepMetadata(dir string) bool {
57+
// gb stores the manifest in the vendor tree
58+
var m = filepath.Join(dir, "vendor", "manifest")
59+
if _, err := os.Stat(m); err != nil {
60+
return false
61+
}
62+
63+
return true
64+
}
65+
66+
func (i *gbImporter) Import(dir string, pr gps.ProjectRoot) (*dep.Manifest, *dep.Lock, error) {
67+
err := i.load(dir)
68+
if err != nil {
69+
return nil, nil, err
70+
}
71+
72+
return i.convert(pr)
73+
}
74+
75+
// load the gb manifest
76+
func (i *gbImporter) load(projectDir string) error {
77+
i.logger.Println("Detected gb manifest file...")
78+
var err error
79+
var mf = filepath.Join(projectDir, "vendor", "manifest")
80+
if i.verbose {
81+
i.logger.Printf(" Loading %s", mf)
82+
}
83+
84+
var buf []byte
85+
if buf, err = ioutil.ReadFile(mf); err != nil {
86+
return errors.Wrapf(err, "Unable to read %s", mf)
87+
}
88+
if err = json.Unmarshal(buf, &i.manifest); err != nil {
89+
return errors.Wrapf(err, "Unable to parse %s", mf)
90+
}
91+
92+
return nil
93+
}
94+
95+
// convert the gb manifest into dep configuration files.
96+
func (i *gbImporter) convert(pr gps.ProjectRoot) (*dep.Manifest, *dep.Lock, error) {
97+
i.logger.Println("Converting from gb manifest...")
98+
99+
manifest := &dep.Manifest{
100+
Constraints: make(gps.ProjectConstraints),
101+
}
102+
103+
lock := &dep.Lock{}
104+
105+
for _, pkg := range i.manifest.Dependencies {
106+
pc, err := i.buildProjectConstraint(pkg)
107+
if err != nil {
108+
return nil, nil, err
109+
}
110+
manifest.Constraints[pc.Ident.ProjectRoot] = gps.ProjectProperties{Source: pc.Ident.Source, Constraint: pc.Constraint}
111+
112+
lp := i.buildLockedProject(pkg, manifest)
113+
lock.P = append(lock.P, lp)
114+
}
115+
116+
return manifest, lock, nil
117+
}
118+
119+
func (i *gbImporter) buildProjectConstraint(pkg gbDependency) (pc gps.ProjectConstraint, err error) {
120+
if pkg.Importpath == "" {
121+
err = errors.New("Invalid gb configuration, package import path is required")
122+
return
123+
}
124+
125+
pc.Ident = gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(pkg.Importpath), Source: pkg.Repository}
126+
pc.Constraint, err = i.sm.InferConstraint(pkg.Revision, pc.Ident)
127+
if err != nil {
128+
return
129+
}
130+
131+
f := fb.NewConstraintFeedback(pc, fb.DepTypeImported)
132+
f.LogFeedback(i.logger)
133+
134+
return
135+
}
136+
137+
func (i *gbImporter) buildLockedProject(pkg gbDependency, manifest *dep.Manifest) gps.LockedProject {
138+
pi := gps.ProjectIdentifier{
139+
ProjectRoot: gps.ProjectRoot(pkg.Importpath),
140+
Source: pkg.Repository,
141+
}
142+
revision := gps.Revision(pkg.Revision)
143+
pp := manifest.Constraints[pi.ProjectRoot]
144+
145+
version, err := lookupVersionForLockedProject(pi, pp.Constraint, revision, i.sm)
146+
if err != nil {
147+
// Only warn about the problem, it is not enough to warrant failing
148+
i.logger.Println(err.Error())
149+
}
150+
151+
lp := gps.NewLockedProject(pi, version, nil)
152+
153+
f := fb.NewLockedProjectFeedback(lp, fb.DepTypeImported)
154+
f.LogFeedback(i.logger)
155+
156+
return lp
157+
}

cmd/dep/root_analyzer.go

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ func (a *rootAnalyzer) importManifestAndLock(dir string, pr gps.ProjectRoot, sup
7373
importers := []importer{
7474
newGlideImporter(logger, a.ctx.Verbose, a.sm),
7575
newGodepImporter(logger, a.ctx.Verbose, a.sm),
76+
newGbImporter(logger, a.ctx.Verbose, a.sm),
7677
}
7778

7879
for _, i := range importers {

0 commit comments

Comments
 (0)