@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix an issue where text intradiff bodies may not render

Summary:
Ref T13523. In the caching layer, there's a tricky clause about filetypes that skips some body rendering behavior.

Provide file type information which at least has a better chance of representing all changes (e.g., an image file may be replaced with a text file, but this can not be represented by a single file type).

Formalize "hasSourceTextBody()", to mean the changeset parser should engage the change as source text.

Test Plan: Intradiffed text changes, saw the body render properly.

Maniphest Tasks: T13523

Differential Revision: https://secure.phabricator.com/D21210

+62 -15
+15 -13
src/applications/differential/parser/DifferentialChangesetParser.php
··· 592 592 } 593 593 594 594 private function tryCacheStuff() { 595 + $changeset = $this->getChangeset(); 596 + if (!$changeset->hasSourceTextBody()) { 597 + 598 + // TODO: This isn't really correct (the change is not "generated"), the 599 + // intent is just to not render a text body for Subversion directory 600 + // changes, etc. 601 + $this->markGenerated(); 602 + 603 + return; 604 + } 605 + 595 606 $viewstate = $this->getViewState(); 596 607 597 608 $skip_cache = false; ··· 610 621 $skip_cache = true; 611 622 } 612 623 613 - $changeset = $this->changeset; 614 - 615 - if ($changeset->getFileType() != DifferentialChangeType::FILE_TEXT && 616 - $changeset->getFileType() != DifferentialChangeType::FILE_SYMLINK) { 617 - 618 - $this->markGenerated(); 619 - 620 - } else { 621 - if ($skip_cache || !$this->loadCache()) { 622 - $this->process(); 623 - if (!$skip_cache) { 624 - $this->saveCache(); 625 - } 624 + if ($skip_cache || !$this->loadCache()) { 625 + $this->process(); 626 + if (!$skip_cache) { 627 + $this->saveCache(); 626 628 } 627 629 } 628 630 }
+47 -2
src/applications/differential/storage/DifferentialChangeset.php
··· 32 32 private $hasNewState; 33 33 private $oldStateMetadata; 34 34 private $newStateMetadata; 35 + private $oldFileType; 36 + private $newFileType; 35 37 36 38 const TABLE_CACHE = 'differential_changeset_parse_cache'; 37 39 ··· 550 552 $left_metadata = $left->getNewStateMetadata(); 551 553 $left_state = $left->hasNewState(); 552 554 $shared_metadata = $left->getMetadata(); 555 + $left_type = $left->getNewFileType(); 553 556 if ($right) { 554 557 $right_data = $right->makeNewFile(); 555 558 $right_properties = $right->getNewProperties(); 556 559 $right_metadata = $right->getNewStateMetadata(); 557 560 $right_state = $right->hasNewState(); 558 561 $shared_metadata = $right->getMetadata(); 562 + $right_type = $right->getNewFileType(); 559 563 } else { 560 564 $right_data = $left->makeOldFile(); 561 565 $right_properties = $left->getOldProperties(); 562 566 $right_metadata = $left->getOldStateMetadata(); 563 567 $right_state = $left->hasOldState(); 568 + $right_type = $left->getOldFileType(); 564 569 } 565 570 566 571 $engine = new PhabricatorDifferenceEngine(); ··· 576 581 ->setFilename($right->getFilename()); 577 582 578 583 // TODO: Change type? 579 - // TODO: File type? 580 584 // TODO: Away paths? 581 585 // TODO: View state key? 582 586 ··· 589 593 ->setOldStateMetadata($left_metadata) 590 594 ->setNewStateMetadata($right_metadata) 591 595 ->setHasOldState($left_state) 592 - ->setHasNewState($right_state); 596 + ->setHasNewState($right_state) 597 + ->setOldFileType($left_type) 598 + ->setNewFileType($right_type); 593 599 594 600 // NOTE: Some metadata is not stored statefully, like the "generated" 595 601 // flag. For now, use the rightmost "new state" metadata to fill in these ··· 600 606 $comparison->setMetadata($metadata); 601 607 602 608 return $comparison; 609 + } 610 + 611 + 612 + public function setNewFileType($new_file_type) { 613 + $this->newFileType = $new_file_type; 614 + return $this; 615 + } 616 + 617 + public function getNewFileType() { 618 + if ($this->newFileType !== null) { 619 + return $this->newFileType; 620 + } 621 + 622 + return $this->getFiletype(); 623 + } 624 + 625 + public function setOldFileType($old_file_type) { 626 + $this->oldFileType = $old_file_type; 627 + return $this; 628 + } 629 + 630 + public function getOldFileType() { 631 + if ($this->oldFileType !== null) { 632 + return $this->oldFileType; 633 + } 634 + 635 + return $this->getFileType(); 636 + } 637 + 638 + public function hasSourceTextBody() { 639 + $type_map = array( 640 + DifferentialChangeType::FILE_TEXT => true, 641 + DifferentialChangeType::FILE_SYMLINK => true, 642 + ); 643 + 644 + $old_body = isset($type_map[$this->getOldFileType()]); 645 + $new_body = isset($type_map[$this->getNewFileType()]); 646 + 647 + return ($old_body || $new_body); 603 648 } 604 649 605 650 public function getNewStateMetadata() {