public void DeploySitesFromLocal()
{
_logger.DebugFormat("[Local Storage => IIS] - Site deploy times: {0}", string.Join(",", _siteDeployTimes.Select(t => t.Key + " - " + t.Value).ToArray()));
foreach (var site in Directory.EnumerateDirectories(_localTempPath).Select(d => Path.GetFileName(d).ToLowerInvariant()))
{
var sitePath = Path.Combine(_localSitesPath, site);
var tempSitePath = Path.Combine(_localTempPath, site);
if (Directory.Exists(tempSitePath))
{
// Sync from package to IIS App using MSDeploy
string packageFile;
try
{
packageFile = Directory.EnumerateFiles(tempSitePath).SingleOrDefault(f => f.ToLowerInvariant().EndsWith(".zip"));
}
catch (InvalidOperationException e)
{
if (string.IsNullOrEmpty(e.Message))
{
throw new InvalidOperationException("Multiple packages exist for the site '" + site + "'.");
}
throw;
}
if (packageFile != null)
{
if (!_siteDeployTimes.ContainsKey(site))
{
_siteDeployTimes.Add(site, DateTime.MinValue);
}
var packageLastModifiedTime = Directory.GetLastWriteTimeUtc(packageFile);
_logger.DebugFormat("[Local Storage => IIS] - Package last modified time: '{0}'", packageLastModifiedTime);
if (_siteDeployTimes[site] < packageLastModifiedTime)
{
_logger.InfoFormat("[Local Storage => IIS] - Deploying the package '{0}' to '{1}' with MSDeploy", packageFile, sitePath);
try
{
using (var deploymentObject = DeploymentManager.CreateObject(DeploymentWellKnownProvider.Package, packageFile))
{
deploymentObject.SyncTo(DeploymentWellKnownProvider.DirPath, sitePath, new DeploymentBaseOptions(), new DeploymentSyncOptions {UseChecksum = true});
}
UpdateSyncStatus(site, SyncInstanceStatus.Deployed);
_logger.DebugFormat(string.Format("Calling OnSiteUpdated event for {0}...", site));
OnSiteUpdated(site);
_siteDeployTimes[site] = DateTime.UtcNow;
}
catch (Exception ex)
{
UpdateSyncStatus(site, SyncInstanceStatus.Error, ex);
throw;
}
}
}
}
}
}