gps/example.go

Summary

Maintainability
A
0 mins
Test Coverage
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build ignore

package main

import (
    "go/build"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
    "strings"

    "github.com/golang/dep/gps"
    "github.com/golang/dep/gps/pkgtree"
)

// This is probably the simplest possible implementation of gps. It does the
// substantive work that `go get` does, except:
//  1. It drops the resulting tree into vendor instead of GOPATH
//  2. It prefers semver tags (if available) over branches
//  3. It removes any vendor directories nested within dependencies
//
//  This will compile and work...and then blow away any vendor directory present
//  in the cwd. Be careful!
func main() {
    // Assume the current directory is correctly placed on a GOPATH, and that it's the
    // root of the project.
    root, _ := os.Getwd()
    srcprefix := filepath.Join(build.Default.GOPATH, "src") + string(filepath.Separator)
    importroot := filepath.ToSlash(strings.TrimPrefix(root, srcprefix))

    // Set up params, including tracing
    params := gps.SolveParameters{
        RootDir:         root,
        TraceLogger:     log.New(os.Stdout, "", 0),
        ProjectAnalyzer: NaiveAnalyzer{},
    }
    // Perform static analysis on the current project to find all of its imports.
    params.RootPackageTree, _ = pkgtree.ListPackages(root, importroot)

    // Set up a SourceManager. This manages interaction with sources (repositories).
    tempdir, _ := ioutil.TempDir("", "gps-repocache")
    sourcemgr, _ := gps.NewSourceManager(gps.SourceManagerConfig{Cachedir: filepath.Join(tempdir)})
    defer sourcemgr.Release()

    // Prep and run the solver
    solver, _ := gps.Prepare(params, sourcemgr)
    solution, err := solver.Solve()
    if err == nil {
        // If no failure, blow away the vendor dir and write a new one out,
        // stripping nested vendor directories as we go.
        os.RemoveAll(filepath.Join(root, "vendor"))
        pruneOpts := gps.CascadingPruneOptions{
            DefaultOptions: gps.PruneNestedVendorDirs | gps.PruneUnusedPackages | gps.PruneGoTestFiles,
        }
        gps.WriteDepTree(filepath.Join(root, "vendor"), solution, sourcemgr, pruneOpts, nil)
    }
}

// NaiveAnalyzer is a project analyzer that implements gps.ProjectAnalyzer interface.
type NaiveAnalyzer struct{}

// DeriveManifestAndLock is called when the solver needs manifest/lock data
// for a particular dependency project (identified by the gps.ProjectRoot
// parameter) at a particular version. That version will be checked out in a
// directory rooted at path.
func (a NaiveAnalyzer) DeriveManifestAndLock(path string, n gps.ProjectRoot) (gps.Manifest, gps.Lock, error) {
    return nil, nil, nil
}

// Info reports the name and version of the analyzer. This is used internally as part
// of gps' hashing memoization scheme.
func (a NaiveAnalyzer) Info() gps.ProjectAnalyzerInfo {
    return gps.ProjectAnalyzerInfo{
        Name:    "example-analyzer",
        Version: 1,
    }
}