About streams

Helix server streams provide an approach to managing bodies of related files, such as codelines. Streams associate these files with rules that define how users can work with those files, including how users can move changes between them. Streams are defined hierarchically using the mainline model, and Helix server generates the views for workspaces that are associated with a stream. Among the advantages of this approach are:

  • Change is propagated in a controlled way through the hierarchy that you define.
  • You can compose the contents of a stream by defining its view, thereby providing all users who work in the stream with a consistent view of its contents.
  • Some best practices, such as merge down from parent before allowing copy up to parent, are enforced automatically.

If you are new to working with the Perforce version control system, you have not yet established a robust codeline policy and associated workflow, or you do not have the staff to customize Helix Core server by writing trigger code, using streams is a good option for you. Streams come with reduced administration duties for codeline policy and workspace management, and the Stream Graph provides a graphical representation of the relationship between parent and child streams and whether a merge is required.

Note

This chapter focuses on working with streams in P4V. For additional stream-related information, see:

Stream depots

Streams are stored in a stream depot, which is displayed in P4V like this: . You cannot add a stream to a "classic" Helix server depot. You can add streams depots through P4Admin or the P4 command-line client.

For more information, see Setting up streams.

Stream types

Perforce codifies the soft-to-firm model of stability in its standard stream types:

  • Stream icon, main node Mainline: A stream with no parent. Expects merging down from more stable child streams. Expects copying up from less stable child streams. Used as the stable trunk of a stream system.
  • Stream icon, release node Release: A stream that is more stable than its parent. Expects merging down from more stable child streams. Does not expect copying up from its parent stream. Useful for ongoing stabilization, bug fixing, and release maintenance.
  • Stream icon, dev node Development: A stream that is less stable than its parent. Expects merging down from its parent stream. Expects copying up from its less stable child streams. Does not expect to have more stable child streams. Useful for long-term projects and major new features.

There are two additional stream types with special characteristics:

  • Stream icon, task node Task streams are lightweight, short-term branches that you can use for work that affects a small portion of a full project branch. Task streams enable you to work privately, switch contexts quickly, and reduce the amount of metadata managed by Helix server.

    For more information, see Working with task streams.

  • Stream icon, virtual node Virtual streams provide users with the ability to restrict the workspace view of a real stream. Virtual streams act as a filter. They are useful when you want to:

    • Submit changes directly to a stream but do not want to sync all of the files in the stream view to your workspace.
    • Develop against the same stream but switch imported libraries, such as when you develop across multiple platforms.
    • See Working with virtual streams

The mainline model

The mainline model of software configuration management defines a stream hierarchyClosedThe set of parent-to-child relationships between streams in a stream depot. based on the stability of the contents of the stream, from softest (unstable or experimental) to firmest (high quality, releasable). Typically, the mainline is required to be fairly stable (for example, code must build), development codelines less stable, and release codelines the most stable.

The mainline stream is the parent of the release and development streams.

Propagating change between streams

The principle of change propagation is merge down, copy up. The goal is to keep less stable streams up to date with their more stable parent or child, so that when change is propagated from a less stable stream to a more stable one, no work is overwritten. This approach keeps the resolve operation as simple as possible. Perforce's merge/copy and resolve features allow you to propagate change between streams.

If you want to merge or copy between peer streams (for example, to merge another developer's changes to your development stream), you must first reparent your stream. To reparent a stream, edit the stream specification and change the Parent field. This approach is a key benefit of streams: the ability to configure the flow of change.

For more information, see Merging down and copying up between streams.

The stream specification and inheritance

A stream specification, also called the stream spec, has a set of field names.

The Advanced tab of the Stream: Edit dialog shows the stream view. The stream view consists of the Paths, Remapped, and Ignored fields.

The stream view controls the files and paths that compose a stream and defines how those files are propagated.

 

 

Prior to P4V 2020.3, a stream always inherited its view from its parent stream.

Starting with P4V 2020.3, this inheritance is associated with the stream spec's ParentView field having the value of inherit.

Note

This assumes that P4V is running against the 2020.2 version or later of Helix Server.

You might want to set up release streams to not inherit from the parent stream so changes to the parent stream do not affect the release streams. To provide this kind of flexibility, release, development, and mainline streams can have the ParentView field set to noinherit when the stream is created or at any time thereafter.

Note

When the stream is created, the Parent view field of the Stream: New dialog is affected by the value of the dm.stream.parentview configurable.

0

(default)

  • all streams created with Parent view: inherit
1
  • mainline, development, and release streams created with Parent view: noinherit
  • task and virtual streams created with Parent view: inherit
2
  • release streams created with Parent view: noinherit
  • other stream types created with Parent view: inherit

For any time after the stream is created, see Convert the Parent View of a stream.

A mainline stream has no parent, so inherit versus noinherit is relevant only if the mainline stream is converted to another type of stream.

In some cases, a child stream that does not inherit its view from its parent might benefit from changes in the parent's view. Such a child stream can integrate the changes. See Stream spec integration.

Stream views and branching

Stream views:

  • define the files that you can work on in your workspace and what you can do with them
  • restrict the files that a child stream inherits from its parent, if the stream is configured to inherit from its parent. For example, let's say you have a mainline stream that includes the following directories of files:
//Acme/Main
 --apps
 --api
 --resources
 --docs

You want to branch to a development stream. You only need to work in the apps folder, but you need resources from the api and resources folders. You can create a development stream as a child of Main that includes the files in the apps folder, excludes the files in the docs folder, and imports the contents of the api and resources folders so you can use them but cannot edit and submit any changes to the depot.

You assign a stream view to the child stream that enacts these rules. Helix server generates the workspaces from the stream view. The stream view enforces the submit and integration rules. Any children branched from this new stream inherit those rules, if those streams inherit from their parent.

You can assign a more restrictive stream view to subsequent children, but you cannot assign a less restrictive one. Child streams cannot branch more than their parent streams are willing to share.

For more information, see Stream view configuration.

Stream hierarchy in the Stream Graph

The stream graph displays the parent-child relationships that control the propagation of change between codelines. All streams are children of the mainline. All children can be parents of yet more children. This enables specific development and release codelines while ensuring that changes are propagated properly between codelines. The stream graph represents those directions of change propagation using arrow connectors.

The Stream graph displays soft streams below the mainline and firm streams above it. A typical software development structure consists of a stable mainline (main1), with less stable or "softer" development streams below it (dev1, dev2, dev11, dev22), and the most stable or "firmer" release streams, such as rel1, above:

The mainline stream is the parent of rel1, dev1, and dev2.

  • The blue band on rel1, dev2, and dev11 means those streams are noinherit and therefore do not inherit their view from their respective parent streams.
  • The grey band on dev1 and dev22 mean those streams do inherit their view from their respective parent streams.
  • The mainline stream has no parent, so its band color has no meaning unless the mainline stream is converted to a different stream type.
Note

Suppose that in preparation for a future release, the mainline gets a new set of library files. A noinherit release stream can continue to build as usual, independent of changes to the parent stream.

For more information, see Using the Stream Graph.

Terminology differences between command line client and P4V

P4V Term Command Line Term Description
Stream Root Stream The top level under the depot where files in the stream are stored.
Stream Name A descriptive name that you assign and which is displayed to label the streams in the Stream Graph.