-
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #124 from pinpox/nextcloud-29
Nextcloud 29
- Loading branch information
Showing
4 changed files
with
135 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
From 3c3e45f0ad4b4f10161197f70daf46c8888ba91e Mon Sep 17 00:00:00 2001 | ||
From: Josh <[email protected]> | ||
Date: Fri, 23 Feb 2024 12:55:58 -0500 | ||
Subject: [PATCH] fix(Files): Change how scanner diffs for changed metadata | ||
|
||
Fixes #43408 | ||
|
||
Signed-off-by: Josh <[email protected]> | ||
--- | ||
lib/private/Files/Cache/Scanner.php | 49 +++++++++++++++++++++++++++-- | ||
1 file changed, 47 insertions(+), 2 deletions(-) | ||
|
||
diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php | ||
index 1c66f3af8d2b0..4aef73b9b2522 100644 | ||
--- a/lib/private/Files/Cache/Scanner.php | ||
+++ b/lib/private/Files/Cache/Scanner.php | ||
@@ -221,8 +221,9 @@ public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = | ||
} | ||
|
||
// Only update metadata that has changed | ||
- $newData = array_diff_assoc($data, $cacheData->getData()); | ||
- | ||
+ // i.e. get all the values in $data that are not present in the cache already | ||
+ $newData = $this->array_diff_assoc_multi($data, $cacheData->getData()); | ||
+ | ||
// make it known to the caller that etag has been changed and needs propagation | ||
if (isset($newData['etag'])) { | ||
$data['etag_changed'] = true; | ||
@@ -369,6 +370,50 @@ public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $loc | ||
return $data; | ||
} | ||
|
||
+ /** | ||
+ * Compares $array1 against $array2 and returns all the values in $array1 that are not in $array2 | ||
+ * Note this is a one-way check - i.e. we don't care about things that are in $array2 that aren't in $array1 | ||
+ * | ||
+ * Supports multi-dimensional arrays | ||
+ * Also checks keys/indexes | ||
+ * Comparisons are strict just like array_diff_assoc | ||
+ * Order of keys/values does not matter | ||
+ * | ||
+ * @param array $array1 | ||
+ * @param array $array2 | ||
+ * @return array with the differences between $array1 and $array1 | ||
+ * @throws \InvalidArgumentException if $array1 isn't an actual array | ||
+ * | ||
+ */ | ||
+ protected function array_diff_assoc_multi(array $array1, array $array2) { | ||
+ | ||
+ $result = []; | ||
+ | ||
+ foreach ($array1 as $key => $value) { | ||
+ | ||
+ // if $array2 doesn't have the same key, that's a result | ||
+ if (!array_key_exists($key, $array2)) { | ||
+ $result[$key] = $value; | ||
+ continue; | ||
+ } | ||
+ | ||
+ // if $array2's value for the same key is different, that's a result | ||
+ if ($array2[$key] !== $value && !is_array($value)) { | ||
+ $result[$key] = $value; | ||
+ continue; | ||
+ } | ||
+ | ||
+ if (is_array($value)) { | ||
+ $nestedDiff = $this->array_diff_assoc_multi($value, $array2[$key]); | ||
+ if (!empty($nestedDiff)) { | ||
+ $result[$key] = $nestedDiff; | ||
+ continue; | ||
+ } | ||
+ } | ||
+ } | ||
+ return $result; | ||
+ } | ||
+ | ||
/** | ||
* Get the children currently in the cache | ||
* |