Adding ingore list to glide.yaml to ignore packages
diff --git a/cfg/config.go b/cfg/config.go
index 0daa26f..63c3676 100644
--- a/cfg/config.go
+++ b/cfg/config.go
@@ -14,6 +14,7 @@
 // Config is the top-level configuration object.
 type Config struct {
 	Name       string       `yaml:"package"`
+	Ignore     []string     `yaml:"ignore,omitempty"`
 	Imports    Dependencies `yaml:"import"`
 	DevImports Dependencies `yaml:"devimport,omitempty"`
 }
@@ -21,6 +22,7 @@
 // A transitive representation of a dependency for importing and exploting to yaml.
 type cf struct {
 	Name       string       `yaml:"package"`
+	Ignore     []string     `yaml:"ignore,omitempty"`
 	Imports    Dependencies `yaml:"import"`
 	DevImports Dependencies `yaml:"devimport,omitempty"`
 }
@@ -48,6 +50,7 @@
 		return err
 	}
 	c.Name = newConfig.Name
+	c.Ignore = newConfig.Ignore
 	c.Imports = newConfig.Imports
 	c.DevImports = newConfig.DevImports
 
@@ -60,7 +63,8 @@
 // MarshalYAML is a hook for gopkg.in/yaml.v2 in the marshaling process
 func (c *Config) MarshalYAML() (interface{}, error) {
 	newConfig := &cf{
-		Name: c.Name,
+		Name:   c.Name,
+		Ignore: c.Ignore,
 	}
 	i, err := c.Imports.Clone().DeDupe()
 	if err != nil {
@@ -93,10 +97,22 @@
 	return false
 }
 
+// HasIgnore returns true if the given name is listed on the ignore list.
+func (c *Config) HasIgnore(name string) bool {
+	for _, v := range c.Ignore {
+		if v == name {
+			return true
+		}
+	}
+
+	return false
+}
+
 // Clone performs a deep clone of the Config instance
 func (c *Config) Clone() *Config {
 	n := &Config{}
 	n.Name = c.Name
+	n.Ignore = c.Ignore
 	n.Imports = c.Imports.Clone()
 	n.DevImports = c.DevImports.Clone()
 	return n
@@ -134,7 +150,30 @@
 		}
 	}
 	if found >= 0 {
-		c.Imports = append(c.DevImports[:found], c.DevImports[found+1:]...)
+		c.DevImports = append(c.DevImports[:found], c.DevImports[found+1:]...)
+	}
+
+	// If something is on the ignore list remove it from the imports.
+	for _, v := range c.Ignore {
+		found = -1
+		for k, d := range c.Imports {
+			if v == d.Name {
+				found = k
+			}
+		}
+		if found >= 0 {
+			c.Imports = append(c.Imports[:found], c.Imports[found+1:]...)
+		}
+
+		found = -1
+		for k, d := range c.DevImports {
+			if v == d.Name {
+				found = k
+			}
+		}
+		if found >= 0 {
+			c.DevImports = append(c.DevImports[:found], c.DevImports[found+1:]...)
+		}
 	}
 
 	return nil
diff --git a/cmd/flatten.go b/cmd/flatten.go
index bb0f055..1bf9adc 100644
--- a/cmd/flatten.go
+++ b/cmd/flatten.go
@@ -115,15 +115,15 @@
 		Debug("----> Scanning %s", imp)
 		base := path.Join(f.top, imp)
 		mod := []string{}
-		if m, ok := mergeGlide(base, imp, f.deps, f.top); ok {
+		if m, ok := mergeGlide(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGodep(base, imp, f.deps, f.top); ok {
+		} else if m, ok = mergeGodep(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGPM(base, imp, f.deps, f.top); ok {
+		} else if m, ok = mergeGPM(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGb(base, imp, f.deps, f.top); ok {
+		} else if m, ok = mergeGb(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGuess(base, imp, f.deps, f.top, scanned); ok {
+		} else if m, ok = mergeGuess(base, imp, f, scanned); ok {
 			mod = m
 		}
 
@@ -197,7 +197,9 @@
 	}
 }
 
-func mergeGlide(dir, name string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGlide(dir, name string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	gp := path.Join(dir, "glide.yaml")
 	if _, err := os.Stat(gp); err != nil {
 		return []string{}, false
@@ -217,14 +219,16 @@
 
 	Info("Found glide.yaml in %s", gp)
 
-	return mergeDeps(deps, conf.Imports, vend), true
+	return mergeDeps(deps, conf.Imports, vend, f), true
 }
 
 // listGodep appends Godeps entries to the deps.
 //
 // It returns true if any dependencies were found (even if not added because
 // they are duplicates).
-func mergeGodep(dir, name string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGodep(dir, name string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	Debug("Looking in %s/Godeps/ for a Godeps.json file.\n", dir)
 	d, err := parseGodepGodeps(dir)
 	if err != nil {
@@ -235,28 +239,32 @@
 	}
 
 	Info("Found Godeps.json file for %q", name)
-	return mergeDeps(deps, d, vend), true
+	return mergeDeps(deps, d, vend, f), true
 }
 
 // listGb merges GB dependencies into the deps.
-func mergeGb(dir, pkg string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGb(dir, pkg string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	Debug("Looking in %s/vendor/ for a manifest file.\n", dir)
 	d, err := parseGbManifest(dir)
 	if err != nil || len(d) == 0 {
 		return []string{}, false
 	}
 	Info("Found gb manifest file for %q", pkg)
-	return mergeDeps(deps, d, vend), true
+	return mergeDeps(deps, d, vend, f), true
 }
 
 // mergeGPM merges GPM Godeps files into deps.
-func mergeGPM(dir, pkg string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGPM(dir, pkg string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	d, err := parseGPMGodeps(dir)
 	if err != nil || len(d) == 0 {
 		return []string{}, false
 	}
 	Info("Found GPM file for %q", pkg)
-	return mergeDeps(deps, d, vend), true
+	return mergeDeps(deps, d, vend, f), true
 }
 
 // mergeGuess guesses dependencies and merges.
@@ -264,7 +272,8 @@
 // This always returns true because it always handles the job of searching
 // for dependencies. So generally it should be the last merge strategy
 // that you try.
-func mergeGuess(dir, pkg string, deps map[string]*cfg.Dependency, vend string, scanned map[string]bool) ([]string, bool) {
+func mergeGuess(dir, pkg string, f *flattening, scanned map[string]bool) ([]string, bool) {
+	deps := f.deps
 	Info("Scanning %s for dependencies.", pkg)
 	buildContext, err := GetBuildContext()
 	if err != nil {
@@ -292,6 +301,10 @@
 		//Debug("====> Seen %s already. Skipping", name)
 		//continue
 		//}
+		if f.conf.HasIgnore(name) {
+			Debug("==> Skipping %s because it is on the ignore list", name)
+			continue
+		}
 
 		found := findPkg(buildContext, name, dir)
 		switch found.PType {
@@ -326,11 +339,13 @@
 }
 
 // mergeDeps merges any dependency array into deps.
-func mergeDeps(orig map[string]*cfg.Dependency, add []*cfg.Dependency, vend string) []string {
+func mergeDeps(orig map[string]*cfg.Dependency, add []*cfg.Dependency, vend string, f *flattening) []string {
 	mod := []string{}
 	for _, dd := range add {
-		// Add it unless it's already there.
-		if existing, ok := orig[dd.Name]; !ok {
+		if f.conf.HasIgnore(dd.Name) {
+			Debug("Skipping %s because it is on the ignore list", dd.Name)
+		} else if existing, ok := orig[dd.Name]; !ok {
+			// Add it unless it's already there.
 			orig[dd.Name] = dd
 			Debug("Adding %s to the scan list", dd.Name)
 			mod = append(mod, dd.Name)
diff --git a/cmd/get_imports.go b/cmd/get_imports.go
index ff0d810..ab103eb 100644
--- a/cmd/get_imports.go
+++ b/cmd/get_imports.go
@@ -72,6 +72,11 @@
 			continue
 		}
 
+		if conf.HasIgnore(root) {
+			Warn("Package %q is set to be ignored in glide.yaml. Skipping", root)
+			continue
+		}
+
 		dest := path.Join(cwd, root)
 
 		if err != nil {
@@ -803,6 +808,16 @@
 	return ""
 }
 
+// list2map takes a list of packages names and creates a map of normalized names.
+func list2map(in []string) map[string]bool {
+	out := make(map[string]bool, len(in))
+	for _, v := range in {
+		v, _ := NormalizeName(v)
+		out[v] = true
+	}
+	return out
+}
+
 func envForDir(dir string) []string {
 	env := os.Environ()
 	return mergeEnvLists([]string{"PWD=" + dir}, env)
diff --git a/cmd/update_references.go b/cmd/update_references.go
deleted file mode 100644
index 92fe235..0000000
--- a/cmd/update_references.go
+++ /dev/null
@@ -1,113 +0,0 @@
-package cmd
-
-import (
-	"path"
-
-	"github.com/Masterminds/cookoo"
-	"github.com/Masterminds/glide/cfg"
-)
-
-// UpdateReferences updates the revision numbers on all of the imports.
-//
-// If a `packages` list is supplied, only the given base packages will
-// be updated.
-//
-// Params:
-// 	- conf (*cfg.Config): Configuration
-// 	- packages ([]string): A list of packages to update. Default is all packages.
-func UpdateReferences(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
-	conf := p.Get("conf", &cfg.Config{}).(*cfg.Config)
-	plist := p.Get("packages", []string{}).([]string)
-	vend, _ := VendorPath(c)
-	pkgs := list2map(plist)
-	restrict := len(pkgs) > 0
-
-	cwd, err := VendorPath(c)
-	if err != nil {
-		return false, err
-	}
-
-	if len(conf.Imports) == 0 {
-		return conf, nil
-	}
-
-	// Walk the dependency tree to discover all the packages to pin.
-	packages := make([]string, len(conf.Imports))
-	for i, v := range conf.Imports {
-		packages[i] = v.Name
-	}
-	deps := make(map[string]*cfg.Dependency, len(conf.Imports))
-	for _, imp := range conf.Imports {
-		deps[imp.Name] = imp
-	}
-	f := &flattening{conf, vend, vend, deps, packages}
-	err = discoverDependencyTree(f)
-	if err != nil {
-		return conf, err
-	}
-
-	exportFlattenedDeps(conf, deps)
-
-	err = conf.DeDupe()
-	if err != nil {
-		return conf, err
-	}
-
-	for _, imp := range conf.Imports {
-		if restrict && !pkgs[imp.Name] {
-			Debug("===> Skipping %q", imp.Name)
-			continue
-		}
-		commit, err := VcsLastCommit(imp, cwd)
-		if err != nil {
-			Warn("Could not get commit on %s: %s", imp.Name, err)
-		}
-		imp.Reference = commit
-	}
-
-	return conf, nil
-}
-
-func discoverDependencyTree(f *flattening) error {
-	Debug("---> Inspecting %s for dependencies (%d packages).\n", f.curr, len(f.scan))
-	scanned := map[string]bool{}
-	for _, imp := range f.scan {
-		Debug("----> Scanning %s", imp)
-		base := path.Join(f.top, imp)
-		mod := []string{}
-		if m, ok := mergeGlide(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGodep(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGPM(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGb(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGuess(base, imp, f.deps, f.top, scanned); ok {
-			mod = m
-		}
-
-		if len(mod) > 0 {
-			Debug("----> Looking for dependencies in %q (%d)", imp, len(mod))
-			f2 := &flattening{
-				conf: f.conf,
-				top:  f.top,
-				curr: base,
-				deps: f.deps,
-				scan: mod}
-			discoverDependencyTree(f2)
-		}
-	}
-
-	return nil
-}
-
-// list2map takes a list of packages names and creates a map of normalized names.
-func list2map(in []string) map[string]bool {
-	out := make(map[string]bool, len(in))
-	for _, v := range in {
-		v, _ := NormalizeName(v)
-		out[v] = true
-	}
-	return out
-}