| // 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. | 
 |  | 
 | package gps | 
 |  | 
 | import ( | 
 | 	"strings" | 
 |  | 
 | 	"github.com/Masterminds/vcs" | 
 | 	"github.com/pkg/errors" | 
 | ) | 
 |  | 
 | // VCSVersion returns the current project version for an absolute path. | 
 | func VCSVersion(path string) (Version, error) { | 
 | 	repo, err := vcs.NewRepo("", path) | 
 | 	if err != nil { | 
 | 		return nil, errors.Wrapf(err, "creating new repo for root: %s", path) | 
 | 	} | 
 |  | 
 | 	ver, err := repo.Current() | 
 | 	if err != nil { | 
 | 		return nil, errors.Wrapf(err, "finding current branch/version for root: %s", path) | 
 | 	} | 
 |  | 
 | 	rev, err := repo.Version() | 
 | 	if err != nil { | 
 | 		return nil, errors.Wrapf(err, "getting repo version for root: %s", path) | 
 | 	} | 
 |  | 
 | 	// First look through tags. | 
 | 	tags, err := repo.Tags() | 
 | 	if err != nil { | 
 | 		return nil, errors.Wrapf(err, "getting repo tags for root: %s", path) | 
 | 	} | 
 | 	// Try to match the current version to a tag. | 
 | 	if contains(tags, ver) { | 
 | 		// Assume semver if it starts with a v. | 
 | 		if strings.HasPrefix(ver, "v") { | 
 | 			return NewVersion(ver).Pair(Revision(rev)), nil | 
 | 		} | 
 |  | 
 | 		return nil, errors.Errorf("version for root %s does not start with a v: %q", path, ver) | 
 | 	} | 
 |  | 
 | 	// Look for the current branch. | 
 | 	branches, err := repo.Branches() | 
 | 	if err != nil { | 
 | 		return nil, errors.Wrapf(err, "getting repo branch for root: %s", path) | 
 | 	} | 
 | 	// Try to match the current version to a branch. | 
 | 	if contains(branches, ver) { | 
 | 		return NewBranch(ver).Pair(Revision(rev)), nil | 
 | 	} | 
 |  | 
 | 	return Revision(rev), nil | 
 | } | 
 |  | 
 | // contains checks if a array of strings contains a value | 
 | func contains(a []string, b string) bool { | 
 | 	for _, v := range a { | 
 | 		if b == v { | 
 | 			return true | 
 | 		} | 
 | 	} | 
 | 	return false | 
 | } |