From 02eff33d295c4e10914235e4d3fc4ba9cfb230ef Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Sun, 8 Jun 2014 13:16:32 +0200 Subject: [PATCH 1/5] Fixes U4-2640 LocalizationService throws exception when getting dictionary items and adds tests for the LocalizationService --- .../Repositories/LanguageRepository.cs | 2 +- src/Umbraco.Core/Services/PackagingService.cs | 5 +- .../Services/LocalizationServiceTests.cs | 204 +++++++++++++++++- 3 files changed, 207 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs index d52a2549f4..0c891d512d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs @@ -33,7 +33,7 @@ namespace Umbraco.Core.Persistence.Repositories var sql = GetBaseQuery(false); sql.Where(GetBaseWhereClause(), new { Id = id }); - var languageDto = Database.First(sql); + var languageDto = Database.FirstOrDefault(sql); if (languageDto == null) return null; diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index b02b765a37..94360e71ad 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -773,6 +773,7 @@ namespace Umbraco.Core.Services var items = new List(); foreach (var dictionaryItemElement in dictionaryItemElementList.Elements("DictionaryItem")) items.AddRange(ImportDictionaryItem(dictionaryItemElement, languages, parentId)); + return items; } @@ -788,6 +789,7 @@ namespace Umbraco.Core.Services dictionaryItem = CreateNewDictionaryItem(key, dictionaryItemElement, languages, parentId); _localizationService.Save(dictionaryItem); items.Add(dictionaryItem); + items.AddRange(ImportDictionaryItems(dictionaryItemElement, languages, dictionaryItem.Key)); return items; } @@ -817,7 +819,8 @@ namespace Umbraco.Core.Services private static bool DictionaryValueIsNew(IEnumerable translations, XElement valueElement) { return translations.All(t => - String.Compare(t.Language.IsoCode, valueElement.Attribute("LanguageCultureAlias").Value, StringComparison.InvariantCultureIgnoreCase) != 0 + String.Compare(t.Language.IsoCode, valueElement.Attribute("LanguageCultureAlias").Value, + StringComparison.InvariantCultureIgnoreCase) != 0 ); } diff --git a/src/Umbraco.Tests/Services/LocalizationServiceTests.cs b/src/Umbraco.Tests/Services/LocalizationServiceTests.cs index 6b22da6800..3ce63bc500 100644 --- a/src/Umbraco.Tests/Services/LocalizationServiceTests.cs +++ b/src/Umbraco.Tests/Services/LocalizationServiceTests.cs @@ -1,4 +1,8 @@ -using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Services @@ -8,10 +12,17 @@ namespace Umbraco.Tests.Services /// This is more of an integration test as it involves multiple layers /// as well as configuration. /// - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class LocalizationServiceTests : BaseServiceTest { + private Guid _parentItemGuidId; + private int _parentItemIntId; + private Guid _childItemGuidId; + private int _childItemIntId; + private int _danishLangId; + private int _englishLangId; + [SetUp] public override void Initialize() { @@ -23,5 +34,194 @@ namespace Umbraco.Tests.Services { base.TearDown(); } + + [Test] + public void LocalizationService_Can_Get_Root_Dictionary_Items() + { + var rootItems = ServiceContext.LocalizationService.GetRootDictionaryItems(); + + Assert.NotNull(rootItems); + Assert.IsTrue(rootItems.Any()); + } + + [Test] + public void LocalizationService_Can_Determint_If_DictionaryItem_Exists() + { + var exists = ServiceContext.LocalizationService.DictionaryItemExists("Parent"); + Assert.IsTrue(exists); + } + + [Test] + public void LocalizationService_Can_Get_All_Languages() + { + var languages = ServiceContext.LocalizationService.GetAllLanguages(); + Assert.NotNull(languages); + Assert.IsTrue(languages.Any()); + Assert.That(languages.Count(), Is.EqualTo(3)); + } + + [Test] + public void LocalizationService_Can_Get_Dictionary_Item_By_Int_Id() + { + var parentItem = ServiceContext.LocalizationService.GetDictionaryItemById(_parentItemIntId); + Assert.NotNull(parentItem); + + var childItem = ServiceContext.LocalizationService.GetDictionaryItemById(_childItemIntId); + Assert.NotNull(childItem); + } + + [Test] + public void LocalizationService_Can_Get_Dictionary_Item_By_Guid_Id() + { + var parentItem = ServiceContext.LocalizationService.GetDictionaryItemById(_parentItemGuidId); + Assert.NotNull(parentItem); + + var childItem = ServiceContext.LocalizationService.GetDictionaryItemById(_childItemGuidId); + Assert.NotNull(childItem); + } + + [Test] + public void LocalizationService_Can_Get_Dictionary_Item_By_Key() + { + var parentItem = ServiceContext.LocalizationService.GetDictionaryItemByKey("Parent"); + Assert.NotNull(parentItem); + + var childItem = ServiceContext.LocalizationService.GetDictionaryItemByKey("Child"); + Assert.NotNull(childItem); + } + + [Test] + public void LocalizationService_Can_Get_Dictionary_Item_Children() + { + var item = ServiceContext.LocalizationService.GetDictionaryItemChildren(_parentItemGuidId); + Assert.NotNull(item); + Assert.That(item.Count(), Is.EqualTo(1)); + + foreach (var dictionaryItem in item) + { + Assert.IsFalse(string.IsNullOrEmpty(dictionaryItem.ItemKey)); + } + } + + [Test] + public void LocalizationService_Can_Get_Language_By_Culture_Code() + { + var danish = ServiceContext.LocalizationService.GetLanguageByCultureCode("Danish"); + var english = ServiceContext.LocalizationService.GetLanguageByCultureCode("English"); + Assert.NotNull(danish); + Assert.NotNull(english); + } + + [Test] + public void LocalizationService_Can_GetLanguageById() + { + var danish = ServiceContext.LocalizationService.GetLanguageById(_danishLangId); + var english = ServiceContext.LocalizationService.GetLanguageById(_englishLangId); + Assert.NotNull(danish); + Assert.NotNull(english); + } + + [Test] + public void LocalizationService_Can_GetLanguageByIsoCode() + { + var danish = ServiceContext.LocalizationService.GetLanguageByIsoCode("da-DK"); + var english = ServiceContext.LocalizationService.GetLanguageByIsoCode("en-GB"); + Assert.NotNull(danish); + Assert.NotNull(english); + } + + [Test] + public void LocalizationService_Does_Not_Fail_When_Language_Doesnt_Exist() + { + var language = ServiceContext.LocalizationService.GetLanguageByIsoCode("sv-SE"); + Assert.Null(language); + } + + [Test] + public void LocalizationService_Does_Not_Fail_When_DictionaryItem_Doesnt_Exist() + { + var item = ServiceContext.LocalizationService.GetDictionaryItemByKey("RandomKey"); + Assert.Null(item); + } + + [Test] + public void LocalizationService_Can_Delete_Language() + { + var norwegian = new Language("nb-NO") { CultureName = "Norwegian" }; + ServiceContext.LocalizationService.Save(norwegian, 0); + Assert.That(norwegian.HasIdentity, Is.True); + var languageId = norwegian.Id; + + ServiceContext.LocalizationService.Delete(norwegian); + + var language = ServiceContext.LocalizationService.GetLanguageById(languageId); + Assert.Null(language); + } + + [Test] + public void LocalizationService_Can_Delete_DictionaryItem() + { + var item = ServiceContext.LocalizationService.GetDictionaryItemByKey("Child"); + Assert.NotNull(item); + + ServiceContext.LocalizationService.Delete(item); + + var deletedItem = ServiceContext.LocalizationService.GetDictionaryItemByKey("Child"); + Assert.Null(deletedItem); + } + + [Test] + public void LocalizationService_Can_Update_Existing_DictionaryItem() + { + var item = ServiceContext.LocalizationService.GetDictionaryItemByKey("Child"); + foreach (var translation in item.Translations) + { + translation.Value = translation.Value + "UPDATED"; + } + + ServiceContext.LocalizationService.Save(item); + + var updatedItem = ServiceContext.LocalizationService.GetDictionaryItemByKey("Child"); + Assert.NotNull(updatedItem); + + foreach (var translation in updatedItem.Translations) + { + Assert.That(translation.Value.EndsWith("UPDATED"), Is.True); + } + } + + public override void CreateTestData() + { + var danish = new Language("da-DK") { CultureName = "Danish" }; + var english = new Language("en-GB") { CultureName = "English" }; + ServiceContext.LocalizationService.Save(danish, 0); + ServiceContext.LocalizationService.Save(english, 0); + _danishLangId = danish.Id; + _englishLangId = english.Id; + + var parentItem = new DictionaryItem("Parent") + { + Translations = new List + { + new DictionaryTranslation(english, "ParentValue"), + new DictionaryTranslation(danish, "ForældreVærdi") + } + }; + ServiceContext.LocalizationService.Save(parentItem); + _parentItemGuidId = parentItem.Key; + _parentItemIntId = parentItem.Id; + + var childItem = new DictionaryItem(parentItem.Key, "Child") + { + Translations = new List + { + new DictionaryTranslation(english, "ChildValue"), + new DictionaryTranslation(danish, "BørnVærdi") + } + }; + ServiceContext.LocalizationService.Save(childItem); + _childItemGuidId = childItem.Key; + _childItemIntId = childItem.Id; + } } } \ No newline at end of file From 859fbaaa058794dd67d1f09f1902146556b275ce Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 25 Jun 2014 19:02:49 +1000 Subject: [PATCH 2/5] Fixes: U4-5121 umbraco.content launches threadpool threads to reload the xml cache which causes lots of other issues Conflicts: src/Umbraco.Web/umbraco.presentation/content.cs --- src/Umbraco.Web/UmbracoModule.cs | 6 +- .../umbraco.presentation/content.cs | 211 +++++------------- 2 files changed, 52 insertions(+), 165 deletions(-) diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index 9c34af7ab8..86ede93ae1 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -498,7 +498,6 @@ namespace Umbraco.Web app.BeginRequest += (sender, e) => { var httpContext = ((HttpApplication)sender).Context; - httpContext.Trace.Write("UmbracoModule", "Umbraco request begins"); LogHelper.Debug("Begin request: {0}.", () => httpContext.Request.Url); BeginRequest(new HttpContextWrapper(httpContext)); }; @@ -523,9 +522,8 @@ namespace Umbraco.Web var httpContext = ((HttpApplication)sender).Context; if (UmbracoContext.Current != null && UmbracoContext.Current.IsFrontEndUmbracoRequest) { - //write the trace output for diagnostics at the end of the request - httpContext.Trace.Write("UmbracoModule", "Umbraco request completed"); - LogHelper.Debug("Total milliseconds for umbraco request to process: " + DateTime.Now.Subtract(UmbracoContext.Current.ObjectCreated).TotalMilliseconds); + LogHelper.Debug( + "Total milliseconds for umbraco request to process: {0}", () => DateTime.Now.Subtract(UmbracoContext.Current.ObjectCreated).TotalMilliseconds); } OnEndRequest(new EventArgs()); diff --git a/src/Umbraco.Web/umbraco.presentation/content.cs b/src/Umbraco.Web/umbraco.presentation/content.cs index ab611bda87..78a5fe7023 100644 --- a/src/Umbraco.Web/umbraco.presentation/content.cs +++ b/src/Umbraco.Web/umbraco.presentation/content.cs @@ -206,7 +206,6 @@ namespace umbraco FireAfterRefreshContent(new RefreshContentEventArgs()); // Only save new XML cache to disk if we just repopulated it - // TODO: Re-architect this so that a call to this method doesn't invoke a new thread for saving disk cache if (!UmbracoSettings.isXmlContentCacheDisabled && !IsValidDiskCachePresent()) { QueueXmlForPersistence(); @@ -215,7 +214,9 @@ namespace umbraco } } } - Trace.WriteLine("Content initialized (was already in context)"); + + LogHelper.Debug(() => "Content initialized (was already in context)"); + return false; } @@ -288,32 +289,33 @@ namespace umbraco #endregion - /// - /// Load content from database in a background thread - /// Replaces active content when done. - /// + [Obsolete("This is no longer used and will be removed in future versions, if you use this method it will not refresh 'async' it will perform the refresh on the current thread which is how it should be doing it")] public virtual void RefreshContentFromDatabaseAsync() + { + RefreshContentFromDatabase(); + } + + /// + /// Load content from database and replaces active content when done. + /// + public virtual void RefreshContentFromDatabase() { var e = new RefreshContentEventArgs(); FireBeforeRefreshContent(e); if (!e.Cancel) { - ThreadPool.QueueUserWorkItem( - delegate - { - XmlDocument xmlDoc = LoadContentFromDatabase(); - XmlContentInternal = xmlDoc; + XmlDocument xmlDoc = LoadContentFromDatabase(); + XmlContentInternal = xmlDoc; - // It is correct to manually call PersistXmlToFile here event though the setter of XmlContentInternal - // queues this up, because this delegate is executing on a different thread and may complete - // after the request which invoked it (which would normally persist the file on completion) - // So we are responsible for ensuring the content is persisted in this case. + // It is correct to manually call PersistXmlToFile here event though the setter of XmlContentInternal + // queues this up, because this delegate is executing on a different thread and may complete + // after the request which invoked it (which would normally persist the file on completion) + // So we are responsible for ensuring the content is persisted in this case. if (!UmbracoSettings.isXmlContentCacheDisabled && UmbracoSettings.continouslyUpdateXmlDiskCache) - PersistXmlToFile(xmlDoc); - }); - - FireAfterRefreshContent(e); + { + PersistXmlToFile(xmlDoc); + } } } @@ -551,33 +553,15 @@ namespace umbraco } } - /// - /// Updates the document cache async. - /// - /// The document id. [Obsolete("Method obsolete in version 4.1 and later, please use UpdateDocumentCache", true)] public virtual void UpdateDocumentCacheAsync(int documentId) { - //SD: WE've obsoleted this but then didn't make it call the method it should! So we've just - // left a bug behind...???? ARGH. - //.... changed now. - //ThreadPool.QueueUserWorkItem(delegate { UpdateDocumentCache(documentId); }); - UpdateDocumentCache(documentId); } - - /// - /// Clears the document cache async. - /// - /// The document id. + [Obsolete("Method obsolete in version 4.1 and later, please use ClearDocumentCache", true)] public virtual void ClearDocumentCacheAsync(int documentId) { - //SD: WE've obsoleted this but then didn't make it call the method it should! So we've just - // left a bug behind...???? ARGH. - //.... changed now. - //ThreadPool.QueueUserWorkItem(delegate { ClearDocumentCache(documentId); }); - ClearDocumentCache(documentId); } @@ -652,69 +636,6 @@ namespace umbraco ClearDocumentCache(documentId); } - ///// - ///// Uns the publish node async. - ///// - ///// The document id. - //[Obsolete("Please use: umbraco.content.ClearDocumentCacheAsync", true)] - //public virtual void UnPublishNodeAsync(int documentId) - //{ - - // ThreadPool.QueueUserWorkItem(delegate { ClearDocumentCache(documentId); }); - //} - - - ///// - ///// Legacy method - you should use the overloaded publishnode(document d) method whenever possible - ///// - ///// - //[Obsolete("Please use: umbraco.content.UpdateDocumentCache", true)] - //public virtual void PublishNode(int documentId) - //{ - - // // Get the document - // var d = new Document(documentId); - // PublishNode(d); - //} - - - ///// - ///// Publishes the node async. - ///// - ///// The document id. - //[Obsolete("Please use: umbraco.content.UpdateDocumentCacheAsync", true)] - //public virtual void PublishNodeAsync(int documentId) - //{ - - // UpdateDocumentCacheAsync(documentId); - //} - - - ///// - ///// Publishes the node. - ///// - ///// The documents. - //[Obsolete("Please use: umbraco.content.UpdateDocumentCache", true)] - //public virtual void PublishNode(List Documents) - //{ - - // UpdateDocumentCache(Documents); - //} - - - - ///// - ///// Publishes the node. - ///// - ///// The document. - //[Obsolete("Please use: umbraco.content.UpdateDocumentCache", true)] - //public virtual void PublishNode(Document d) - //{ - - // UpdateDocumentCache(d); - //} - - /// /// Occurs when [before document cache update]. /// @@ -932,9 +853,10 @@ namespace umbraco RemoveXmlFilePersistenceQueue(); } } - catch + catch (Exception ex) { // Nothing to catch here - we'll just persist + LogHelper.Error("An error occurred checking if xml file is queued for persistence", ex); } } } @@ -1036,22 +958,8 @@ namespace umbraco /// private XmlDocument LoadContentFromDatabase() { - // Alex N - 2010 06 - Very generic try-catch simply because at the moment, unfortunately, this method gets called inside a ThreadPool thread - // and we need to guarantee it won't tear down the app pool by throwing an unhandled exception try { - // Moved User to a local variable - why are we causing user 0 to load from the DB though? - // Alex N 20100212 - User staticUser = null; - try - { - staticUser = User.GetCurrent(); //User.GetUser(0); - } - catch - { - /* We don't care later if the staticUser is null */ - } - // Try to log to the DB LogHelper.Info("Loading content from database..."); @@ -1235,19 +1143,10 @@ order by umbracoNode.level, umbracoNode.sortOrder"; { if (xmlDoc != null) { - Trace.Write(string.Format("Saving content to disk on thread '{0}' (Threadpool? {1})", - Thread.CurrentThread.Name, Thread.CurrentThread.IsThreadPoolThread)); - - // Moved the user into a variable and avoided it throwing an error if one can't be loaded (e.g. empty / corrupt db on initial install) - User staticUser = null; - try - { - staticUser = User.GetCurrent(); - } - catch - { - } - + LogHelper.Debug("Saving content to disk on thread '{0}' (Threadpool? {1})", + () => Thread.CurrentThread.Name, + () => Thread.CurrentThread.IsThreadPoolThread); + try { Stopwatch stopWatch = Stopwatch.StartNew(); @@ -1263,23 +1162,20 @@ order by umbracoNode.level, umbracoNode.sortOrder"; } xmlDoc.Save(UmbracoXmlDiskCacheFileName); - - Trace.Write(string.Format("Saved content on thread '{0}' in {1} (Threadpool? {2})", - Thread.CurrentThread.Name, stopWatch.Elapsed, - Thread.CurrentThread.IsThreadPoolThread)); - - LogHelper.Debug(string.Format("Xml saved in {0}", stopWatch.Elapsed)); + + LogHelper.Debug("Saved content on thread '{0}' in {1} (Threadpool? {2})", + () => Thread.CurrentThread.Name, + () => stopWatch.Elapsed, + () => Thread.CurrentThread.IsThreadPoolThread); } catch (Exception ee) { // If for whatever reason something goes wrong here, invalidate disk cache DeleteXmlCache(); - - Trace.Write(string.Format( + + LogHelper.Error(string.Format( "Error saving content on thread '{0}' due to '{1}' (Threadpool? {2})", - Thread.CurrentThread.Name, ee.Message, Thread.CurrentThread.IsThreadPoolThread)); - - LogHelper.Error("Xml wasn't saved", ee); + Thread.CurrentThread.Name, ee.Message, Thread.CurrentThread.IsThreadPoolThread), ee); } } } @@ -1288,36 +1184,29 @@ order by umbracoNode.level, umbracoNode.sortOrder"; /// /// Marks a flag in the HttpContext so that, upon page execution completion, the Xml cache will /// get persisted to disk. Ensure this method is only called from a thread executing a page request - /// since umbraco.presentation.requestModule is the only monitor of this flag and is responsible + /// since UmbracoModule is the only monitor of this flag and is responsible /// for enacting the persistence at the PostRequestHandlerExecute stage of the page lifecycle. /// private void QueueXmlForPersistence() { - /* Alex Norcliffe 2010 06 03 - removing all launching of ThreadPool threads, instead we just - * flag on the context that the Xml should be saved and an event in the requestModule - * will check for this and call PersistXmlToFile() if necessary */ + //if this is called outside a web request we cannot queue it. + if (HttpContext.Current != null) { HttpContext.Current.Application.Lock(); - if (HttpContext.Current.Application[PersistenceFlagContextKey] != null) - HttpContext.Current.Application.Add(PersistenceFlagContextKey, null); - HttpContext.Current.Application[PersistenceFlagContextKey] = DateTime.UtcNow; - HttpContext.Current.Application.UnLock(); - } - else - { - //// Save copy of content - if (UmbracoSettings.CloneXmlCacheOnPublish) + try { - XmlDocument xmlContentCopy = CloneXmlDoc(_xmlContent); - - ThreadPool.QueueUserWorkItem( - delegate { PersistXmlToFile(xmlContentCopy); }); + if (HttpContext.Current.Application[PersistenceFlagContextKey] != null) + { + HttpContext.Current.Application.Add(PersistenceFlagContextKey, null); + } + HttpContext.Current.Application[PersistenceFlagContextKey] = DateTime.UtcNow; } - else - ThreadPool.QueueUserWorkItem( - delegate { PersistXmlToFile(); }); - } + finally + { + HttpContext.Current.Application.UnLock(); + } + } } internal DateTime GetCacheFileUpdateTime() From 582bafdefd790cc9737b6f32d0b8712734c64cc3 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 26 Jun 2014 10:02:09 +1000 Subject: [PATCH 3/5] Updates version --- build/Build.bat | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/Build.bat b/build/Build.bat index a758bb5722..48d3439a47 100644 --- a/build/Build.bat +++ b/build/Build.bat @@ -1,5 +1,5 @@ @ECHO OFF -SET release=6.2.1 +SET release=6.2.2 SET comment= SET version=%release% diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index b88f880021..50ee876c64 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -5,7 +5,7 @@ namespace Umbraco.Core.Configuration { public class UmbracoVersion { - private static readonly Version Version = new Version("6.2.1"); + private static readonly Version Version = new Version("6.2.2"); /// /// Gets the current version of Umbraco. diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index e86ecfccc6..dc6b9c6884 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2677,7 +2677,7 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\x86\*.* "$(TargetDir)x86\" True 6210 / - http://localhost:6210 + http://localhost:6220 False False From 259bc863f04f0b23aa6a74834a22c4154e78f51f Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 26 Jun 2014 11:32:43 +1000 Subject: [PATCH 4/5] Removes Examine.dll deploy from nuspec --- build/NuSpecs/UmbracoCms.Core.nuspec | 1 - 1 file changed, 1 deletion(-) diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index bdd352b8f3..b43cc2d1fc 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -39,7 +39,6 @@ - From 392634eb76681ee7c94c54f8368a788a78c8f2b5 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 26 Jun 2014 11:44:28 +1000 Subject: [PATCH 5/5] bumps nuspec versions --- build/NuSpecs/UmbracoCms.Core.nuspec | 2 +- build/NuSpecs/UmbracoCms.nuspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index b43cc2d1fc..3d64ebeedd 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -2,7 +2,7 @@ UmbracoCms.Core - 6.2.0 + 6.2.2 Umbraco Cms Core Binaries Umbraco HQ Umbraco HQ diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index 8199f67c6f..8fddfada58 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -2,7 +2,7 @@ UmbracoCms - 6.1.2 + 6.2.2 Umbraco Cms Umbraco HQ Umbraco HQ