public void Save()
{
if (String.IsNullOrEmpty(Id))
{
throw new InvalidOperationException();
}
var document = new XDocument(new XElement("deployment",
new XElement("id", Id),
new XElement("author", XmlUtility.Sanitize(Author)),
new XElement("deployer", Deployer),
new XElement("authorEmail", AuthorEmail),
new XElement("message", XmlUtility.Sanitize(Message)),
new XElement("progress", Progress),
new XElement("status", Status),
new XElement("statusText", StatusText),
new XElement("lastSuccessEndTime", LastSuccessEndTime),
new XElement("receivedTime", ReceivedTime),
new XElement("startTime", StartTime),
new XElement("endTime", EndTime),
new XElement("complete", Complete.ToString()),
new XElement("is_temp", IsTemporary.ToString()),
new XElement("is_readonly", IsReadOnly.ToString())
));
_statusLock.LockOperation(() =>
{
using (Stream stream = FileSystemHelpers.CreateFile(_statusFile))
{
document.Save(stream);
}
// Used for ETAG
if (FileSystemHelpers.FileExists(_activeFile))
{
FileSystemHelpers.SetLastWriteTimeUtc(_activeFile, DateTime.UtcNow);
}
else
{
FileSystemHelpers.WriteAllText(_activeFile, String.Empty);
}
}, "Updating deployment status", DeploymentStatusManager.LockTimeout);
}