Add -a option and allfiles manifest entry to include all files

Closes #30
diff --git a/README.md b/README.md
index 5b5071d..4c6cbe6 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@
 
 Files and folders starting with `.` or `_` are ignored. Only [files relevant to the Go compiler](https://golang.org/cmd/go/#hdr-File_types) are fetched. LICENSE files are always included, too.
 
-Test files and `testdata` folders can be included with `-t`.
+Test files and `testdata` folders can be included with `-t`. To include all files (except the repository metadata), use `-a`.
 
 ```
 $ tree -d
diff --git a/alldocs.go b/alldocs.go
index 656ba9d..f6727ea 100644
--- a/alldocs.go
+++ b/alldocs.go
@@ -21,7 +21,7 @@
 Fetch a remote dependency
 
 Usage:
-        gvt fetch [-branch branch] [-revision rev | -tag tag] [-precaire] [-no-recurse] [-t] importpath
+        gvt fetch [-branch branch] [-revision rev | -tag tag] [-precaire] [-no-recurse] [-t|-a] importpath
 
 fetch vendors an upstream import path.
 
@@ -31,6 +31,8 @@
 Flags:
 	-t
 		fetch also _test.go files and testdata.
+	-a
+		fetch all files and subfolders, ignoring ONLY .git, .hg and .bzr.
 	-branch branch
 		fetch from the named branch. Will also be used by gvt update.
 		If not supplied the default upstream branch will be used.
diff --git a/fetch.go b/fetch.go
index b21f3b4..ae43ee9 100644
--- a/fetch.go
+++ b/fetch.go
@@ -21,6 +21,7 @@
 	noRecurse bool
 	insecure  bool // Allow the use of insecure protocols
 	tests     bool
+	all       bool
 
 	recurse bool // should we fetch recursively
 )
@@ -32,11 +33,12 @@
 	fs.BoolVar(&noRecurse, "no-recurse", false, "do not fetch recursively")
 	fs.BoolVar(&insecure, "precaire", false, "allow the use of insecure protocols")
 	fs.BoolVar(&tests, "t", false, "fetch _test.go files and testdata")
+	fs.BoolVar(&all, "a", false, "fetch all files and subfolders")
 }
 
 var cmdFetch = &Command{
 	Name:      "fetch",
-	UsageLine: "fetch [-branch branch] [-revision rev | -tag tag] [-precaire] [-no-recurse] [-t] importpath",
+	UsageLine: "fetch [-branch branch] [-revision rev | -tag tag] [-precaire] [-no-recurse] [-t|-a] importpath",
 	Short:     "fetch a remote dependency",
 	Long: `fetch vendors an upstream import path.
 
@@ -46,6 +48,8 @@
 Flags:
 	-t
 		fetch also _test.go files and testdata.
+	-a
+		fetch all files and subfolders, ignoring ONLY .git, .hg and .bzr.
 	-branch branch
 		fetch from the named branch. Will also be used by gvt update.
 		If not supplied the default upstream branch will be used.
@@ -117,6 +121,7 @@
 		Branch:     b,
 		Path:       extra,
 		NoTests:    !tests,
+		AllFiles:   all,
 	}
 
 	if err := m.AddDependency(dep); err != nil {
@@ -126,7 +131,7 @@
 	dst := filepath.Join(vendorDir(), dep.Importpath)
 	src := filepath.Join(wc.Dir(), dep.Path)
 
-	if err := fileutils.Copypath(dst, src, !dep.NoTests); err != nil {
+	if err := fileutils.Copypath(dst, src, !dep.NoTests, dep.AllFiles); err != nil {
 		return err
 	}
 
diff --git a/fileutils/fileutils.go b/fileutils/fileutils.go
index 2a36a1d..5584de7 100644
--- a/fileutils/fileutils.go
+++ b/fileutils/fileutils.go
@@ -28,7 +28,7 @@
 
 // Copypath copies the contents of src to dst, excluding any file that is not
 // relevant to the Go compiler.
-func Copypath(dst string, src string, tests bool) error {
+func Copypath(dst string, src string, tests, all bool) error {
 	err := filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
 		if err != nil {
 			return err
@@ -53,6 +53,9 @@
 
 		skip := false
 		switch {
+		case all && !(name == ".git" && info.IsDir()) && name != ".bzr" && name != ".hg":
+			skip = false
+
 		// Include all files in a testdata folder
 		case tests && testdata:
 			skip = false
diff --git a/fileutils/fileutils_test.go b/fileutils/fileutils_test.go
index 69bb60a..2be29c8 100644
--- a/fileutils/fileutils_test.go
+++ b/fileutils/fileutils_test.go
@@ -15,7 +15,7 @@
 	dst := mktemp(t)
 	defer RemoveAll(dst)
 	src := filepath.Join("_testdata", "copyfile")
-	if err := Copypath(dst, src, true); err != nil {
+	if err := Copypath(dst, src, true, false); err != nil {
 		t.Fatalf("copypath(%s, %s): %v", dst, src, err)
 	}
 	res, err := os.Readlink(filepath.Join(dst, "a", "rick"))
diff --git a/gbvendor/manifest.go b/gbvendor/manifest.go
index 397208f..2282cde 100644
--- a/gbvendor/manifest.go
+++ b/gbvendor/manifest.go
@@ -86,6 +86,9 @@
 	// NoTests indicates that test files were ignored.
 	// In the negative for backwards compatibility.
 	NoTests bool `json:"notests,omitempty"`
+
+	// AllFiles indicates that no files were ignored.
+	AllFiles bool `json:"allfiles,omitempty"`
 }
 
 // WriteManifest writes a Manifest to the path. If the manifest does
diff --git a/restore.go b/restore.go
index dfd078a..c0756fd 100644
--- a/restore.go
+++ b/restore.go
@@ -91,14 +91,17 @@
 }
 
 func downloadDependency(dep vendor.Dependency, errors *uint32, vendorDir string, recursive bool) error {
-	testsMsg := ""
+	extraMsg := ""
 	if !dep.NoTests {
-		testsMsg = "(including tests)"
+		extraMsg = "(including tests)"
+	}
+	if dep.AllFiles {
+		extraMsg = "(without file exclusions)"
 	}
 	if recursive {
-		log.Printf("fetching recursive %s %s", dep.Importpath, testsMsg)
+		log.Printf("fetching recursive %s %s", dep.Importpath, extraMsg)
 	} else {
-		log.Printf("fetching %s %s", dep.Importpath, testsMsg)
+		log.Printf("fetching %s %s", dep.Importpath, extraMsg)
 	}
 
 	repo, _, err := vendor.DeduceRemoteRepo(dep.Importpath, rbInsecure)
@@ -120,7 +123,7 @@
 		}
 	}
 
-	if err := fileutils.Copypath(dst, src, !dep.NoTests); err != nil {
+	if err := fileutils.Copypath(dst, src, !dep.NoTests, dep.AllFiles); err != nil {
 		return err
 	}
 
diff --git a/update.go b/update.go
index f7d38d6..8d71ae6 100644
--- a/update.go
+++ b/update.go
@@ -107,7 +107,7 @@
 			dst := filepath.Join(vendorDir(), filepath.FromSlash(dep.Importpath))
 			src := filepath.Join(wc.Dir(), dep.Path)
 
-			if err := fileutils.Copypath(dst, src, !d.NoTests); err != nil {
+			if err := fileutils.Copypath(dst, src, !d.NoTests, d.AllFiles); err != nil {
 				return err
 			}