Optimize Perforce revision parsing and file existence checks.

Review Request #8939 — Created May 11, 2017 and submitted — Latest diff uploaded

Information

Review Board
release-2.5.x
aba5821...

Reviewers

Perforce was doing a bit too much work when checking for the existence
of certain files and when parsing files at revision 1. For file
existence checking, we were using the default behavior of fetching the
complete contents of the file and using that to determine existence.
That wasn't the most optimal, especially for very large files. We now
use p4 fstat to look up the file instead.

For revision parsing, we had to work around some behavior in older
versions of Perforce where new files had a revision of 1 in the diff. To
determine whether the file existed in the repository, we ran p4 files
and checked the result. However, we weren't limiting the number of
results, and so files with a lot of history were slow. Also, for newer
versions of Perforce, revisions for new files are 0.

Instead of running p4 files, we just use the new file existence
checks. This has the advantage of using/populating the existence cache,
helping reduce the number of remote calls even further. We also now only
run these tests if the revision is 1 (and we assume 0 means it's a new
file).

Unit tests pass.

Tested these with a real diff against a real server consisting of new
files at revision 0 and with files with large files containing lots of
history. Saw the results I expected, and reduced times needed for these
functions.