Ref T13098. The lint part of this barely gets all the pieces cobbled together, but all the tests do actually run now, minus a handful of skipped tests. Major ideas here:
Lint, Unit and (soon) Build are becoming "Operations" where an "Overseer" manages a list of "Engines" that read configuration from a ".arc<operation>" file, operate on a working copy, may operate on a subset of files (possibly selected by examining recent changes in the working copy), produce some kind of result (test outcomes, lint messages, build artifacts) and then the results are sent to a list of one or more "Sinks" (console display, files, Harbormaster, patchers). All three workflows share a meaningful amount of code in terms of doing most of these things in roughly the same way.
A lot of Lint logic is currently based around passing paths around as strings, then calling a lot of $thing->getParentObject()->getInformationForPath($path_as_string). This tends to be pretty bulky and somewhat fragile. I'm moving toward passing an ArcanistWorkingCopyPath $path around instead, which has methods with a better defined scope like $path->getData(), $path->getMimeType(), $path->isBinary(), and so on. This requires us to build fewer objects to run tests.
arc lint itself won't run yet, and I don't plan to make it run for a bit (I have some of a patch, but it's not really there yet). Instead, I want to focus on getting coverage for existing flows (particularly alias) and then getting Windows support online now that it can have test coverage.
This change is less about any of what it actually does and more about powering through to make arc unit a useful tool for building other changes.