p4 - a wrapper for the Perforce p4 command.

		Rick Richardson <rickr@mn.rr.com>
			

INTRODUCTION
------------
This is a wrapper for the Perforce "p4" command.  It extends "p4" by
adding CVS-style commands like import, commit, update, and annotate to
the regular set of Perforce commands.  In addition, the Perforce "p4
submit" command was missing fundamental features, so this wrapper
augments that command as well.

All regular Perforce commands are available thru this wrapper, so
there is no reason not to wrap the p4 command as no functionality will
be lost.

As of 06/30/2001, this is a work in progress.  Some of the lesser used
CVS options are being added as time permits, and of course there will
be bugs that won't show up until more people use the wrapper.

INSTALLATION
------------

Assuming that Perforce's "p4" command is in /usr/bin, and your usual
search $PATH puts /usr/local/bin before /usr/bin, then just type "make
install" (as root, if necessary).  Another way is to move your p4
binary to "p4.orig", then edit the script and change the P4 variabe to
point to p4.orig, then copy the script to any convenient directory in
your $PATH.

EXTENDED COMMANDS
-----------------
Most extended subcommands take file and/or directory arguments,
recursing on the directories.  If no arguments are supplied to such a
command, it will recurse on the current directory (inclusive) by
default.  This is the surprise-free behavior CVS users are used to.

So far, the extended list of commands is:

p4 annotate file|dir ...
	Generate an annotated listing of each "file", showing who to
	blame for each changed each line.  The underlying engine for
	this command is Bob Sidebotham's p4pr.perl script.

p4 checkout dir ...
	Currently, checks out all source code under the listed
	directories.

p4 commit [options] [file|dir] ...
	A lot like the CVS commit command.  Submit files which have been
	changed, issuing "p4 edit" commands as needed.  Best used when you
	like to operate with the "allwrite" option on your workspace.
	But certainly a savior if you made changes to files and manually
	overrode the readonly file permission (who hasn't?).

	Options:

	-R		Process directories recursively (default).
	-l		Local directory only (not recursive).
	-f		Force the file to be committed; disables recursion.
	-F msgfile	Read the log message from msgfile.
	-m msg		The -m msg option is use to specify the log message,
			in which case the operation is non-interactive.

p4 import
	Add all files in current directory and below to the depot.
	CVS style repository vendortag releasetag options are not
	currently handled.

p4 log [file|dir] ...
	Produce a long listing of the file(s) revision history.

p4 rename from to
	Rename the file "from" to name "to".
	N.B. it is currently NOT SAFE to do this:
		p4 rename xxx yyy
		p4 rename yyy xxx
	If you decide you want to rename something back to its original
	name, then you must rename it three times:
		p4 rename xxx yyy
		p4 rename yyy zzz
		p4 rename zzz xxx
	This appears to be a problem within Perforce and has been mentioned
	on the Perforce mailing lists, but Perforce has not offered a
	solution as far as I can tell.

p4 stat [file|dir] ...
	Short and sweet status summary.  Stuff you need to get, and stuff
	you need to commit.

p4 submit [p4options] [-m logmsg] [p4filespec] ...
	Augmented version of p4 submit that allows more than one P4-style
	file specification.  It also allows the changelog description to be
	specified with -m logmsg.

	The limitation of one p4filespec with the Perforce version of this
	command is a glaring weakness in Perforce that they have not
	addressed despite repeated requests from users going back to 1999.
	For this reason, the augmented version of p4 submit is supplied,
	even though I prefer to use the p4 commit variation.

p4 update [options] [file|dir] ...
	Get the latest versions of files from the repository (sync).
	Then resolve any conflicts.

	Options:

	-C		Overwrite locally modified files with clean depot
			copies.

	-r rev		Get the revision specified by "rev", which may
			be a revision number, a label, or any of the
			Perforce style "#"/"@" revision specifiers.
			Unlike CVS, this option is NOT STICKY.

	-D date		Get the version which was current as of date.
			Date is not restricted to the weak Perforce syntax;
			it can be in any of the allowable date(1) formats.
			Unlike CVS, this option is NOT STICKY.

p4 ws <wsname> [server:port [user [passwd]]]
	Create a new workspace named "<wsname>" in the current directory.
	The default server:port is perforce:1666, but may be overridden.

	You do not need to set any environment variables in order to use
	this command.  It is recommended, however, that you eventually
	set P4CONFIG=.p4config in your .profile.  This is so that the
	unadorned Perforce p4 command will work properly in case you stop
	using this wrapper.

QUICKER START
-------------

Make a workspace to hold (potentially all of) the company wide source tree...

	mkdir work
	cd work
	p4 ws my-work-tree

Populate the tree with everything that other people committed (optional)...

	# current dir is now, say, $HOME/work
	p4 update

Add your project...

	mkdir myjunk
	cd myjunk
	# current dir is now, say, $HOME/work/myjunk
	echo foo > xxx.c
	echo bar > yyy.c
	p4 add *.c
	p4 commit

Or add it this way...
	mkdir myjunk
	cd myjunk
	# current dir is now, say, $HOME/work/myjunk
	echo foo > xxx.c
	echo bar > yyy.c
	p4 import

Make some changes...
	echo foobar > xxx.c
	echo barfoo > yyy.c
	p4 commit