private static void UpgradeToLatestStructureVersion(this IVault vault) { var pos = History.FindIndex(p => p.First == vault.GetStructureVersionToken()); if (pos == -1) { throw new ArgumentException(String.Format("Version '{0}' is not supported", vault.GetStructureVersionToken())); } if (pos == History.Count - 1) { return; } var origFilename = vault.Uri; Func <int, String> namegen = i => origFilename + "." + vault.GetStructureVersionToken() + ".bak" + (i == 1 ? null : i.ToString()); var lastUsedIndex = 1.Seq(i => i + 1, i => File.Exists(namegen(i))).LastOrDefault(); var bakFilename = namegen(lastUsedIndex + 1); vault.SaveAs(bakFilename); History.Skip(pos + 1).ForEach(p => { p.Second(vault); vault.UpdateStructureVersionToken(p.First); }); (History.Last().First == Current).AssertTrue(); vault.UpdateStructureVersionToken(Current); vault.SaveAs(origFilename); }
public override IVault SaveAs(string uri) { Materialize(); _vault.SaveAs(uri); return(this); }