@@ -1356,7 +1356,7 @@ public FileMetadata FindMetadata(string filenameCanonical,
1356
1356
/// <param name="addEntry">Whether to add an entry if the metadata isn't found.</param>
1357
1357
/// <returns>Reference to the metadata by version if successful or addEntry is true,
1358
1358
/// null otherwise.</returns>
1359
- private FileMetadataByVersion FindMetadataByVersion ( string filenameCanonical ,
1359
+ public FileMetadataByVersion FindMetadataByVersion ( string filenameCanonical ,
1360
1360
bool addEntry ) {
1361
1361
FileMetadataByVersion metadataByVersion ;
1362
1362
if ( ! metadataByCanonicalFilename . TryGetValue (
@@ -1446,7 +1446,7 @@ private Dictionary<string, HashSet<string>> GetManifestAliasesByName() {
1446
1446
}
1447
1447
1448
1448
/// <summary>
1449
- /// Use manifest aliases to cosolidate manifest metadata.
1449
+ /// Use manifest aliases to consolidate manifest metadata.
1450
1450
/// </summary>
1451
1451
/// <returns>Flattened map of highest priority manifest name by each alias of the manifest
1452
1452
/// name.</returns>
@@ -1752,10 +1752,13 @@ public ManifestReferences() { }
1752
1752
/// project. This is used to handle file renaming in the parsed
1753
1753
/// manifest. If the manifest contains files that have been
1754
1754
/// renamed it's updated with the new filenames.</param>
1755
- /// <returns>Metadata of files in the package indexed by current filename.<returns>
1756
- public Dictionary < string , FileMetadata > ParseLegacyManifest ( FileMetadata metadata ,
1757
- FileMetadataSet metadataSet ) {
1758
- var filesInManifest = new Dictionary < string , FileMetadata > ( ) ;
1755
+ /// <returns>Metadata of files in the package indexed by current filename.
1756
+ /// The FileMetadataByVersion will be null for files that aren't present in the
1757
+ /// asset database.returns>
1758
+ public Dictionary < string , KeyValuePair < FileMetadata , FileMetadataByVersion > >
1759
+ ParseLegacyManifest ( FileMetadata metadata , FileMetadataSet metadataSet ) {
1760
+ var filesInManifest =
1761
+ new Dictionary < string , KeyValuePair < FileMetadata , FileMetadataByVersion > > ( ) ;
1759
1762
StreamReader manifestFile =
1760
1763
new StreamReader ( metadata . filename ) ;
1761
1764
string line ;
@@ -1769,7 +1772,11 @@ public Dictionary<string, FileMetadata> ParseLegacyManifest(FileMetadata metadat
1769
1772
metadataSet . FindMetadata ( manifestFileMetadata . filenameCanonical , version ) ??
1770
1773
metadataSet . FindMetadata ( manifestFileMetadata . filename , version ) ;
1771
1774
if ( existingFileMetadata != null ) manifestFileMetadata = existingFileMetadata ;
1772
- filesInManifest [ manifestFileMetadata . filename ] = manifestFileMetadata ;
1775
+ filesInManifest [ manifestFileMetadata . filename ] =
1776
+ new KeyValuePair < FileMetadata , FileMetadataByVersion > (
1777
+ manifestFileMetadata ,
1778
+ metadataSet . FindMetadataByVersion ( manifestFileMetadata . filenameCanonical ,
1779
+ false ) ) ;
1773
1780
}
1774
1781
manifestFile . Close ( ) ;
1775
1782
return filesInManifest ;
@@ -1802,15 +1809,36 @@ public bool ParseManifests(FileMetadataByVersion metadataByVersion,
1802
1809
metadataByVersion . filenameCanonical ) , verbose : true ) ;
1803
1810
this . metadataByVersion = metadataByVersion ;
1804
1811
var filesInManifest = ParseLegacyManifest ( metadata , metadataSet ) ;
1805
- var filenames = new HashSet < string > ( filesInManifest . Keys ) ;
1806
1812
// If this is the most recent manifest version, remove all
1807
1813
// current files from the set to delete.
1808
1814
if ( versionIndex == numberOfVersions ) {
1815
+ var filenames = new HashSet < string > ( ) ;
1816
+ // Add references to the most recent file metadata for each referenced file.
1817
+ metadataByFilename = new Dictionary < string , FileMetadata > ( ) ;
1818
+ foreach ( var kv in filesInManifest . Values ) {
1819
+ var fileMetadataByVersion = kv . Value ;
1820
+ var mostRecentMetadata =
1821
+ fileMetadataByVersion != null ?
1822
+ fileMetadataByVersion . MostRecentVersion : kv . Key ;
1823
+ metadataByFilename [ mostRecentMetadata . filename ] = mostRecentMetadata ;
1824
+ filenames . Add ( mostRecentMetadata . filename ) ;
1825
+ if ( fileMetadataByVersion != null ) {
1826
+ var versions = fileMetadataByVersion . Values ;
1827
+ int numberOfFileVersions = versions . Count ;
1828
+ int fileVersionIndex = 0 ;
1829
+ foreach ( var version in versions ) {
1830
+ fileVersionIndex ++ ;
1831
+ if ( fileVersionIndex == numberOfFileVersions ) break ;
1832
+ obsoleteFiles . Add ( version . filename ) ;
1833
+ }
1834
+ }
1835
+ }
1836
+
1809
1837
currentFiles . UnionWith ( filenames ) ;
1810
1838
obsoleteFiles . ExceptWith ( filenames ) ;
1811
1839
currentMetadata = metadata ;
1812
- metadataByFilename = filesInManifest ;
1813
1840
} else {
1841
+ var filenames = new HashSet < string > ( filesInManifest . Keys ) ;
1814
1842
obsoleteFiles . UnionWith ( filenames ) ;
1815
1843
}
1816
1844
}
@@ -1866,6 +1894,7 @@ public static Dictionary<string, ManifestReferences> FindAndReadManifestsByPacka
1866
1894
aliases . Add ( alias ) ;
1867
1895
}
1868
1896
1897
+ var allObsoleteFiles = new HashSet < string > ( ) ;
1869
1898
var manifestReferencesByPackageName = new Dictionary < string , ManifestReferences > ( ) ;
1870
1899
foreach ( var metadataByVersion in metadataSet . Values ) {
1871
1900
ManifestReferences manifestReferences = new ManifestReferences ( ) ;
@@ -1875,8 +1904,18 @@ public static Dictionary<string, ManifestReferences> FindAndReadManifestsByPacka
1875
1904
aliasesByName [ manifestReferences . filenameCanonical ] ;
1876
1905
manifestReferencesByPackageName [ manifestReferences . filenameCanonical ] =
1877
1906
manifestReferences ;
1907
+ allObsoleteFiles . UnionWith ( manifestReferences . obsoleteFiles ) ;
1878
1908
}
1879
1909
}
1910
+
1911
+ // Move globally obsolete files to the obsolete files set across all manifests.
1912
+ foreach ( var manifestReferences in manifestReferencesByPackageName . Values ) {
1913
+ var newlyObsoleteFiles = new HashSet < string > ( manifestReferences . currentFiles ) ;
1914
+ newlyObsoleteFiles . IntersectWith ( allObsoleteFiles ) ;
1915
+ manifestReferences . currentFiles . ExceptWith ( newlyObsoleteFiles ) ;
1916
+ manifestReferences . obsoleteFiles . UnionWith ( newlyObsoleteFiles ) ;
1917
+ }
1918
+
1880
1919
return manifestReferencesByPackageName ;
1881
1920
}
1882
1921
0 commit comments