ignoreWhitespace = $ignore_whitespace; return $this; } /* -( Generating Diffs )--------------------------------------------------- */ /** * Generate an @{class:DifferentialChangeset} from two raw files. This is * principally useful because you can feed the output to * @{class:DifferentialChangesetParser} in order to render it. * * @param string Entire previous file content. * @param string Entire current file content. * @return @{class:DifferentialChangeset} Synthetic changeset. * @task diff */ public function generateChangesetFromFileContent($old, $new) { $options = array(); if ($this->ignoreWhitespace) { $options[] = '-bw'; } // Generate diffs with full context. $options[] = '-U65535'; $old_tmp = new TempFile(); $new_tmp = new TempFile(); Filesystem::writeFile($old_tmp, $old); Filesystem::writeFile($new_tmp, $new); list($err, $diff) = exec_manual( '/usr/bin/diff %Ls %s %s', $options, $old_tmp, $new_tmp); if (!strlen($diff)) { // This indicates that the two files are the same (or, possibly, the // same modulo whitespace differences, which is why we can't do this // check trivially before running `diff`). Build a synthetic, changeless // diff so that we can still render the raw, unchanged file instead of // being forced to just say "this file didn't change" since we don't have // the content. $entire_file = explode("\n", $old); foreach ($entire_file as $k => $line) { $entire_file[$k] = ' '.$line; } $len = count($entire_file); $entire_file = implode("\n", $entire_file); // This is a bit hacky but the diff parser can handle it. $diff = "--- ignored 9999-99-99\n". "+++ ignored 9999-99-99\n". "@@ -1,{$len} +1,{$len} @@\n". $entire_file."\n"; } $changes = id(new ArcanistDiffParser())->parseDiff($diff); $diff = DifferentialDiff::newFromRawChanges($changes); return head($diff->getChangesets()); } }