There are two methods of producing file diffs in Perforce,
either against local changes that have not been submitted yet, or between two trees (or
within a branch) in the depot. These are done with different commands, diff and diff2:
This generates a diff of the local changes to files in 	 the edit state. The -du and 	 -dc flags can be used to
create unified or 	 context diffs, respectively, or the P4DIFF
	 environment variable can be set to a local diff command to be 	 used instead.
It is a very good idea to use this command to 	 review your changes before submitting
them.
This creates a diff between arbitrary files in the 	 depot, or between files
specified in a branch spec. The diff 	 operation takes place on the server, so P4DIFF 	 variable has no effect, though the -du and 	 -dc flags do work. The
two forms of this 	 command are:
% p4 diff2 -b branchname
and
% p4 diff2 //depot/path1 //depot/path2
In all cases the diff will be written to the standard output. Unfortunately, Perforce produces a diff format that is slightly incompatible
with the traditional Unix diff and patch tools. Using the P4DIFF
variable to point to the real diff(1) tool can help
this, but only for the p4 diff command. The output of diff2 command must be post-processed to be useful (the -u flag of diff2 will produce unified
diffs that are somewhat compatible, but it does not include files that have been added or
deleted). There is a post-processing script at: http://people.freebsd.org/~scottl/awkdiff.