diff --git a/scripts/arcanist.php b/scripts/arcanist.php
--- a/scripts/arcanist.php
+++ b/scripts/arcanist.php
@@ -195,8 +195,8 @@
   if ($need_working_copy || $want_working_copy) {
     if ($need_working_copy && !$working_copy->getVCSType()) {
       throw new ArcanistUsageException(
-        "This command must be run in a Git, Mercurial or Subversion working ".
-        "copy.");
+        'This command must be run in a Git, Mercurial or Subversion working '.
+        'copy.');
     }
     $configuration_manager->setWorkingCopyIdentity($working_copy);
   }
@@ -352,7 +352,7 @@
     echo phutil_console_format(
       "**Exception**\n%s\n%s\n",
       $ex->getMessage(),
-      "(Run with --trace for a full exception trace.)");
+      '(Run with --trace for a full exception trace.)');
   }
 
   exit(1);
diff --git a/scripts/hgdaemon/hgdaemon_client.php b/scripts/hgdaemon/hgdaemon_client.php
--- a/scripts/hgdaemon/hgdaemon_client.php
+++ b/scripts/hgdaemon/hgdaemon_client.php
@@ -22,7 +22,7 @@
 
 $repo = $args->getArg('repository');
 if (count($repo) !== 1) {
-  throw new Exception("Specify exactly one working copy!");
+  throw new Exception('Specify exactly one working copy!');
 }
 $repo = head($repo);
 
diff --git a/scripts/hgdaemon/hgdaemon_server.php b/scripts/hgdaemon/hgdaemon_server.php
--- a/scripts/hgdaemon/hgdaemon_server.php
+++ b/scripts/hgdaemon/hgdaemon_server.php
@@ -40,7 +40,7 @@
 
 $repo = $args->getArg('repository');
 if (count($repo) !== 1) {
-  throw new Exception("Specify exactly one working copy!");
+  throw new Exception('Specify exactly one working copy!');
 }
 $repo = head($repo);
 
diff --git a/scripts/lib/PhutilLibraryMapBuilder.php b/scripts/lib/PhutilLibraryMapBuilder.php
--- a/scripts/lib/PhutilLibraryMapBuilder.php
+++ b/scripts/lib/PhutilLibraryMapBuilder.php
@@ -152,7 +152,7 @@
             $result['error']);
           exit(1);
         }
-        $this->log(".");
+        $this->log('.');
       }
       $this->log("\nDone.\n");
     }
diff --git a/scripts/phutil_rebuild_map.php b/scripts/phutil_rebuild_map.php
--- a/scripts/phutil_rebuild_map.php
+++ b/scripts/phutil_rebuild_map.php
@@ -49,7 +49,7 @@
 
 $root = $args->getArg('root');
 if (count($root) !== 1) {
-  throw new Exception("Provide exactly one library root!");
+  throw new Exception('Provide exactly one library root!');
 }
 $root = Filesystem::resolvePath(head($root));
 
diff --git a/scripts/phutil_symbols.php b/scripts/phutil_symbols.php
--- a/scripts/phutil_symbols.php
+++ b/scripts/phutil_symbols.php
@@ -52,7 +52,7 @@
 
 $paths = $args->getArg('path');
 if (count($paths) !== 1) {
-  throw new Exception("Specify exactly one path!");
+  throw new Exception('Specify exactly one path!');
 }
 $path = Filesystem::resolvePath(head($paths));
 
diff --git a/src/configuration/ArcanistConfiguration.php b/src/configuration/ArcanistConfiguration.php
--- a/src/configuration/ArcanistConfiguration.php
+++ b/src/configuration/ArcanistConfiguration.php
@@ -168,7 +168,7 @@
   private function raiseUnknownCommand($command, array $maybe = array()) {
     $message = pht("Unknown command '%s'. Try 'arc help'.", $command);
     if ($maybe) {
-      $message .= "\n\n".pht("Did you mean:")."\n";
+      $message .= "\n\n".pht('Did you mean:')."\n";
       sort($maybe);
       foreach ($maybe as $other) {
         $message .= "    ".$other."\n";
diff --git a/src/configuration/ArcanistConfigurationManager.php b/src/configuration/ArcanistConfigurationManager.php
--- a/src/configuration/ArcanistConfigurationManager.php
+++ b/src/configuration/ArcanistConfigurationManager.php
@@ -151,7 +151,7 @@
       return $this->workingCopy->writeLocalArcConfig($config);
     }
 
-    throw new Exception(pht("No working copy to write config to!"));
+    throw new Exception(pht('No working copy to write config to!'));
   }
 
   /**
@@ -235,7 +235,7 @@
   public function setUserConfigurationFileLocation($custom_arcrc) {
     if (!Filesystem::pathExists($custom_arcrc)) {
       throw new Exception(
-        "Custom arcrc file was specified, but it was not found!");
+        'Custom arcrc file was specified, but it was not found!');
     }
 
     $this->customArcrcFilename = $custom_arcrc;
diff --git a/src/configuration/ArcanistSettings.php b/src/configuration/ArcanistSettings.php
--- a/src/configuration/ArcanistSettings.php
+++ b/src/configuration/ArcanistSettings.php
@@ -142,7 +142,7 @@
       'browser' => array(
         'type' => 'string',
         'help' =>
-          "Command to use to invoke a web browser.",
+          'Command to use to invoke a web browser.',
         'example' => '"gnome-www-browser"',
       ),
       'events.listeners' => array(
@@ -154,13 +154,13 @@
       'http.basicauth.user' => array(
         'type' => 'string',
         'help' =>
-          "Username to use for basic auth over http transports",
+          'Username to use for basic auth over http transports',
         'example' => '"bob"',
       ),
       'http.basicauth.pass' => array(
         'type' => 'string',
         'help' =>
-          "Password to use for basic auth over http transports",
+          'Password to use for basic auth over http transports',
         'example' => '"bobhasasecret"',
       ),
       'arc.autostash' => array(
diff --git a/src/difference/__tests__/ArcanistDiffUtilsTestCase.php b/src/difference/__tests__/ArcanistDiffUtilsTestCase.php
--- a/src/difference/__tests__/ArcanistDiffUtilsTestCase.php
+++ b/src/difference/__tests__/ArcanistDiffUtilsTestCase.php
@@ -100,7 +100,7 @@
 
     $utf8_tests = array(
       array(
-        "GrumpyCat",
+        'GrumpyCat',
         "Grumpy\xE2\x98\x83at",
         'ssssssxss',
       ),
@@ -118,8 +118,8 @@
 
   public function testGenerateUTF8IntralineDiff() {
     // Both Strings Empty.
-    $left = "";
-    $right = "";
+    $left = '';
+    $right = '';
     $result = array(
                 array(array(0, 0)),
                 array(array(0, 0))
@@ -129,7 +129,7 @@
       ArcanistDiffUtils::generateIntralineDiff($left, $right));
 
     // Left String Empty.
-    $left = "";
+    $left = '';
     $right = "Grumpy\xE2\x98\x83at";
     $result = array(
                 array(array(0, 0)),
@@ -141,7 +141,7 @@
 
     // Right String Empty.
     $left = "Grumpy\xE2\x98\x83at";
-    $right = "";
+    $right = '';
     $result = array(
                 array(array(0, 11)),
                 array(array(0, 0))
@@ -163,7 +163,7 @@
 
     // Both Strings are different.
     $left = "Grumpy\xE2\x98\x83at";
-    $right = "Smiling Dog";
+    $right = 'Smiling Dog';
     $result = array(
                 array(array(1, 11)),
                 array(array(1, 11))
@@ -173,7 +173,7 @@
       ArcanistDiffUtils::generateIntralineDiff($left, $right));
 
     // String with one difference in the middle.
-    $left = "GrumpyCat";
+    $left = 'GrumpyCat';
     $right = "Grumpy\xE2\x98\x83at";
     $result = array(
                 array(array(0, 6), array(1, 1), array(0, 2)),
@@ -184,7 +184,7 @@
       ArcanistDiffUtils::generateIntralineDiff($left, $right));
 
     // Differences in middle, not connected to each other.
-    $left = "GrumpyCat";
+    $left = 'GrumpyCat';
     $right = "Grumpy\xE2\x98\x83a\xE2\x98\x83t";
     $result = array(
                 array(array(0, 6), array(1, 2), array(0, 1)),
@@ -229,7 +229,7 @@
 
     // This is a unicode combining character, "COMBINING DOUBLE TILDE".
     $cc = "\xCD\xA0";
-    $left = "Senor";
+    $left = 'Senor';
     $right = "Sen{$cc}or";
     $result = array(
                 array(array(0, 2), array(1, 1), array(0, 2)),
diff --git a/src/hgdaemon/ArcanistHgClientChannel.php b/src/hgdaemon/ArcanistHgClientChannel.php
--- a/src/hgdaemon/ArcanistHgClientChannel.php
+++ b/src/hgdaemon/ArcanistHgClientChannel.php
@@ -57,7 +57,7 @@
    */
   protected function encodeMessage($argv) {
     if (!is_array($argv) || count($argv) !== 2) {
-      throw new Exception("Message should be <channel, data>.");
+      throw new Exception('Message should be <channel, data>.');
     }
 
     $channel = head($argv);
diff --git a/src/hgdaemon/ArcanistHgProxyServer.php b/src/hgdaemon/ArcanistHgProxyServer.php
--- a/src/hgdaemon/ArcanistHgProxyServer.php
+++ b/src/hgdaemon/ArcanistHgProxyServer.php
@@ -181,7 +181,7 @@
         ));
 
       if (!$hg->update()) {
-        throw new Exception("Server exited unexpectedly!");
+        throw new Exception('Server exited unexpectedly!');
       }
 
       // Accept any new clients.
@@ -353,7 +353,7 @@
 
     $ok = stream_set_blocking($socket, 0);
     if ($ok === false) {
-      throw new Exception("Unable to set socket nonblocking!");
+      throw new Exception('Unable to set socket nonblocking!');
     }
 
     return $socket;
@@ -461,7 +461,7 @@
 
     $pid = pcntl_fork();
     if ($pid === -1) {
-      throw new Exception("Unable to fork!");
+      throw new Exception('Unable to fork!');
     } else if ($pid) {
       // We're the parent; exit. First, drop our reference to the socket so
       // our __destruct() doesn't tear it down; the child will tear it down
diff --git a/src/hgdaemon/ArcanistHgServerChannel.php b/src/hgdaemon/ArcanistHgServerChannel.php
--- a/src/hgdaemon/ArcanistHgServerChannel.php
+++ b/src/hgdaemon/ArcanistHgServerChannel.php
@@ -86,7 +86,7 @@
    */
   protected function encodeMessage($argv) {
     if (!is_array($argv)) {
-      throw new Exception("Message to Mercurial server should be an array.");
+      throw new Exception('Message to Mercurial server should be an array.');
     }
 
     $command = head($argv);
diff --git a/src/lint/ArcanistLintPatcher.php b/src/lint/ArcanistLintPatcher.php
--- a/src/lint/ArcanistLintPatcher.php
+++ b/src/lint/ArcanistLintPatcher.php
@@ -48,7 +48,7 @@
     }
     Filesystem::writeFile($lint, $data);
 
-    list($err) = exec_manual("mv -f %s %s", $lint, $path);
+    list($err) = exec_manual('mv -f %s %s', $lint, $path);
     if ($err) {
       throw new Exception(
         "Unable to overwrite path `{$path}', patched version was left ".
diff --git a/src/lint/engine/ArcanistLintEngine.php b/src/lint/engine/ArcanistLintEngine.php
--- a/src/lint/engine/ArcanistLintEngine.php
+++ b/src/lint/engine/ArcanistLintEngine.php
@@ -208,7 +208,7 @@
   final public function run() {
     $linters = $this->buildLinters();
     if (!$linters) {
-      throw new ArcanistNoEffectException("No linters to run.");
+      throw new ArcanistNoEffectException('No linters to run.');
     }
 
     $linters = msort($linters, 'getLinterPriority');
@@ -225,7 +225,7 @@
     }
 
     if (!$have_paths) {
-      throw new ArcanistNoEffectException("No paths are lintable.");
+      throw new ArcanistNoEffectException('No paths are lintable.');
     }
 
     $versions = array($this->getCacheVersion());
diff --git a/src/lint/linter/ArcanistCSharpLinter.php b/src/lint/linter/ArcanistCSharpLinter.php
--- a/src/lint/linter/ArcanistCSharpLinter.php
+++ b/src/lint/linter/ArcanistCSharpLinter.php
@@ -60,7 +60,7 @@
 
   public function setCustomSeverityMap(array $map) {
     foreach ($map as $code => $severity) {
-      if (substr($code, 0, 2) === "SA" && $severity == "disabled") {
+      if (substr($code, 0, 2) === 'SA' && $severity == 'disabled') {
         throw new Exception(
           "In order to keep StyleCop integration with IDEs and other tools ".
           "consistent with Arcanist results, you aren't permitted to ".
@@ -88,42 +88,42 @@
 
     // Determine runtime engine (.NET or Mono).
     if (phutil_is_windows()) {
-      $this->runtimeEngine = "";
-    } else if (Filesystem::binaryExists("mono")) {
-      $this->runtimeEngine = "mono ";
+      $this->runtimeEngine = '';
+    } else if (Filesystem::binaryExists('mono')) {
+      $this->runtimeEngine = 'mono ';
     } else {
-      throw new Exception("Unable to find Mono and you are not on Windows!");
+      throw new Exception('Unable to find Mono and you are not on Windows!');
     }
 
     // Determine cslint path.
     $cslint = $this->cslintHintPath;
     if ($cslint !== null && file_exists($cslint)) {
       $this->cslintEngine = Filesystem::resolvePath($cslint);
-    } else if (Filesystem::binaryExists("cslint.exe")) {
-      $this->cslintEngine = "cslint.exe";
+    } else if (Filesystem::binaryExists('cslint.exe')) {
+      $this->cslintEngine = 'cslint.exe';
     } else {
-      throw new Exception("Unable to locate cslint.");
+      throw new Exception('Unable to locate cslint.');
     }
 
     // Determine cslint version.
     $ver_future = new ExecFuture(
-      "%C -v",
+      '%C -v',
       $this->runtimeEngine.$this->cslintEngine);
     list($err, $stdout, $stderr) = $ver_future->resolve();
     if ($err !== 0) {
       throw new Exception(
-        "You are running an old version of cslint.  Please ".
-        "upgrade to version ".self::SUPPORTED_VERSION.".");
+        'You are running an old version of cslint.  Please '.
+        'upgrade to version '.self::SUPPORTED_VERSION.'.');
     }
     $ver = (int)$stdout;
     if ($ver < self::SUPPORTED_VERSION) {
       throw new Exception(
-        "You are running an old version of cslint.  Please ".
-        "upgrade to version ".self::SUPPORTED_VERSION.".");
-    } elseif ($ver > self::SUPPORTED_VERSION) {
+        'You are running an old version of cslint.  Please '.
+        'upgrade to version '.self::SUPPORTED_VERSION.'.');
+    } else if ($ver > self::SUPPORTED_VERSION) {
       throw new Exception(
-        "Arcanist does not support this version of cslint (it is ".
-        "newer).  You can try upgrading Arcanist with `arc upgrade`.");
+        'Arcanist does not support this version of cslint (it is '.
+        'newer).  You can try upgrading Arcanist with `arc upgrade`.');
     }
 
     $this->loaded = true;
@@ -158,7 +158,7 @@
         // settings JSON through base64-encoded to mitigate
         // this issue.
         $futures[] = new ExecFuture(
-          "%C --settings-base64=%s -r=. %Ls",
+          '%C --settings-base64=%s -r=. %Ls',
           $this->runtimeEngine.$this->cslintEngine,
           base64_encode(json_encode($this->discoveryMap)),
           $current_paths);
@@ -173,7 +173,7 @@
     // a future for those too.
     if (count($current_paths) > 0) {
       $futures[] = new ExecFuture(
-        "%C --settings-base64=%s -r=. %Ls",
+        '%C --settings-base64=%s -r=. %Ls',
         $this->runtimeEngine.$this->cslintEngine,
         base64_encode(json_encode($this->discoveryMap)),
         $current_paths);
diff --git a/src/lint/linter/ArcanistExternalLinter.php b/src/lint/linter/ArcanistExternalLinter.php
--- a/src/lint/linter/ArcanistExternalLinter.php
+++ b/src/lint/linter/ArcanistExternalLinter.php
@@ -204,7 +204,7 @@
    * @task bin
    */
   public function getDefaultInterpreter() {
-    throw new Exception("Incomplete implementation!");
+    throw new Exception('Incomplete implementation!');
   }
 
 
diff --git a/src/lint/linter/ArcanistFlake8Linter.php b/src/lint/linter/ArcanistFlake8Linter.php
--- a/src/lint/linter/ArcanistFlake8Linter.php
+++ b/src/lint/linter/ArcanistFlake8Linter.php
@@ -128,10 +128,10 @@
           'Unrecognized lint message code "%s". Expected a valid flake8 '.
           'lint code like "%s", or "%s", or "%s", or "%s".',
           $code,
-          "E225",
-          "W291",
-          "F811",
-          "C901"));
+          'E225',
+          'W291',
+          'F811',
+          'C901'));
     }
 
     return $code;
diff --git a/src/lint/linter/ArcanistLinter.php b/src/lint/linter/ArcanistLinter.php
--- a/src/lint/linter/ArcanistLinter.php
+++ b/src/lint/linter/ArcanistLinter.php
@@ -221,7 +221,7 @@
     if (isset($map[$code])) {
       return $map[$code];
     }
-    return "Unknown lint message!";
+    return 'Unknown lint message!';
   }
 
   final protected function addLintMessage(ArcanistLintMessage $message) {
diff --git a/src/lint/linter/ArcanistPEP8Linter.php b/src/lint/linter/ArcanistPEP8Linter.php
--- a/src/lint/linter/ArcanistPEP8Linter.php
+++ b/src/lint/linter/ArcanistPEP8Linter.php
@@ -125,8 +125,8 @@
           'Unrecognized lint message code "%s". Expected a valid PEP8 '.
           'lint code like "%s" or "%s".',
           $code,
-          "E101",
-          "W291"));
+          'E101',
+          'W291'));
     }
 
     return $code;
diff --git a/src/lint/linter/ArcanistPyLintLinter.php b/src/lint/linter/ArcanistPyLintLinter.php
--- a/src/lint/linter/ArcanistPyLintLinter.php
+++ b/src/lint/linter/ArcanistPyLintLinter.php
@@ -98,13 +98,13 @@
   }
 
   private function getPyLintPath() {
-    $pylint_bin = "pylint";
+    $pylint_bin = 'pylint';
 
     // Use the PyLint prefix specified in the config file
     $config = $this->getEngine()->getConfigurationManager();
     $prefix = $config->getConfigFromAnySource('lint.pylint.prefix');
     if ($prefix !== null) {
-      $pylint_bin = $prefix."/bin/".$pylint_bin;
+      $pylint_bin = $prefix.'/bin/'.$pylint_bin;
     }
 
     if (!Filesystem::pathExists($pylint_bin)) {
@@ -156,7 +156,7 @@
     }
 
     $python_path[] = '';
-    return implode(":", $python_path);
+    return implode(':', $python_path);
   }
 
   private function getPyLintOptions() {
@@ -164,8 +164,8 @@
     $options = array('-rn');
 
     // Version 0.x.x include the pylint message ids in the output
-    if (version_compare($this->getLinterVersion(), "1", 'lt')) {
-      array_push($options, '-iy', "--output-format=text");
+    if (version_compare($this->getLinterVersion(), '1', 'lt')) {
+      array_push($options, '-iy', '--output-format=text');
     }
     // Version 1.x.x set the output specifically to the 0.x.x format
     else {
@@ -192,7 +192,7 @@
       $options = array_merge($options, $config_options);
     }
 
-    return implode(" ", $options);
+    return implode(' ', $options);
   }
 
   public function getLinterName() {
@@ -216,7 +216,7 @@
     // Assume a future version that at least is compatible with 1.x.x
     if (count($lines) == 0 ||
         !preg_match('/pylint\s((?:\d+\.?)+)/', $lines[0], $matches)) {
-      return "999";
+      return '999';
     }
 
     return $matches[1];
@@ -264,7 +264,7 @@
       $message->setPath($path);
       $message->setLine($matches[2]);
       $message->setCode($matches[1]);
-      $message->setName($this->getLinterName()." ".$matches[1]);
+      $message->setName($this->getLinterName().' '.$matches[1]);
       $message->setDescription($matches[3]);
       $message->setSeverity($this->getMessageCodeSeverity($matches[1]));
       $this->addLintMessage($message);
diff --git a/src/lint/linter/ArcanistRubyLinter.php b/src/lint/linter/ArcanistRubyLinter.php
--- a/src/lint/linter/ArcanistRubyLinter.php
+++ b/src/lint/linter/ArcanistRubyLinter.php
@@ -75,7 +75,7 @@
     foreach ($lines as $line) {
       $matches = null;
 
-      if (!preg_match("/(.*?):(\d+): (.*?)$/", $line, $matches)) {
+      if (!preg_match('/(.*?):(\d+): (.*?)$/', $line, $matches)) {
         continue;
       }
 
diff --git a/src/lint/linter/ArcanistTextLinter.php b/src/lint/linter/ArcanistTextLinter.php
--- a/src/lint/linter/ArcanistTextLinter.php
+++ b/src/lint/linter/ArcanistTextLinter.php
@@ -170,7 +170,7 @@
       $this->raiseLintAtOffset(
         strlen($data),
         self::LINT_EOF_NEWLINE,
-        "Files must end in a newline.",
+        'Files must end in a newline.',
         '',
         "\n");
     }
diff --git a/src/lint/linter/ArcanistXHPASTLinter.php b/src/lint/linter/ArcanistXHPASTLinter.php
--- a/src/lint/linter/ArcanistXHPASTLinter.php
+++ b/src/lint/linter/ArcanistXHPASTLinter.php
@@ -302,12 +302,12 @@
         $this->raiseLintAtNode(
           $strstr,
           self::LINT_SLOWNESS,
-          "Use strpos() for checking if the string contains something.");
+          'Use strpos() for checking if the string contains something.');
       } else if ($name == 'stristr') {
         $this->raiseLintAtNode(
           $strstr,
           self::LINT_SLOWNESS,
-          "Use stripos() for checking if the string contains something.");
+          'Use stripos() for checking if the string contains something.');
       }
     }
   }
@@ -344,13 +344,13 @@
         $this->raiseLintAtNode(
           $strpos,
           self::LINT_SLOWNESS,
-          "Use strncmp() for checking if the string starts with something.");
+          'Use strncmp() for checking if the string starts with something.');
       } else if ($name == 'stripos') {
         $this->raiseLintAtNode(
           $strpos,
           self::LINT_SLOWNESS,
-          "Use strncasecmp() for checking if the string starts with ".
-            "something.");
+          'Use strncasecmp() for checking if the string starts with '.
+            'something.');
       }
     }
   }
@@ -480,7 +480,7 @@
           self::LINT_PHP_53_FEATURES,
           "This codebase targets PHP 5.3.0 on Windows, but `{$name}()` is not ".
           "available there".
-          ($windows ? " until PHP {$windows}" : "").".");
+          ($windows ? " until PHP {$windows}" : '').".");
       }
     }
 
@@ -510,9 +510,9 @@
           $this->raiseLintAtNode(
             $index->getChildByIndex(1),
             self::LINT_PHP_54_FEATURES,
-            "The f()[...] syntax was not introduced until PHP 5.4, but this ".
-            "codebase targets an earlier version of PHP. You can rewrite ".
-            "this expression using idx().");
+            'The f()[...] syntax was not introduced until PHP 5.4, but this '.
+            'codebase targets an earlier version of PHP. You can rewrite '.
+            'this expression using idx().');
           break;
       }
     }
@@ -2044,7 +2044,7 @@
           $this->raiseLintAtNode(
             $unary,
             self::LINT_EXIT_EXPRESSION,
-            "Use exit as a statement, not an expression.");
+            'Use exit as a statement, not an expression.');
         }
       }
     }
@@ -2208,8 +2208,8 @@
         $message = $this->raiseLintAtNode(
           $node,
           self::LINT_DUPLICATE_KEYS_IN_ARRAY,
-          "Duplicate key in array initializer. PHP will ignore all ".
-            "but the last entry.");
+          'Duplicate key in array initializer. PHP will ignore all '.
+            'but the last entry.');
 
         $locations = array();
         foreach ($nodes_by_key[$key] as $node) {
diff --git a/src/lint/linter/__tests__/ArcanistClosureLinterTestCase.php b/src/lint/linter/__tests__/ArcanistClosureLinterTestCase.php
--- a/src/lint/linter/__tests__/ArcanistClosureLinterTestCase.php
+++ b/src/lint/linter/__tests__/ArcanistClosureLinterTestCase.php
@@ -5,7 +5,7 @@
 
   public function testClosureLinter() {
     $linter = new ArcanistClosureLinter();
-    $linter->setFlags(array("--additional_extensions=lint-test"));
+    $linter->setFlags(array('--additional_extensions=lint-test'));
 
     $this->executeTestsInDirectory(
       dirname(__FILE__).'/gjslint/',
diff --git a/src/lint/renderer/ArcanistLintConsoleRenderer.php b/src/lint/renderer/ArcanistLintConsoleRenderer.php
--- a/src/lint/renderer/ArcanistLintConsoleRenderer.php
+++ b/src/lint/renderer/ArcanistLintConsoleRenderer.php
@@ -43,7 +43,7 @@
         foreach ($message->getOtherLocations() as $location) {
           $locations[] =
             idx($location, 'path', $path).
-            (!empty($location['line']) ? ":{$location['line']}" : "");
+            (!empty($location['line']) ? ":{$location['line']}" : '');
         }
         $description .= "\nOther locations: ".implode(', ', $locations);
       }
@@ -226,7 +226,7 @@
   protected function renderLine($line, $data, $chevron = false, $diff = null) {
     $chevron = $chevron ? '>>>' : '';
     return sprintf(
-      "    %3s %1s %6s %s",
+      '    %3s %1s %6s %s',
       $chevron,
       $diff,
       $line,
diff --git a/src/lint/renderer/ArcanistLintJSONRenderer.php b/src/lint/renderer/ArcanistLintJSONRenderer.php
--- a/src/lint/renderer/ArcanistLintJSONRenderer.php
+++ b/src/lint/renderer/ArcanistLintJSONRenderer.php
@@ -30,6 +30,6 @@
   }
 
   public function renderOkayResult() {
-    return "";
+    return '';
   }
 }
diff --git a/src/lint/renderer/ArcanistLintLikeCompilerRenderer.php b/src/lint/renderer/ArcanistLintLikeCompilerRenderer.php
--- a/src/lint/renderer/ArcanistLintLikeCompilerRenderer.php
+++ b/src/lint/renderer/ArcanistLintLikeCompilerRenderer.php
@@ -30,6 +30,6 @@
   }
 
   public function renderOkayResult() {
-    return "";
+    return '';
   }
 }
diff --git a/src/lint/renderer/ArcanistLintSummaryRenderer.php b/src/lint/renderer/ArcanistLintSummaryRenderer.php
--- a/src/lint/renderer/ArcanistLintSummaryRenderer.php
+++ b/src/lint/renderer/ArcanistLintSummaryRenderer.php
@@ -20,7 +20,7 @@
       $text[] = "{$path}:{$line}:{$severity}: {$name}\n";
     }
 
-    return implode("", $text);
+    return implode('', $text);
   }
 
   public function renderOkayResult() {
diff --git a/src/parser/ArcanistBaseCommitParser.php b/src/parser/ArcanistBaseCommitParser.php
--- a/src/parser/ArcanistBaseCommitParser.php
+++ b/src/parser/ArcanistBaseCommitParser.php
@@ -121,10 +121,10 @@
     switch ($name) {
       case 'verbose':
         $this->verbose = true;
-        $this->log("Enabled verbose mode.");
+        $this->log('Enabled verbose mode.');
         break;
       case 'prompt':
-        $reason = "it is what you typed when prompted.";
+        $reason = 'it is what you typed when prompted.';
         $this->api->setBaseCommitExplanation($reason);
         return phutil_console_prompt('Against which commit?');
       case 'local':
@@ -144,7 +144,7 @@
       case 'halt':
         // Dump the whole stack.
         $this->try = array();
-        $this->log("Halting all rule processing.");
+        $this->log('Halting all rule processing.');
         return false;
       case 'skip':
         return null;
diff --git a/src/parser/ArcanistBundle.php b/src/parser/ArcanistBundle.php
--- a/src/parser/ArcanistBundle.php
+++ b/src/parser/ArcanistBundle.php
@@ -379,7 +379,7 @@
 
       if (!$decompose_okay) {
         throw new Exception(
-          "Failed to decompose multicopy changeset in order to generate diff.");
+          'Failed to decompose multicopy changeset in order to generate diff.');
       }
     }
 
@@ -763,7 +763,7 @@
 
     $content = array();
     $content[] = "index {$old_sha1}..{$new_sha1}".$eol;
-    $content[] = "GIT binary patch".$eol;
+    $content[] = 'GIT binary patch'.$eol;
 
     $content[] = "literal {$new_length}".$eol;
     $content[] = $this->emitBinaryDiffBody($new_data).$eol;
@@ -779,9 +779,9 @@
 
     if (!function_exists('gzcompress')) {
       throw new Exception(
-        "This patch has binary data. The PHP zlib extension is required to ".
-        "apply patches with binary data to git. Install the PHP zlib ".
-        "extension to continue.");
+        'This patch has binary data. The PHP zlib extension is required to '.
+        'apply patches with binary data to git. Install the PHP zlib '.
+        'extension to continue.');
     }
 
     // See emit_binary_diff_body() in diff.c for git's implementation.
diff --git a/src/parser/ArcanistDiffParser.php b/src/parser/ArcanistDiffParser.php
--- a/src/parser/ArcanistDiffParser.php
+++ b/src/parser/ArcanistDiffParser.php
@@ -349,7 +349,7 @@
           $this->parseIndexHunk($change);
           break;
         default:
-          $this->didFailParse("Unknown diff type.");
+          $this->didFailParse('Unknown diff type.');
           break;
       }
     } while ($this->getLine() !== null);
@@ -526,7 +526,7 @@
 
   protected function setIsGit($git) {
     if ($this->isGit !== null && $this->isGit != $git) {
-      throw new Exception("Git status has changed!");
+      throw new Exception('Git status has changed!');
     }
     $this->isGit = $git;
     return $this;
@@ -817,7 +817,7 @@
         $this->nextNonemptyLine();
         return;
       } else if (!preg_match('/^[a-zA-Z]/', $line)) {
-        $this->didFailParse("Expected base85 line length character (a-zA-Z).");
+        $this->didFailParse('Expected base85 line length character (a-zA-Z).');
       }
     } while (true);
   }
@@ -878,7 +878,7 @@
           $line = $this->nextNonemptyLine();
           $ok = preg_match('/^Property changes on:/', $line);
           if (!$ok) {
-            $this->didFailParse("Confused by empty line");
+            $this->didFailParse('Confused by empty line');
           }
           $line = $this->nextLine();
           return $this->parsePropertyHunk($change);
@@ -966,7 +966,7 @@
       }
 
       if ($old_len || $new_len) {
-        $this->didFailParse("Found the wrong number of hunk lines.");
+        $this->didFailParse('Found the wrong number of hunk lines.');
       }
 
       $corpus = implode('', $real);
@@ -1074,7 +1074,7 @@
 
   protected function getLine() {
     if ($this->text === null) {
-      throw new Exception("Not parsing!");
+      throw new Exception('Not parsing!');
     }
     if (isset($this->text[$this->line])) {
       return $this->text[$this->line];
@@ -1168,7 +1168,7 @@
     $context = '';
     for ($ii = $min; $ii <= $max; $ii++) {
       $context .= sprintf(
-        "%8.8s %6.6s   %s",
+        '%8.8s %6.6s   %s',
         ($ii == $this->line) ? '>>>  ' : '',
         $ii + 1,
         $this->text[$ii]);
@@ -1182,7 +1182,7 @@
       $temp->setPreserveFile(true);
 
       Filesystem::writeFile($temp, $this->rawDiff);
-      $out[] = "Raw input file was written to: ".(string)$temp;
+      $out[] = 'Raw input file was written to: '.(string)$temp;
     }
 
     $out[] = $context;
@@ -1392,7 +1392,7 @@
     //   8. ("--")
     //   9. Patch footer.
 
-    list($head, $tail) = preg_split("/^---$/m", $diff, 2);
+    list($head, $tail) = preg_split('/^---$/m', $diff, 2);
     list($mail_headers, $mail_body) = explode("\n\n", $head, 2);
     list($body, $foot) = preg_split('/^-- ?$/m', $tail, 2);
     list($stat, $diff) = explode("\n\n", $body, 2);
diff --git a/src/parser/__tests__/ArcanistBundleTestCase.php b/src/parser/__tests__/ArcanistBundleTestCase.php
--- a/src/parser/__tests__/ArcanistBundleTestCase.php
+++ b/src/parser/__tests__/ArcanistBundleTestCase.php
@@ -148,7 +148,7 @@
     foreach ($raw_changes as $change) {
       $this->assertTrue(
         empty($changes[$change->getCurrentPath()]),
-        "Unique Path: ".$change->getCurrentPath());
+        'Unique Path: '.$change->getCurrentPath());
       $changes[$change->getCurrentPath()] = $change;
     }
 
@@ -567,7 +567,7 @@
       case '228d7be4840313ed805c25c15bba0f7b188af3e6':
         // "Add a text file."
         // This commit is never reached because we skip the 0th commit junk.
-        $this->assertTrue(true, "This is never reached.");
+        $this->assertTrue(true, 'This is never reached.');
         break;
       default:
         throw new Exception(
diff --git a/src/parser/__tests__/ArcanistDiffParserTestCase.php b/src/parser/__tests__/ArcanistDiffParserTestCase.php
--- a/src/parser/__tests__/ArcanistDiffParserTestCase.php
+++ b/src/parser/__tests__/ArcanistDiffParserTestCase.php
@@ -583,7 +583,7 @@
         $this->assertEqual(
           ArcanistDiffChangeType::TYPE_MESSAGE,
           $change->getType());
-        $this->assertEqual("WIP", $change->getMetadata('message'));
+        $this->assertEqual('WIP', $change->getMetadata('message'));
 
         $change = array_shift($changes);
         $this->assertEqual(
@@ -620,11 +620,11 @@
 
   public function testGitPathSplitting() {
     static $tests = array(
-      "a/old.c b/new.c"       => array('old.c', 'new.c'),
+      'a/old.c b/new.c'       => array('old.c', 'new.c'),
       "a/old.c b/new.c\n"     => array('old.c', 'new.c'),
       "a/old.c b/new.c\r\n"   => array('old.c', 'new.c'),
-      "old.c new.c"           => array('old.c', 'new.c'),
-      "1/old.c 2/new.c"       => array('old.c', 'new.c'),
+      'old.c new.c'           => array('old.c', 'new.c'),
+      '1/old.c 2/new.c'       => array('old.c', 'new.c'),
       '"a/\\"quotes1\\"" "b/\\"quotes2\\""' => array(
         '"quotes1"',
         '"quotes2"',
@@ -637,11 +637,11 @@
         "\xE2\x98\x831",
         "\xE2\x98\x832",
       ),
-      "a/Core Data/old.c b/Core Data/new.c" => array(
+      'a/Core Data/old.c b/Core Data/new.c' => array(
         'Core Data/old.c',
         'Core Data/new.c',
       ),
-      "some file with spaces.c some file with spaces.c" => array(
+      'some file with spaces.c some file with spaces.c' => array(
         'some file with spaces.c',
         'some file with spaces.c',
       ),
@@ -657,7 +657,7 @@
 
 
     static $ambiguous = array(
-      "old file with spaces.c new file with spaces.c",
+      'old file with spaces.c new file with spaces.c',
     );
 
     foreach ($ambiguous as $input) {
diff --git a/src/parser/diff/ArcanistDiffChange.php b/src/parser/diff/ArcanistDiffChange.php
--- a/src/parser/diff/ArcanistDiffChange.php
+++ b/src/parser/diff/ArcanistDiffChange.php
@@ -271,7 +271,7 @@
 
     $summary = array();
     $summary[] = sprintf(
-      "%s %5.5s %s",
+      '%s %5.5s %s',
       $char,
       $attr,
       $this->getCurrentPath());
@@ -289,14 +289,14 @@
 
   public function getSymlinkTarget() {
     if ($this->getFileType() != ArcanistDiffChangeType::FILE_SYMLINK) {
-      throw new Exception("Not a symlink!");
+      throw new Exception('Not a symlink!');
     }
     $hunks = $this->getHunks();
     $hunk = reset($hunks);
     $corpus = $hunk->getCorpus();
     $match = null;
     if (!preg_match('/^\+(?:link )?(.*)$/m', $corpus, $match)) {
-      throw new Exception("Failed to extract link target!");
+      throw new Exception('Failed to extract link target!');
     }
     return trim($match[1]);
   }
diff --git a/src/repository/api/ArcanistGitAPI.php b/src/repository/api/ArcanistGitAPI.php
--- a/src/repository/api/ArcanistGitAPI.php
+++ b/src/repository/api/ArcanistGitAPI.php
@@ -156,7 +156,7 @@
     if ($symbolic_commit !== null) {
       if ($symbolic_commit == ArcanistGitAPI::GIT_MAGIC_ROOT_COMMIT) {
         $this->setBaseCommitExplanation(
-          "you explicitly specified the empty tree.");
+          'you explicitly specified the empty tree.');
         return $symbolic_commit;
       }
 
@@ -187,10 +187,10 @@
 
       if ($this->repositoryHasNoCommits) {
         $this->setBaseCommitExplanation(
-          "the repository has no commits.");
+          'the repository has no commits.');
       } else {
         $this->setBaseCommitExplanation(
-          "the repository has only one commit.");
+          'the repository has only one commit.');
       }
 
       return self::GIT_MAGIC_ROOT_COMMIT;
@@ -265,7 +265,7 @@
         "(Technically: the merge-base of the selected revision and HEAD is ".
         "used to determine the start of the commit range.)");
 
-      $prompt = "What default do you want to use? [origin/master]";
+      $prompt = 'What default do you want to use? [origin/master]';
       $default = phutil_console_prompt($prompt);
 
       if (!strlen(trim($default))) {
@@ -453,13 +453,13 @@
 
   // Convert svn revision number to git hash
   public function getHashFromFromSVNRevisionNumber($revision_id) {
-    return $this->executeSVNFindRev("r".$revision_id, "Git");
+    return $this->executeSVNFindRev('r'.$revision_id, 'Git');
   }
 
 
   // Convert a git hash to svn revision number
   public function getSVNRevisionNumberFromHash($hash) {
-    return $this->executeSVNFindRev($hash, "SVN");
+    return $this->executeSVNFindRev($hash, 'SVN');
   }
 
 
@@ -710,7 +710,7 @@
         $line,
         $matches);
       if (!$ok) {
-        throw new Exception("Failed to parse git ls-tree output!");
+        throw new Exception('Failed to parse git ls-tree output!');
       }
       $result[$matches[4]] = array(
         'mode' => $matches[1],
@@ -836,7 +836,7 @@
   public function performLocalBranchMerge($branch, $message) {
     if (!$branch) {
       throw new ArcanistUsageException(
-        "Under git, you must specify the branch you want to merge.");
+        'Under git, you must specify the branch you want to merge.');
     }
     $err = phutil_passthru(
       '(cd %s && git merge --no-ff -m %s %s)',
@@ -845,7 +845,7 @@
       $branch);
 
     if ($err) {
-      throw new ArcanistUsageException("Merge failed!");
+      throw new ArcanistUsageException('Merge failed!');
     }
   }
 
@@ -917,8 +917,8 @@
 
     foreach ($results as $key => $result) {
       $results[$key]['why'] =
-        "A git commit or tree hash in the commit range is already attached ".
-        "to the Differential revision.";
+        'A git commit or tree hash in the commit range is already attached '.
+        'to the Differential revision.';
     }
 
     return $results;
@@ -953,7 +953,7 @@
   }
 
   public function getBackoutMessage($commit_hash) {
-    return "This reverts commit ".$commit_hash.".";
+    return 'This reverts commit '.$commit_hash.'.';
   }
 
   public function isGitSubversionRepo() {
diff --git a/src/repository/api/ArcanistMercurialAPI.php b/src/repository/api/ArcanistMercurialAPI.php
--- a/src/repository/api/ArcanistMercurialAPI.php
+++ b/src/repository/api/ArcanistMercurialAPI.php
@@ -133,8 +133,8 @@
         }
       }
 
-      $this->setBaseCommitExplanation("it is the greatest common ancestor of ".
-        "the working directory and the commit you specified explicitly.");
+      $this->setBaseCommitExplanation('it is the greatest common ancestor of '.
+        'the working directory and the commit you specified explicitly.');
       return $commit;
     }
 
@@ -174,8 +174,8 @@
 
     if (!$logs) {
       $this->setBaseCommitExplanation(
-        "you have no outgoing commits, so arc assumes you intend to submit ".
-        "uncommitted changes in the working copy.");
+        'you have no outgoing commits, so arc assumes you intend to submit '.
+        'uncommitted changes in the working copy.');
       return $this->getWorkingCopyRevision();
     }
 
@@ -217,11 +217,11 @@
 
     if ($against == 'null') {
       $this->setBaseCommitExplanation(
-        "this is a new repository (all changes are outgoing).");
+        'this is a new repository (all changes are outgoing).');
     } else {
       $this->setBaseCommitExplanation(
-        "it is the first commit reachable from the working copy state ".
-        "which is not outgoing.");
+        'it is the first commit reachable from the working copy state '.
+        'which is not outgoing.');
     }
 
     return $against;
@@ -231,7 +231,7 @@
     if ($this->localCommitInfo === null) {
       $base_commit = $this->getBaseCommit();
       list($info) = $this->execxLocal(
-        "log --template %s --rev %s --branch %s --",
+        'log --template %s --rev %s --branch %s --',
         "{node}\1{rev}\1{author}\1".
           "{date|rfc822date}\1{branch}\1{tag}\1{parents}\1{desc}\2",
         hgsprintf('(%s::. - %s)', $base_commit, $base_commit),
@@ -522,13 +522,13 @@
     if ($err) {
       return false;
     } else {
-      return (strpos($stdout, "amend") !== false);
+      return (strpos($stdout, 'amend') !== false);
     }
   }
 
   public function supportsRebase() {
     if ($this->supportsRebase === null) {
-      list ($err) = $this->execManualLocal("help rebase");
+      list ($err) = $this->execManualLocal('help rebase');
       $this->supportsRebase = $err === 0;
     }
 
@@ -537,7 +537,7 @@
 
   public function supportsPhases() {
     if ($this->supportsPhases === null) {
-      list ($err) = $this->execManualLocal("help phase");
+      list ($err) = $this->execManualLocal('help phase');
       $this->supportsPhases = $err === 0;
     }
 
@@ -616,7 +616,7 @@
     }
 
     if ($err) {
-      throw new ArcanistUsageException("Merge failed!");
+      throw new ArcanistUsageException('Merge failed!');
     }
   }
 
@@ -628,7 +628,7 @@
   public function getCommitMessageLog() {
     $base_commit = $this->getBaseCommit();
     list($stdout) = $this->execxLocal(
-      "log --template %s --rev %s --branch %s --",
+      'log --template %s --rev %s --branch %s --',
       "{node}\1{desc}\2",
       hgsprintf('(%s::. - %s)', $base_commit, $base_commit),
       $this->getBranchName());
@@ -698,8 +698,8 @@
 
       foreach ($results as $key => $hash) {
         $results[$key]['why'] =
-          "A mercurial commit hash in the commit range is already attached ".
-          "to the Differential revision.";
+          'A mercurial commit hash in the commit range is already attached '.
+          'to the Differential revision.';
       }
 
       return $results;
@@ -796,7 +796,7 @@
   }
 
   public function getBackoutMessage($commit_hash) {
-    return "Backed out changeset ".$commit_hash.".";
+    return 'Backed out changeset '.$commit_hash.'.';
   }
 
   public function resolveBaseCommitRule($rule, $source) {
diff --git a/src/repository/api/ArcanistRepositoryAPI.php b/src/repository/api/ArcanistRepositoryAPI.php
--- a/src/repository/api/ArcanistRepositoryAPI.php
+++ b/src/repository/api/ArcanistRepositoryAPI.php
@@ -64,7 +64,7 @@
     if (!$working_copy) {
       throw new Exception(
         pht(
-          "Trying to create a RepositoryAPI without a working copy!"));
+          'Trying to create a RepositoryAPI without a working copy!'));
     }
 
     $root = $working_copy->getProjectRoot();
@@ -81,9 +81,9 @@
       default:
         throw new Exception(
           pht(
-            "The current working directory is not part of a working copy for ".
-            "a supported version control system (Git, Subversion or ".
-            "Mercurial)."));
+            'The current working directory is not part of a working copy for '.
+            'a supported version control system (Git, Subversion or '.
+            'Mercurial).'));
     }
 
     $api->configurationManager = $configuration_manager;
diff --git a/src/repository/api/ArcanistSubversionAPI.php b/src/repository/api/ArcanistSubversionAPI.php
--- a/src/repository/api/ArcanistSubversionAPI.php
+++ b/src/repository/api/ArcanistSubversionAPI.php
@@ -631,7 +631,7 @@
   public function getFinalizedRevisionMessage() {
     // In other VCSes we give push instructions here, but it never makes sense
     // in SVN.
-    return "Done.";
+    return 'Done.';
   }
 
   public function loadWorkingCopyDifferentialRevisions(
@@ -660,7 +660,7 @@
 
     foreach ($results as $key => $result) {
       $results[$key]['why'] =
-        "Matching arcanist project name and working copy directory path.";
+        'Matching arcanist project name and working copy directory path.';
     }
 
     return $results;
diff --git a/src/unit/engine/ArcanistXUnitTestResultParser.php b/src/unit/engine/ArcanistXUnitTestResultParser.php
--- a/src/unit/engine/ArcanistXUnitTestResultParser.php
+++ b/src/unit/engine/ArcanistXUnitTestResultParser.php
@@ -32,18 +32,18 @@
     }
 
     $results = array();
-    $testcases = $xunit_dom->getElementsByTagName("testcase");
+    $testcases = $xunit_dom->getElementsByTagName('testcase');
     foreach ($testcases as $testcase) {
-      $classname = $testcase->getAttribute("classname");
-      $name = $testcase->getAttribute("name");
-      $time = $testcase->getAttribute("time");
+      $classname = $testcase->getAttribute('classname');
+      $name = $testcase->getAttribute('name');
+      $time = $testcase->getAttribute('time');
 
       $status = ArcanistUnitTestResult::RESULT_PASS;
-      $user_data = "";
+      $user_data = '';
 
       // A skipped test is a test which was ignored using framework
       // mechanizms (e.g. @skip decorator)
-      $skipped = $testcase->getElementsByTagName("skipped");
+      $skipped = $testcase->getElementsByTagName('skipped');
       if ($skipped->length > 0) {
         $status = ArcanistUnitTestResult::RESULT_SKIP;
         $messages = array();
@@ -56,7 +56,7 @@
 
       // Failure is a test which the code has explicitly failed by using
       // the mechanizms for that purpose. e.g., via an assertEquals
-      $failures = $testcase->getElementsByTagName("failure");
+      $failures = $testcase->getElementsByTagName('failure');
       if ($failures->length > 0) {
         $status = ArcanistUnitTestResult::RESULT_FAIL;
         $messages = array();
@@ -70,7 +70,7 @@
       // An errored test is one that had an unanticipated problem. e.g., an
       // unchecked throwable, or a problem with an implementation of the
       // test.
-      $errors = $testcase->getElementsByTagName("error");
+      $errors = $testcase->getElementsByTagName('error');
       if ($errors->length > 0) {
         $status = ArcanistUnitTestResult::RESULT_BROKEN;
         $messages = array();
@@ -82,7 +82,7 @@
       }
 
       $result = new ArcanistUnitTestResult();
-      $result->setName($classname.".".$name);
+      $result->setName($classname.'.'.$name);
       $result->setResult($status);
       $result->setDuration($time);
       $result->setUserData($user_data);
diff --git a/src/unit/engine/CSharpToolsTestEngine.php b/src/unit/engine/CSharpToolsTestEngine.php
--- a/src/unit/engine/CSharpToolsTestEngine.php
+++ b/src/unit/engine/CSharpToolsTestEngine.php
@@ -50,8 +50,8 @@
       $this->coverEngine = Filesystem::resolvePath($cscover);
     } else {
       throw new Exception(
-        "Unable to locate cscover coverage runner ".
-        "(have you built yet?)");
+        'Unable to locate cscover coverage runner '.
+        '(have you built yet?)');
     }
 
   }
@@ -95,7 +95,7 @@
     // FIXME: Can't use TempFile here as xUnit doesn't like
     // UNIX-style full paths.  It sees the leading / as the
     // start of an option flag, even when quoted.
-    $xunit_temp = Filesystem::readRandomCharacters(10).".results.xml";
+    $xunit_temp = Filesystem::readRandomCharacters(10).'.results.xml';
     if (file_exists($xunit_temp)) {
       unlink($xunit_temp);
     }
@@ -103,15 +103,15 @@
     $cover_temp->setPreserveFile(true);
     $xunit_cmd = $this->runtimeEngine;
     $xunit_args = null;
-    if ($xunit_cmd === "") {
+    if ($xunit_cmd === '') {
       $xunit_cmd = $this->testEngine;
       $xunit_args = csprintf(
-        "%s /xml %s",
+        '%s /xml %s',
         $test_assembly,
         $xunit_temp);
     } else {
       $xunit_args = csprintf(
-        "%s %s /xml %s",
+        '%s %s /xml %s',
         $this->testEngine,
         $test_assembly,
         $xunit_temp);
@@ -119,7 +119,7 @@
     $assembly_dir = dirname($test_assembly);
     $assemblies_to_instrument = array();
     foreach (Filesystem::listDirectory($assembly_dir) as $file) {
-      if (substr($file, -4) == ".dll" || substr($file, -4) == ".exe") {
+      if (substr($file, -4) == '.dll' || substr($file, -4) == '.exe') {
         if ($this->assemblyShouldBeInstrumented($file)) {
           $assemblies_to_instrument[] = $assembly_dir.DIRECTORY_SEPARATOR.$file;
         }
@@ -129,8 +129,8 @@
       return parent::buildTestFuture($test_assembly);
     }
     $future = new ExecFuture(
-      "%C -o %s -c %s -a %s -w %s %Ls",
-      trim($this->runtimeEngine." ".$this->coverEngine),
+      '%C -o %s -c %s -a %s -w %s %Ls',
+      trim($this->runtimeEngine.' '.$this->coverEngine),
       $cover_temp,
       $xunit_cmd,
       $xunit_args,
@@ -200,9 +200,9 @@
     $results = array();
     foreach ($tags as $tag) {
       $results[] = array(
-        "file" => $tag->getAttribute("file"),
-        "start" => $tag->getAttribute("start"),
-        "end" => $tag->getAttribute("end"));
+        'file' => $tag->getAttribute('file'),
+        'start' => $tag->getAttribute('start'),
+        'end' => $tag->getAttribute('end'));
     }
     return $results;
   }
@@ -229,12 +229,12 @@
     $executed = array();
 
     $instrumented = $this->processTags(
-      $coverage_dom->getElementsByTagName("instrumented"));
+      $coverage_dom->getElementsByTagName('instrumented'));
     $executed = $this->processTags(
-      $coverage_dom->getElementsByTagName("executed"));
+      $coverage_dom->getElementsByTagName('executed'));
 
     foreach ($instrumented as $instrument) {
-      $absolute_file = $instrument["file"];
+      $absolute_file = $instrument['file'];
       $relative_file = substr($absolute_file, strlen($this->projectRoot) + 1);
       if (!in_array($relative_file, $files)) {
         $files[] = $relative_file;
@@ -254,24 +254,24 @@
       }
 
       foreach ($instrumented as $instrument) {
-        if ($instrument["file"] !== $absolute_file) {
+        if ($instrument['file'] !== $absolute_file) {
           continue;
         }
         for (
-          $i = $instrument["start"];
-          $i <= $instrument["end"];
+          $i = $instrument['start'];
+          $i <= $instrument['end'];
           $i++) {
           $coverage[$i - 1] = 'U';
         }
       }
 
       foreach ($executed as $execute) {
-        if ($execute["file"] !== $absolute_file) {
+        if ($execute['file'] !== $absolute_file) {
           continue;
         }
         for (
-          $i = $execute["start"];
-          $i <= $execute["end"];
+          $i = $execute['start'];
+          $i <= $execute['end'];
           $i++) {
           $coverage[$i - 1] = 'C';
         }
diff --git a/src/unit/engine/GoTestResultParser.php b/src/unit/engine/GoTestResultParser.php
--- a/src/unit/engine/GoTestResultParser.php
+++ b/src/unit/engine/GoTestResultParser.php
@@ -28,13 +28,13 @@
 
     $results = array();
     // We'll get our full test case name at the end and add it back in
-    $test_case_name = "";
+    $test_case_name = '';
 
     // Temp store for test case results (in case we run multiple test cases)
     $test_case_results = array();
     foreach ($test_results as $i => $line) {
 
-      if (strncmp($line, "--- PASS", 8) === 0) {
+      if (strncmp($line, '--- PASS', 8) === 0) {
         // We have a passing test
         $meta = array();
         preg_match(
@@ -53,7 +53,7 @@
         continue;
       }
 
-      if (strncmp($line, "--- FAIL", 8) === 0) {
+      if (strncmp($line, '--- FAIL', 8) === 0) {
         // We have a failing test
         $reason = trim($test_results[$i + 1]);
         $meta = array();
@@ -73,21 +73,21 @@
         continue;
       }
 
-      if (strncmp($line, "ok", 2) === 0) {
+      if (strncmp($line, 'ok', 2) === 0) {
         $meta = array();
         preg_match(
           '/^ok[\s\t]+(?P<test_name>\w.*)[\s\t]+(?P<time>.*)s.*/',
           $line,
           $meta);
 
-        $test_case_name = str_replace("/", "::", $meta['test_name']);
+        $test_case_name = str_replace('/', '::', $meta['test_name']);
 
         // Our test case passed
         // check to make sure we were in verbose (-v) mode
         if (empty($test_case_results)) {
           // We weren't in verbose mode
           // create one successful result for the whole test case
-          $test_name = "Go::TestCase::".$test_case_name;
+          $test_name = 'Go::TestCase::'.$test_case_name;
 
           $result = new ArcanistUnitTestResult();
           $result->setName($test_name);
@@ -113,7 +113,7 @@
           $line,
           $meta);
 
-        $test_case_name = str_replace("/", "::", $meta['test_name']);
+        $test_case_name = str_replace('/', '::', $meta['test_name']);
 
         $test_case_results = $this->fixNames(
           $test_case_results,
@@ -132,7 +132,7 @@
 
     foreach ($test_case_results as &$result) {
       $test_name = $result->getName();
-      $result->setName("Go::Test::".$test_case_name."::".$test_name);
+      $result->setName('Go::Test::'.$test_case_name.'::'.$test_name);
     }
 
     return $test_case_results;
diff --git a/src/unit/engine/NoseTestEngine.php b/src/unit/engine/NoseTestEngine.php
--- a/src/unit/engine/NoseTestEngine.php
+++ b/src/unit/engine/NoseTestEngine.php
@@ -18,7 +18,7 @@
       $absolute_path = Filesystem::resolvePath($path);
 
       if (is_dir($absolute_path)) {
-        $absolute_test_path = Filesystem::resolvePath("tests/".$path);
+        $absolute_test_path = Filesystem::resolvePath('tests/'.$path);
         if (is_readable($absolute_test_path)) {
           $affected_tests[] = $absolute_test_path;
         }
@@ -29,7 +29,7 @@
         $directory = dirname($path);
 
         // assumes directory layout: tests/<package>/test_<module>.py
-        $relative_test_path = "tests/".$directory."/test_".$filename;
+        $relative_test_path = 'tests/'.$directory.'/test_'.$filename;
         $absolute_test_path = Filesystem::resolvePath($relative_test_path);
 
         if (is_readable($absolute_test_path)) {
@@ -87,16 +87,16 @@
   }
 
   public function buildTestFuture($path, $xunit_tmp, $cover_tmp) {
-    $cmd_line = csprintf("nosetests --with-xunit --xunit-file=%s",
+    $cmd_line = csprintf('nosetests --with-xunit --xunit-file=%s',
                          $xunit_tmp);
 
     if ($this->getEnableCoverage() !== false) {
-      $cmd_line .= csprintf(" --with-coverage --cover-xml " .
-                            "--cover-xml-file=%s",
+      $cmd_line .= csprintf(' --with-coverage --cover-xml ' .
+                            '--cover-xml-file=%s',
                             $cover_tmp);
     }
 
-    return new ExecFuture("%C %s", $cmd_line, $path);
+    return new ExecFuture('%C %s', $cmd_line, $path);
   }
 
   public function parseTestResults($source_path, $xunit_tmp, $cover_tmp) {
@@ -119,10 +119,10 @@
     $coverage_dom->loadXML(Filesystem::readFile($cover_file));
 
     $reports = array();
-    $classes = $coverage_dom->getElementsByTagName("class");
+    $classes = $coverage_dom->getElementsByTagName('class');
 
     foreach ($classes as $class) {
-      $path = $class->getAttribute("filename");
+      $path = $class->getAttribute('filename');
       $root = $this->getWorkingCopy()->getProjectRoot();
 
       if (!Filesystem::isDescendant($path, $root)) {
@@ -132,21 +132,21 @@
       // get total line count in file
       $line_count = count(phutil_split_lines(Filesystem::readFile($path)));
 
-      $coverage = "";
+      $coverage = '';
       $start_line = 1;
-      $lines = $class->getElementsByTagName("line");
+      $lines = $class->getElementsByTagName('line');
       for ($ii = 0; $ii < $lines->length; $ii++) {
         $line = $lines->item($ii);
 
-        $next_line = intval($line->getAttribute("number"));
+        $next_line = intval($line->getAttribute('number'));
         for ($start_line; $start_line < $next_line; $start_line++) {
-          $coverage .= "N";
+          $coverage .= 'N';
         }
 
-        if (intval($line->getAttribute("hits")) == 0) {
-          $coverage .= "U";
-        } else if (intval($line->getAttribute("hits")) > 0) {
-          $coverage .= "C";
+        if (intval($line->getAttribute('hits')) == 0) {
+          $coverage .= 'U';
+        } else if (intval($line->getAttribute('hits')) > 0) {
+          $coverage .= 'C';
         }
 
         $start_line++;
@@ -154,7 +154,7 @@
 
       if ($start_line < $line_count) {
         foreach (range($start_line, $line_count) as $line_num) {
-          $coverage .= "N";
+          $coverage .= 'N';
         }
       }
 
diff --git a/src/unit/engine/PhpunitTestEngine.php b/src/unit/engine/PhpunitTestEngine.php
--- a/src/unit/engine/PhpunitTestEngine.php
+++ b/src/unit/engine/PhpunitTestEngine.php
@@ -71,7 +71,7 @@
 
       $config = $this->configFile ? csprintf('-c %s', $this->configFile) : null;
 
-      $stderr = "-d display_errors=stderr";
+      $stderr = '-d display_errors=stderr';
 
       $futures[$test_path] = new ExecFuture('%C %C %C --log-json %s %C %s',
         $this->phpunitBinary, $config, $stderr, $json_tmp, $clover, $test_path);
diff --git a/src/unit/engine/PhutilUnitTestEngine.php b/src/unit/engine/PhutilUnitTestEngine.php
--- a/src/unit/engine/PhutilUnitTestEngine.php
+++ b/src/unit/engine/PhutilUnitTestEngine.php
@@ -19,7 +19,7 @@
     }
 
     if (!$run_tests) {
-      throw new ArcanistNoEffectException("No tests to run.");
+      throw new ArcanistNoEffectException('No tests to run.');
     }
 
     $enable_coverage = $this->getEnableCoverage();
@@ -27,8 +27,8 @@
       if (!function_exists('xdebug_start_code_coverage')) {
         if ($enable_coverage === true) {
           throw new ArcanistUsageException(
-            "You specified --coverage but xdebug is not available, so ".
-            "coverage can not be enabled for PhutilUnitTestEngine.");
+            'You specified --coverage but xdebug is not available, so '.
+            'coverage can not be enabled for PhutilUnitTestEngine.');
         }
       } else {
         $enable_coverage = true;
diff --git a/src/unit/engine/PytestTestEngine.php b/src/unit/engine/PytestTestEngine.php
--- a/src/unit/engine/PytestTestEngine.php
+++ b/src/unit/engine/PytestTestEngine.php
@@ -64,29 +64,29 @@
 
     $paths = $this->getPaths();
     $reports = array();
-    $classes = $coverage_dom->getElementsByTagName("class");
+    $classes = $coverage_dom->getElementsByTagName('class');
 
     foreach ($classes as $class) {
       // filename is actually python module path with ".py" at the end,
       // e.g.: tornado.web.py
-      $relative_path = explode(".", $class->getAttribute("filename"));
+      $relative_path = explode('.', $class->getAttribute('filename'));
       array_pop($relative_path);
-      $relative_path = implode("/", $relative_path);
+      $relative_path = implode('/', $relative_path);
 
       // first we check if the path is a directory (a Python package), if it is
       // set relative and absolute paths to have __init__.py at the end.
       $absolute_path = Filesystem::resolvePath($relative_path);
       if (is_dir($absolute_path)) {
-        $relative_path .= "/__init__.py";
-        $absolute_path .= "/__init__.py";
+        $relative_path .= '/__init__.py';
+        $absolute_path .= '/__init__.py';
       }
 
       // then we check if the path with ".py" at the end is file (a Python
       // submodule), if it is - set relative and absolute paths to have
       // ".py" at the end.
-      if (is_file($absolute_path.".py")) {
-        $relative_path .= ".py";
-        $absolute_path .= ".py";
+      if (is_file($absolute_path.'.py')) {
+        $relative_path .= '.py';
+        $absolute_path .= '.py';
       }
 
       if (!file_exists($absolute_path)) {
@@ -100,22 +100,22 @@
       // get total line count in file
       $line_count = count(file($absolute_path));
 
-      $coverage = "";
+      $coverage = '';
       $start_line = 1;
-      $lines = $class->getElementsByTagName("line");
+      $lines = $class->getElementsByTagName('line');
       for ($ii = 0; $ii < $lines->length; $ii++) {
         $line = $lines->item($ii);
 
-        $next_line = intval($line->getAttribute("number"));
+        $next_line = intval($line->getAttribute('number'));
         for ($start_line; $start_line < $next_line; $start_line++) {
-            $coverage .= "N";
+            $coverage .= 'N';
         }
 
-        if (intval($line->getAttribute("hits")) == 0) {
-            $coverage .= "U";
+        if (intval($line->getAttribute('hits')) == 0) {
+            $coverage .= 'U';
         }
-        else if (intval($line->getAttribute("hits")) > 0) {
-            $coverage .= "C";
+        else if (intval($line->getAttribute('hits')) > 0) {
+            $coverage .= 'C';
         }
 
         $start_line++;
@@ -123,7 +123,7 @@
 
       if ($start_line < $line_count) {
         foreach (range($start_line, $line_count) as $line_num) {
-          $coverage .= "N";
+          $coverage .= 'N';
         }
       }
 
diff --git a/src/unit/engine/XUnitTestEngine.php b/src/unit/engine/XUnitTestEngine.php
--- a/src/unit/engine/XUnitTestEngine.php
+++ b/src/unit/engine/XUnitTestEngine.php
@@ -38,21 +38,21 @@
     $this->projectRoot = $this->getWorkingCopy()->getProjectRoot();
 
     // Determine build engine.
-    if (Filesystem::binaryExists("msbuild")) {
-      $this->buildEngine = "msbuild";
-    } else if (Filesystem::binaryExists("xbuild")) {
-      $this->buildEngine = "xbuild";
+    if (Filesystem::binaryExists('msbuild')) {
+      $this->buildEngine = 'msbuild';
+    } else if (Filesystem::binaryExists('xbuild')) {
+      $this->buildEngine = 'xbuild';
     } else {
-      throw new Exception("Unable to find msbuild or xbuild in PATH!");
+      throw new Exception('Unable to find msbuild or xbuild in PATH!');
     }
 
     // Determine runtime engine (.NET or Mono).
     if (phutil_is_windows()) {
-      $this->runtimeEngine = "";
-    } else if (Filesystem::binaryExists("mono")) {
-      $this->runtimeEngine = Filesystem::resolveBinary("mono");
+      $this->runtimeEngine = '';
+    } else if (Filesystem::binaryExists('mono')) {
+      $this->runtimeEngine = Filesystem::resolveBinary('mono');
     } else {
-      throw new Exception("Unable to find Mono and you are not on Windows!");
+      throw new Exception('Unable to find Mono and you are not on Windows!');
     }
 
     // Read the discovery rules.
@@ -61,8 +61,8 @@
         'unit.csharp.discovery');
     if ($this->discoveryRules === null) {
       throw new Exception(
-        "You must configure discovery rules to map C# files ".
-        "back to test projects (`unit.csharp.discovery` in .arcconfig).");
+        'You must configure discovery rules to map C# files '.
+        'back to test projects (`unit.csharp.discovery` in .arcconfig).');
     }
 
     // Determine xUnit test runner path.
@@ -74,8 +74,8 @@
     $xunit = $this->projectRoot.DIRECTORY_SEPARATOR.$this->xunitHintPath;
     if (file_exists($xunit) && $this->xunitHintPath !== null) {
       $this->testEngine = Filesystem::resolvePath($xunit);
-    } else if (Filesystem::binaryExists("xunit.console.clr4.exe")) {
-      $this->testEngine = "xunit.console.clr4.exe";
+    } else if (Filesystem::binaryExists('xunit.console.clr4.exe')) {
+      $this->testEngine = 'xunit.console.clr4.exe';
     } else {
       throw new Exception(
         "Unable to locate xUnit console runner.  Configure ".
@@ -204,23 +204,23 @@
   private function generateProjects() {
 
     // No "Build" directory; so skip generation of projects.
-    if (!is_dir(Filesystem::resolvePath($this->projectRoot."/Build"))) {
+    if (!is_dir(Filesystem::resolvePath($this->projectRoot.'/Build'))) {
       return array();
     }
 
     // No "Protobuild.exe" file; so skip generation of projects.
     if (!is_file(Filesystem::resolvePath(
-      $this->projectRoot."/Protobuild.exe"))) {
+      $this->projectRoot.'/Protobuild.exe'))) {
 
       return array();
     }
 
     // Work out what platform the user is building for already.
-    $platform = phutil_is_windows() ? "Windows" : "Linux";
+    $platform = phutil_is_windows() ? 'Windows' : 'Linux';
     $files = Filesystem::listDirectory($this->projectRoot);
     foreach ($files as $file) {
-      if (strtolower(substr($file, -4)) == ".sln") {
-        $parts = explode(".", $file);
+      if (strtolower(substr($file, -4)) == '.sln') {
+        $parts = explode('.', $file);
         $platform = $parts[count($parts) - 2];
         break;
       }
@@ -228,7 +228,7 @@
 
     $regenerate_start = microtime(true);
     $regenerate_future = new ExecFuture(
-      "%C Protobuild.exe --resync %s",
+      '%C Protobuild.exe --resync %s',
       $this->runtimeEngine,
       $platform);
     $regenerate_future->setCWD(Filesystem::resolvePath(
@@ -271,9 +271,9 @@
     $results = array();
     foreach ($test_assemblies as $test_assembly) {
       $build_future = new ExecFuture(
-        "%C %s",
+        '%C %s',
         $this->buildEngine,
-        "/p:SkipTestsOnBuild=True");
+        '/p:SkipTestsOnBuild=True');
       $build_future->setCWD(Filesystem::resolvePath(
         dirname($test_assembly['project'])));
       $build_futures[$test_assembly['project']] = $build_future;
@@ -281,7 +281,7 @@
     $iterator = Futures($build_futures)->limit(1);
     foreach ($iterator as $test_assembly => $future) {
       $result = new ArcanistUnitTestResult();
-      $result->setName("(build) ".$test_assembly);
+      $result->setName('(build) '.$test_assembly);
 
       try {
         $future->resolvex();
@@ -314,20 +314,20 @@
       // FIXME: Can't use TempFile here as xUnit doesn't like
       // UNIX-style full paths.  It sees the leading / as the
       // start of an option flag, even when quoted.
-      $xunit_temp = Filesystem::readRandomCharacters(10).".results.xml";
+      $xunit_temp = Filesystem::readRandomCharacters(10).'.results.xml';
       if (file_exists($xunit_temp)) {
         unlink($xunit_temp);
       }
       $future = new ExecFuture(
-        "%C %s /xml %s",
-        trim($this->runtimeEngine." ".$this->testEngine),
+        '%C %s /xml %s',
+        trim($this->runtimeEngine.' '.$this->testEngine),
         $test_assembly,
         $xunit_temp);
       $folder = Filesystem::resolvePath($this->projectRoot);
       $future->setCWD($folder);
-      $combined = $folder."/".$xunit_temp;
+      $combined = $folder.'/'.$xunit_temp;
       if (phutil_is_windows()) {
-        $combined = $folder."\\".$xunit_temp;
+        $combined = $folder.'\\'.$xunit_temp;
       }
       return array($future, $combined, null);
   }
@@ -408,32 +408,32 @@
     $xunit_dom->loadXML(Filesystem::readFile($xunit_tmp));
 
     $results = array();
-    $tests = $xunit_dom->getElementsByTagName("test");
+    $tests = $xunit_dom->getElementsByTagName('test');
     foreach ($tests as $test) {
-      $name = $test->getAttribute("name");
-      $time = $test->getAttribute("time");
+      $name = $test->getAttribute('name');
+      $time = $test->getAttribute('time');
       $status = ArcanistUnitTestResult::RESULT_UNSOUND;
-      switch ($test->getAttribute("result")) {
-        case "Pass":
+      switch ($test->getAttribute('result')) {
+        case 'Pass':
           $status = ArcanistUnitTestResult::RESULT_PASS;
           break;
-        case "Fail":
+        case 'Fail':
           $status = ArcanistUnitTestResult::RESULT_FAIL;
           break;
-        case "Skip":
+        case 'Skip':
           $status = ArcanistUnitTestResult::RESULT_SKIP;
           break;
       }
-      $userdata = "";
-      $reason = $test->getElementsByTagName("reason");
-      $failure = $test->getElementsByTagName("failure");
+      $userdata = '';
+      $reason = $test->getElementsByTagName('reason');
+      $failure = $test->getElementsByTagName('failure');
       if ($reason->length > 0 || $failure->length > 0) {
         $node = ($reason->length > 0) ? $reason : $failure;
-        $message = $node->item(0)->getElementsByTagName("message");
+        $message = $node->item(0)->getElementsByTagName('message');
         if ($message->length > 0) {
           $userdata = $message->item(0)->nodeValue;
         }
-        $stacktrace = $node->item(0)->getElementsByTagName("stack-trace");
+        $stacktrace = $node->item(0)->getElementsByTagName('stack-trace');
         if ($stacktrace->length > 0) {
           $userdata .= "\n".$stacktrace->item(0)->nodeValue;
         }
diff --git a/src/unit/engine/__tests__/GoTestResultParserTestCase.php b/src/unit/engine/__tests__/GoTestResultParserTestCase.php
--- a/src/unit/engine/__tests__/GoTestResultParserTestCase.php
+++ b/src/unit/engine/__tests__/GoTestResultParserTestCase.php
@@ -19,7 +19,7 @@
 
     $this->assertEqual(2, count($parsed_results));
     $this->assertEqual(
-      "Go::Test::package::subpackage::TestFoo",
+      'Go::Test::package::subpackage::TestFoo',
       $parsed_results[0]->getName());
     foreach ($parsed_results as $result) {
       $this->assertEqual(
@@ -53,10 +53,10 @@
 
     $this->assertEqual(3, count($parsed_results));
     $this->assertEqual(
-      "Go::Test::package::subpackage1::TestFoo1",
+      'Go::Test::package::subpackage1::TestFoo1',
       $parsed_results[0]->getName());
     $this->assertEqual(
-      "Go::Test::package::subpackage2::TestFoo2",
+      'Go::Test::package::subpackage2::TestFoo2',
       $parsed_results[2]->getName());
     foreach ($parsed_results as $result) {
       $this->assertEqual(
@@ -74,10 +74,10 @@
 
     $this->assertEqual(3, count($parsed_results));
     $this->assertEqual(
-      "Go::Test::package::subpackage1::TestFoo1",
+      'Go::Test::package::subpackage1::TestFoo1',
       $parsed_results[0]->getName());
     $this->assertEqual(
-      "Go::Test::package::subpackage2::TestFoo2",
+      'Go::Test::package::subpackage2::TestFoo2',
       $parsed_results[2]->getName());
     $this->assertEqual(
       ArcanistUnitTestResult::RESULT_PASS,
@@ -96,10 +96,10 @@
 
     $this->assertEqual(2, count($parsed_results));
     $this->assertEqual(
-      "Go::TestCase::package::subpackage1",
+      'Go::TestCase::package::subpackage1',
       $parsed_results[0]->getName());
     $this->assertEqual(
-      "Go::TestCase::package::subpackage2",
+      'Go::TestCase::package::subpackage2',
       $parsed_results[1]->getName());
     foreach ($parsed_results as $result) {
       $this->assertEqual(
diff --git a/src/unit/engine/__tests__/PhutilUnitTestEngineTestCase.php b/src/unit/engine/__tests__/PhutilUnitTestEngineTestCase.php
--- a/src/unit/engine/__tests__/PhutilUnitTestEngineTestCase.php
+++ b/src/unit/engine/__tests__/PhutilUnitTestEngineTestCase.php
@@ -43,7 +43,7 @@
   public function __destruct() {
     if (self::$allTestsCounter !== 0) {
       throw new Exception(
-        "didRunTests() was not called correctly after tests completed!");
+        'didRunTests() was not called correctly after tests completed!');
     }
   }
 
@@ -107,7 +107,7 @@
 
   protected function throwIfFalsey($input) {
     if (!$input) {
-      throw new Exception("This is a negative test case!");
+      throw new Exception('This is a negative test case!');
     }
   }
 
diff --git a/src/unit/engine/phutil/ArcanistPhutilTestCase.php b/src/unit/engine/phutil/ArcanistPhutilTestCase.php
--- a/src/unit/engine/phutil/ArcanistPhutilTestCase.php
+++ b/src/unit/engine/phutil/ArcanistPhutilTestCase.php
@@ -97,13 +97,13 @@
 
     if ($message !== null) {
       $output = pht(
-        "Assertion failed, expected values to be equal (at %s:%d): %s",
+        'Assertion failed, expected values to be equal (at %s:%d): %s',
         $file,
         $line,
         $message);
     } else {
       $output = pht(
-        "Assertion failed, expected values to be equal (at %s:%d).",
+        'Assertion failed, expected values to be equal (at %s:%d).',
         $file,
         $line);
     }
@@ -216,7 +216,7 @@
 
     if (count($inputs) !== count($expect)) {
       $this->assertFailure(
-        "Input and expectations must have the same number of values.");
+        'Input and expectations must have the same number of values.');
     }
 
     $labels = array_keys($inputs);
@@ -500,7 +500,7 @@
               throw head($exceptions);
             } else {
               throw new PhutilAggregateException(
-                "Multiple exceptions were raised during test execution.",
+                'Multiple exceptions were raised during test execution.',
                 $exceptions);
             }
           }
diff --git a/src/unit/renderer/ArcanistUnitConsoleRenderer.php b/src/unit/renderer/ArcanistUnitConsoleRenderer.php
--- a/src/unit/renderer/ArcanistUnitConsoleRenderer.php
+++ b/src/unit/renderer/ArcanistUnitConsoleRenderer.php
@@ -57,7 +57,7 @@
     $star = "\xE2\x98\x85";
     if (phutil_is_windows()) {
       // Fall-back to normal asterisk for Windows consoles.
-      $star = "*";
+      $star = '*';
     }
     $acceptableness = array(
       50   => "<fg:green>%s</fg><fg:yellow>{$star}</fg> ",
diff --git a/src/workflow/ArcanistAmendWorkflow.php b/src/workflow/ArcanistAmendWorkflow.php
--- a/src/workflow/ArcanistAmendWorkflow.php
+++ b/src/workflow/ArcanistAmendWorkflow.php
@@ -73,15 +73,15 @@
 
       if ($this->isHistoryImmutable()) {
         throw new ArcanistUsageException(
-          "This project is marked as adhering to a conservative history ".
-          "mutability doctrine (having an immutable local history), which ".
-          "precludes amending commit messages.");
+          'This project is marked as adhering to a conservative history '.
+          'mutability doctrine (having an immutable local history), which '.
+          'precludes amending commit messages.');
       }
 
       if ($repository_api->getUncommittedChanges()) {
         throw new ArcanistUsageException(
-          "You have uncommitted changes in this branch. Stage and commit (or ".
-          "revert) them before proceeding.");
+          'You have uncommitted changes in this branch. Stage and commit (or '.
+          'revert) them before proceeding.');
       }
     }
 
diff --git a/src/workflow/ArcanistBackoutWorkflow.php b/src/workflow/ArcanistBackoutWorkflow.php
--- a/src/workflow/ArcanistBackoutWorkflow.php
+++ b/src/workflow/ArcanistBackoutWorkflow.php
@@ -62,12 +62,12 @@
         'The revision you provided does not exist!');
     }
     $revision = $revisions[0];
-    $commits = $revision["commits"];
+    $commits = $revision['commits'];
     if (!$commits) {
       throw new ArcanistUsageException(
         'This revision has not been committed yet!');
     }
-    elseif (count($commits) > 1) {
+    else if (count($commits) > 1) {
       throw new ArcanistUsageException(
         'The revision you provided has multiple commits!');
     }
@@ -77,7 +77,7 @@
       array(
         'phids' => array($commit_phid),
       ));
-    $commit_id = $commit[$commit_phid]["name"];
+    $commit_id = $commit[$commit_phid]['name'];
     return $commit_id;
   }
 
@@ -91,7 +91,7 @@
       ));
     $commit = $result[$commit_id];
     // This commit was not found in Diffusion
-    if (array_key_exists("error", $commit)) {
+    if (array_key_exists('error', $commit)) {
       return null;
     }
     return $commit;
diff --git a/src/workflow/ArcanistBaseWorkflow.php b/src/workflow/ArcanistBaseWorkflow.php
--- a/src/workflow/ArcanistBaseWorkflow.php
+++ b/src/workflow/ArcanistBaseWorkflow.php
@@ -139,7 +139,7 @@
   final public function setConduitURI($conduit_uri) {
     if ($this->conduit) {
       throw new Exception(
-        "You can not change the Conduit URI after a conduit is already open.");
+        'You can not change the Conduit URI after a conduit is already open.');
     }
     $this->conduitURI = $conduit_uri;
     return $this;
@@ -176,8 +176,8 @@
 
     if (!$this->conduitURI) {
       throw new Exception(
-        "You must specify a Conduit URI with setConduitURI() before you can ".
-        "establish a conduit.");
+        'You must specify a Conduit URI with setConduitURI() before you can '.
+        'establish a conduit.');
     }
 
     $this->conduit = new ConduitClient($this->conduitURI);
@@ -222,7 +222,7 @@
   final public function setConduitCredentials(array $credentials) {
     if ($this->isConduitAuthenticated()) {
       throw new Exception(
-        "You may not set new credentials after authenticating conduit.");
+        'You may not set new credentials after authenticating conduit.');
     }
 
     $this->conduitCredentials = $credentials;
@@ -315,8 +315,8 @@
     try {
       if (!$credentials) {
         throw new Exception(
-          "Set conduit credentials with setConduitCredentials() before ".
-          "authenticating conduit!");
+          'Set conduit credentials with setConduitCredentials() before '.
+          'authenticating conduit!');
       }
 
       if (empty($credentials['user'])) {
@@ -349,10 +349,10 @@
         $message =
           "\n".
           phutil_console_format(
-            "YOU NEED TO __INSTALL A CERTIFICATE__ TO LOGIN TO PHABRICATOR").
+            'YOU NEED TO __INSTALL A CERTIFICATE__ TO LOGIN TO PHABRICATOR').
           "\n\n".
           phutil_console_format(
-            "    To do this, run: **arc install-certificate**").
+            '    To do this, run: **arc install-certificate**').
           "\n\n".
           "The server '{$conduit_uri}' rejected your request:".
           "\n".
@@ -368,7 +368,7 @@
         echo "In most cases, arc can be upgraded automatically.\n";
 
         $ok = phutil_console_confirm(
-          "Upgrade arc now?",
+          'Upgrade arc now?',
           $default_no = false);
         if (!$ok) {
           throw $ex;
@@ -897,7 +897,7 @@
           $this->stashed = true;
         } else {
           throw new ArcanistUsageException(
-            "Stage and commit (or revert) them before proceeding.");
+            'Stage and commit (or revert) them before proceeding.');
         }
       }
     }
@@ -917,7 +917,7 @@
         $must_commit += array_flip($uncommitted);
       } else {
         throw new ArcanistUncommittedChangesException(
-          "Commit (or revert) them before proceeding.");
+          'Commit (or revert) them before proceeding.');
       }
     }
 
@@ -926,7 +926,7 @@
         $commit = head($api->getLocalCommitInformation());
         $api->amendCommit($commit['message']);
       } else if ($api->supportsLocalCommits()) {
-        $commit_message = phutil_console_prompt("Enter commit message:");
+        $commit_message = phutil_console_prompt('Enter commit message:');
         if ($commit_message == '') {
           $commit_message = self::AUTO_COMMIT_TITLE;
         }
@@ -1116,7 +1116,7 @@
         $parser = $this->newDiffParser();
         $changes = $parser->parseDiff($diff);
         if (count($changes) != 1) {
-          throw new Exception("Expected exactly one change.");
+          throw new Exception('Expected exactly one change.');
         }
         $this->changeCache[$path] = reset($changes);
       }
@@ -1128,7 +1128,7 @@
         }
       }
     } else {
-      throw new Exception("Missing VCS support.");
+      throw new Exception('Missing VCS support.');
     }
 
     if (empty($this->changeCache[$path])) {
@@ -1516,13 +1516,13 @@
     $api = $this->getRepositoryAPI();
     if (!$api->supportsCommitRanges()) {
       throw new ArcanistUsageException(
-        "This version control system does not support commit ranges.");
+        'This version control system does not support commit ranges.');
     }
 
     if (count($argv) > 1) {
       throw new ArcanistUsageException(
-        "Specify exactly one base commit. The end of the commit range is ".
-        "always the working copy state.");
+        'Specify exactly one base commit. The end of the commit range is '.
+        'always the working copy state.');
     }
 
     $api->setBaseCommit(head($argv));
diff --git a/src/workflow/ArcanistCallConduitWorkflow.php b/src/workflow/ArcanistCallConduitWorkflow.php
--- a/src/workflow/ArcanistCallConduitWorkflow.php
+++ b/src/workflow/ArcanistCallConduitWorkflow.php
@@ -58,7 +58,7 @@
     $method = $this->getArgument('method', array());
     if (count($method) !== 1) {
       throw new ArcanistUsageException(
-        "Provide exactly one Conduit method name.");
+        'Provide exactly one Conduit method name.');
     }
     $method = reset($method);
 
@@ -68,7 +68,7 @@
     $params = json_decode($params, true);
     if (!is_array($params)) {
       throw new ArcanistUsageException(
-        "Provide method parameters on stdin as a JSON blob.");
+        'Provide method parameters on stdin as a JSON blob.');
     }
 
     $error = null;
diff --git a/src/workflow/ArcanistCloseRevisionWorkflow.php b/src/workflow/ArcanistCloseRevisionWorkflow.php
--- a/src/workflow/ArcanistCloseRevisionWorkflow.php
+++ b/src/workflow/ArcanistCloseRevisionWorkflow.php
@@ -70,11 +70,11 @@
     $revision_list = $this->getArgument('revision', array());
     if (!$revision_list) {
       throw new ArcanistUsageException(
-        "close-revision requires a revision number.");
+        'close-revision requires a revision number.');
     }
     if (count($revision_list) != 1) {
       throw new ArcanistUsageException(
-        "close-revision requires exactly one revision.");
+        'close-revision requires exactly one revision.');
     }
     $revision_id = reset($revision_list);
     $revision_id = $this->normalizeRevisionID($revision_id);
diff --git a/src/workflow/ArcanistCloseWorkflow.php b/src/workflow/ArcanistCloseWorkflow.php
--- a/src/workflow/ArcanistCloseWorkflow.php
+++ b/src/workflow/ArcanistCloseWorkflow.php
@@ -109,7 +109,7 @@
     }
 
     foreach ($ids as $id) {
-      if (!preg_match("/^T?\d+$/", $id)) {
+      if (!preg_match('/^T?\d+$/', $id)) {
         echo "Invalid Task ID: {$id}.\n";
         return 1;
       }
@@ -125,7 +125,7 @@
     return 0;
   }
 
-  private function closeTask($task_id, $status, $comment = "") {
+  private function closeTask($task_id, $status, $comment = '') {
     $conduit = $this->getConduit();
     $info = $conduit->callMethodSynchronous(
       'maniphest.info',
diff --git a/src/workflow/ArcanistCommitWorkflow.php b/src/workflow/ArcanistCommitWorkflow.php
--- a/src/workflow/ArcanistCommitWorkflow.php
+++ b/src/workflow/ArcanistCommitWorkflow.php
@@ -52,14 +52,14 @@
     return array(
       'show' => array(
         'help' =>
-          "Show the command which would be issued, but do not actually ".
-          "commit anything."
+          'Show the command which would be issued, but do not actually '.
+          'commit anything.'
       ),
       'revision' => array(
         'param' => 'revision_id',
         'help' =>
-          "Commit a specific revision. If you do not specify a revision, ".
-          "arc will look for committable revisions.",
+          'Commit a specific revision. If you do not specify a revision, '.
+          'arc will look for committable revisions.',
       )
     );
   }
@@ -246,7 +246,7 @@
       $prefix = pht(
         'Revision includes changes to path(s) that do not exist:',
         count($do_not_exist));
-      $prompt = "Commit this revision anyway?";
+      $prompt = 'Commit this revision anyway?';
       $this->promptFileWarning($prefix, $prompt, $do_not_exist);
     }
 
@@ -255,7 +255,7 @@
 
     if (empty($files)) {
       throw new ArcanistUsageException(
-        "There is nothing left to commit. None of the modified paths exist.");
+        'There is nothing left to commit. None of the modified paths exist.');
     }
 
     return $files;
diff --git a/src/workflow/ArcanistCoverWorkflow.php b/src/workflow/ArcanistCoverWorkflow.php
--- a/src/workflow/ArcanistCoverWorkflow.php
+++ b/src/workflow/ArcanistCoverWorkflow.php
@@ -39,7 +39,7 @@
           'hg',
         ),
         'nosupport' => array(
-          'svn' => "cover does not currently support --rev in svn.",
+          'svn' => 'cover does not currently support --rev in svn.',
         ),
       ),
       '*' => 'paths',
diff --git a/src/workflow/ArcanistDiffWorkflow.php b/src/workflow/ArcanistDiffWorkflow.php
--- a/src/workflow/ArcanistDiffWorkflow.php
+++ b/src/workflow/ArcanistDiffWorkflow.php
@@ -86,8 +86,8 @@
         'short'       => 'm',
         'param'       => 'message',
         'help' =>
-          "When updating a revision, use the specified message instead of ".
-          "prompting.",
+          'When updating a revision, use the specified message instead of '.
+          'prompting.',
       ),
       'message-file' => array(
         'short' => 'F',
@@ -119,14 +119,14 @@
           'svn' => 'Edit revisions via the web interface when using SVN.',
         ),
         'help' =>
-          "When updating a revision under git, edit revision information ".
-          "before updating.",
+          'When updating a revision under git, edit revision information '.
+          'before updating.',
       ),
       'raw' => array(
         'help' =>
-          "Read diff from stdin, not from the working copy. This disables ".
-          "many Arcanist/Phabricator features which depend on having access ".
-          "to the working copy.",
+          'Read diff from stdin, not from the working copy. This disables '.
+          'many Arcanist/Phabricator features which depend on having access '.
+          'to the working copy.',
         'conflicts' => array(
           'less-context'        => null,
           'apply-patches'       => '--raw disables lint.',
@@ -144,9 +144,9 @@
       'raw-command' => array(
         'param' => 'command',
         'help' =>
-          "Generate diff by executing a specified command, not from the ".
-          "working copy. This disables many Arcanist/Phabricator features ".
-          "which depend on having access to the working copy.",
+          'Generate diff by executing a specified command, not from the '.
+          'working copy. This disables many Arcanist/Phabricator features '.
+          'which depend on having access to the working copy.',
         'conflicts' => array(
           'less-context'        => null,
           'apply-patches'       => '--raw-command disables lint.',
@@ -156,7 +156,7 @@
         ),
       ),
       'create' => array(
-        'help' => "Always create a new revision.",
+        'help' => 'Always create a new revision.',
         'conflicts' => array(
           'edit'    => '--create can not be used with --edit.',
           'only'    => '--create can not be used with --only.',
@@ -166,15 +166,15 @@
       ),
       'update' => array(
         'param' => 'revision_id',
-        'help'  => "Always update a specific revision.",
+        'help'  => 'Always update a specific revision.',
       ),
       'nounit' => array(
         'help' =>
-          "Do not run unit tests.",
+          'Do not run unit tests.',
       ),
       'nolint' => array(
         'help' =>
-          "Do not run lint.",
+          'Do not run lint.',
         'conflicts' => array(
           'lintall'   => '--nolint suppresses lint.',
           'advice'    => '--nolint suppresses lint.',
@@ -184,8 +184,8 @@
       ),
       'only' => array(
         'help' =>
-          "Only generate a diff, without running lint, unit tests, or other ".
-          "auxiliary steps. See also --preview.",
+          'Only generate a diff, without running lint, unit tests, or other '.
+          'auxiliary steps. See also --preview.',
         'conflicts' => array(
           'preview'   => null,
           'message'   => '--only does not affect revisions.',
@@ -198,9 +198,9 @@
       ),
       'preview' => array(
         'help' =>
-          "Instead of creating or updating a revision, only create a diff, ".
-          "which you may later attach to a revision. This still runs lint ".
-          "unit tests. See also --only.",
+          'Instead of creating or updating a revision, only create a diff, '.
+          'which you may later attach to a revision. This still runs lint '.
+          'unit tests. See also --only.',
         'conflicts' => array(
           'only'      => null,
           'edit'      => '--preview does affect revisions.',
@@ -209,7 +209,7 @@
       ),
       'plan-changes' => array(
         'help' =>
-          "Create or update a revision without requesting a code review.",
+          'Create or update a revision without requesting a code review.',
         'conflicts' => array(
           'only'     => '--only does not affect revisions.',
           'preview'  => '--preview does not affect revisions.',
@@ -218,11 +218,11 @@
       'encoding' => array(
         'param' => 'encoding',
         'help' =>
-          "Attempt to convert non UTF-8 hunks into specified encoding.",
+          'Attempt to convert non UTF-8 hunks into specified encoding.',
       ),
       'allow-untracked' => array(
         'help' =>
-          "Skip checks for untracked files in the working copy.",
+          'Skip checks for untracked files in the working copy.',
       ),
       'excuse' => array(
         'param' => 'excuse',
@@ -239,15 +239,15 @@
       ),
       'lintall' => array(
         'help' =>
-          "Raise all lint warnings, not just those on lines you changed.",
+          'Raise all lint warnings, not just those on lines you changed.',
         'passthru' => array(
           'lint' => true,
         ),
       ),
       'advice' => array(
         'help' =>
-          "Require excuse for lint advice in addition to lint warnings and ".
-          "errors.",
+          'Require excuse for lint advice in addition to lint warnings and '.
+          'errors.',
       ),
       'only-new' => array(
         'param' => 'bool',
@@ -374,7 +374,7 @@
       ),
       'cache' => array(
         'param' => 'bool',
-        'help' => "0 to disable lint cache, 1 to enable (default).",
+        'help' => '0 to disable lint cache, 1 to enable (default).',
         'passthru' => array(
           'lint' => true,
         ),
@@ -504,7 +504,7 @@
     $changes = $this->generateChanges();
     if (!$changes) {
       throw new ArcanistUsageException(
-        "There are no changes to generate a diff from!");
+        'There are no changes to generate a diff from!');
     }
 
     $diff_spec = array(
@@ -584,8 +584,8 @@
             echo "Updating commit message...\n";
             $repository_api->amendCommit($revised_message);
           } else {
-            echo "Commit message was not amended. Amending commit message is ".
-                 "only supported in git and hg (version 2.2 or newer)";
+            echo 'Commit message was not amended. Amending commit message is '.
+                 'only supported in git and hg (version 2.2 or newer)';
           }
         }
 
@@ -837,7 +837,7 @@
           "Modified 'svn:externals' files:".
           "\n\n".
           phutil_console_wrap(implode("\n", $warn_externals), 8));
-        $prompt = "Generate a diff (with just local changes) anyway?";
+        $prompt = 'Generate a diff (with just local changes) anyway?';
         if (!phutil_console_confirm($prompt)) {
           throw new ArcanistUserAbortException();
         } else {
@@ -871,7 +871,7 @@
       } else if ($this->getArgument('raw-command')) {
         list($raw_diff) = execx('%C', $this->getArgument('raw-command'));
       } else {
-        throw new Exception("Unknown raw diff source.");
+        throw new Exception('Unknown raw diff source.');
       }
 
       $changes = $parser->parseDiff($raw_diff);
@@ -940,25 +940,25 @@
       $diff = $repository_api->getFullGitDiff();
       if (!strlen($diff)) {
         throw new ArcanistUsageException(
-          "No changes found. (Did you specify the wrong commit range?)");
+          'No changes found. (Did you specify the wrong commit range?)');
       }
       $changes = $parser->parseDiff($diff);
     } else if ($repository_api instanceof ArcanistMercurialAPI) {
       $diff = $repository_api->getFullMercurialDiff();
       if (!strlen($diff)) {
         throw new ArcanistUsageException(
-          "No changes found. (Did you specify the wrong commit range?)");
+          'No changes found. (Did you specify the wrong commit range?)');
       }
       $changes = $parser->parseDiff($diff);
     } else {
-      throw new Exception("Repository API is not supported.");
+      throw new Exception('Repository API is not supported.');
     }
 
     if (count($changes) > 250) {
       $count = number_format(count($changes));
       $link =
-        "http://www.phabricator.com/docs/phabricator/article/".
-        "Differential_User_Guide_Large_Changes.html";
+        'http://www.phabricator.com/docs/phabricator/article/'.
+        'Differential_User_Guide_Large_Changes.html';
       $message =
         "This diff has a very large number of changes ({$count}). ".
         "Differential works best for changes which will receive detailed ".
@@ -967,7 +967,7 @@
         "checkins. Continue anyway?";
       if (!phutil_console_confirm($message)) {
         throw new ArcanistUsageException(
-          "Aborted generation of gigantic diff.");
+          'Aborted generation of gigantic diff.');
       }
     }
 
@@ -1003,7 +1003,7 @@
             $change->convertToBinaryChange($repository_api);
           } else {
             throw new ArcanistUsageException(
-              "Aborted generation of gigantic diff.");
+              'Aborted generation of gigantic diff.');
           }
         }
       }
@@ -1061,10 +1061,10 @@
     if ($utf8_problems) {
       $utf8_warning =
         pht(
-          "This diff includes file(s) which are not valid UTF-8 (they contain ".
-            "invalid byte sequences). You can either stop this workflow and ".
-            "fix these files, or continue. If you continue, these files will ".
-            "be marked as binary.",
+          'This diff includes file(s) which are not valid UTF-8 (they contain '.
+            'invalid byte sequences). You can either stop this workflow and '.
+            'fix these files, or continue. If you continue, these files will '.
+            'be marked as binary.',
           count($utf8_problems))."\n\n".
         "You can learn more about how Phabricator handles character encodings ".
         "(and how to configure encoding settings and detect and correct ".
@@ -1083,7 +1083,7 @@
       echo $file_list;
 
       if (!phutil_console_confirm($confirm, $default_no = false)) {
-        throw new ArcanistUsageException("Aborted workflow to fix UTF-8.");
+        throw new ArcanistUsageException('Aborted workflow to fix UTF-8.');
       } else {
         foreach ($utf8_problems as $change) {
           $change->convertToBinaryChange($repository_api);
@@ -1245,7 +1245,7 @@
               $lint_workflow->getUnresolvedMessages()) {
             $this->getErrorExcuse(
               'lint',
-              "Lint issued unresolved advice.",
+              'Lint issued unresolved advice.',
               'lint-excuses');
           } else {
             $this->console->writeOut(
@@ -1255,7 +1255,7 @@
         case ArcanistLintWorkflow::RESULT_WARNINGS:
           $this->getErrorExcuse(
             'lint',
-            "Lint issued unresolved warnings.",
+            'Lint issued unresolved warnings.',
             'lint-excuses');
           break;
         case ArcanistLintWorkflow::RESULT_ERRORS:
@@ -1263,7 +1263,7 @@
             "<bg:red>** LINT ERRORS **</bg> Lint raised errors!\n");
           $this->getErrorExcuse(
             'lint',
-            "Lint issued unresolved errors!",
+            'Lint issued unresolved errors!',
             'lint-excuses');
           break;
         case ArcanistLintWorkflow::RESULT_POSTPONED:
@@ -1325,8 +1325,8 @@
               "but all failing tests are unsound.\n");
           } else {
             $continue = $this->console->confirm(
-              "Unit test results included failures, but all failing tests ".
-              "are known to be unsound. Ignore unsound test failures?");
+              'Unit test results included failures, but all failing tests '.
+              'are known to be unsound. Ignore unsound test failures?');
             if (!$continue) {
               throw new ArcanistUserAbortException();
             }
@@ -1337,7 +1337,7 @@
             "<bg:red>** UNIT ERRORS **</bg> Unit testing raised errors!\n");
           $this->getErrorExcuse(
             'unit',
-            "Unit test results include failures!",
+            'Unit test results include failures!',
             'unit-excuses');
           break;
       }
@@ -1387,18 +1387,18 @@
     if ($this->getArgument('excuse')) {
       $this->console->sendMessage(array(
         'type'    => $type,
-        'confirm'  => $prompt." Ignore them?",
+        'confirm'  => $prompt.' Ignore them?',
       ));
       return;
     }
 
     $history = $this->getRepositoryAPI()->getScratchFilePath($history);
 
-    $prompt .= " Provide explanation to continue or press Enter to abort.";
+    $prompt .= ' Provide explanation to continue or press Enter to abort.';
     $this->console->writeOut("\n\n%s", phutil_console_wrap($prompt));
     $this->console->sendMessage(array(
       'type'    => $type,
-      'prompt'  => "Explanation:",
+      'prompt'  => 'Explanation:',
       'history' => $history,
     ));
   }
@@ -1542,7 +1542,7 @@
           "You can use this message, or discard it.";
 
         $use = phutil_console_confirm(
-          "Do you want to use this message?",
+          'Do you want to use this message?',
           $default_no = false);
         if ($use) {
           $template = $saved;
@@ -1592,9 +1592,9 @@
       }
       $included = array_merge(
         array(
-          "",
+          '',
           "Included commits{$in_branch}:",
-          "",
+          '',
         ),
         $included);
     }
@@ -1635,7 +1635,7 @@
       $first = false;
 
       if ($template_is_default && ($new_template == $template)) {
-        throw new ArcanistUsageException("Template not edited.");
+        throw new ArcanistUsageException('Template not edited.');
       }
 
       $template = ArcanistCommentRemover::removeComments($new_template);
@@ -1678,9 +1678,9 @@
           $issues[] = '  - '.$error;
         }
         echo "\n";
-        echo "You must resolve these errors to continue.";
+        echo 'You must resolve these errors to continue.';
         $again = phutil_console_confirm(
-          "Do you want to edit the message?",
+          'Do you want to edit the message?',
           $default_no = false);
         if ($again) {
           // Keep going.
@@ -1773,7 +1773,7 @@
 
     $reviewers = $message->getFieldValue('reviewerPHIDs');
     if (!$reviewers) {
-      $confirm = "You have not specified any reviewers. Continue anyway?";
+      $confirm = 'You have not specified any reviewers. Continue anyway?';
       if (!phutil_console_confirm($confirm)) {
         throw new ArcanistUsageException('Specify reviewers and retry.');
       }
@@ -2510,7 +2510,7 @@
       $change->setMetadata("{$type}:file:mime-type", $mime);
     }
 
-    echo pht("Uploading %d files...", count($need_upload))."\n";
+    echo pht('Uploading %d files...', count($need_upload))."\n";
 
     // Now we're ready to upload the actual file data. If possible, we'll just
     // transmit a hash of the file instead of the actual file data. If the data
@@ -2584,7 +2584,7 @@
       }
     }
 
-    echo pht("Upload complete.")."\n";
+    echo pht('Upload complete.')."\n";
   }
 
   private function getFileMimeType($data) {
diff --git a/src/workflow/ArcanistDownloadWorkflow.php b/src/workflow/ArcanistDownloadWorkflow.php
--- a/src/workflow/ArcanistDownloadWorkflow.php
+++ b/src/workflow/ArcanistDownloadWorkflow.php
@@ -52,15 +52,15 @@
   protected function didParseArguments() {
     $argv = $this->getArgument('argv');
     if (!$argv) {
-      throw new ArcanistUsageException("Specify a file to download.");
+      throw new ArcanistUsageException('Specify a file to download.');
     }
     if (count($argv) > 1) {
-      throw new ArcanistUsageException("Specify exactly one file to download.");
+      throw new ArcanistUsageException('Specify exactly one file to download.');
     }
 
     $file = reset($argv);
     if (!preg_match('/^F?\d+$/', $file)) {
-      throw new ArcanistUsageException("Specify file by ID, e.g. F123.");
+      throw new ArcanistUsageException('Specify file by ID, e.g. F123.');
     }
 
     $this->id = (int)ltrim($file, 'F');
diff --git a/src/workflow/ArcanistExportWorkflow.php b/src/workflow/ArcanistExportWorkflow.php
--- a/src/workflow/ArcanistExportWorkflow.php
+++ b/src/workflow/ArcanistExportWorkflow.php
@@ -66,19 +66,19 @@
       'encoding' => array(
         'param' => 'encoding',
         'help' =>
-          "Attempt to convert non UTF-8 patch into specified encoding.",
+          'Attempt to convert non UTF-8 patch into specified encoding.',
       ),
       'revision' => array(
         'param' => 'revision_id',
         'help' =>
-          "Instead of exporting changes from the working copy, export them ".
-          "from a Differential revision."
+          'Instead of exporting changes from the working copy, export them '.
+          'from a Differential revision.'
       ),
       'diff' => array(
         'param' => 'diff_id',
         'help' =>
-          "Instead of exporting changes from the working copy, export them ".
-          "from a Differential diff."
+          'Instead of exporting changes from the working copy, export them '.
+          'from a Differential diff.'
       ),
       '*' => 'paths',
     );
diff --git a/src/workflow/ArcanistFeatureWorkflow.php b/src/workflow/ArcanistFeatureWorkflow.php
--- a/src/workflow/ArcanistFeatureWorkflow.php
+++ b/src/workflow/ArcanistFeatureWorkflow.php
@@ -82,7 +82,7 @@
     $names = $this->getArgument('branch');
     if ($names) {
       if (count($names) > 2) {
-        throw new ArcanistUsageException("Specify only one branch.");
+        throw new ArcanistUsageException('Specify only one branch.');
       }
       return $this->checkoutBranch($names);
     }
@@ -186,7 +186,7 @@
     foreach ($branches as $branch) {
       if ($repository_api instanceof ArcanistMercurialAPI) {
         $futures[$branch['name']] = $repository_api->execFutureLocal(
-          "log -l 1 --template %s -r %s",
+          'log -l 1 --template %s -r %s',
           "{node}\1{date|hgdate}\1{p1node}\1{desc|firstline}\1{desc}",
           hgsprintf('%s', $branch['name']));
 
diff --git a/src/workflow/ArcanistFlagWorkflow.php b/src/workflow/ArcanistFlagWorkflow.php
--- a/src/workflow/ArcanistFlagWorkflow.php
+++ b/src/workflow/ArcanistFlagWorkflow.php
@@ -115,7 +115,7 @@
       throw new ArcanistUsageException("You can't both edit and clear a flag.");
     }
     if (($editing || $clear) && count($objects) != 1) {
-      throw new ArcanistUsageException("Specify exactly one object.");
+      throw new ArcanistUsageException('Specify exactly one object.');
     }
 
     if (!empty($objects)) {
@@ -155,7 +155,7 @@
       } else {
         self::flagWasEdited($flag, 'deleted');
       }
-    } elseif ($editing) {
+    } else if ($editing) {
       // Let's set some flags. Just like Minesweeper, but less distracting.
       $flag_params = array(
         'objectPHID' => head($phids),
diff --git a/src/workflow/ArcanistGitHookPreReceiveWorkflow.php b/src/workflow/ArcanistGitHookPreReceiveWorkflow.php
--- a/src/workflow/ArcanistGitHookPreReceiveWorkflow.php
+++ b/src/workflow/ArcanistGitHookPreReceiveWorkflow.php
@@ -47,8 +47,8 @@
     $working_copy = $this->getWorkingCopy();
     if (!$working_copy->getProjectID()) {
       throw new ArcanistUsageException(
-        "You have installed a git pre-receive hook in a remote without an ".
-        ".arcconfig.");
+        'You have installed a git pre-receive hook in a remote without an '.
+        '.arcconfig.');
     }
 
     // Git repositories have special rules in pre-receive hooks. We need to
diff --git a/src/workflow/ArcanistHelpWorkflow.php b/src/workflow/ArcanistHelpWorkflow.php
--- a/src/workflow/ArcanistHelpWorkflow.php
+++ b/src/workflow/ArcanistHelpWorkflow.php
@@ -86,37 +86,37 @@
         if (isset($spec['param'])) {
           if (isset($spec['short'])) {
             $optref[] = phutil_console_format(
-              "          __--%s__ __%s__, __-%s__ __%s__",
+              '          __--%s__ __%s__, __-%s__ __%s__',
               $argument,
               $spec['param'],
               $spec['short'],
               $spec['param']);
           } else {
             $optref[] = phutil_console_format(
-              "          __--%s__ __%s__",
+              '          __--%s__ __%s__',
               $argument,
               $spec['param']);
           }
         } else {
           if (isset($spec['short'])) {
             $optref[] = phutil_console_format(
-              "          __--%s__, __-%s__",
+              '          __--%s__, __-%s__',
               $argument,
               $spec['short']);
           } else {
             $optref[] = phutil_console_format(
-              "          __--%s__",
+              '          __--%s__',
               $argument);
           }
         }
 
         if (isset($config_arguments[$argument])) {
-          $optref[] = "              (This is a custom option for this ".
-                      "project.)";
+          $optref[] = '              (This is a custom option for this '.
+                      'project.)';
         }
 
         if (isset($spec['supports'])) {
-          $optref[] = "              Supports: ".
+          $optref[] = '              Supports: '.
                       implode(', ', $spec['supports']);
         }
 
diff --git a/src/workflow/ArcanistInlinesWorkflow.php b/src/workflow/ArcanistInlinesWorkflow.php
--- a/src/workflow/ArcanistInlinesWorkflow.php
+++ b/src/workflow/ArcanistInlinesWorkflow.php
@@ -28,12 +28,12 @@
       'revision' => array(
         'param' => 'revision_id',
         'help' =>
-          "Display inline comments for a specific revision. If you do not ".
-          "specify a revision, arc will look in the commit message at HEAD.",
+          'Display inline comments for a specific revision. If you do not '.
+          'specify a revision, arc will look in the commit message at HEAD.',
       ),
       'root' => array(
         'param' => 'directory',
-        'help' => "Specify a string printed in front of each path.",
+        'help' => 'Specify a string printed in front of each path.',
       ),
     );
   }
@@ -60,7 +60,7 @@
     }
 
     if (!$revision_id) {
-      throw new ArcanistUsageException("No revisions found.");
+      throw new ArcanistUsageException('No revisions found.');
     }
 
     $comments = array_mergev(
diff --git a/src/workflow/ArcanistInstallCertificateWorkflow.php b/src/workflow/ArcanistInstallCertificateWorkflow.php
--- a/src/workflow/ArcanistInstallCertificateWorkflow.php
+++ b/src/workflow/ArcanistInstallCertificateWorkflow.php
@@ -65,7 +65,7 @@
       $conduit->callMethodSynchronous('conduit.ping', array());
     } catch (Exception $ex) {
       throw new ArcanistUsageException(
-        "Failed to connect to server: ".$ex->getMessage());
+        'Failed to connect to server: '.$ex->getMessage());
     }
     echo "Connection OK!\n";
 
@@ -79,7 +79,7 @@
     echo "\n";
     echo "    {$token_uri}\n";
     echo "\n";
-    echo "Then paste the token on that page below.";
+    echo 'Then paste the token on that page below.';
 
 
     do {
@@ -118,15 +118,15 @@
   private function determineConduitURI() {
     $uri = $this->getArgument('uri');
     if (count($uri) > 1) {
-      throw new ArcanistUsageException("Specify at most one URI.");
+      throw new ArcanistUsageException('Specify at most one URI.');
     } else if (count($uri) == 1) {
       $uri = reset($uri);
     } else {
       $conduit_uri = $this->getConduitURI();
       if (!$conduit_uri) {
         throw new ArcanistUsageException(
-          "Specify an explicit URI or run this command from within a project ".
-          "which is configured with a .arcconfig.");
+          'Specify an explicit URI or run this command from within a project '.
+          'which is configured with a .arcconfig.');
       }
       $uri = $conduit_uri;
     }
diff --git a/src/workflow/ArcanistLandWorkflow.php b/src/workflow/ArcanistLandWorkflow.php
--- a/src/workflow/ArcanistLandWorkflow.php
+++ b/src/workflow/ArcanistLandWorkflow.php
@@ -318,16 +318,16 @@
       if ($this->useSquash) {
         if (!$repository_api->supportsRebase()) {
           throw new ArcanistUsageException(
-            pht("You must enable the rebase extension to use the --squash ".
-                "strategy."));
+            pht('You must enable the rebase extension to use the --squash '.
+                'strategy.'));
         }
       }
 
       if ($this->branchType != $this->ontoType) {
         throw new ArcanistUsageException(pht(
-          "Source %s is a %s but destination %s is a %s. When landing a ".
-          "%s, the destination must also be a %s. Use --onto to specify a %s, ".
-          "or set arc.land.onto.default in .arcconfig.",
+          'Source %s is a %s but destination %s is a %s. When landing a '.
+          '%s, the destination must also be a %s. Use --onto to specify a %s, '.
+          'or set arc.land.onto.default in .arcconfig.',
           $this->branch,
           $this->branchType,
           $this->onto,
@@ -361,7 +361,7 @@
     }
 
     echo phutil_console_format(
-      pht("Switched to %s **%s**. Identifying and merging...",
+      pht('Switched to %s **%s**. Identifying and merging...',
           $this->branchType,
           $this->branch).
       "\n");
@@ -396,7 +396,7 @@
     if (!trim($out)) {
       $this->restoreBranch();
       throw new ArcanistUsageException(
-          pht("No commits to land from %s.", $this->branch));
+          pht('No commits to land from %s.', $this->branch));
     }
 
     echo pht("The following commit(s) will be landed:\n\n%s", $out), "\n";
@@ -506,7 +506,7 @@
         if (!empty($open_dep_revs)) {
           $open_revs = array();
           foreach ($open_dep_revs as $id => $title) {
-            $open_revs[] = "    - D".$id.": ".$title;
+            $open_revs[] = '    - D'.$id.': '.$title;
           }
           $open_revs = implode("\n", $open_revs);
 
@@ -514,7 +514,7 @@
                    "D{$rev_id}: {$rev_title}",
                    $open_revs);
 
-          $ok = phutil_console_confirm(pht("Continue anyway?"));
+          $ok = phutil_console_confirm(pht('Continue anyway?'));
           if (!$ok) {
             throw new ArcanistUserAbortException();
           }
@@ -570,7 +570,7 @@
 
     } else if ($this->isHg) {
       echo phutil_console_format(pht(
-        "Updating **%s**...",
+        'Updating **%s**...',
         $this->onto) . "\n");
 
       try {
@@ -616,7 +616,7 @@
       // Pull succeeded.  Now make sure master is not on an outgoing change
       if ($repository_api->supportsPhases()) {
         list($out) = $repository_api->execxLocal(
-          'log -r %s --template %s', $this->onto, "{phase}");
+          'log -r %s --template %s', $this->onto, '{phase}');
         if ($out != 'public') {
           $local_ahead_of_remote = true;
         }
@@ -655,7 +655,7 @@
     if ($this->isGit) {
       if ($this->shouldUpdateWithRebase) {
         echo phutil_console_format(pht(
-          "Rebasing **%s** onto **%s**",
+          'Rebasing **%s** onto **%s**',
           $this->branch,
           $this->onto)."\n");
         $err = phutil_passthru('git rebase %s', $this->onto);
@@ -669,7 +669,7 @@
         }
       } else {
         echo phutil_console_format(pht(
-          "Merging **%s** into **%s**",
+          'Merging **%s** into **%s**',
           $this->branch,
           $this->onto)."\n");
         $err = phutil_passthru(
@@ -687,7 +687,7 @@
     } else if ($this->isHg) {
       $onto_tip = $repository_api->getCanonicalRevisionName($this->onto);
       $common_ancestor = $repository_api->getCanonicalRevisionName(
-        hgsprintf("ancestor(%s, %s)",
+        hgsprintf('ancestor(%s, %s)',
           $this->onto,
           $this->branch));
 
@@ -745,13 +745,13 @@
       // function). So we're guaranteed to have onto as an ancestor of branch
       // when we use first((onto::branch)-onto) below.
       $branch_root = $repository_api->getCanonicalRevisionName(
-        hgsprintf("first((%s::%s)-%s)",
+        hgsprintf('first((%s::%s)-%s)',
           $this->onto,
           $this->branch,
           $this->onto));
 
       $branch_range = hgsprintf(
-        "(%s::%s)",
+        '(%s::%s)',
         $branch_root,
         $this->branch);
 
@@ -793,8 +793,8 @@
 
       // check if the branch had children
       list($output) = $repository_api->execxLocal(
-        "log -r %s --template %s",
-        hgsprintf("children(%s)", $this->branch),
+        'log -r %s --template %s',
+        hgsprintf('children(%s)', $this->branch),
         '{node}\n');
 
       $child_branch_roots = phutil_split_lines($output, false);
@@ -849,7 +849,7 @@
       $this->branch,
       $branch_range);
     list($alt_branches) = $repository_api->execxLocal(
-      "log --template %s -r %s",
+      'log --template %s -r %s',
       '{node}\n',
        $alt_branch_revset);
 
@@ -890,7 +890,7 @@
         throw new ArcanistUserAbortException();
       } else {
         throw new ArcanistUsageException(
-          pht("Invalid choice. Aborting arc land."));
+          pht('Invalid choice. Aborting arc land.'));
       }
     }
   }
@@ -923,7 +923,7 @@
       // The user should never reach this line, since --merge is
       // forbidden at the command line argument level.
       throw new ArcanistUsageException(pht(
-        "--merge is not currently supported for hg repos."));
+        '--merge is not currently supported for hg repos.'));
     }
   }
 
@@ -961,7 +961,7 @@
 
     if ($this->getArgument('hold')) {
       echo phutil_console_format(pht(
-        "Holding change in **%s**: it has NOT been pushed yet.",
+        'Holding change in **%s**: it has NOT been pushed yet.',
         $this->onto). "\n");
     } else {
       echo pht('Pushing change...'), "\n\n";
@@ -970,13 +970,13 @@
 
       if ($this->isGitSvn) {
         $err = phutil_passthru('git svn dcommit');
-        $cmd = "git svn dcommit";
+        $cmd = 'git svn dcommit';
       } else if ($this->isGit) {
         $err = phutil_passthru(
           'git push %s %s',
           $this->remote,
           $this->onto);
-        $cmd = "git push";
+        $cmd = 'git push';
       } else if ($this->isHgSvn) {
         // hg-svn doesn't support 'push -r', so we do a normal push
         // which hg-svn modifies to only push the current branch and
@@ -984,13 +984,13 @@
         $err = $repository_api->execPassthru(
           'push %s',
           $this->remote);
-        $cmd = "hg push";
+        $cmd = 'hg push';
       } else if ($this->isHg) {
         $err = $repository_api->execPassthru(
           'push -r %s %s',
           $this->onto,
           $this->remote);
-        $cmd = "hg push";
+        $cmd = 'hg push';
       }
 
       if ($err) {
@@ -1070,12 +1070,12 @@
         $this->branch);
     } else if ($this->isHg) {
       $common_ancestor = $repository_api->getCanonicalRevisionName(
-        hgsprintf("ancestor(%s,%s)",
+        hgsprintf('ancestor(%s,%s)',
           $this->onto,
           $this->branch));
 
       $branch_root = $repository_api->getCanonicalRevisionName(
-        hgsprintf("first((%s::%s)-%s)",
+        hgsprintf('first((%s::%s)-%s)',
           $common_ancestor,
           $this->branch,
           $common_ancestor));
@@ -1148,9 +1148,9 @@
   private function getBranchType($branch) {
     $repository_api = $this->getRepositoryAPI();
     if ($this->isHg && $repository_api->isBookmark($branch)) {
-      return "bookmark";
+      return 'bookmark';
     }
-    return "branch";
+    return 'branch';
   }
 
   /**
diff --git a/src/workflow/ArcanistLiberateWorkflow.php b/src/workflow/ArcanistLiberateWorkflow.php
--- a/src/workflow/ArcanistLiberateWorkflow.php
+++ b/src/workflow/ArcanistLiberateWorkflow.php
@@ -37,34 +37,34 @@
     return array(
       'all' => array(
         'help' =>
-          "Drop the module cache before liberating. This will completely ".
-          "reanalyze the entire library. Thorough, but slow!",
+          'Drop the module cache before liberating. This will completely '.
+          'reanalyze the entire library. Thorough, but slow!',
       ),
       'force-update' => array(
         'help' =>
-          "Force the library map to be updated, even in the presence of ".
-          "lint errors.",
+          'Force the library map to be updated, even in the presence of '.
+          'lint errors.',
       ),
       'library-name' => array(
         'param' => 'name',
         'help' =>
-          "Use a flag for library name rather than awaiting user input.",
+          'Use a flag for library name rather than awaiting user input.',
       ),
       'remap' => array(
         'hide' => true,
         'help' =>
-          "Internal. Run the remap step of liberation. You do not need to ".
-          "run this unless you are debugging the workflow.",
+          'Internal. Run the remap step of liberation. You do not need to '.
+          'run this unless you are debugging the workflow.',
       ),
       'verify' => array(
         'hide' => true,
         'help' =>
-          "Internal. Run the verify step of liberation. You do not need to ".
-          "run this unless you are debugging the workflow.",
+          'Internal. Run the verify step of liberation. You do not need to '.
+          'run this unless you are debugging the workflow.',
       ),
       'upgrade' => array(
         'hide'  => true,
-        'help'  => "Experimental. Upgrade library to v2.",
+        'help'  => 'Experimental. Upgrade library to v2.',
       ),
       '*' => 'argv',
     );
@@ -98,8 +98,8 @@
     if ($init) {
       if (count($init) > 1) {
         throw new ArcanistUsageException(
-          "Specified directory contains more than one libphutil library. Use ".
-          "a more specific path.");
+          'Specified directory contains more than one libphutil library. Use '.
+          'a more specific path.');
       }
       $path = Filesystem::resolvePath(dirname(reset($init)), $path);
     } else {
@@ -186,14 +186,14 @@
     if (Filesystem::pathExists($path)) {
       if (!is_dir($path)) {
         throw new ArcanistUsageException(
-          "Provide a directory to create or update a libphutil library in.");
+          'Provide a directory to create or update a libphutil library in.');
       }
       return;
     }
 
     echo "The directory '{$path}' does not exist.";
     if (!phutil_console_confirm('Do you want to create it?')) {
-      throw new ArcanistUsageException("Cancelled.");
+      throw new ArcanistUsageException('Cancelled.');
     }
 
     execx('mkdir -p %s', $path);
@@ -208,7 +208,7 @@
     echo "Creating new libphutil library in '{$path}'.\n";
 
     do {
-      $name = $this->getArgument("library-name");
+      $name = $this->getArgument('library-name');
       if ($name === null) {
         echo "Choose a name for the new library.\n";
         $name = phutil_console_prompt('What do you want to name this library?');
diff --git a/src/workflow/ArcanistLintWorkflow.php b/src/workflow/ArcanistLintWorkflow.php
--- a/src/workflow/ArcanistLintWorkflow.php
+++ b/src/workflow/ArcanistLintWorkflow.php
@@ -63,31 +63,31 @@
     return array(
       'lintall' => array(
         'help' =>
-        "Show all lint warnings, not just those on changed lines.  When " .
-        "paths are specified, this is the default behavior.",
+        'Show all lint warnings, not just those on changed lines.  When ' .
+        'paths are specified, this is the default behavior.',
         'conflicts' => array(
           'only-changed' => true,
         ),
       ),
       'only-changed' => array(
         'help' =>
-        "Show lint warnings just on changed lines.  When no paths are " .
-        "specified, this is the default.  This differs from only-new " .
-        "in cases where line modifications introduce lint on other " .
-        "unmodified lines.",
+        'Show lint warnings just on changed lines.  When no paths are ' .
+        'specified, this is the default.  This differs from only-new ' .
+        'in cases where line modifications introduce lint on other ' .
+        'unmodified lines.',
         'conflicts' => array(
           'lintall' => true,
         ),
       ),
       'rev' => array(
         'param' => 'revision',
-        'help' => "Lint changes since a specific revision.",
+        'help' => 'Lint changes since a specific revision.',
         'supports' => array(
           'git',
           'hg',
         ),
         'nosupport' => array(
-          'svn' => "Lint does not currently support --rev in SVN.",
+          'svn' => 'Lint does not currently support --rev in SVN.',
         ),
       ),
       'output' => array(
@@ -107,7 +107,7 @@
       'engine' => array(
         'param' => 'classname',
         'help' =>
-          "Override configured lint engine for this project."
+          'Override configured lint engine for this project.'
       ),
       'apply-patches' => array(
         'help' =>
@@ -193,8 +193,8 @@
     $everything = $this->getArgument('everything');
     if ($everything && $paths) {
       throw new ArcanistUsageException(
-        "You can not specify paths with --everything. The --everything ".
-        "flag lints every file.");
+        'You can not specify paths with --everything. The --everything '.
+        'flag lints every file.');
     }
     if ($use_cache === null) {
       $use_cache = (bool)$configuration_manager->getConfigFromAnySource(
@@ -203,7 +203,7 @@
     }
 
     if ($rev && $paths) {
-      throw new ArcanistUsageException("Specify either --rev or paths.");
+      throw new ArcanistUsageException('Specify either --rev or paths.');
     }
 
 
@@ -503,12 +503,12 @@
           // TODO: Improve the behavior here, make it more like
           // difference_render().
           list(, $stdout, $stderr) =
-            exec_manual("diff -u %s %s", $old_file, $new_file);
+            exec_manual('diff -u %s %s', $old_file, $new_file);
           $console->writeOut('%s', $stdout);
           $console->writeErr('%s', $stderr);
 
           $prompt = phutil_console_format(
-            "Apply this patch to __%s__?",
+            'Apply this patch to __%s__?',
             $result->getPath());
           if (!$console->confirm($prompt, $default_no = false)) {
             continue;
@@ -531,7 +531,7 @@
           "with lint patches.\n");
         $amend = true;
       } else {
-        $amend = $console->confirm("Amend HEAD with lint patches?");
+        $amend = $console->confirm('Amend HEAD with lint patches?');
       }
 
       if ($amend) {
@@ -543,8 +543,8 @@
         $repository_api->amendCommit();
       } else {
         throw new ArcanistUsageException(
-          "Sort out the lint changes that were applied to the working ".
-          "copy and relint.");
+          'Sort out the lint changes that were applied to the working '.
+          'copy and relint.');
       }
     }
 
diff --git a/src/workflow/ArcanistPasteWorkflow.php b/src/workflow/ArcanistPasteWorkflow.php
--- a/src/workflow/ArcanistPasteWorkflow.php
+++ b/src/workflow/ArcanistPasteWorkflow.php
@@ -67,17 +67,17 @@
 
     $argv = $this->getArgument('argv');
     if (count($argv) > 1) {
-      throw new ArcanistUsageException("Specify only one paste to retrieve.");
+      throw new ArcanistUsageException('Specify only one paste to retrieve.');
     } else if (count($argv) == 1) {
       $id = $argv[0];
       if (!preg_match('/^P?\d+/', $id)) {
-        throw new ArcanistUsageException("Specify a paste ID, like P123.");
+        throw new ArcanistUsageException('Specify a paste ID, like P123.');
       }
       $this->id = (int)ltrim($id, 'P');
 
       if ($this->language || $this->title) {
         throw new ArcanistUsageException(
-          "Use options --lang and --title only when creating pastes.");
+          'Use options --lang and --title only when creating pastes.');
       }
     }
   }
diff --git a/src/workflow/ArcanistPatchWorkflow.php b/src/workflow/ArcanistPatchWorkflow.php
--- a/src/workflow/ArcanistPatchWorkflow.php
+++ b/src/workflow/ArcanistPatchWorkflow.php
@@ -52,10 +52,10 @@
       'diff' => array(
         'param' => 'diff_id',
         'help' =>
-          "Apply changes from a Differential diff. Normally you want to use ".
-          "--revision to get the most recent changes, but you can ".
-          "specifically apply an out-of-date diff or a diff which was never ".
-          "attached to a revision by using this flag.",
+          'Apply changes from a Differential diff. Normally you want to use '.
+          '--revision to get the most recent changes, but you can '.
+          'specifically apply an out-of-date diff or a diff which was never '.
+          'attached to a revision by using this flag.',
       ),
       'arcbundle' => array(
         'param' => 'bundlefile',
@@ -67,19 +67,19 @@
         'param' => 'patchfile',
         'paramtype' => 'file',
         'help' =>
-          "Apply changes from a git patchfile or unified patchfile.",
+          'Apply changes from a git patchfile or unified patchfile.',
       ),
       'encoding' => array(
         'param' => 'encoding',
         'help' =>
-          "Attempt to convert non UTF-8 patch into specified encoding.",
+          'Attempt to convert non UTF-8 patch into specified encoding.',
       ),
       'update' => array(
         'supports' => array(
           'git', 'svn', 'hg'
         ),
         'help' =>
-          "Update the local working copy before applying the patch.",
+          'Update the local working copy before applying the patch.',
         'conflicts' => array(
           'nobranch' => true,
           'bookmark' => true,
@@ -90,8 +90,8 @@
           'git', 'hg'
         ),
         'help' =>
-          "Normally under git/hg, if the patch is successful, the changes ".
-          "are committed to the working copy. This flag prevents the commit.",
+          'Normally under git/hg, if the patch is successful, the changes '.
+          'are committed to the working copy. This flag prevents the commit.',
       ),
       'skip-dependencies' => array(
         'supports' => array(
@@ -107,17 +107,17 @@
           'git', 'hg'
         ),
         'help' =>
-          "Normally, a new branch (git) or bookmark (hg) is created and then ".
-          "the patch is applied and committed in the new branch/bookmark. ".
-          "This flag cherry-picks the resultant commit onto the original ".
-          "branch and deletes the temporary branch.",
+          'Normally, a new branch (git) or bookmark (hg) is created and then '.
+          'the patch is applied and committed in the new branch/bookmark. '.
+          'This flag cherry-picks the resultant commit onto the original '.
+          'branch and deletes the temporary branch.',
         'conflicts' => array(
           'update' => true,
         ),
       ),
       'force' => array(
         'help' =>
-          "Do not run any sanity checks.",
+          'Do not run any sanity checks.',
       ),
       '*' => 'name',
     );
@@ -147,7 +147,7 @@
     if ($this->getArgument('name')) {
       $namev = $this->getArgument('name');
       if (count($namev) > 1) {
-        throw new ArcanistUsageException("Specify at most one revision name.");
+        throw new ArcanistUsageException('Specify at most one revision name.');
       }
       $source = self::SOURCE_REVISION;
       $requested++;
@@ -216,7 +216,7 @@
     $branch_name    = null;
     $repository_api = $this->getRepositoryAPI();
     $revision_id    = $bundle->getRevisionID();
-    $base_name      = "arcpatch";
+    $base_name      = 'arcpatch';
     if ($revision_id) {
       $base_name .= "-D{$revision_id}";
     }
@@ -242,8 +242,8 @@
 
     if (!$branch_name) {
       throw new Exception(
-        "Arc was unable to automagically make a name for this patch.  ".
-        "Please clean up your working copy and try again."
+        'Arc was unable to automagically make a name for this patch.  '.
+        'Please clean up your working copy and try again.'
       );
     }
 
@@ -254,7 +254,7 @@
     $bookmark_name    = null;
     $repository_api = $this->getRepositoryAPI();
     $revision_id    = $bundle->getRevisionID();
-    $base_name      = "arcpatch";
+    $base_name      = 'arcpatch';
     if ($revision_id) {
       $base_name .= "-D{$revision_id}";
     }
@@ -281,8 +281,8 @@
 
     if (!$bookmark_name) {
       throw new Exception(
-        "Arc was unable to automagically make a name for this patch. ".
-        "Please clean up your working copy and try again."
+        'Arc was unable to automagically make a name for this patch. '.
+        'Please clean up your working copy and try again.'
       );
     }
 
@@ -362,7 +362,7 @@
             $patch = @file_get_contents('php://stdin');
             if (!strlen($patch)) {
               throw new ArcanistUsageException(
-                "Failed to read patch from stdin!");
+                'Failed to read patch from stdin!');
             }
           } else {
             $patch = Filesystem::readFile($param);
@@ -685,7 +685,7 @@
         // can not apply these patches on case-insensitive filesystems and
         // there is no way to build a patch which works.
 
-        throw new ArcanistUsageException("Unable to apply patch!");
+        throw new ArcanistUsageException('Unable to apply patch!');
       }
 
       // in case there were any submodule changes involved
diff --git a/src/workflow/ArcanistSvnHookPreCommitWorkflow.php b/src/workflow/ArcanistSvnHookPreCommitWorkflow.php
--- a/src/workflow/ArcanistSvnHookPreCommitWorkflow.php
+++ b/src/workflow/ArcanistSvnHookPreCommitWorkflow.php
@@ -210,7 +210,7 @@
     }
 
     if ($failures) {
-      $at = "@";
+      $at = '@';
       $msg = phutil_console_format(
         "\n**LINT ERRORS**\n\n".
         "This changeset has lint errors. You must fix all lint errors before ".
diff --git a/src/workflow/ArcanistTasksWorkflow.php b/src/workflow/ArcanistTasksWorkflow.php
--- a/src/workflow/ArcanistTasksWorkflow.php
+++ b/src/workflow/ArcanistTasksWorkflow.php
@@ -44,31 +44,31 @@
     return array(
       'status' => array(
         'param' => 'task_status',
-        'help' => "Show tasks that or open or closed, default is open.",
+        'help' => 'Show tasks that or open or closed, default is open.',
       ),
       'owner' => array(
         'param' => 'username',
         'paramtype' => 'username',
         'help' =>
-          "Only show tasks assigned to the given username, ".
-            "also accepts @all to show all, default is you.",
+          'Only show tasks assigned to the given username, '.
+            'also accepts @all to show all, default is you.',
         'conflict' => array(
-          "unassigned" => "--owner suppresses unassigned",
+          'unassigned' => '--owner suppresses unassigned',
         ),
       ),
       'order' => array(
         'param' => 'task_order',
         'help' =>
-          "Arrange tasks based on priority, created, or modified, ".
-            "default is priority.",
+          'Arrange tasks based on priority, created, or modified, '.
+            'default is priority.',
       ),
       'limit' => array(
         'param' => 'n',
         'paramtype' => 'int',
-        'help' => "Limit the amount of tasks outputted, default is all.",
+        'help' => 'Limit the amount of tasks outputted, default is all.',
       ),
       'unassigned' => array(
-        'help' => "Only show tasks that are not assigned (upforgrabs).",
+        'help' => 'Only show tasks that are not assigned (upforgrabs).',
       )
     );
   }
@@ -84,7 +84,7 @@
 
     if ($owner) {
       $owner_phid = $this->findOwnerPhid($owner);
-    } elseif ($unassigned) {
+    } else if ($unassigned) {
       $owner_phid = null;
     } else {
       $owner_phid = $this->getUserPHID();
@@ -106,7 +106,7 @@
       $output = array();
 
       // Render the "T123" column.
-      $task_id = "T".$task['id'];
+      $task_id = 'T'.$task['id'];
       $formatted_task_id = phutil_console_format(
         '**%s**',
         $task_id);
@@ -176,7 +176,7 @@
         );
       } else {
         $output['status'] = array(
-          'text'  => "",
+          'text'  => '',
           'len'   => 0,
         );
       }
@@ -265,8 +265,8 @@
       $find_params['limit'] = $limit;
     }
 
-    $find_params['order'] = ($order ? "order-".$order : "order-priority");
-    $find_params['status'] = ($status ? "status-".$status : "status-open");
+    $find_params['order'] = ($order ? 'order-'.$order : 'order-priority');
+    $find_params['status'] = ($status ? 'status-'.$status : 'status-open');
 
     $tasks = $conduit->callMethodSynchronous(
       'maniphest.query',
diff --git a/src/workflow/ArcanistUnitWorkflow.php b/src/workflow/ArcanistUnitWorkflow.php
--- a/src/workflow/ArcanistUnitWorkflow.php
+++ b/src/workflow/ArcanistUnitWorkflow.php
@@ -42,19 +42,19 @@
     return array(
       'rev' => array(
         'param' => 'revision',
-        'help' => "Run unit tests covering changes since a specific revision.",
+        'help' => 'Run unit tests covering changes since a specific revision.',
         'supports' => array(
           'git',
           'hg',
         ),
         'nosupport' => array(
-          'svn' => "Arc unit does not currently support --rev in SVN.",
+          'svn' => 'Arc unit does not currently support --rev in SVN.',
         ),
       ),
       'engine' => array(
         'param' => 'classname',
         'help' =>
-          "Override configured unit engine for this project."
+          'Override configured unit engine for this project.'
       ),
       'coverage' => array(
         'help' => 'Always enable coverage information.',
@@ -66,8 +66,8 @@
         'help' => 'Always disable coverage information.',
       ),
       'detailed-coverage' => array(
-        'help' => "Show a detailed coverage report on the CLI. Implies ".
-                  "--coverage.",
+        'help' => 'Show a detailed coverage report on the CLI. Implies '.
+                  '--coverage.',
       ),
       'json' => array(
         'help' => 'Report results in JSON format.',
@@ -119,8 +119,8 @@
 
     if (!$engine_class) {
       throw new ArcanistNoEngineException(
-        "No unit test engine is configured for this project. Edit .arcconfig ".
-        "to specify a unit test engine.");
+        'No unit test engine is configured for this project. Edit .arcconfig '.
+        'to specify a unit test engine.');
     }
 
     $paths = $this->getArgument('paths');
@@ -128,8 +128,8 @@
     $everything = $this->getArgument('everything');
     if ($everything && $paths) {
       throw new ArcanistUsageException(
-        "You can not specify paths with --everything. The --everything ".
-        "flag runs every test.");
+        'You can not specify paths with --everything. The --everything '.
+        'flag runs every test.');
     }
 
     $paths = $this->selectPathsForWorkflow($paths, $rev);
diff --git a/src/workflow/ArcanistUploadWorkflow.php b/src/workflow/ArcanistUploadWorkflow.php
--- a/src/workflow/ArcanistUploadWorkflow.php
+++ b/src/workflow/ArcanistUploadWorkflow.php
@@ -40,7 +40,7 @@
 
   protected function didParseArguments() {
     if (!$this->getArgument('paths')) {
-      throw new ArcanistUsageException("Specify one or more files to upload.");
+      throw new ArcanistUsageException('Specify one or more files to upload.');
     }
 
     $this->paths = $this->getArgument('paths');
diff --git a/src/workflow/ArcanistWhichWorkflow.php b/src/workflow/ArcanistWhichWorkflow.php
--- a/src/workflow/ArcanistWhichWorkflow.php
+++ b/src/workflow/ArcanistWhichWorkflow.php
@@ -44,7 +44,7 @@
   public function getArguments() {
     return array(
       'any-status' => array(
-        'help' => "Show committed and abandoned revisions.",
+        'help' => 'Show committed and abandoned revisions.',
       ),
       'base' => array(
         'param' => 'rules',
@@ -115,7 +115,7 @@
       } else if ($repository_api instanceof ArcanistMercurialAPI) {
         $command = "hg diff --rev {$relative}";
       } else {
-        throw new Exception("Unknown VCS!");
+        throw new Exception('Unknown VCS!');
       }
 
       echo phutil_console_wrap(