Define the behavior around overlapping dependencies
This will inform the recursive imports detection rewrite, and provides
the "right answer" for #32/#33 and in the future #38/#6.
diff --git a/README.md b/README.md
index 7a48011..9ebafba 100644
--- a/README.md
+++ b/README.md
@@ -118,6 +118,8 @@
* the dependencies will need to remain available from the source repositories: if the original
repository goes down or rewrites history, build reproducibility is lost
* `go get` won't work on your package
+ * unless you pin the gvt version, bugs and unintended changes introduced in how `gvt restore`
+ behaves can affect your build
## Vendoring a different fork
@@ -130,6 +132,24 @@
`gvt update` will stay on your fork.
+## Overlapping dependencies
+
+Since in the current manifest, inherited from gb-vendor, a dependency includes
+all subpackages, it is possible to get conflicts in the form of overlapping dependencies.
+For example, if we had one version of example.com/a and a different one of example.com/a/b.
+
+To solve this cleanly, ovelaps are disallowed. Subpackages of existing dependencies are
+silently treated as existing dependencies. Parents of existing dependencies are treated
+as missing and cause the subpackages to be deleted when they are fetched.
+
+This rule might be arbitrary, but it is required to have determinism in situations like
+recursive fetches, where the orders and priorities of fetches are undefined.
+If it causes incompatibilities, they were for the human to fix anyway.
+
+(There's an exception, if you want to nitpick, and it's that if you fetch a package at a revision,
+and its parent ends up being fetched by the recursive resolution, the parent will be fetched at
+the revision, not at master, because that's probably what you meant.)
+
## Troubleshooting
### `fatal: Not a git repository [...]`
diff --git a/fetch.go b/fetch.go
index f78a6cf..89547a8 100644
--- a/fetch.go
+++ b/fetch.go
@@ -42,6 +42,9 @@
Short: "fetch a remote dependency",
Long: `fetch vendors an upstream import path.
+Recursive dependencies are fetched at their master/tip/HEAD revision, unless they
+or their parent package is already present.
+
The import path may include a url scheme. This may be useful when fetching dependencies
from private repositories that cannot be probed.