Let me explain the full situation below, I'd love to know if I'm trying to do something beyond the pale, or if there is a better way to achieve what we want from the streams.
We've got a large Unity project stored in Perforce. The project is designed to be built into a number of different products that would each consist of a subset of the master project's features. There are a bunch of core shared features, and then a set of optional features for the various products, something like:
Assets + Core + Features + Flowers + Trees + Vegetables + Caterpillars
The mainline stream contains the super set of all of the features, but when working on a particular product child stream we'd like to exclude anything not used in that product. This is partly to keep the size down (models, textures, animation and audio are large and slow iteration) and partly to enforce separation of dependencies between features. So the stream views are set up something like:
stream name: Product_Wilderness Paths: share ... exclude /Assets/Features/... share /Assets/Features/Flowers/... share /Assets/Features/Trees/...
i.e. For a given product we: include everything, exclude all of the optional features, then re-include just the optional features we want.
The problem came when something was checked in to Core, that really should have been part of Features/Caterpillars. The developer in the Caterpillar stream checked in a move/delete from Assets/Core/Caterpillar.cs -> Assets/Features/Caterpillars/Caterpillar.cs This change copied up to mainline fine, and it merges fine into any child that includes both Core and Features/Caterpillars but when trying to merge down in to the Product_Wilderness stream (with no Caterpillars) the add/delete always gets ignored leaving Caterpillar.cs in Core.
I'd expect that from the Wilderness stream's point of view the delete part of the add/delete pair would still merge, because from the point of view of that stream that is exactly what has happened. Caterpillar.cs should disappear.
From fiddling around if we switch to merging use filespecs and specify either -Di or -1 in the advanced options then the delete half of the merge will come through. But it is annoying in that there is no indication that the merge has failed, and to fix it you have to drop out of the nice stream workflow.
Am I just asking too much of Perforce?
The other way we considered going was to make the product streams full copies of mainline, but then use virtual streams with limited views for anyone working in them. We rejected this because it makes it a bit harder to create dev streams as children of the product streams, and requires anyone merging from mainline to remember to switch to a workspace that has the full product stream synced.