diff --git a/action/get.go b/action/get.go
index 8a3a979..785dc28 100644
--- a/action/get.go
+++ b/action/get.go
@@ -37,12 +37,18 @@
 		msg.Die("Could not find the vendor dir: %s", err)
 	}
 
+	rd := filepath.Dir(glidefile)
+	rt, err := gps.ListPackages(rd, conf.Name)
+	if err != nil {
+		msg.Die("Error while scanning project: %s", err)
+	}
+
 	params := gps.SolveParameters{
-		RootDir:     filepath.Dir(glidefile),
-		ImportRoot:  gps.ProjectRoot(conf.Name),
-		Manifest:    conf,
-		Trace:       true,
-		TraceLogger: log.New(os.Stdout, "", 0),
+		RootDir:         rd,
+		RootPackageTree: rt,
+		Manifest:        conf,
+		Trace:           true,
+		TraceLogger:     log.New(os.Stdout, "", 0),
 	}
 
 	// We load the lock file early and bail out if there's a problem, because we
@@ -57,7 +63,7 @@
 	}
 
 	// Create the SourceManager for this run
-	sm, err := gps.NewSourceManager(dependency.Analyzer{}, filepath.Join(installer.Home, "cache"), false)
+	sm, err := gps.NewSourceManager(dependency.Analyzer{}, filepath.Join(installer.Home, "cache"))
 	defer sm.Release()
 	if err != nil {
 		msg.Err(err.Error())
diff --git a/action/install.go b/action/install.go
index a719cc0..0ce5797 100644
--- a/action/install.go
+++ b/action/install.go
@@ -31,19 +31,25 @@
 	}
 
 	// Create the SourceManager for this run
-	sm, err := gps.NewSourceManager(dependency.Analyzer{}, filepath.Join(installer.Home, "cache"), false)
+	sm, err := gps.NewSourceManager(dependency.Analyzer{}, filepath.Join(installer.Home, "cache"))
 	defer sm.Release()
 	if err != nil {
 		msg.Err(err.Error())
 		return
 	}
 
+	rd := filepath.Dir(vend)
+	rt, err := gps.ListPackages(rd, conf.Name)
+	if err != nil {
+		msg.Die("Error while scanning project: %s", err)
+	}
+
 	params := gps.SolveParameters{
-		RootDir:     filepath.Dir(vend),
-		ImportRoot:  gps.ProjectRoot(conf.Name),
-		Manifest:    conf,
-		Trace:       true,
-		TraceLogger: log.New(os.Stdout, "", 0),
+		RootDir:         rd,
+		RootPackageTree: rt,
+		Manifest:        conf,
+		Trace:           true,
+		TraceLogger:     log.New(os.Stdout, "", 0),
 	}
 
 	var s gps.Solver
@@ -63,7 +69,7 @@
 			msg.Err("Could not set up solver: %s", err)
 			return
 		}
-		digest, err := s.HashInputs()
+		digest := s.HashInputs()
 
 		// Check if digests match, and warn if they don't
 		if bytes.Equal(digest, params.Lock.InputHash()) {
diff --git a/action/update.go b/action/update.go
index 3221258..324b5a3 100644
--- a/action/update.go
+++ b/action/update.go
@@ -30,12 +30,18 @@
 		msg.Die("Could not find the vendor dir: %s", err)
 	}
 
+	rd := filepath.Dir(vend)
+	rt, err := gps.ListPackages(rd, conf.Name)
+	if err != nil {
+		msg.Die("Error while scanning project: %s", err)
+	}
+
 	params := gps.SolveParameters{
-		RootDir:     filepath.Dir(vend),
-		ImportRoot:  gps.ProjectRoot(conf.Name),
-		Manifest:    conf,
-		Trace:       true,
-		TraceLogger: log.New(os.Stdout, "", 0),
+		RootDir:         rd,
+		RootPackageTree: rt,
+		Manifest:        conf,
+		Trace:           true,
+		TraceLogger:     log.New(os.Stdout, "", 0),
 	}
 
 	if len(projs) == 0 {
@@ -59,7 +65,7 @@
 	}
 
 	// Create the SourceManager for this run
-	sm, err := gps.NewSourceManager(dependency.Analyzer{}, filepath.Join(installer.Home, "cache"), false)
+	sm, err := gps.NewSourceManager(dependency.Analyzer{}, filepath.Join(installer.Home, "cache"))
 	if err != nil {
 		msg.Err(err.Error())
 		return
diff --git a/glide.lock b/glide.lock
index 04611c5..bd87515 100644
--- a/glide.lock
+++ b/glide.lock
@@ -14,8 +14,8 @@
   version: v1.8.0
   revision: fbe9fb6ad5b5f35b3e82a7c21123cfc526cbf895
 - name: github.com/sdboyer/gps
-  branch: master
-  revision: 166f36103aedbb9d835b9b6dcc7762a6bd900a98
+  version: v0.11.1
+  revision: 507f709c7eb2429371a22cff9f6077630827e450
 - name: github.com/termie/go-shutil
   revision: bcacb06fecaeec8dc42af03c87c6949f4a05c74c
 - name: gopkg.in/yaml.v2
diff --git a/glide.yaml b/glide.yaml
index 2bd32d8..dcc78aa 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -18,4 +18,4 @@
 - package: github.com/Masterminds/semver
   branch: 2.x
 - package: github.com/sdboyer/gps
-  branch: master
+  version: ^0.11.0
diff --git a/vendor/github.com/sdboyer/gps/README.md b/vendor/github.com/sdboyer/gps/README.md
index 381c2a8..0cb902b 100644
--- a/vendor/github.com/sdboyer/gps/README.md
+++ b/vendor/github.com/sdboyer/gps/README.md
@@ -66,16 +66,16 @@
 * A [**manifest** and
   **lock**](https://github.com/sdboyer/gps/wiki/gps-for-Implementors#manifests-and-locks)
   approach to tracking version and constraint information
-* Source repositories can be `git`, `bzr`, `hg` or `svn` (Most of the work here is through a [separate lib](https://github.com/Masterminds/vcs))
+* Upstream sources are one of `git`, `bzr`, `hg` or `svn` repositories
 * What the available versions are for a given project/repository (all branches, tags, or revs are eligible)
-  * In general, semver tags are preferred to plain tags, are preferred to branches
-* The actual packages required (determined through import graph static analysis)
+  * In general, semver tags are preferred to branches, are preferred to plain tags
+* The actual packages that must be present (determined through import graph static analysis)
   * How the import graph is statically analyzed (Similar to `go/build`, but with a combinatorial view of build tags)
+* All packages from the same source (repository) must be the same version
 * Package import cycles are not allowed ([not yet implemented](https://github.com/sdboyer/gps/issues/66))
 
 There are also some current non-choices that we would like to push into the realm of choice:
 
-* Different versions of packages from the same repository cannot be used
 * Importable projects that are not bound to the repository root
 * Source inference around different import path patterns (e.g., how `github.com/*` or `my_company/*` are handled)
 
diff --git a/vendor/github.com/sdboyer/gps/example.go b/vendor/github.com/sdboyer/gps/example.go
index c3a827a..728439f 100644
--- a/vendor/github.com/sdboyer/gps/example.go
+++ b/vendor/github.com/sdboyer/gps/example.go
@@ -38,7 +38,7 @@
 	params.RootPackageTree, _ = gps.ListPackages(root, importroot)
 
 	// Set up a SourceManager with the NaiveAnalyzer
-	sourcemgr, _ := gps.NewSourceManager(NaiveAnalyzer{}, ".repocache", false)
+	sourcemgr, _ := gps.NewSourceManager(NaiveAnalyzer{}, ".repocache")
 	defer sourcemgr.Release()
 
 	// Prep and run the solver
diff --git a/vendor/github.com/sdboyer/gps/hash.go b/vendor/github.com/sdboyer/gps/hash.go
index ca9c9a2..acede5c 100644
--- a/vendor/github.com/sdboyer/gps/hash.go
+++ b/vendor/github.com/sdboyer/gps/hash.go
@@ -2,7 +2,6 @@
 
 import (
 	"crypto/sha256"
-	"fmt"
 	"sort"
 )
 
@@ -16,15 +15,7 @@
 // unnecessary.
 //
 // (Basically, this is for memoization.)
-func (s *solver) HashInputs() ([]byte, error) {
-	// Do these checks up front before any other work is needed, as they're the
-	// only things that can cause errors
-	// Pass in magic root values, and the bridge will analyze the right thing
-	ptree, err := s.b.ListPackages(ProjectIdentifier{ProjectRoot: ProjectRoot(s.params.RootPackageTree.ImportRoot)}, nil)
-	if err != nil {
-		return nil, badOptsFailure(fmt.Sprintf("Error while parsing packages under %s: %s", s.params.RootDir, err.Error()))
-	}
-
+func (s *solver) HashInputs() []byte {
 	c, tc := s.rm.DependencyConstraints(), s.rm.TestDependencyConstraints()
 	// Apply overrides to the constraints from the root. Otherwise, the hash
 	// would be computed on the basis of a constraint from root that doesn't
@@ -51,7 +42,7 @@
 
 	// Write each of the packages, or the errors that were found for a
 	// particular subpath, into the hash.
-	for _, perr := range ptree.Packages {
+	for _, perr := range s.rpt.Packages {
 		if perr.Err != nil {
 			h.Write([]byte(perr.Err.Error()))
 		} else {
@@ -97,5 +88,5 @@
 	h.Write([]byte(an))
 	h.Write([]byte(av.String()))
 
-	return h.Sum(nil), nil
+	return h.Sum(nil)
 }
diff --git a/vendor/github.com/sdboyer/gps/hash_test.go b/vendor/github.com/sdboyer/gps/hash_test.go
index 51732ca..a257252 100644
--- a/vendor/github.com/sdboyer/gps/hash_test.go
+++ b/vendor/github.com/sdboyer/gps/hash_test.go
@@ -16,12 +16,12 @@
 	}
 
 	s, err := Prepare(params, newdepspecSM(fix.ds, nil))
-
-	dig, err := s.HashInputs()
 	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
+		t.Errorf("Unexpected error while prepping solver: %s", err)
+		t.FailNow()
 	}
 
+	dig := s.HashInputs()
 	h := sha256.New()
 
 	elems := []string{
@@ -64,12 +64,12 @@
 	}
 
 	s, err := Prepare(params, newdepspecSM(fix.ds, nil))
-
-	dig, err := s.HashInputs()
 	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
+		t.Errorf("Unexpected error while prepping solver: %s", err)
+		t.FailNow()
 	}
 
+	dig := s.HashInputs()
 	h := sha256.New()
 
 	elems := []string{
@@ -116,12 +116,12 @@
 	}
 
 	s, err := Prepare(params, newdepspecSM(fix.ds, nil))
-
-	dig, err := s.HashInputs()
 	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
+		t.Errorf("Unexpected error while prepping solver: %s", err)
+		t.FailNow()
 	}
 
+	dig := s.HashInputs()
 	h := sha256.New()
 
 	elems := []string{
@@ -154,11 +154,7 @@
 	rm.ovr["d"] = ProjectProperties{
 		Constraint: NewBranch("foobranch"),
 	}
-	dig, err = s.HashInputs()
-	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
-	}
-
+	dig = s.HashInputs()
 	h = sha256.New()
 
 	elems = []string{
@@ -194,11 +190,7 @@
 		NetworkName: "groucho",
 		Constraint:  NewBranch("plexiglass"),
 	}
-	dig, err = s.HashInputs()
-	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
-	}
-
+	dig = s.HashInputs()
 	h = sha256.New()
 
 	elems = []string{
@@ -236,11 +228,7 @@
 	rm.ovr["a"] = ProjectProperties{
 		Constraint: NewVersion("fluglehorn"),
 	}
-	dig, err = s.HashInputs()
-	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
-	}
-
+	dig = s.HashInputs()
 	h = sha256.New()
 
 	elems = []string{
@@ -280,11 +268,7 @@
 	rm.ovr["a"] = ProjectProperties{
 		NetworkName: "nota",
 	}
-	dig, err = s.HashInputs()
-	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
-	}
-
+	dig = s.HashInputs()
 	h = sha256.New()
 
 	elems = []string{
@@ -326,11 +310,7 @@
 		NetworkName: "nota",
 		Constraint:  NewVersion("fluglehorn"),
 	}
-	dig, err = s.HashInputs()
-	if err != nil {
-		t.Fatalf("HashInputs returned unexpected err: %s", err)
-	}
-
+	dig = s.HashInputs()
 	h = sha256.New()
 
 	elems = []string{
diff --git a/vendor/github.com/sdboyer/gps/manager_test.go b/vendor/github.com/sdboyer/gps/manager_test.go
index f3892d6..0daaef9 100644
--- a/vendor/github.com/sdboyer/gps/manager_test.go
+++ b/vendor/github.com/sdboyer/gps/manager_test.go
@@ -44,7 +44,7 @@
 		t.FailNow()
 	}
 
-	sm, err := NewSourceManager(naiveAnalyzer{}, cpath, false)
+	sm, err := NewSourceManager(naiveAnalyzer{}, cpath)
 	if err != nil {
 		t.Errorf("Unexpected error on SourceManager creation: %s", err)
 		t.FailNow()
@@ -69,32 +69,45 @@
 	if err != nil {
 		t.Errorf("Failed to create temp dir: %s", err)
 	}
-	_, err = NewSourceManager(naiveAnalyzer{}, cpath, false)
+	sm, err := NewSourceManager(naiveAnalyzer{}, cpath)
 
 	if err != nil {
 		t.Errorf("Unexpected error on SourceManager creation: %s", err)
 	}
-	defer func() {
-		err := removeAll(cpath)
-		if err != nil {
-			t.Errorf("removeAll failed: %s", err)
-		}
-	}()
 
-	_, err = NewSourceManager(naiveAnalyzer{}, cpath, false)
+	_, err = NewSourceManager(naiveAnalyzer{}, cpath)
 	if err == nil {
 		t.Errorf("Creating second SourceManager should have failed due to file lock contention")
-	}
-
-	sm, err := NewSourceManager(naiveAnalyzer{}, cpath, true)
-	defer sm.Release()
-	if err != nil {
-		t.Errorf("Creating second SourceManager should have succeeded when force flag was passed, but failed with err %s", err)
+	} else if te, ok := err.(CouldNotCreateLockError); !ok {
+		t.Errorf("Should have gotten CouldNotCreateLockError error type, but got %T", te)
 	}
 
 	if _, err = os.Stat(path.Join(cpath, "sm.lock")); err != nil {
 		t.Errorf("Global cache lock file not created correctly")
 	}
+
+	sm.Release()
+	err = removeAll(cpath)
+	if err != nil {
+		t.Errorf("removeAll failed: %s", err)
+	}
+
+	if _, err = os.Stat(path.Join(cpath, "sm.lock")); !os.IsNotExist(err) {
+		t.Errorf("Global cache lock file not cleared correctly on Release()")
+		t.FailNow()
+	}
+
+	// Set another one up at the same spot now, just to be sure
+	sm, err = NewSourceManager(naiveAnalyzer{}, cpath)
+	if err != nil {
+		t.Errorf("Creating a second SourceManager should have succeeded when the first was released, but failed with err %s", err)
+	}
+
+	sm.Release()
+	err = removeAll(cpath)
+	if err != nil {
+		t.Errorf("removeAll failed: %s", err)
+	}
 }
 
 func TestSourceInit(t *testing.T) {
@@ -109,7 +122,7 @@
 		t.FailNow()
 	}
 
-	sm, err := NewSourceManager(naiveAnalyzer{}, cpath, false)
+	sm, err := NewSourceManager(naiveAnalyzer{}, cpath)
 	if err != nil {
 		t.Errorf("Unexpected error on SourceManager creation: %s", err)
 		t.FailNow()
@@ -144,10 +157,17 @@
 		SortForUpgrade(v)
 
 		for k, e := range expected {
-			if v[k] != e {
+			if !v[k].Matches(e) {
 				t.Errorf("Expected version %s in position %v but got %s", e, k, v[k])
 			}
 		}
+
+		if !v[1].(versionPair).v.(branchVersion).isDefault {
+			t.Error("Expected master branch version to have isDefault flag, but it did not")
+		}
+		if v[2].(versionPair).v.(branchVersion).isDefault {
+			t.Error("Expected test branch version not to have isDefault flag, but it did")
+		}
 	}
 
 	// Two birds, one stone - make sure the internal ProjectManager vlist cache
@@ -175,10 +195,17 @@
 		}
 
 		for k, e := range expected {
-			if v[k] != e {
+			if !v[k].Matches(e) {
 				t.Errorf("Expected version %s in position %v but got %s", e, k, v[k])
 			}
 		}
+
+		if !v[1].(versionPair).v.(branchVersion).isDefault {
+			t.Error("Expected master branch version to have isDefault flag, but it did not")
+		}
+		if v[2].(versionPair).v.(branchVersion).isDefault {
+			t.Error("Expected test branch version not to have isDefault flag, but it did")
+		}
 	}
 
 	present, err := smc.RevisionPresentIn(id, rev)
@@ -217,6 +244,51 @@
 	}
 }
 
+func TestDefaultBranchAssignment(t *testing.T) {
+	if testing.Short() {
+		t.Skip("Skipping default branch assignment test in short mode")
+	}
+
+	sm, clean := mkNaiveSM(t)
+	defer clean()
+
+	id := mkPI("github.com/sdboyer/test-multibranch")
+	v, err := sm.ListVersions(id)
+	if err != nil {
+		t.Errorf("Unexpected error during initial project setup/fetching %s", err)
+	}
+
+	if len(v) != 3 {
+		t.Errorf("Expected three version results from the test repo, got %v", len(v))
+	} else {
+		brev := Revision("fda020843ac81352004b9dca3fcccdd517600149")
+		mrev := Revision("9f9c3a591773d9b28128309ac7a9a72abcab267d")
+		expected := []Version{
+			NewBranch("branchone").Is(brev),
+			NewBranch("otherbranch").Is(brev),
+			NewBranch("master").Is(mrev),
+		}
+
+		SortForUpgrade(v)
+
+		for k, e := range expected {
+			if !v[k].Matches(e) {
+				t.Errorf("Expected version %s in position %v but got %s", e, k, v[k])
+			}
+		}
+
+		if !v[0].(versionPair).v.(branchVersion).isDefault {
+			t.Error("Expected branchone branch version to have isDefault flag, but it did not")
+		}
+		if !v[0].(versionPair).v.(branchVersion).isDefault {
+			t.Error("Expected otherbranch branch version to have isDefault flag, but it did not")
+		}
+		if v[2].(versionPair).v.(branchVersion).isDefault {
+			t.Error("Expected master branch version not to have isDefault flag, but it did")
+		}
+	}
+}
+
 func TestMgrMethodsFailWithBadPath(t *testing.T) {
 	// a symbol will always bork it up
 	bad := mkPI("foo/##&^").normalize()
diff --git a/vendor/github.com/sdboyer/gps/remove_go16.go b/vendor/github.com/sdboyer/gps/remove_go16.go
index 8c7844d..a25ea2f 100644
--- a/vendor/github.com/sdboyer/gps/remove_go16.go
+++ b/vendor/github.com/sdboyer/gps/remove_go16.go
@@ -24,8 +24,8 @@
 	}
 
 	// make sure all files are writable so we can delete them
-	return filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
-		if err != nil {
+	err = filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
+		if err != nil && err != filepath.SkipDir {
 			// walk gave us some error, give it back.
 			return err
 		}
@@ -33,6 +33,12 @@
 		if mode|0200 == mode {
 			return nil
 		}
+
 		return os.Chmod(path, mode|0200)
 	})
+	if err != nil {
+		return err
+	}
+
+	return os.Remove(path)
 }
diff --git a/vendor/github.com/sdboyer/gps/result_test.go b/vendor/github.com/sdboyer/gps/result_test.go
index ac98678..d0fd972 100644
--- a/vendor/github.com/sdboyer/gps/result_test.go
+++ b/vendor/github.com/sdboyer/gps/result_test.go
@@ -73,7 +73,7 @@
 	tmp := path.Join(os.TempDir(), "vsolvtest")
 
 	clean := true
-	sm, err := NewSourceManager(naiveAnalyzer{}, path.Join(tmp, "cache"), true)
+	sm, err := NewSourceManager(naiveAnalyzer{}, path.Join(tmp, "cache"))
 	if err != nil {
 		b.Errorf("NewSourceManager errored unexpectedly: %q", err)
 		clean = false
@@ -81,7 +81,7 @@
 
 	// Prefetch the projects before timer starts
 	for _, lp := range r.p {
-		_, _, err := sm.GetManifestAndLock(lp.Ident(), lp.Version())
+		err := sm.SyncSourceFor(lp.Ident())
 		if err != nil {
 			b.Errorf("failed getting project info during prefetch: %s", err)
 			clean = false
diff --git a/vendor/github.com/sdboyer/gps/solver.go b/vendor/github.com/sdboyer/gps/solver.go
index 8993b78..5556589 100644
--- a/vendor/github.com/sdboyer/gps/solver.go
+++ b/vendor/github.com/sdboyer/gps/solver.go
@@ -175,7 +175,7 @@
 	// this Solver's inputs.
 	//
 	// In such a case, it may not be necessary to run Solve() at all.
-	HashInputs() ([]byte, error)
+	HashInputs() []byte
 
 	// Solve initiates a solving run. It will either complete successfully with
 	// a Solution, or fail with an informative error.
@@ -304,10 +304,7 @@
 			att: s.attempts,
 		}
 
-		// An err here is impossible; it could only be caused by a parsing error
-		// of the root tree, but that necessarily already succeeded back up in
-		// selectRoot(), so we can ignore the err return here
-		soln.hd, _ = s.HashInputs()
+		soln.hd = s.HashInputs()
 
 		// Convert ProjectAtoms into LockedProjects
 		soln.p = make([]LockedProject, len(all))
@@ -440,17 +437,16 @@
 		v: rootRev,
 	}
 
-	ptree, err := s.b.ListPackages(pa.id, nil)
-	if err != nil {
-		return err
-	}
-
-	list := make([]string, len(ptree.Packages))
+	list := make([]string, len(s.rpt.Packages))
 	k := 0
-	for path := range ptree.Packages {
-		list[k] = path
-		k++
+	for path, pkg := range s.rpt.Packages {
+		if pkg.Err != nil {
+			list[k] = path
+			k++
+		}
 	}
+	list = list[:k]
+	sort.Strings(list)
 
 	a := atomWithPackages{
 		a:  pa,
@@ -489,7 +485,7 @@
 		heap.Push(s.unsel, bimodalIdentifier{id: dep.Ident, pl: dep.pl, fromRoot: true})
 	}
 
-	s.traceSelectRoot(ptree, deps)
+	s.traceSelectRoot(s.rpt, deps)
 	return nil
 }
 
@@ -515,8 +511,8 @@
 	allex := ptree.ExternalReach(false, false, s.ig)
 	// Use a map to dedupe the unique external packages
 	exmap := make(map[string]struct{})
-	// Add the packages reached by the packages explicitly listed in the atom to
-	// the list
+	// Add to the list those packages that are reached by the packages
+	// explicitly listed in the atom
 	for _, pkg := range a.pl {
 		expkgs, exists := allex[pkg]
 		if !exists {
@@ -543,6 +539,7 @@
 		reach[k] = pkg
 		k++
 	}
+	sort.Strings(reach)
 
 	deps := s.ovr.overrideAll(m.DependencyConstraints())
 	return s.intersectConstraintsWithImports(deps, reach)
diff --git a/vendor/github.com/sdboyer/gps/source_manager.go b/vendor/github.com/sdboyer/gps/source_manager.go
index 82064e4..f59ae62 100644
--- a/vendor/github.com/sdboyer/gps/source_manager.go
+++ b/vendor/github.com/sdboyer/gps/source_manager.go
@@ -83,6 +83,7 @@
 // tools; control via dependency injection is intended to be sufficient.
 type SourceMgr struct {
 	cachedir string
+	lf       *os.File
 	srcs     map[string]source
 	srcmut   sync.RWMutex
 	an       ProjectAnalyzer
@@ -94,22 +95,19 @@
 
 // NewSourceManager produces an instance of gps's built-in SourceManager. It
 // takes a cache directory (where local instances of upstream repositories are
-// stored), a vendor directory for the project currently being worked on, and a
-// force flag indicating whether to overwrite the global cache lock file (if
-// present).
+// stored), and a ProjectAnalyzer that is used to extract manifest and lock
+// information from source trees.
 //
 // The returned SourceManager aggressively caches information wherever possible.
-// It is recommended that, if tools need to do preliminary, work involving
-// upstream repository analysis prior to invoking a solve run, that they create
-// this SourceManager as early as possible and use it to their ends. That way,
-// the solver can benefit from any caches that may have already been warmed.
+// If tools need to do preliminary work involving upstream repository analysis
+// prior to invoking a solve run, it is recommended that they create this
+// SourceManager as early as possible and use it to their ends. That way, the
+// solver can benefit from any caches that may have already been warmed.
 //
-// gps's SourceManager is intended to be threadsafe (if it's not, please
-// file a bug!). It should certainly be safe to reuse from one solving run to
-// the next; however, the fact that it takes a basedir as an argument makes it
-// much less useful for simultaneous use by separate solvers operating on
-// different root projects. This architecture may change in the future.
-func NewSourceManager(an ProjectAnalyzer, cachedir string, force bool) (*SourceMgr, error) {
+// gps's SourceManager is intended to be threadsafe (if it's not, please file a
+// bug!). It should be safe to reuse across concurrent solving runs, even on
+// unrelated projects.
+func NewSourceManager(an ProjectAnalyzer, cachedir string) (*SourceMgr, error) {
 	if an == nil {
 		return nil, fmt.Errorf("a ProjectAnalyzer must be provided to the SourceManager")
 	}
@@ -121,17 +119,24 @@
 
 	glpath := filepath.Join(cachedir, "sm.lock")
 	_, err = os.Stat(glpath)
-	if err == nil && !force {
-		return nil, fmt.Errorf("cache lock file %s exists - another process crashed or is still running?", glpath)
+	if err == nil {
+		return nil, CouldNotCreateLockError{
+			Path: glpath,
+			Err:  fmt.Errorf("cache lock file %s exists - another process crashed or is still running?", glpath),
+		}
 	}
 
-	_, err = os.OpenFile(glpath, os.O_CREATE|os.O_RDONLY, 0700) // is 0700 sane for this purpose?
+	fi, err := os.OpenFile(glpath, os.O_CREATE|os.O_EXCL, 0600) // is 0600 sane for this purpose?
 	if err != nil {
-		return nil, fmt.Errorf("failed to create global cache lock file at %s with err %s", glpath, err)
+		return nil, CouldNotCreateLockError{
+			Path: glpath,
+			Err:  fmt.Errorf("err on attempting to create global cache lock: %s", err),
+		}
 	}
 
 	return &SourceMgr{
 		cachedir: cachedir,
+		lf:       fi,
 		srcs:     make(map[string]source),
 		an:       an,
 		dxt:      pathDeducerTrie(),
@@ -139,8 +144,18 @@
 	}, nil
 }
 
+type CouldNotCreateLockError struct {
+	Path string
+	Err  error
+}
+
+func (e CouldNotCreateLockError) Error() string {
+	return e.Err.Error()
+}
+
 // Release lets go of any locks held by the SourceManager.
 func (sm *SourceMgr) Release() {
+	sm.lf.Close()
 	os.Remove(filepath.Join(sm.cachedir, "sm.lock"))
 }
 
diff --git a/vendor/github.com/sdboyer/gps/source_test.go b/vendor/github.com/sdboyer/gps/source_test.go
index ffee963..787e573 100644
--- a/vendor/github.com/sdboyer/gps/source_test.go
+++ b/vendor/github.com/sdboyer/gps/source_test.go
@@ -86,7 +86,7 @@
 		SortForUpgrade(vlist)
 		evl := []Version{
 			NewVersion("1.0.0").Is(Revision("30605f6ac35fcb075ad0bfa9296f90a7d891523e")),
-			NewBranch("master").Is(Revision("30605f6ac35fcb075ad0bfa9296f90a7d891523e")),
+			newDefaultBranch("master").Is(Revision("30605f6ac35fcb075ad0bfa9296f90a7d891523e")),
 			NewBranch("test").Is(Revision("30605f6ac35fcb075ad0bfa9296f90a7d891523e")),
 		}
 		if !reflect.DeepEqual(vlist, evl) {
@@ -147,6 +147,10 @@
 	if ident != un {
 		t.Errorf("Expected %s as source ident, got %s", un, ident)
 	}
+	evl := []Version{
+		NewVersion("1.0.0").Is(Revision("matt@mattfarina.com-20150731135137-pbphasfppmygpl68")),
+		newDefaultBranch("(default)").Is(Revision("matt@mattfarina.com-20150731135137-pbphasfppmygpl68")),
+	}
 
 	// check that an expected rev is present
 	is, err := src.revisionPresentIn(Revision("matt@mattfarina.com-20150731135137-pbphasfppmygpl68"))
@@ -168,12 +172,12 @@
 		t.Errorf("bzrSource.listVersions() should have set the upstream and cache existence bits for found")
 	}
 
-	if len(vlist) != 1 {
-		t.Errorf("bzr test repo should've produced one version, got %v", len(vlist))
+	if len(vlist) != 2 {
+		t.Errorf("bzr test repo should've produced two versions, got %v", len(vlist))
 	} else {
-		v := NewVersion("1.0.0").Is(Revision("matt@mattfarina.com-20150731135137-pbphasfppmygpl68"))
-		if vlist[0] != v {
-			t.Errorf("bzr pair fetch reported incorrect first version, got %s", vlist[0])
+		SortForUpgrade(vlist)
+		if !reflect.DeepEqual(vlist, evl) {
+			t.Errorf("bzr version list was not what we expected:\n\t(GOT): %s\n\t(WNT): %s", vlist, evl)
 		}
 	}
 
@@ -190,12 +194,12 @@
 		t.Errorf("bzrSource.listVersions() should have set the upstream and cache existence bits for found")
 	}
 
-	if len(vlist) != 1 {
-		t.Errorf("bzr test repo should've produced one version, got %v", len(vlist))
+	if len(vlist) != 2 {
+		t.Errorf("bzr test repo should've produced two versions, got %v", len(vlist))
 	} else {
-		v := NewVersion("1.0.0").Is(Revision("matt@mattfarina.com-20150731135137-pbphasfppmygpl68"))
-		if vlist[0] != v {
-			t.Errorf("bzr pair fetch reported incorrect first version, got %s", vlist[0])
+		SortForUpgrade(vlist)
+		if !reflect.DeepEqual(vlist, evl) {
+			t.Errorf("bzr version list was not what we expected:\n\t(GOT): %s\n\t(WNT): %s", vlist, evl)
 		}
 	}
 
@@ -225,94 +229,111 @@
 		}
 	}
 
-	n := "bitbucket.org/mattfarina/testhgrepo"
-	un := "https://" + n
-	u, err := url.Parse(un)
-	if err != nil {
-		t.Errorf("URL was bad, lolwut? errtext: %s", err)
-		rf()
-		t.FailNow()
-	}
-	mb := maybeHgSource{
-		url: u,
-	}
+	tfunc := func(n string, evl []Version) {
+		un := "https://" + n
+		u, err := url.Parse(un)
+		if err != nil {
+			t.Errorf("URL was bad, lolwut? errtext: %s", err)
+			return
+		}
+		mb := maybeHgSource{
+			url: u,
+		}
 
-	isrc, ident, err := mb.try(cpath, naiveAnalyzer{})
-	if err != nil {
-		t.Errorf("Unexpected error while setting up hgSource for test repo: %s", err)
-		rf()
-		t.FailNow()
-	}
-	src, ok := isrc.(*hgSource)
-	if !ok {
-		t.Errorf("Expected a hgSource, got a %T", isrc)
-		rf()
-		t.FailNow()
-	}
-	if ident != un {
-		t.Errorf("Expected %s as source ident, got %s", un, ident)
-	}
+		isrc, ident, err := mb.try(cpath, naiveAnalyzer{})
+		if err != nil {
+			t.Errorf("Unexpected error while setting up hgSource for test repo: %s", err)
+			return
+		}
+		src, ok := isrc.(*hgSource)
+		if !ok {
+			t.Errorf("Expected a hgSource, got a %T", isrc)
+			return
+		}
+		if ident != un {
+			t.Errorf("Expected %s as source ident, got %s", un, ident)
+		}
 
-	// check that an expected rev is present
-	is, err := src.revisionPresentIn(Revision("d680e82228d206935ab2eaa88612587abe68db07"))
-	if err != nil {
-		t.Errorf("Unexpected error while checking revision presence: %s", err)
-	} else if !is {
-		t.Errorf("Revision that should exist was not present")
-	}
+		// check that an expected rev is present
+		is, err := src.revisionPresentIn(Revision("103d1bddef2199c80aad7c42041223083d613ef9"))
+		if err != nil {
+			t.Errorf("Unexpected error while checking revision presence: %s", err)
+		} else if !is {
+			t.Errorf("Revision that should exist was not present")
+		}
 
-	vlist, err := src.listVersions()
-	if err != nil {
-		t.Errorf("Unexpected error getting version pairs from hg repo: %s", err)
-	}
-	evl := []Version{
-		NewVersion("1.0.0").Is(Revision("d680e82228d206935ab2eaa88612587abe68db07")),
-		NewBranch("test").Is(Revision("6c44ee3fe5d87763616c19bf7dbcadb24ff5a5ce")),
-	}
+		vlist, err := src.listVersions()
+		if err != nil {
+			t.Errorf("Unexpected error getting version pairs from hg repo: %s", err)
+		}
 
-	if src.ex.s&existsUpstream|existsInCache != existsUpstream|existsInCache {
-		t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for search")
-	}
-	if src.ex.f&existsUpstream|existsInCache != existsUpstream|existsInCache {
-		t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for found")
-	}
+		if src.ex.s&existsUpstream|existsInCache != existsUpstream|existsInCache {
+			t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for search")
+		}
+		if src.ex.f&existsUpstream|existsInCache != existsUpstream|existsInCache {
+			t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for found")
+		}
 
-	if len(vlist) != 2 {
-		t.Errorf("hg test repo should've produced one version, got %v", len(vlist))
-	} else {
-		SortForUpgrade(vlist)
-		if !reflect.DeepEqual(vlist, evl) {
-			t.Errorf("Version list was not what we expected:\n\t(GOT): %s\n\t(WNT): %s", vlist, evl)
+		if len(vlist) != len(evl) {
+			t.Errorf("hg test repo should've produced %v versions, got %v", len(evl), len(vlist))
+		} else {
+			SortForUpgrade(vlist)
+			if !reflect.DeepEqual(vlist, evl) {
+				t.Errorf("Version list was not what we expected:\n\t(GOT): %s\n\t(WNT): %s", vlist, evl)
+			}
+		}
+
+		// Run again, this time to ensure cache outputs correctly
+		vlist, err = src.listVersions()
+		if err != nil {
+			t.Errorf("Unexpected error getting version pairs from hg repo: %s", err)
+		}
+
+		if src.ex.s&existsUpstream|existsInCache != existsUpstream|existsInCache {
+			t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for search")
+		}
+		if src.ex.f&existsUpstream|existsInCache != existsUpstream|existsInCache {
+			t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for found")
+		}
+
+		if len(vlist) != len(evl) {
+			t.Errorf("hg test repo should've produced %v versions, got %v", len(evl), len(vlist))
+		} else {
+			SortForUpgrade(vlist)
+			if !reflect.DeepEqual(vlist, evl) {
+				t.Errorf("Version list was not what we expected:\n\t(GOT): %s\n\t(WNT): %s", vlist, evl)
+			}
+		}
+
+		// recheck that rev is present, this time interacting with cache differently
+		is, err = src.revisionPresentIn(Revision("103d1bddef2199c80aad7c42041223083d613ef9"))
+		if err != nil {
+			t.Errorf("Unexpected error while re-checking revision presence: %s", err)
+		} else if !is {
+			t.Errorf("Revision that should exist was not present on re-check")
 		}
 	}
 
-	// Run again, this time to ensure cache outputs correctly
-	vlist, err = src.listVersions()
-	if err != nil {
-		t.Errorf("Unexpected error getting version pairs from hg repo: %s", err)
-	}
+	// simultaneously run for both the repo with and without the magic bookmark
+	donech := make(chan struct{})
+	go func() {
+		tfunc("bitbucket.org/sdboyer/withbm", []Version{
+			NewVersion("v1.0.0").Is(Revision("aa110802a0c64195d0a6c375c9f66668827c90b4")),
+			newDefaultBranch("@").Is(Revision("b10d05d581e5401f383e48ccfeb84b48fde99d06")),
+			NewBranch("another").Is(Revision("b10d05d581e5401f383e48ccfeb84b48fde99d06")),
+			NewBranch("default").Is(Revision("3d466f437f6616da594bbab6446cc1cb4328d1bb")),
+			NewBranch("newbranch").Is(Revision("5e2a01be9aee942098e44590ae545c7143da9675")),
+		})
+		close(donech)
+	}()
 
-	if src.ex.s&existsUpstream|existsInCache != existsUpstream|existsInCache {
-		t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for search")
-	}
-	if src.ex.f&existsUpstream|existsInCache != existsUpstream|existsInCache {
-		t.Errorf("hgSource.listVersions() should have set the upstream and cache existence bits for found")
-	}
+	tfunc("bitbucket.org/sdboyer/nobm", []Version{
+		NewVersion("v1.0.0").Is(Revision("aa110802a0c64195d0a6c375c9f66668827c90b4")),
+		newDefaultBranch("default").Is(Revision("3d466f437f6616da594bbab6446cc1cb4328d1bb")),
+		NewBranch("another").Is(Revision("b10d05d581e5401f383e48ccfeb84b48fde99d06")),
+		NewBranch("newbranch").Is(Revision("5e2a01be9aee942098e44590ae545c7143da9675")),
+	})
 
-	if len(vlist) != 2 {
-		t.Errorf("hg test repo should've produced one version, got %v", len(vlist))
-	} else {
-		SortForUpgrade(vlist)
-		if !reflect.DeepEqual(vlist, evl) {
-			t.Errorf("Version list was not what we expected:\n\t(GOT): %s\n\t(WNT): %s", vlist, evl)
-		}
-	}
-
-	// recheck that rev is present, this time interacting with cache differently
-	is, err = src.revisionPresentIn(Revision("d680e82228d206935ab2eaa88612587abe68db07"))
-	if err != nil {
-		t.Errorf("Unexpected error while re-checking revision presence: %s", err)
-	} else if !is {
-		t.Errorf("Revision that should exist was not present on re-check")
-	}
+	<-donech
+	rf()
 }
diff --git a/vendor/github.com/sdboyer/gps/types.go b/vendor/github.com/sdboyer/gps/types.go
index 11221e3..33b57f9 100644
--- a/vendor/github.com/sdboyer/gps/types.go
+++ b/vendor/github.com/sdboyer/gps/types.go
@@ -211,12 +211,6 @@
 	}
 }
 
-//type byImportPath []Package
-
-//func (s byImportPath) Len() int           { return len(s) }
-//func (s byImportPath) Less(i, j int) bool { return s[i].ImportPath < s[j].ImportPath }
-//func (s byImportPath) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-
 // completeDep (name hopefully to change) provides the whole picture of a
 // dependency - the root (repo and project, since currently we assume the two
 // are the same) name, a constraint, and the actual packages needed that are
diff --git a/vendor/github.com/sdboyer/gps/vcs_source.go b/vendor/github.com/sdboyer/gps/vcs_source.go
index ecded0c..338a2da 100644
--- a/vendor/github.com/sdboyer/gps/vcs_source.go
+++ b/vendor/github.com/sdboyer/gps/vcs_source.go
@@ -136,13 +136,59 @@
 	s.ex.s |= existsUpstream
 	s.ex.f |= existsUpstream
 
+	// pull out the HEAD rev (it's always first) so we know what branches to
+	// mark as default. This is, perhaps, not the best way to glean this, but it
+	// was good enough for git itself until 1.8.5. Also, the alternative is
+	// sniffing data out of the pack protocol, which is a separate request, and
+	// also waaaay more than we want to do right now.
+	//
+	// The cost is that we could potentially have multiple branches marked as
+	// the default. If that does occur, a later check (again, emulating git
+	// <1.8.5 behavior) further narrows the failure mode by choosing master as
+	// the sole default branch if a) master exists and b) master is one of the
+	// branches marked as a default.
+	//
+	// This all reduces the failure mode to a very narrow range of
+	// circumstances. Nevertheless, if we do end up emitting multiple
+	// default branches, it is possible that a user could end up following a
+	// non-default branch, IF:
+	//
+	// * Multiple branches match the HEAD rev
+	// * None of them are master
+	// * The solver makes it into the branch list in the version queue
+	// * The user has provided no constraint, or DefaultBranch
+	// * A branch that is not actually the default, but happens to share the
+	// rev, is lexicographically earlier than the true default branch
+	//
+	// Then the user could end up with an erroneous non-default branch in their
+	// lock file.
+	headrev := Revision(all[0][:40])
+	var onedef, multidef, defmaster bool
+
 	smap := make(map[string]bool)
 	uniq := 0
 	vlist = make([]Version, len(all)-1) // less 1, because always ignore HEAD
 	for _, pair := range all {
 		var v PairedVersion
 		if string(pair[46:51]) == "heads" {
-			v = NewBranch(string(pair[52:])).Is(Revision(pair[:40])).(PairedVersion)
+			rev := Revision(pair[:40])
+
+			isdef := rev == headrev
+			n := string(pair[52:])
+			if isdef {
+				if onedef {
+					multidef = true
+				}
+				onedef = true
+				if n == "master" {
+					defmaster = true
+				}
+			}
+			v = branchVersion{
+				name:      n,
+				isDefault: isdef,
+			}.Is(rev).(PairedVersion)
+
 			vlist[uniq] = v
 			uniq++
 		} else if string(pair[46:50]) == "tags" {
@@ -169,6 +215,20 @@
 	// Trim off excess from the slice
 	vlist = vlist[:uniq]
 
+	// There were multiple default branches, but one was master. So, go through
+	// and strip the default flag from all the non-master branches.
+	if multidef && defmaster {
+		for k, v := range vlist {
+			pv := v.(PairedVersion)
+			if bv, ok := pv.Unpair().(branchVersion); ok {
+				if bv.name != "master" && bv.isDefault == true {
+					bv.isDefault = false
+					vlist[k] = bv.Is(pv.Underlying())
+				}
+			}
+		}
+	}
+
 	// Process the version data into the cache
 	//
 	// reset the rmap and vmap, as they'll be fully repopulated by this
@@ -226,23 +286,30 @@
 	}
 
 	var out []byte
-
 	// Now, list all the tags
 	out, err = r.RunFromDir("bzr", "tags", "--show-ids", "-v")
 	if err != nil {
-		return
+		return nil, fmt.Errorf("%s: %s", err, string(out))
 	}
 
 	all := bytes.Split(bytes.TrimSpace(out), []byte("\n"))
 
-	// reset the rmap and vmap, as they'll be fully repopulated by this
-	// TODO(sdboyer) detect out-of-sync pairings as we do this?
+	var branchrev []byte
+	branchrev, err = r.RunFromDir("bzr", "version-info", "--custom", "--template={revision_id}", "--revision=branch:.")
+	br := string(branchrev)
+	if err != nil {
+		return nil, fmt.Errorf("%s: %s", err, br)
+	}
+
+	// Both commands completed successfully, so there's no further possibility
+	// of errors. That means it's now safe to reset the rmap and vmap, as
+	// they're about to be fully repopulated.
 	s.dc.vMap = make(map[UnpairedVersion]Revision)
 	s.dc.rMap = make(map[Revision][]UnpairedVersion)
+	vlist = make([]Version, len(all)+1)
 
-	vlist = make([]Version, len(all))
-	k := 0
-	for _, line := range all {
+	// Now, all the tags.
+	for k, line := range all {
 		idx := bytes.IndexByte(line, 32) // space
 		v := NewVersion(string(line[:idx]))
 		r := Revision(bytes.TrimSpace(line[idx:]))
@@ -250,9 +317,16 @@
 		s.dc.vMap[v] = r
 		s.dc.rMap[r] = append(s.dc.rMap[r], v)
 		vlist[k] = v.Is(r)
-		k++
 	}
 
+	// Last, add the default branch, hardcoding the visual representation of it
+	// that bzr uses when operating in the workflow mode we're using.
+	v := newDefaultBranch("(default)")
+	rev := Revision(string(branchrev))
+	s.dc.vMap[v] = rev
+	s.dc.rMap[rev] = append(s.dc.rMap[rev], v)
+	vlist[len(vlist)-1] = v.Is(rev)
+
 	// Cache is now in sync with upstream's version list
 	s.cvsync = true
 	return
@@ -301,7 +375,7 @@
 	// Now, list all the tags
 	out, err = r.RunFromDir("hg", "tags", "--debug", "--verbose")
 	if err != nil {
-		return
+		return nil, fmt.Errorf("%s: %s", err, string(out))
 	}
 
 	all := bytes.Split(bytes.TrimSpace(out), []byte("\n"))
@@ -330,30 +404,71 @@
 		vlist = append(vlist, v)
 	}
 
-	out, err = r.RunFromDir("hg", "branches", "--debug", "--verbose")
+	// bookmarks next, because the presence of the magic @ bookmark has to
+	// determine how we handle the branches
+	var magicAt bool
+	out, err = r.RunFromDir("hg", "bookmarks", "--debug")
 	if err != nil {
 		// better nothing than partial and misleading
-		vlist = nil
-		return
+		return nil, fmt.Errorf("%s: %s", err, string(out))
+	}
+
+	out = bytes.TrimSpace(out)
+	if !bytes.Equal(out, []byte("no bookmarks set")) {
+		all = bytes.Split(out, []byte("\n"))
+		for _, line := range all {
+			// Trim leading spaces, and * marker if present
+			line = bytes.TrimLeft(line, " *")
+			pair := bytes.Split(line, []byte(":"))
+			// if this doesn't split exactly once, we have something weird
+			if len(pair) != 2 {
+				continue
+			}
+
+			// Split on colon; this gets us the rev and the branch plus local revno
+			idx := bytes.IndexByte(pair[0], 32) // space
+			// if it's the magic @ marker, make that the default branch
+			str := string(pair[0][:idx])
+			var v Version
+			if str == "@" {
+				magicAt = true
+				v = newDefaultBranch(str).Is(Revision(pair[1])).(PairedVersion)
+			} else {
+				v = NewBranch(str).Is(Revision(pair[1])).(PairedVersion)
+			}
+			vlist = append(vlist, v)
+		}
+	}
+
+	out, err = r.RunFromDir("hg", "branches", "-c", "--debug")
+	if err != nil {
+		// better nothing than partial and misleading
+		return nil, fmt.Errorf("%s: %s", err, string(out))
 	}
 
 	all = bytes.Split(bytes.TrimSpace(out), []byte("\n"))
-	lbyt = []byte("(inactive)")
 	for _, line := range all {
-		if bytes.Equal(lbyt, line[len(line)-len(lbyt):]) {
-			// Skip inactive branches
-			continue
-		}
+		// Trim inactive and closed suffixes, if present; we represent these
+		// anyway
+		line = bytes.TrimSuffix(line, []byte(" (inactive)"))
+		line = bytes.TrimSuffix(line, []byte(" (closed)"))
 
 		// Split on colon; this gets us the rev and the branch plus local revno
 		pair := bytes.Split(line, []byte(":"))
 		idx := bytes.IndexByte(pair[0], 32) // space
-		v := NewBranch(string(pair[0][:idx])).Is(Revision(pair[1])).(PairedVersion)
+		str := string(pair[0][:idx])
+		// if there was no magic @ bookmark, and this is mercurial's magic
+		// "default" branch, then mark it as default branch
+		var v Version
+		if !magicAt && str == "default" {
+			v = newDefaultBranch(str).Is(Revision(pair[1])).(PairedVersion)
+		} else {
+			v = NewBranch(str).Is(Revision(pair[1])).(PairedVersion)
+		}
 		vlist = append(vlist, v)
 	}
 
 	// reset the rmap and vmap, as they'll be fully repopulated by this
-	// TODO(sdboyer) detect out-of-sync pairings as we do this?
 	s.dc.vMap = make(map[UnpairedVersion]Revision)
 	s.dc.rMap = make(map[Revision][]UnpairedVersion)
 
diff --git a/vendor/github.com/sdboyer/gps/version.go b/vendor/github.com/sdboyer/gps/version.go
index f288b2a..7912d1e 100644
--- a/vendor/github.com/sdboyer/gps/version.go
+++ b/vendor/github.com/sdboyer/gps/version.go
@@ -69,7 +69,23 @@
 // NewBranch creates a new Version to represent a floating version (in
 // general, a branch).
 func NewBranch(body string) UnpairedVersion {
-	return branchVersion(body)
+	return branchVersion{
+		name: body,
+		// We always set isDefault to false here, because the property is
+		// specifically designed to be internal-only: only the SourceManager
+		// gets to mark it. This is OK because nothing that client code is
+		// responsible for needs to care about has to touch it it.
+		//
+		// TODO(sdboyer) ...maybe. this just ugly.
+		isDefault: false,
+	}
+}
+
+func newDefaultBranch(body string) UnpairedVersion {
+	return branchVersion{
+		name:      body,
+		isDefault: true,
+	}
 }
 
 // NewVersion creates a Semver-typed Version if the provided version string is
@@ -150,13 +166,16 @@
 	return none
 }
 
-type branchVersion string
-
-func (v branchVersion) String() string {
-	return string(v)
+type branchVersion struct {
+	name      string
+	isDefault bool
 }
 
-func (r branchVersion) Type() string {
+func (v branchVersion) String() string {
+	return string(v.name)
+}
+
+func (v branchVersion) Type() string {
 	return "branch"
 }
 
@@ -165,10 +184,10 @@
 	case versionTypeUnion:
 		return tv.Matches(v)
 	case branchVersion:
-		return v == tv
+		return v.name == tv.name
 	case versionPair:
 		if tv2, ok := tv.v.(branchVersion); ok {
-			return tv2 == v
+			return tv2.name == v.name
 		}
 	}
 	return false
@@ -183,10 +202,10 @@
 	case versionTypeUnion:
 		return tc.MatchesAny(v)
 	case branchVersion:
-		return v == tc
+		return v.name == tc.name
 	case versionPair:
 		if tc2, ok := tc.v.(branchVersion); ok {
-			return tc2 == v
+			return tc2.name == v.name
 		}
 	}
 
@@ -202,12 +221,12 @@
 	case versionTypeUnion:
 		return tc.Intersect(v)
 	case branchVersion:
-		if v == tc {
+		if v.name == tc.name {
 			return v
 		}
 	case versionPair:
 		if tc2, ok := tc.v.(branchVersion); ok {
-			if v == tc2 {
+			if v.name == tc2.name {
 				return v
 			}
 		}
@@ -615,9 +634,19 @@
 		panic("unreachable")
 	}
 
-	switch l.(type) {
-	// For these, now nothing to do but alpha sort
-	case Revision, branchVersion, plainVersion:
+	switch tl := l.(type) {
+	case branchVersion:
+		tr := r.(branchVersion)
+		if tl.isDefault != tr.isDefault {
+			// If they're not both defaults, then return the left val: if left
+			// is the default, then it is "less" (true) b/c we want it earlier.
+			// Else the right is the default, and so the left should be later
+			// (false).
+			return tl.isDefault
+		}
+		return l.String() < r.String()
+	case Revision, plainVersion:
+		// All that we can do now is alpha sort
 		return l.String() < r.String()
 	}
 
@@ -652,9 +681,19 @@
 		panic("unreachable")
 	}
 
-	switch l.(type) {
-	// For these, now nothing to do but alpha
-	case Revision, branchVersion, plainVersion:
+	switch tl := l.(type) {
+	case branchVersion:
+		tr := r.(branchVersion)
+		if tl.isDefault != tr.isDefault {
+			// If they're not both defaults, then return the left val: if left
+			// is the default, then it is "less" (true) b/c we want it earlier.
+			// Else the right is the default, and so the left should be later
+			// (false).
+			return tl.isDefault
+		}
+		return l.String() < r.String()
+	case Revision, plainVersion:
+		// All that we can do now is alpha sort
 		return l.String() < r.String()
 	}
 
diff --git a/vendor/github.com/sdboyer/gps/version_test.go b/vendor/github.com/sdboyer/gps/version_test.go
index 394bb27..d375e77 100644
--- a/vendor/github.com/sdboyer/gps/version_test.go
+++ b/vendor/github.com/sdboyer/gps/version_test.go
@@ -10,7 +10,7 @@
 	v4 := NewVersion("1.0.1")
 	v5 := NewVersion("v2.0.5")
 	v6 := NewVersion("2.0.5.2")
-	v7 := NewBranch("unwrapped")
+	v7 := newDefaultBranch("unwrapped")
 	v8 := NewVersion("20.0.5.2")
 
 	start := []Version{
@@ -32,14 +32,14 @@
 
 	edown := []Version{
 		v3, v4, v5, // semvers
-		v1, v2, v7, // floating/branches
+		v7, v1, v2, // floating/branches
 		v6, v8, // plain versions
 		rev, // revs
 	}
 
 	eup := []Version{
 		v5, v4, v3, // semvers
-		v1, v2, v7, // floating/branches
+		v7, v1, v2, // floating/branches
 		v6, v8, // plain versions
 		rev, // revs
 	}
diff --git a/vendor/gopkg.in/yaml.v2/README.md b/vendor/gopkg.in/yaml.v2/README.md
index 1884de6..7b8bd86 100644
--- a/vendor/gopkg.in/yaml.v2/README.md
+++ b/vendor/gopkg.in/yaml.v2/README.md
@@ -42,7 +42,7 @@
 License
 -------
 
-The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details.
+The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details.
 
 
 Example
