private void GenerateDeltas(VersionManifest manifest, string sourceDirectory, string destionationDirectory, string newVersion, int numberOfVersionsAsDelta)
{
string newVersionDirectory = Path.Combine(destionationDirectory, newVersion);
var publishedVersions = Directory.EnumerateDirectories(destionationDirectory)
.Select(x => x.Remove(0, destionationDirectory.Length))
.Except(new[] { newVersion })
.OrderByDescending(x => x)
.Take(numberOfVersionsAsDelta);
foreach (var version in publishedVersions)
{
string versionDirectory = Path.Combine(destionationDirectory, version);
string manifestFile = Path.Combine(versionDirectory, "manifest.xml");
VersionManifest versionManifest = VersionManifest.LoadVersionFile(version, manifestFile);
foreach (var file in manifest.Files)
{
VersionManifestFile fileInVersion = versionManifest.Files.FirstOrDefault(x => x.Name.Equals(file.Name, StringComparison.CurrentCultureIgnoreCase));
if (fileInVersion != null && fileInVersion.Checksum != file.Checksum)
{
if (file.GetDeltaFrom(fileInVersion.Checksum) == null)
{
string oldFile = Path.Combine(versionDirectory, fileInVersion.Name + ".deploy");
string decompressedOldFile = Path.GetTempFileName();
byte[] data = File.ReadAllBytes(oldFile);
data = DataCompressor.Decompress(data);
File.WriteAllBytes(decompressedOldFile, data);
string decompressedNewFile = Path.Combine(sourceDirectory, fileInVersion.Name);
string deltaFilename = String.Format("deltas\\{0}.{1}.deploy", fileInVersion.Name, GetShortChecksum(fileInVersion.Checksum));
string deltaFile = Path.Combine(newVersionDirectory, deltaFilename);
Directory.CreateDirectory(Path.GetDirectoryName(deltaFile));
DeltaAPI.CreateDelta(decompressedOldFile, decompressedNewFile, deltaFile, true);
File.Delete(decompressedOldFile);
VersionManifestDeltaFile deltaInfo = new VersionManifestDeltaFile(deltaFilename, fileInVersion.Checksum, new FileInfo(deltaFile).Length);
file.Deltas.Add(deltaInfo);
}
}
}
}
}