Browse Source

Bugfix: Don't re-save unchanged meta files to avoid them being marked as modified in version control systems

BearishSun 6 years ago
parent
commit
090856ed29
1 changed files with 22 additions and 3 deletions
  1. 22 3
      Source/EditorCore/Library/BsProjectLibrary.cpp

+ 22 - 3
Source/EditorCore/Library/BsProjectLibrary.cpp

@@ -11,6 +11,8 @@
 #include "Importer/BsImporter.h"
 #include "Importer/BsImporter.h"
 #include "Importer/BsImportOptions.h"
 #include "Importer/BsImportOptions.h"
 #include "Serialization/BsFileSerializer.h"
 #include "Serialization/BsFileSerializer.h"
+#include "Serialization/BsSerializedObject.h"
+#include "Serialization/BsBinaryDiff.h"
 #include "Debug/BsDebug.h"
 #include "Debug/BsDebug.h"
 #include "Library/BsProjectLibraryEntries.h"
 #include "Library/BsProjectLibraryEntries.h"
 #include "Resources/BsResource.h"
 #include "Resources/BsResource.h"
@@ -651,11 +653,14 @@ namespace bs
 		Path metaPath = fileEntry->path;
 		Path metaPath = fileEntry->path;
 		metaPath.setFilename(metaPath.getFilename() + ".meta");
 		metaPath.setFilename(metaPath.getFilename() + ".meta");
 
 
+		SPtr<SerializedObject> orgMetaData;
 		Vector<SPtr<ProjectResourceMeta>> existingMetas;
 		Vector<SPtr<ProjectResourceMeta>> existingMetas;
 		if (fileEntry->meta == nullptr) // Build a brand new meta-file
 		if (fileEntry->meta == nullptr) // Build a brand new meta-file
 			fileEntry->meta = ProjectFileMeta::create(import.importOptions);
 			fileEntry->meta = ProjectFileMeta::create(import.importOptions);
 		else // Existing meta-file, which needs to be updated
 		else // Existing meta-file, which needs to be updated
 		{
 		{
+			orgMetaData = SerializedObject::create(*fileEntry->meta);
+
 			// Remove existing dependencies (they will be re-added later)
 			// Remove existing dependencies (they will be re-added later)
 			removeDependencies(fileEntry);
 			removeDependencies(fileEntry);
 
 
@@ -762,9 +767,23 @@ namespace bs
 			mResourceManifest->registerResource(entry.uuid, internalResourcesPath);
 			mResourceManifest->registerResource(entry.uuid, internalResourcesPath);
 		}
 		}
 
 
-		// Save the meta file
-		FileEncoder fs(metaPath);
-		fs.encode(fileEntry->meta.get());
+		// Note: Ideally we replace this with a specialized BinaryCompare method
+		bool metaModified = true;
+		if(orgMetaData != nullptr)
+		{
+			SPtr<SerializedObject> newMetaData = SerializedObject::create(*fileEntry->meta);
+			BinaryDiff diffHandler;
+			SPtr<SerializedObject> diff = diffHandler.generateDiff(orgMetaData, newMetaData);
+
+			metaModified = diff != nullptr;
+		}
+
+		if(metaModified)
+		{
+			// Save the meta file
+			FileEncoder fs(metaPath);
+			fs.encode(fileEntry->meta.get());
+		}
 
 
 		// Register any dependencies this resource depends on
 		// Register any dependencies this resource depends on
 		addDependencies(fileEntry);
 		addDependencies(fileEntry);