public function hasUpdated($path, $time) { if ($this->is_file($path)) { return parent::hasUpdated($path, $time); } $path = $this->normalizePath($path); $dh = $this->opendir($path); $content = array(); while (($file = readdir($dh)) !== false) { $content[] = $file; } if ($path === '.') { $path = ''; } $cachedContent = $this->getCache()->getFolderContents($path); $cachedNames = array_map(function ($content) { return $content['name']; }, $cachedContent); sort($cachedNames); sort($content); return $cachedNames != $content; }
public function hasUpdated($path, $time) { $appConfig = \OC::$server->getAppConfig(); if ($this->is_file($path)) { return parent::hasUpdated($path, $time); } else { // Google Drive doesn't change modified times of folders when files inside are updated // Instead we use the Changes API to see if folders have been updated, and it's a pain $folder = $this->getDriveFile($path); if ($folder) { $result = false; $folderId = $folder->getId(); $startChangeId = $appConfig->getValue('files_external', $this->getId() . 'cId'); $params = array('includeDeleted' => true, 'includeSubscribed' => true); if (isset($startChangeId)) { $startChangeId = (int) $startChangeId; $largestChangeId = $startChangeId; $params['startChangeId'] = $startChangeId + 1; } else { $largestChangeId = 0; } $pageToken = true; while ($pageToken) { if ($pageToken !== true) { $params['pageToken'] = $pageToken; } $changes = $this->service->changes->listChanges($params); if ($largestChangeId === 0 || $largestChangeId === $startChangeId) { $largestChangeId = $changes->getLargestChangeId(); } if (isset($startChangeId)) { // Check if a file in this folder has been updated // There is no way to filter by folder at the API level... foreach ($changes->getItems() as $change) { $file = $change->getFile(); if ($file) { foreach ($file->getParents() as $parent) { if ($parent->getId() === $folderId) { $result = true; // Check if there are changes in different folders } else { if ($change->getId() <= $largestChangeId) { // Decrement id so this change is fetched when called again $largestChangeId = $change->getId(); $largestChangeId--; } } } } } $pageToken = $changes->getNextPageToken(); } else { // Assuming the initial scan just occurred and changes are negligible break; } } $appConfig->setValue('files_external', $this->getId() . 'cId', $largestChangeId); return $result; } } return false; }