Skip to content

Stache store doesn't handle different app paths correctly #11862

@simonworkhouse

Description

@simonworkhouse

Bug description

The \Statamic\Stache\Stores::handleFileChanges() method erroneously removes valid items from the stache when switching between multiple app directories. We have noticed this when utilising symlinks and/or separate containers with separate mounts.

When this issue occurs it causes errors such as the following:

$php artisan statamic:stache:warm 

   Error 

  Call to a member function requiresSlugs() on null

  at vendor/statamic/cms/src/Stache/Stores/CollectionEntriesStore.php:87
     83▕             ->data($data);
     84▕ 
     85▕         $slug = (new GetSlugFromPath)($path);
     86▕ 
  ➜  87▕         if (! $collection->requiresSlugs() && $slug == $id) {
     88▕             $entry->slug(null);
     89▕         } else {
     90▕             $entry->slug($slug);
     91▕         }

      +2 vendor frames 

  3   [internal]:0
      Statamic\Stache\Stores\Store::Statamic\Stache\Stores\{closure}()
      +39 vendor frames 

  43  artisan:35
      Illuminate\Foundation\Console\Kernel::handle()

Also attempting a second time fails on entries:

$php artisan statamic:stache:warm 

   Error 

  Call to a member function id() on null

  at vendor/statamic/cms/src/Stache/Repositories/EntryRepository.php:166
    162▕ 
    163▕     public function applySubstitutions($items)
    164▕     {
    165▕         return $items->map(function ($item) {
  ➜ 166▕             return $this->substitutionsById[$item->id()] ?? $item;
    167▕         });
    168▕     }
    169▕ 
    170▕     public function updateUris($collection, $ids = null)

  1   [internal]:0
      Statamic\Stache\Repositories\EntryRepository::Statamic\Stache\Repositories\{closure}()
      +39 vendor frames 

  41  [internal]:0
      Statamic\Stache\Query\EntryQueryBuilder::Statamic\Stache\Query\{closure}()

How to reproduce

Execute php artisan statamic:stache:warm in your app folder and attempt to execute it again in a symlink to that folder. Assuming that you have at least one collection configured it will fail with an error Call to a member function requiresSlugs() on null or a Call to a member function id() on null when attempting to process entries.

Logs

N/A

Environment

N/A

Installation

Fresh statamic/statamic site via CLI

Additional details

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions