Initially I was going to call this "Things I Don't Like About Perforce" but I decided that it would be a bit negative. Instead it will just be a bunch of observations I have had.

I started work this week at a new company, well new to me at least. They use Perforce as their revision control mechanism. I have looked at Perforce in the past when doing feature comparisons but I haven't ever really used it.

It is different. I am somewhat of a CVS expert due to vast experience using and abusing it in the last five years. I also am quite accomplished with RCS and have even written a revision control system based on RCS and XPath myself. I also have a half-assed working knowledge of bitkeeper due to my kernel work. Additionally I have done a decent amount of research into various revision control systems and the philosophy and technology behind them.

In spite of this I am having a bit of a hard time figuring out some of the design decisions in Perforce. It seems to be a relatively complete tool and quite functional on the commandline. However, using the graphical interface under Windows in conjunction with a normal commandline interface pretty much has been an exercise in futility.

It does have some tremendously irritating features. By default when you check out or synchronize your checked out copy of code it doesn't preserve the last modified date in your local copy. It instead used the current date. This sucks if you are trying to figure out what someone else was last working on in a particular project. There is a flag to change this behavior but it should be the default (as it is in most revision control systems.) Having to specify a bunch of environment variables to connect to a repository do anything useful sucks also. One environment variable should be more than enough.

There are some really nice features in it though. You can either mirror the repository's directory structure or create your own view of it which may or may not be identical. It easily allows you to exclude particular subdirectories of a project you want to check out. It doesn't put its own control directory in every directory you check out, unlike CVS.

That's all I can come up with off the top of my head but I figure I will add to this as I discover new irritations.

I've discovered something else that definitely annoys me. In perforce you define Views into the repository that map to somewhere on your local filesystem. Unfortunately there's no way to comment your various views it appears. So if you have a really large repository, and you happen to need lots of little pieces of the system your View becomes very unweildy and difficult to keep track of. Additionally, many people seem to enjoy coming up with their own local directory structures that don't map evenly to the repository's directory structure. This becomes a serious pain in the ass for building or deploying code. You have to find their client specification and get the person's view. Then check the code out based on that view (which may end up in a directory structure that bears no relationship to your normal environment.)