Operation move disabled on this server

Problem

I tried to move or rename a file using the p4 move command. The p4 server responded with this error message:

Operation 'move' disabled on this server

Solution

Since the move operation has been disabled by admins on this server, we need to use two operations to simulate a move:

$ p4 integrate old.txt new.txt
$ p4 delete old.txt
Advertisements

How to create and use multiple P4 workspaces

It is sometimes useful to have more than one workspace in Perforce. I have found that this gives me more freedom to work on multiple bugs or features at the same time for the same branch.

  • To create a new workspace, we create a new P4 client. To do this, you need to provide a new client name:
$ p4 client my_client_2

This opens the configuration of a new client named my_client_2 in your favorite editor. Here you can provide the root directory for this client and mappings as your normally would. Save and exit the editor.

  • Create the root directory path you specified in the new client config:
$ mkdir -p /home/joe/p4_workspaces/my_workspace_2
  • You need to set this client name as the current client to inform P4 that its commands apply to this client. You do this by setting the P4CLIENT environment variable:
$ export P4CLIENT=my_client_2

Now you can run commands such as sync and they should work in this new workspace.

  • Switching between two or more P4 workspaces gets onerous if you need to set the above environment variable every time. One solution to overcome this is to create a P4 config file in the root directory of every workspace with the environment variables you want applied for that workspace.

Create a file named .p4config in the root directory of the new workspace, /home/joe/p4_workspaces/my_workspace_2 in this example, with the environment variables and their values you want to set:

P4CLIENT=my_client_2

Now when you are at any child directory of the new workspace, P4 will know that it has to use the above client config for its commands. You need to place such config files at the roots of all your workspaces to have a pleasant working experience when moving between workspaces.

p4 changelist cheatsheet

A changelist in Perforce is identified by an unique number and contains a list of modified files and a description (among other things). When you inform Perforce that you have created a file, deleted a file or modified a file, such changed files are by default added to a default changelist that has no changelist number.

  • To create a changelist by grabbing the files in the current default changelist:
$ p4 change

This opens your default editor to a temporary text file showing an empty description and the list of files from the default changelist. You have to use the editor and provide a description. If you do not want some of the files to be in the changelist you are creating, you can delete those lines in the editor. Once you save the file, the changelist is created with a unique number identifying it. After this command ends, p4 prints out its changelist number, say 123456.

Note that this command moves all the files in the default changelist to the new changelist you created. That is, unless you removed a few of them while creating the changelist.

  • To view all the details of an existing changelist 123456:
$ p4 change -o 123456
  • To add a new file to an existing changelist 123456:
$ p4 reopen -c 123456 joe/foobar.cpp

Description

  • To view the description of a changelist:
$ p4 describe 123456
  • To edit the description of an existing changelist 123456:
$ p4 change -u 123456

Shelve

  • To shelve the files from a changelist 123456:
$ p4 shelve -c 123456
  • To list the files in a shelved changelist 123456:
$ p4 describe -s -S 123456
  • To update a shelved changelist 123456 with newly updated files from disk:
$ p4 shelve -f -c 123456
  • To update a shelved file with a particular changed file from disk:
$ p4 shelve -f -c 123456 foobar.cpp
  • To delete the shelved files of a changelist:
$ p4 shelve -d -c 123456
  • To delete a few files from a shelved changelist 123456:
$ p4 shelve -d -c 123456 joe/foo.cpp joe/foo.h

Unshelve

  • To unshelve the files that were shelved from a changelist 123456 back to the same changelist:
$ p4 unshelve -s 123456 -c 123456
  • To unshelve the files that were shelved from a changelist 123456 back to a different changelist 789012:
$ p4 unshelve -s 123456 -c 789012
  • To unshelve the files that were shelved from a changelist 123456 back to the default changelist:
$ p4 unshelve -s 123456

Submit

  • To create a changelist from the default changelist and submit it to your branch in the depot:
$ p4 submit
  • To submit a changelist 123456 to your branch in the depot:
$ p4 submit -c 123456

Perforce cheatsheet

Perforce is a version control system. p4 is its primary commandline tool. p4g is its GUI tool. The reference for all this is the p4 command reference.

  • To get help on any p4 command named foobar:
$ p4 help foobar
  • To list all depots:
$ p4 depots
  • To view info about your workspace:
$ p4 info
  • To list environment variables that P4 understands and their values:
$ p4 set
  • To view all clients of all users:
$ p4 clients
  • To view all clients of a particular user or yours:
$ p4 clients -u joe
  • To create or view or change the configuration of your current client or default client:
$ p4 client

You typically use this command to add new branches or paths from the depot to your directory view.

  • To create or view or change the configuration of a new client or existing client with a name:
$ p4 client my_client_2
  • To delete a client from the server:
$ p4 client -d my_client_2
  • To sync all the latest branches and paths of your client from the depot:
$ p4 sync
  • To list (and not actually sync) the unsynced files between workspace and depot:
$ p4 sync -n
  • To sync only a specific directory or file use its depot path:
$ p4 sync //dev/foo/some.cpp
  • To sync a specific changelist to your working directory:
$ p4 sync ...@123456

Changelist

p4 commands related to changelist are collected here.

Log

  • To view all the changelists from the server:
$ p4 changes

This will list all changelists of everybody, so it is pretty much useless. You want to filter it down using other criteria, like shown below.

  • To view all the changelists of a particular depot:
$ p4 changes //somedepot/
  • To view all the changelists of a particular branch in a depot:
$ p4 changes //somedepot/somebranch/
  • To view the most recent 5 changelists added to the server:
$ p4 changes -m5
  • To view the changelists added by a particular user:
$ p4 changes -u joe
  • By default, a single truncated line of information is shown for each changelist. To view the complete description of every changelist:
$ p4 changes -l
  • To list changelists, with each description limited to 250 characters:
$ p4 changes -L
  • To view the changelists of a particular status, say pending:
$ p4 changes -s pending
  • To view the changelist checked out in the current workspace:
$ p4 changes -m1 ...#have
  • To add a new file, either cause you want to create a new file or add an existing file to be tracked by version control:
$ p4 add foobar.txt

If it is a new file, then you will need to create the file yourself after this command. This command just indicates to p4 to start tracking such a file.

  • To delete a file:
$ p4 delete foobar.txt
  • To delete a file and record that to a particular changelist:
$ p4 delete -c 123456 foobar.txt
  • To open a file for editing:
$ p4 edit foobar.txt
  • To revert a specific file or all files in directory with versions from depot:
$ p4 revert foobar.txt
$ p4 revert ...
$ p4 revert src/...

Note that you will lose changed made your files on disk with this operation. This operation can be used after shelving a changelist to revert the files back to their original state.

  • To revert back only unchanged (but opened) files:
$ p4 revert -a
  • To view the currently changed files as seen by p4:
$ p4 opened
$ p4 opened ...
$ p4 opened src/...

File information

  • To view the changelist of a file:
$ p4 changes //somedepot/somepath/foobar.txt
  • To view the log of a file:
$ p4 filelog //somedepot/somepath/foobar.txt
  • To see a beautiful timelapse view of file history, it is better to view it in p4g by right-clicking the file and choosing Timelapse view. The color of the lines show their age and the slider can be used to move through history.

  • To print all the lines of a file:

$ p4 print //somedepot/somepath/foobar.txt
  • To print the revision numbers of every line of a file:
$ p4 annotate //somedepot/somepath/foobar.txt
  • To print changelists for every line of a file:
$ p4 annotate -c //somedepot/somepath/foobar.txt
  • To print the user who last changed every line of a file:
$ p4 annotate -u //somedepot/somepath/foobar.txt

Diff

  • To view the diff of all currently open files:
$ p4 diff

This prints a text diff at the shell by default. If you set the P4DIFF environment variable to a GUI program, like Meld, it will use that to show the diffs.

  • By default, the diff is shown in P4’s own format. To display in the unified diff format that is understood by most tools:
$ p4 diff -du
  • To view the diff of opened files that are actually changed:
$ p4 diff -sa
  • To diff two files in the depot:
$ p4 diff2 //branch1/some.cpp //branch2/some.cpp

This prints a diff at the shell. Set the P4DIFF2 environment variable to a GUI diff program to view the diff using that.

Branch

To create a new branch from an old branch, there are typically 3 steps:

First, create the branch:

$ p4 integrate //foo/old_branch/... //foo/new_branch/...

Now the branch is created, but you cannot yet view the files in the new branch in your filesystem.

Second, change the client specification add the new branch files to your view and sync:

$ p4 client
$ p4 sync

Finally, submit the new branch to depot:

$ p4 submit //foo/new_branch/...

Merge

  • To merge, resolve automatically and finally only resolve merge conflicts manually:
$ p4 integrate //foo/from_branch/... //foo/my_branch/...
$ p4 resolve -a
$ p4 resolve
  • After an integrate, show what files cannot be resolved automatically:
$ p4 resolve -n
  • Integrate a specific changelist 123456 from one branch to another:
$ p4 integrate from_branch/...@=123456 to_branch/...
$ p4 resolve to_branch/...
$ p4 change

Perforce sync clobber writable error

Problem

I was trying to sync a Perforce client and got this error:

$ p4 sync
Can't clobber writable file: /home/joe/p4_workspace/foobar.txt

Solution

Perforce keeps its files read-only until they are opened for editing. I had for some reason made this file writeable and Perforce was complaining about that with this error message.

The error was fixed and the sync worked once I made the file read-only:

$ chmod -w /home/joe/p4_workspace/foobar.txt

Perforce sync write permission error

Problem

I tried to sync a Perforce client and got this error:

$ p4 sync
open for write: /home/joe/p4_workspace/foobar/tmp.30935.46: Permission denied

The strange thing is that there is no tmp.30935.46 in this repository!

Solution

Turns out that Perforce writes some temporary files to subdirectories during the sync operation. This error indicates that it is failing in this write because the directory does not have write permissions.

The error went away and the sync worked once I added write permissions to that directory:

$ chmod +w /home/joe/p4_workspace/foobar