Labels
A Perforce label is a set of tagged file revisions.
For example, you might want to tag the file revisions that compose a
particular release with the label release2.0.1
. In
general, you can use labels to:
-
Keep track of all the file revisions contained in a particular release of software.
-
Distribute a particular set of file revisions to other users (for example, a standard configuration).
-
Populate a clean build workspace.
-
Specify a set of file revisions to be branched for development purposes.
-
Sync the revisions as a group to a client workspace.
Labels and changelist numbers both refer to particular sets of file revisions but differ as follows:
-
A label can refer to any set of file revisions. A changelist number refers to the contents of all the files in the depot at the time the changelist was submitted. If you need to refer to a group of file revisions from different points in time, use a label. If there is a point in time at which the files are consistent for your purposes, use a changelist number.
-
You can change the contents of a label. You cannot change the contents of a submitted changelist.
-
You can assign your own names to labels. Changelist numbers are assigned by Perforce.
Changelists are suitable for many applications that traditionally use labels. Unlike labels, changelists represent the state of a set of files at a specific time. Before you assume that a label is required, consider whether simply referring to a changelist number might fulfill your requirements.
Tagging files with a label
To tag a set of file revisions (in addition to any revisions that have already been tagged), use p4 tag, specifying a label name and the desired file revisions.
For example, to tag the head revisions of files that reside under
//depot/release/jam/2.1/src/
with the label
jam-2.1.0
, issue the following command:
p4 tag -l jam-2.1.0 //depot/release/jam/2.1/src/...
To tag revisions other than the head revision, specify a changelist number in the file pattern:
p4 tag -l jam-2.1.0 //depot/release/jam/2.1/src/...@1234
Only one revision of a given file can be tagged with a given label, but the same file revision can be tagged by multiple labels.
Untagging files
You can untag revisions with:
p4 tag -d -l labelname
filepattern
This command removes the association between the specified label and the
file revisions tagged by it. For example, if you have tagged all revisions
under //depot/release/jam/2.1/src/...
with
jam-2.1.0
, you can untag only the header files with:
p4 tag -d -l jam-2.1.0 //depot/release/jam/2.1/src/*.h
Previewing tagging results
You can preview the results of p4 tag with p4 tag -n. This command lists the revisions that would be tagged, untagged, or retagged without actually performing the operation.
Listing files tagged by a label
To list the revisions tagged with labelname
,
use p4 files, specifying the label name as follows:
p4 files @labelname
All revisions tagged with labelname
are listed,
with their file type, change action, and changelist number. (This command
is equivalent to p4 files
//...@labelname
).
Listing labels that have been applied to files
To list all labels that have been applied to files, use the command:
p4 labels filepattern
Using a label to specify file revisions
You can use a label name anywhere you can refer to files by revision
(#1
, #head
), changelist number
(@7381
), or date (@2011/07/01
).
If you omit file arguments when you issue the p4 sync
@labelname
command, all files in the
client workspace view that are tagged by the label are synced to the
revision specified in the label. All files in the workspace that do not
have revisions tagged by the label are deleted from the workspace. Open
files or files not under Perforce control are unaffected. This command is
equivalent to p4 sync
//...@labelname
.
If you specify file arguments when you issue the p4
sync command (p4 sync
files
@labelname
),
files that are in your workspace and tagged by the label are synced to the
tagged revision.
Example 34. Retrieving files tagged by a label into a client workspace
To retrieve the files tagged by Earl's jam-2.1.0
label into his client workspace, Bruno issues the following command:
p4 sync @ jam-2.1.0
and sees:
//depot/dev/main/jam/Build.com#5 - updating c:\bruno_ws\dev\main\jam\Build.com //depot/dev/main/jam/command.c#5 - updating c:\bruno_ws\dev\main\jam\command.c //depot/dev/main/jam/command.h#3 - added as c:\bruno_ws\dev\main\jam\command.h //depot/dev/main/jam/compile.c#12 - updating c:\bruno_ws\dev\main\jam\compile.c //depot/dev/main/jam/compile.h#2 - updating c:\bruno_ws\dev\main\jam\compile.h <etc>
Deleting labels
To delete a label, use the following command:
p4 label -d labelname
Deleting a label has no effect on the tagged file revisions (though, of course, the revisions are no longer tagged).
Creating a label for future use
To create a label without tagging any file revisions, issue the
p4 label labelname
command.
This command displays a form in which you describe and specify the label.
After you have created a label, you can use p4 tag or
p4 labelsync to apply the label to file revisions.
Label names cannot be the same as client workspace, branch, or depot names.
For example, to create jam-2.1.0,
issue the following
command:
p4 label jam-2.1.0
The following form is displayed:
Label: jam-2.1.0 Update: 2011/03/07 13:07:39 Access: 2011/03/07 13:13:35 Owner: earl Description: Created by earl. Options: unlocked noautoreload View: //depot/...
Enter a description for the label and save the form. (You do not need to
change the View:
field.)
After you create the label, you are able to use the p4 tag and p4 labelsync commands to apply the label to file revisions.
Restricting files that can be tagged
The View:
field in the p4 label form
limits the files that can be tagged with a label. The default label view
includes the entire depot (//depot/...
). To prevent
yourself from inadvertently tagging every file in your depot, set the
label's View:
field to the files and directories to be
taggable, using depot syntax.
Example 35. Using a label view to control which files can be tagged
Earl wants to tag the revisions of source code in the release 2.1
branch, which he knows can be successfully compiled. He types
p4 label jam-2.1.0 and uses the label's
View:
field to restrict the scope of the label as
follows:
Label: jam-2.1.0 Update: 2011/03/07 13:07:39 Access: 2011/03/07 13:13:35 Owner: earl Description: Created by earl. Options: unlocked noautoreload View: //depot/release/jam/2.1/src/...
This label can tag only files in the release 2.1 source code directory.
Using static labels to archive workspace configurations
You can use static labels to archive the state of your client workspace (meaning the currently synced file revisions) by issuing the p4 labelsync command. The label you specify must have the same view as your client workspace.
For example, to record the configuration of your current client workspace
using the existing ws_config
label, use the following
command:
p4 labelsync -l ws_config
All file revisions that are synced to your current workspace and visible
through both the client workspace view and the label view (if any) are
tagged with the ws_config
label. Files that were
previously tagged with ws_config
, then subsequently
removed from your workspace (p4 sync #none), are
untagged.
To sync the files tagged by the ws_config
label
(thereby recreating the workspace configuration), issue the following
command:
p4 sync @ws_config
Note
You can control how static labels are stored using the
autoreload
or noautoreload
option:
-
autoreload
stores the labels in the unload depot. This storage option can improve performance on sites that make heavy use of labels. -
noautoreload
stores the labels in thedb.label
table.
These storage options do not affect automatic labels.
Using automatic labels as aliases for changelists or other revisions
You can use automatic labels to specify files at certain revisions without having to issue the p4 labelsync command.
To create an automatic label, fill in the Revision:
field of the p4 label form with a revision specifier.
When you sync a workspace to an automatic label, the contents of the
Revision:
field are applied to every file in the
View:
field.
Example 36. Using an automatic label as an alias for a changelist number.
Earl is running a nightly build process, and has successfully built a
product as of changelist 1234. Rather than having to remember the
specific changelist for every night's build, he types p4 label
nightly20111201 and uses the label's
Revision:
field to automatically tag all files as of
changelist 1234 with the nightly20111201
label:
Label: nightly20111201 Owner: earl Description: Nightly build process. Options: unlocked noautoreload View: //depot/... Revision: @1234
The advantage to this approach is that it is highly amenable to scripting, takes up very little space in the label table, and provides a way to easily refer to a nightly build without remembering which changelist number was associated with the night's build process.
Example 37. Referring specifically to the set of files submitted in a single changelist.
A bug was fixed by means of changelist 1238, and requires a patch label
that refers to only those files associated with the fix. Earl types
p4 label patch20111201 and uses the label's
Revision:
field to automatically tag only those files
submitted in changelist 1238 with the patch20111201
label:
Label: patch20111201 Owner: earl Description: Patch to 2011/12/01 nightly build. Options: unlocked noautoreload View: //depot/... Revision: @1238,1238
This automatic label refers only to those files submitted in changelist 1238.
Example 38. Referring to the first revision of every file over multiple changelists.
You can use revision specifiers other than changelist specifiers; in this example, Earl is referring to the first revision (#1) of every file in a branch. Depending on how the branch was populated, these files could have been created through multiple changelists over a long period of time:
Label: first2.2 Owner: earl Description: The first revision in the 2.2 branch Options: unlocked noautoreload View: //depot/release/jam/2.2/src/... Revision: "#1"
Because Perforce forms use the #
character as a
comment indicator, Earl has placed quotation marks around the
#
to ensure that it is parsed as a revision
specifier.
Preventing inadvertent tagging and untagging of files
To tag the files that are in your client workspace and label view (if set)
and untag all other files, issue the p4 labelsync
command with no arguments. To prevent the inadvertent tagging and
untagging of files, issue the p4 label
labelname
command and lock the label
by setting the Options:
field of the label form to
locked
. To prevent other users from unlocking the
label, set the Owner:
field. For details about
Perforce privileges, refer to the
Perforce
Server Administrator's Guide: Fundamentals.
Using labels on edge servers
You can user Perforce Server in a distributed, multi-site environment using central and edge servers. With a distributed Perforce service architecture, users typically connect to an edge server and execute commands just as they would with a classic Perforce service. For more information, refer to Perforce Server Administrator's Guide: Multi-site Deployment.
When connected to an edge server, the commands p4
label, p4 labelsync, and p4
tag operate on labels local to the edge server. Global labels
can be manipulated by using the -g
option. For
details, refer to the
P4
Command Reference.
Note
Using the -g
option with p4
labelsync only works with a global client. To manipulate a
global label, use p4 tag.