Option to export the discovered YAML after glide up.

Also added --quick alias to up, and added file name output to
import commands.
diff --git a/cmd/flatten.go b/cmd/flatten.go
index a3450e1..74aff62 100644
--- a/cmd/flatten.go
+++ b/cmd/flatten.go
@@ -22,8 +22,12 @@
 // Returns:
 //
 func Flatten(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
-	packages := p.Get("packages", []string{}).([]string)
 	conf := p.Get("conf", &Config{}).(*Config)
+	skip := p.Get("skip", false).(bool)
+	if skip {
+		return conf, nil
+	}
+	packages := p.Get("packages", []string{}).([]string)
 	force := p.Get("force", true).(bool)
 	vend, _ := VendorPath(c)
 
@@ -43,10 +47,22 @@
 
 	f := &flattening{conf, vend, vend, deps, packages}
 
-	a, err := recFlatten(f, force)
+	err := recFlatten(f, force)
 	flattenSetRefs(f)
 	Info("Project relies on %d dependencies.", len(deps))
-	return a, err
+	exportFlattenedDeps(conf, deps)
+
+	return conf, err
+}
+
+func exportFlattenedDeps(conf *Config, in map[string]*Dependency) {
+	out := make([]*Dependency, len(in))
+	i := 0
+	for _, v := range in {
+		out[i] = v
+		i++
+	}
+	conf.Imports = out
 }
 
 type flattening struct {
@@ -62,10 +78,10 @@
 }
 
 // Hack: Cache record of updates so we don't have to keep doing git pulls.
-var flattenUpdateCache = map[string]bool{}
+var updateCache = map[string]bool{}
 
 // refFlatten recursively flattens the vendor tree.
-func recFlatten(f *flattening, force bool) (interface{}, error) {
+func recFlatten(f *flattening, force bool) error {
 	Debug("---> Inspecting %s for changes (%d packages).\n", f.curr, len(f.scan))
 	for _, imp := range f.scan {
 		Debug("----> Scanning %s", imp)
@@ -96,8 +112,7 @@
 		}
 	}
 
-	// Stopped: Need to recurse down the next level.
-	return nil, nil
+	return nil
 }
 
 // flattenGlideUp does a glide update in the middle of a flatten operation.
@@ -110,7 +125,7 @@
 	for _, imp := range f.deps {
 		wd := path.Join(f.top, imp.Name)
 		if VcsExists(imp, wd) {
-			if flattenUpdateCache[imp.Name] {
+			if updateCache[imp.Name] {
 				Debug("----> Already updated %s", imp.Name)
 				continue
 			}
@@ -120,7 +135,7 @@
 				Warn("Skipped update %s: %s\n", imp.Name, err)
 				continue
 			}
-			flattenUpdateCache[imp.Name] = true
+			updateCache[imp.Name] = true
 		} else {
 			Debug("Importing %s to project %s\n", imp.Name, wd)
 			if err := VcsGet(imp, wd); err != nil {
@@ -216,7 +231,7 @@
 // for dependencies. So generally it should be the last merge strategy
 // that you try.
 func mergeGuess(dir, pkg string, deps map[string]*Dependency) ([]string, bool) {
-	Info("%s manages its own dependencies.", pkg)
+	Info("Scanning %s for dependencies.", pkg)
 	buildContext, err := GetBuildContext()
 	if err != nil {
 		Warn("Could not scan package %q: %s", pkg, err)
diff --git a/cmd/get_imports.go b/cmd/get_imports.go
index 405cdc5..c5dec3c 100644
--- a/cmd/get_imports.go
+++ b/cmd/get_imports.go
@@ -142,6 +142,12 @@
 			Debug("===> Skipping %q", dep.Name)
 			continue
 		}
+
+		// Hack: The updateCache global keeps us from re-updating the same
+		// dependencies when we're recursing. We cache here to prevent
+		// flattening from causing unnecessary updates.
+		updateCache[dep.Name] = true
+
 		if err := VcsUpdate(dep, cwd, force); err != nil {
 			Warn("Update failed for %s: %s\n", dep.Name, err)
 		}
diff --git a/cmd/yaml.go b/cmd/yaml.go
index f0fbbdf..b1a6e2c 100644
--- a/cmd/yaml.go
+++ b/cmd/yaml.go
@@ -63,6 +63,7 @@
 // 	- filename (string): If set, the file will be opened and the content will be written to it.
 func WriteYaml(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
 	top := p.Get("yaml.Node", yaml.Scalar("nothing to print")).(yaml.Node)
+	toStdout := p.Get("toStdout", true).(bool)
 	var out io.Writer
 	if nn, ok := p.Has("filename"); ok && len(nn.(string)) > 0 {
 		file, err := os.Create(nn.(string))
@@ -70,11 +71,12 @@
 		}
 		defer file.Close()
 		out = io.Writer(file)
-	} else {
+		fmt.Fprint(out, yaml.Render(top))
+	} else if toStdout {
 		out = p.Get("out", os.Stdout).(io.Writer)
+		fmt.Fprint(out, yaml.Render(top))
 	}
-
-	fmt.Fprint(out, yaml.Render(top))
+	// Otherwise we supress output.
 
 	return true, nil
 }
diff --git a/glide.go b/glide.go
index f735b7a..06c37c6 100644
--- a/glide.go
+++ b/glide.go
@@ -171,7 +171,8 @@
 					os.Exit(1)
 				}
 				cxt.Put("packages", []string(c.Args()))
-				cxt.Put("recursiveDependencies", !c.Bool("no-recursive"))
+				cxt.Put("skipFlatten", !c.Bool("no-recursive"))
+				// FIXME: Are these used anywhere?
 				if c.Bool("import") {
 					cxt.Put("importGodeps", true)
 					cxt.Put("importGPM", true)
@@ -187,21 +188,42 @@
 				{
 					Name:  "godep",
 					Usage: "Import Godep's Godeps.json files and display the would-be yaml file",
+					Flags: []cli.Flag{
+						cli.StringFlag{
+							Name:  "file, f",
+							Usage: "Save all of the discovered dependencies to a Glide YAML file.",
+						},
+					},
 					Action: func(c *cli.Context) {
+						cxt.Put("toPath", c.String("file"))
 						setupHandler(c, "import godep", cxt, router)
 					},
 				},
 				{
 					Name:  "gpm",
 					Usage: "Import GPM's Godeps and Godeps-Git files and display the would-be yaml file",
+					Flags: []cli.Flag{
+						cli.StringFlag{
+							Name:  "file, f",
+							Usage: "Save all of the discovered dependencies to a Glide YAML file.",
+						},
+					},
 					Action: func(c *cli.Context) {
+						cxt.Put("toPath", c.String("file"))
 						setupHandler(c, "import gpm", cxt, router)
 					},
 				},
 				{
 					Name:  "gb",
 					Usage: "Import gb's manifest file and display the would-be yaml file",
+					Flags: []cli.Flag{
+						cli.StringFlag{
+							Name:  "file, f",
+							Usage: "Save all of the discovered dependencies to a Glide YAML file.",
+						},
+					},
 					Action: func(c *cli.Context) {
+						cxt.Put("toPath", c.String("file"))
 						setupHandler(c, "import gb", cxt, router)
 					},
 				},
@@ -285,6 +307,10 @@
 	dependencies, stored in your projects VCS repository, will be updated. This
 	works by removing the old package, checking out an the repo and setting the
 	version, and removing the VCS directory.
+
+	By default, packages that are discovered are considered transient, and are
+	not stored in the glide.yaml file. The --file=NAME.yaml flag allows you
+	to save the discovered dependencies to a YAML file.
 	`,
 			Flags: []cli.Flag{
 				cli.BoolFlag{
@@ -292,8 +318,8 @@
 					Usage: "Delete vendor packages not specified in config.",
 				},
 				cli.BoolFlag{
-					Name:  "no-recursive",
-					Usage: "Disable updating dependencies' dependencies.",
+					Name:  "no-recursive, quick",
+					Usage: "Disable updating dependencies' dependencies. Only update things in glide.yaml.",
 				},
 				cli.BoolFlag{
 					Name:  "force",
@@ -303,12 +329,18 @@
 					Name:  "update-vendored, u",
 					Usage: "Update vendored packages (without local VCS repo). Warning, changes will be lost.",
 				},
+				cli.StringFlag{
+					Name:  "file, f",
+					Usage: "Save all of the discovered dependencies to a Glide YAML file.",
+				},
 			},
 			Action: func(c *cli.Context) {
 				cxt.Put("deleteOptIn", c.Bool("delete"))
 				cxt.Put("forceUpdate", c.Bool("force"))
-				cxt.Put("recursiveDependencies", !c.Bool("no-recursive"))
+				cxt.Put("skipFlatten", c.Bool("no-recursive"))
 				cxt.Put("deleteFlatten", c.Bool("delete-flatten"))
+				cxt.Put("toPath", c.String("file"))
+				cxt.Put("toStdout", false)
 				if c.Bool("import") {
 					cxt.Put("importGodeps", true)
 					cxt.Put("importGPM", true)
@@ -440,12 +472,18 @@
 		Using("force").From("cxt:forceUpdate").
 		Using("packages").From("cxt:packages").
 		Does(cmd.SetReference, "version").Using("conf").From("cxt:cfg").
-		Does(cmd.Flatten, "flatten").Using("conf").From("cxt:cfg").
+		Does(cmd.Flatten, "flattened").Using("conf").From("cxt:cfg").
 		Using("packages").From("cxt:packages").
 		Using("force").From("cxt:forceUpdate").
+		Using("skip").From("cxt:skipFlatten").
 		Does(cmd.VendoredCleanUp, "_").
 		Using("conf").From("cxt:cfg").
-		Using("update").From("cxt:updateVendoredDeps")
+		Using("update").From("cxt:updateVendoredDeps").
+		Does(cmd.MergeToYaml, "merged").Using("conf").From("cxt:cfg").
+		Does(cmd.WriteYaml, "out").
+		Using("yaml.Node").From("cxt:merged").
+		Using("filename").From("cxt:toPath").
+		Using("toStdout").From("cxt:toStdout")
 
 	//Does(cmd.Rebuild, "rebuild").Using("conf").From("cxt:cfg")
 
@@ -477,7 +515,8 @@
 		Using("conf").From("cxt:cfg").
 		// Does(cmd.UpdateReferences, "refs").Using("conf").From("cxt:cfg").
 		Does(cmd.MergeToYaml, "merged").Using("conf").From("cxt:cfg").
-		Does(cmd.WriteYaml, "out").Using("yaml.Node").From("cxt:merged")
+		Does(cmd.WriteYaml, "out").Using("yaml.Node").From("cxt:merged").
+		Using("filename").From("cxt:toPath")
 
 	reg.Route("import godep", "Read a Godeps.json file").
 		Includes("@startup").
@@ -488,7 +527,8 @@
 		Using("conf").From("cxt:cfg").
 		// Does(cmd.UpdateReferences, "refs").Using("conf").From("cxt:cfg").
 		Does(cmd.MergeToYaml, "merged").Using("conf").From("cxt:cfg").
-		Does(cmd.WriteYaml, "out").Using("yaml.Node").From("cxt:merged")
+		Does(cmd.WriteYaml, "out").Using("yaml.Node").From("cxt:merged").
+		Using("filename").From("cxt:toPath")
 
 	reg.Route("import gb", "Read a vendor/manifest file").
 		Includes("@startup").
@@ -498,7 +538,8 @@
 		Using("dependencies").From("cxt:manifest").
 		Using("conf").From("cxt:cfg").
 		Does(cmd.MergeToYaml, "merged").Using("conf").From("cxt:cfg").
-		Does(cmd.WriteYaml, "out").Using("yaml.Node").From("cxt:merged")
+		Does(cmd.WriteYaml, "out").Using("yaml.Node").From("cxt:merged").
+		Using("filename").From("cxt:toPath")
 
 	reg.Route("guess", "Guess dependencies").
 		Includes("@ready").