Compare commits

...

1401 Commits

Author SHA1 Message Date
Stephan baba390c7b Version 8.0.0-alpha.41 2018-05-21 23:04:18 +02:00
Stephan a3a14c8339 Fix NuGet packages - oh well 2018-05-21 22:38:27 +02:00
Stephan e4bd0e975e Fix NuGet package 2018-05-21 19:08:52 +02:00
Stephan bd07a1ba5c Version 8.0.0-alpha.40 2018-05-21 11:49:20 +02:00
Stephan f535f6d324 Cleanup ModelsBuilder merge 2018-05-21 11:49:08 +02:00
Stephan 373fad6efe Merge ModelsBuilder in, NuGet dies on circ dependencies now 2018-05-21 10:05:52 +02:00
leekelleher 21dbd1e402 Corrected a typo with MultipleTextStringConfiguration class name
@zpqrtbnk approved in person this at CGRT18 ;-)
2018-05-20 18:16:09 +01:00
Stephan 129e094b09 Fix Umbraco.Web.UI references 2018-05-18 15:24:12 +02:00
Mads Rasmussen c3c24eba4f Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2018-05-18 12:33:16 +02:00
Mads Rasmussen 145858a302 hide culture dropdown in culture and hostnames dialog 2018-05-18 11:07:54 +02:00
Stephan c13e3ec220 Version 8.0.0-alpha.37 2018-05-18 09:39:02 +02:00
Stephan 6ce24bf1a1 Various fixes 2018-05-17 17:24:30 +02:00
Stephan 6c61eb2d69 Fix tests 2018-05-17 16:34:11 +02:00
Stephan 76bf84f8ea Forgot to update binding redirects 2018-05-17 16:34:05 +02:00
Stephan a8ba8598f2 Merge branch origin/temp8 into temp8-xbuild 2018-05-17 15:34:27 +02:00
Stephan 6e7bb41190 Version 8.0.0-alpha.36 2018-05-17 15:33:38 +02:00
Stephan 7387379aea Upgrade to ModelsBuilder -alpha.18 2018-05-17 15:32:27 +02:00
Shannon 50659787ee fixes published content Url for invariant 2018-05-17 15:26:06 +02:00
Shannon 3da120ce33 Adds Property Type to the published content model, fixes some web.config versions 2018-05-17 13:32:20 +02:00
Stephan de9f4f8d0b Cleanup references and dependencies 2018-05-17 13:19:35 +02:00
Stephan 20ecb6a779 Merge branch origin/temp8 into temp8-xbuild 2018-05-17 13:04:57 +02:00
Stephan 40f2558a70 Cleanup 2018-05-17 13:03:37 +02:00
Stephan f44c5ad757 Cleanup nuget, bindings, build 2018-05-17 12:17:42 +02:00
Shannon 1cf63bd471 missing checkin of package-lock 2018-05-17 11:29:21 +02:00
Shannon 07a263b794 Fixes validation check for variant nodes that don't have names assigned 2018-05-17 10:28:38 +02:00
Claus c2236b7b97 Merge pull request #2632 from umbraco/temp-U4-11218
Merge infinite editing UI branch to temp8
2018-05-17 09:16:01 +02:00
Claus 9e3db051c9 Merge remote-tracking branch 'origin/temp8' into temp-U4-11218
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/common/dialogs/insertmacro.html
#	src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html
#	src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html
#	src/Umbraco.Web.UI.Client/src/views/common/dialogs/rteembed.html
#	src/Umbraco.Web.UI.Client/src/views/common/dialogs/user.html
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/googlemaps/googlemaps.html
#	src/Umbraco.Web.UI/web.Template.config
2018-05-17 08:26:02 +02:00
Claus 70d1bed396 Merge branch 'temp8' into temp-U4-11218 2018-05-17 08:16:17 +02:00
Stephan a6ea270d93 Cleanup build 2018-05-16 21:52:40 +02:00
Stephan a39a9b7a89 Cleanup nuspec 2018-05-16 16:02:51 +02:00
Stephan 8c815cf47e Git-ignore local directory 2018-05-16 15:54:08 +02:00
Stephan 2b7966dc55 Depend on Umbraco.SqlServerCE, package in net47 2018-05-16 15:54:07 +02:00
Stephan fe1a4f7d4f Depend on Umbraco.SqlServerCE 2018-05-16 15:54:07 +02:00
Stephan 9b17468c43 Cleanup solution 2018-05-16 15:53:22 +02:00
Stephan 6bedc1020b Cleanup solution and build wip 2018-05-16 15:46:51 +02:00
Stephan fc56126820 Cleanup Solution 2018-05-16 15:46:51 +02:00
Shannon c6fa0e560a Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2018-05-16 15:21:35 +02:00
Shannon 34de58e0dc adjust assembly redirects 2018-05-16 15:21:23 +02:00
Shannon Deminick 056bcaff96 adds notes on what to work on 2018-05-16 13:51:59 +02:00
Shannon Deminick f38df3753c Adds quick start v8 link 2018-05-16 13:35:52 +02:00
Shannon Deminick 7fd78aaf2e adds link to quick start guide 2018-05-16 13:29:38 +02:00
Shannon Deminick 9bba6f4b9b adding get started guide for v8 2018-05-16 13:21:29 +02:00
Shannon Deminick 5128c23413 cross link to v7 branch 2018-05-16 12:57:13 +02:00
Shannon b565b8be77 disables redirect tracking for now until we fix it to work with variants 2018-05-16 11:25:57 +02:00
Shannon Deminick 2e2e76c92a Merge pull request #2624 from umbraco/temp-U4-11327
fixes: U4-11327 Remove styles for umb-era-button and use umb-button c…
2018-05-16 18:51:12 +10:00
Shannon 1bc3fdd07c Fixes package tree references 2018-05-16 10:49:43 +02:00
Shannon c1e0b86554 Merge branch 'temp8' into temp-U4-11327 2018-05-16 10:39:51 +02:00
Shannon bf7591aaa0 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2018-05-16 10:33:57 +02:00
Shannon 6c5abf14bd Removes legacy dialog client files 2018-05-16 10:33:46 +02:00
Claus 8044ccbf27 adding missing null check after navigating to parent. 2018-05-16 10:17:38 +02:00
Shannon 95c6de5534 Merge branch 'temp8' of https://github.com/umbraco/Umbraco-CMS into temp8 2018-05-16 10:15:57 +02:00
Stephan 2c124e87dd Merge pull request #2630 from umbraco/temp8-dependency-fixing
Temp8 dependency fixing
2018-05-16 10:15:45 +02:00
Shannon c655873b7d Cleanup canvas designer files, no more dotless dependency, cleans up preview, removes bloat 2018-05-16 10:13:55 +02:00
Shannon ea6c466323 Fixes up some warnings 2018-05-16 10:06:51 +02:00
MADSRASMUSSB4A1\madsrasmussen 6e647d87fa Merge branch 'temp8' into temp-U4-11218
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/controllers/main.controller.js
#	src/Umbraco.Web.UI/umbraco/Views/Default.cshtml
2018-05-16 09:51:26 +02:00
Shannon 07e7068c22 removed too many assembly bindings 2018-05-15 18:07:48 +02:00
Shannon 971114e0fd Updates to 472 and re-targets to the original System.Threading.Tasks.Dataflow package against netstandard 1.3 but with 472 this completely fixes dependency outputs 2018-05-15 17:17:05 +02:00
Shannon 03977c4806 removed too much 2018-05-15 17:13:24 +02:00
Shannon 842d5049b5 Fixing dependencies so we aren't relying so much on netstandard 1.3 libs which require system runtime facade's 2018-05-15 17:02:06 +02:00
Shannon Deminick e4d1415627 Merge pull request #2621 from umbraco/temp8-U4-11282
U4-11282 - Publishing, unpublishing, saving drafts, for variant, non variant content types and property types
2018-05-15 20:29:10 +10:00
Mads Rasmussen 5dad26cb92 fixes: U4-11327 Remove styles for umb-era-button and use umb-button component instead 2018-05-11 11:59:32 +02:00
Mads Rasmussen 491ce00c17 remove console.log from unit test 2018-05-11 10:36:36 +02:00
Mads Rasmussen b7c7e8e84b make right side overlays go all the way to the top 2018-05-11 10:11:26 +02:00
Mads Rasmussen 095704d297 removing unnecessary print of number of open overlays 2018-05-11 10:05:57 +02:00
Shannon 09d03161ce fixes test 2018-05-11 00:09:31 +10:00
Shannon aa4dc64a57 Fixes ContentCache.GetRouteByIdInternal to ensure that no route is returned for any variant in the path of an unpublished variant of the same culture 2018-05-10 23:07:33 +10:00
Shannon d78fa85307 null check fix 2018-05-10 22:40:32 +10:00
Shannon 0ee056aafc null check fix 2018-05-10 22:38:10 +10:00
Shannon 68f0a64136 Fixes auth with AllowsCultureVariation and LanguageController post methods, fixes merge issues with navigation.controller 2018-05-10 19:16:46 +10:00
Warren Buckley f9f108ef33 Merge pull request #2620 from umbraco/temp-U4-11309
Temp u4 11309
2018-05-10 10:00:17 +01:00
Shannon 573b8a0701 Merge remote-tracking branch 'origin/temp8' into temp8-U4-11282
# Conflicts:
#	src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs
#	src/Umbraco.Web.UI.Client/src/controllers/navigation.controller.js
2018-05-10 18:55:39 +10:00
Shannon 4ce6f5c3b0 Fixes how the name is ensured on the content tree so that the media tree doesn't break. 2018-05-10 18:20:33 +10:00
Shannon f2b78c06ef FIxes issue where an invariant property type was being validated with a culture when that would always fail. Fixes issue when saving a content type to ensure that a property type is never both variant and invariant. Adds test. 2018-05-10 18:01:41 +10:00
Mads Rasmussen d27594d4af Update picked nodes which has been updated through the media picker 2018-05-09 16:19:54 +02:00
Mads Rasmussen 7239ce97aa only allow users to add and edit media if they have access to the media section 2018-05-09 11:09:26 +02:00
Mads Rasmussen 18b7581879 only parse in the media id for the infinite media editor 2018-05-09 09:46:15 +02:00
Mads Rasmussen 8535ff1d01 update media items in media picker if they are changed in the infinite media editor 2018-05-09 09:35:11 +02:00
Mads Rasmussen 4f366bbdda prepare media editor to support infinite mode 2018-05-09 09:34:11 +02:00
Mads Rasmussen 86c554e3d3 add option to prevent redirect of succesfull saves to new route 2018-05-09 09:20:23 +02:00
Mads Rasmussen d97d1c427e fixes some js errors in editor service 2018-05-09 09:18:45 +02:00
Mads Rasmussen 600979d129 Merge branch 'temp8' into temp-U4-11218 2018-05-09 08:51:34 +02:00
Shannon 8be861809a fixes filter 2018-05-09 15:52:06 +10:00
Shannon 8642a52a12 Fixes property model binding to display to show the invariant data if the property is non variant 2018-05-09 14:35:23 +10:00
Shannon d90ccbb7f0 no matter what you can always publish the current variant 2018-05-09 14:34:55 +10:00
Shannon 9c1451ecd3 Fixes LanguageRepository for deleting a lang, updates UrlProvider to have consistent method parameter order, updates UmbracoHelper to have culture params for getting URLs 2018-05-09 12:50:34 +10:00
Stephan c890421f55 Fix mixed properties (wip) 2018-05-08 17:09:26 +02:00
Stephan 6d1f42c9b6 Fixes 2018-05-08 16:41:37 +02:00
Stephan b1faade9b0 Revert various changes 2018-05-08 16:41:30 +02:00
Warren Buckley 5bc229801b Merge pull request #2618 from umbraco/temp8-U4-11284-2
Removes vertical and horizontal scroll bars on content tree language …
2018-05-08 12:20:22 +01:00
Robert f3e509ad55 Removes vertical and horizontal scroll bars on content tree language picker, updates languageCreated and languageDeleted event listeners to check for variant doctypes before populating the language list 2018-05-08 12:13:42 +02:00
Warren Buckley 9e8239f05b Merge pull request #2612 from umbraco/temp8-U4-11284
Fixes - U4-11284 When you don't have any doc types that are variant, the tree language drop downs should not be there
2018-05-08 10:28:54 +01:00
Stephan 6051891280 Fixes 2018-05-08 11:06:07 +02:00
Robert 70e4ea5502 Moved authenticated flag back to "app.ready" listener 2018-05-08 10:46:09 +02:00
Robert 216aaec7f2 Removed unneeded test 2018-05-08 10:00:28 +02:00
Robert db160cdc85 Merge pull request #2617 from umbraco/temp8-U4-11306
fixes: U4-11306 Add load indicators in doc type infinite editors
2018-05-08 09:00:02 +02:00
Claus d1191c0693 temporarily removing the packages tree - known issue it's not working. 2018-05-08 08:49:09 +02:00
Claus 9ac7df82ad fixing typo in packages tree. 2018-05-08 08:46:48 +02:00
Shannon 389fb100bb 'fixes' an issue where you can get any property value back due to the incorrect cache key being used 2018-05-08 16:01:20 +10:00
Shannon 7728dfa853 Ensures that the PublishedContent culture dictionary is CultureInvariantIgnoreCase and fixes the publish dialog to allow publishing the current culture if the user has edited it 2018-05-08 13:50:39 +10:00
Shannon 177bba5e73 REmoves null checks on PropertyData since this causes exceptions when creating this object and deserializing to this object 2018-05-08 13:03:19 +10:00
Shannon ee9f150483 Removes the AdditionalData properties for EntitySlim and moves them to real properties of IDocumentEntitySlim, renames PublishedCultureInfos to not be plural 2018-05-08 12:43:07 +10:00
Shannon 85c739aed4 Merge branch 'temp8-U4-11227' into temp8-U4-11282
# Conflicts:
#	src/Umbraco.Core/Models/ContentBase.cs
#	src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs
#	src/Umbraco.Tests/Services/EntityServiceTests.cs
#	src/Umbraco.Web/PublishedCache/NuCache/ContentCache.cs
#	src/Umbraco.Web/PublishedContentExtensions.cs
#	src/Umbraco.Web/Trees/ContentTreeControllerBase.cs
2018-05-08 12:31:03 +10:00
Shannon 0e19ec7495 Fixes logic for determining if a domain is published and fixes logic for getting a url name for a variant taking into account it's published status 2018-05-08 11:21:14 +10:00
Shannon 6e61450788 Merge remote-tracking branch 'origin/temp8' into temp8-U4-11282 2018-05-08 10:36:53 +10:00
Mads Rasmussen 736190f93c rename class on dropdown property editor 2018-05-07 21:40:27 +02:00
Mads Rasmussen 02f95053b8 fixes: U4-11306 Add load indicators in doc type infinite editors 2018-05-07 21:14:35 +02:00
Stephan 3f73452bc7 Various fixes, and U4-11287 2018-05-07 18:51:18 +02:00
Stephan 5247a9d143 Merge branch temp8 into temp8-U4-11227 2018-05-07 18:27:30 +02:00
Stephan 912d89cdb3 Fix DomainHelper 2018-05-07 18:24:56 +02:00
Robert 1a82f93722 Fixes email property editor pre-value 2018-05-07 17:59:43 +02:00
Shannon 8a5ca2c4b4 Fixes being able to edit invariant content 2018-05-08 01:16:32 +10:00
Shannon b1eeb5b193 Merge remote-tracking branch 'origin/temp8' into temp8-U4-11282 2018-05-08 00:39:12 +10:00
Shannon 97cb752cda Ensures the whole doc gets unpublished if a mandatory culture is unpublished, updates content service Unpublish to have it's own status result enum since that is needed. 2018-05-08 00:37:41 +10:00
Shannon 5a991c9424 Fixes Publishing/Unpublishing variants and it's nuances 2018-05-07 23:22:52 +10:00
Robert ff505531c2 Merge pull request #2614 from umbraco/temp8-U4-11283
fixes - U4-11283 Cannot save content when a doc type is variant but a property type is invariant
2018-05-07 13:18:15 +02:00
Robert 1b2a964001 Fixed localization 2018-05-07 12:08:59 +02:00
Mads Rasmussen 1d5751a1e5 Merge branch 'temp8' into temp-U4-11218
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js
#	src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/propertysettings/propertysettings.controller.js
#	src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html
#	src/Umbraco.Web.UI.Client/src/views/content/edit.html
2018-05-07 11:25:38 +02:00
Robert b8c5a389d2 Merge pull request #2613 from umbraco/temp8-U4-11223
Temp8 u4 11223
2018-05-07 09:58:29 +02:00
Stephan 5d37df182a Fix tests 2018-05-07 09:36:51 +02:00
Stephan d13a6f5f58 Fixes 2018-05-07 08:26:10 +02:00
Stephan aa35b28349 Cleanup 2018-05-07 08:25:09 +02:00
Stephan 6104dcafd5 Merge branch 'temp8' into temp8-U4-11227 2018-05-07 08:21:58 +02:00
Stephan 71ed99f080 Fix some tests 2018-05-05 10:46:52 +02:00
Stephan bb0f6fe0e3 Cleanup benchmarks SqlCE nuget dependency 2018-05-05 10:02:04 +02:00
Stephan 73b5694aad Fix web.config transform 2018-05-04 18:35:01 +02:00
Mads Rasmussen 63d7768653 add bg box to code editors 2018-05-04 18:32:35 +02:00
Mads Rasmussen ed0886b040 add bg box to user details sidebar 2018-05-04 18:21:58 +02:00
Mads Rasmussen 9474c78de8 add bg boxes to content type editors 2018-05-04 18:21:04 +02:00
Stephan 8388eca503 Fix agressive cleanup 2018-05-04 15:00:10 +02:00
Robert cc7febcc6d Allows variant content item to save while having a invariant property, also fixes not being able to save invariant content item with invariant property 2018-05-04 13:51:35 +02:00
Robert c5de31cce3 Invariant property value should persist trough all variants of a content item 2018-05-04 13:44:04 +02:00
Robert 48c70604a9 Added localization for "Ready to publish?" publish overlay, added previously removed property which was still in use. 2018-05-04 13:42:33 +02:00
Mads Rasmussen 650441b1f6 don't add shadow to the default editor 2018-05-04 11:25:19 +02:00
Shannon 7a92691bf5 ok the routing is working, for realz this time 2018-05-04 16:07:05 +10:00
Shannon 506365b8ff OK, finally got the query string problem resolved 2018-05-04 13:17:56 +10:00
Mads Rasmussen a5bbf3d832 add will-change css property to prepare browser for the animations 2018-05-03 20:04:34 +02:00
Mads Rasmussen 101d92ca2d speed up animation 2018-05-03 20:03:05 +02:00
Shannon 912711bfa0 Fixing tree, navs, initializing, sequence of events, oh my. The init logic is much more stable but we have issues with tracking the mculture query string 2018-05-04 00:58:18 +10:00
Mads Rasmussen 677bf71a94 make icon picker as infinite editor 2018-05-03 16:11:32 +02:00
Stephan b35d28c568 Merge branch temp8 into temp8-U4-11227 2018-05-03 15:12:42 +02:00
Stephan 3495331005 Cleanup, get rid of warnings 2018-05-03 15:11:57 +02:00
Stephan bcf46eceb6 Cleanup, get rid of warnings 2018-05-03 15:11:52 +02:00
Stephan d04a573888 Refactor some locks, get rid of warnings 2018-05-03 15:11:41 +02:00
Stephan 41144bb7f7 Fix references and build 2018-05-03 15:11:33 +02:00
Stephan 5798d8e57b Enable src/preserve.belle to stop rebuilding Belle all the time 2018-05-03 15:11:25 +02:00
Mads Rasmussen e2478e5cd4 move new editors to infinite editor folder 2018-05-03 14:43:22 +02:00
Mads Rasmussen c4027898cb fix validation in property settings dialog 2018-05-03 14:21:43 +02:00
Mads Rasmussen 2704111497 move indent value to a variable 2018-05-03 13:44:07 +02:00
Robert 8a9caad23d Small fix to editors that had no config values defined. 2018-05-03 13:14:19 +02:00
Mads Rasmussen 1fc0b32fc2 submit property settings editor on enter 2018-05-03 10:55:27 +02:00
Mads Rasmussen 11a4040da7 remove unused umb-overlay component 2018-05-03 10:54:51 +02:00
Robert b5ec775833 Removed duplicate code and fixed bug where dropdown would not go away when there were no document types that allowed variations 2018-05-03 10:35:23 +02:00
Mads Rasmussen 329f90922c remove old content type overlays 2018-05-03 10:30:06 +02:00
Mads Rasmussen 4eca4ac291 use infinite editing in content type editors instead of overlays 2018-05-03 10:19:14 +02:00
Robert f447294c0b Adds new end point that returns true/false if current document types allows variations, display language dropdown if current content types allow variations. 2018-05-03 10:18:08 +02:00
Shannon 46c7290e4f Fixes JS tests 2018-05-03 15:16:23 +10:00
Shannon c33bdf1f27 Revert "Reverts change from merge in U4-11289 aka PR#2608 from Shan - that causes the Karma unit JS tests to fail - not sure why the chained version fails though & thus the Powershell ZIP & Nuget build output script"
This reverts commit 2246e5bc2f.
2018-05-03 14:40:56 +10:00
Stephan a545c3c333 Fix 2018-05-02 18:15:22 +02:00
Stephan aaa1ac0700 Merge branch temp8 into temp8-U4-11227 2018-05-02 17:50:58 +02:00
Stephan 93adda2e4a Cleanup 2018-05-02 17:44:14 +02:00
Stephan 5c96b32c64 Fix tests 2018-05-02 16:23:58 +02:00
Warren 2246e5bc2f Reverts change from merge in U4-11289 aka PR#2608 from Shan - that causes the Karma unit JS tests to fail - not sure why the chained version fails though & thus the Powershell ZIP & Nuget build output script 2018-05-02 14:03:00 +01:00
Stephan a5f1ad6da1 Merge branch temp8 into temp8-U4-11227 2018-05-02 13:43:12 +02:00
Stephan d56af5872d Implement basic fallback plumbing (in progress) 2018-05-02 13:38:45 +02:00
Sebastiaan Janssen a4cc67f732 Make NuGet package install work 2018-05-02 12:35:10 +02:00
Robert 64d467e071 Merge pull request #2608 from umbraco/temp8-U4-11289
U4-11289 Tracking the currently selected language in the main tree
2018-05-02 12:10:02 +02:00
Warren Buckley 394e7f3d6d Merge pull request #2609 from umbraco/temp8-U4-11173
Fixes - U4-11173 Update the publish dialog list to only show languages that have pending changes
2018-05-02 09:39:08 +01:00
Stephan 211267d500 Deal with FIXMEs 2018-05-02 09:31:30 +02:00
Stephan a695b8aed5 Test host-less domains 2018-05-02 08:55:21 +02:00
Shannon 6fe9c4d4df Fixes the null PublishName problem, ensures the quey strings are not replaced when selecting a doc type 2018-05-02 15:35:26 +10:00
Shannon 9843f3a5fd Ensures that domains assigned to non-published nodes are filtered when routing, ensures caches are cleared when content is deleted or langauges are changed, updates logic for dealing with null invariant content names, adds more validation for saving cultre variants. 2018-05-02 14:52:00 +10:00
Shannon efc56c015f Merge remote-tracking branch 'origin/temp8' into temp8-U4-11289 2018-05-02 13:22:32 +10:00
Shannon Deminick 638b6e9cdc Merge pull request #2607 from umbraco/temp8-U4-11291
U4-11291 Paging in the IContentService needs to work with variant data - for both names and property values
2018-05-02 13:22:07 +10:00
Shannon fb759e3923 Merge remote-tracking branch 'origin/temp8' into temp8-U4-11289 2018-05-02 13:11:19 +10:00
Mads Rasmussen c308b081a1 start on docs for editorService 2018-05-01 20:21:48 +02:00
Mads Rasmussen 6c77313a82 remove background color on modal footer 2018-05-01 17:12:40 +02:00
Mads Rasmussen 7c42d29eb0 remove margin on actions 2018-05-01 17:11:54 +02:00
Robert 106955f6c3 Adds localization keys for some text, removed duplicate loading indicator 2018-05-01 16:41:36 +02:00
Mads Rasmussen e3754fb62f remove indentation code from the editorService 2018-05-01 15:33:14 +02:00
Mads Rasmussen db2d75c3f5 temp remove animations 2018-05-01 15:31:03 +02:00
Robert adfc8769e6 Adding missing service injection which broke discard changes dialog 2018-05-01 13:16:13 +02:00
Stephan 6548154261 Fixes 2018-05-01 12:45:07 +02:00
Robert 630212f66f remove console log 2018-05-01 12:06:43 +02:00
Robert a4b5e08a73 Simplified the way we mark variants as drafts trough localization keys, show published languages in the overlay instead of hiding them 2018-05-01 12:03:34 +02:00
Shannon be4ea93d12 U4-11289 Tracking the currently selected language in the main tree 2018-05-01 18:17:07 +10:00
Warren 8f11edc17a Fix up csproj to remove reference to file that's been removed in cleanup - umbraco/developer/packages/installer.aspx 2018-05-01 09:12:07 +01:00
Robert fc860d5061 Merge branch 'temp8' into temp8-U4-11173 2018-05-01 08:27:45 +02:00
Robert 03c574a97c Merge pull request #2605 from umbraco/temp8-U4-11290
U4-11290 - Disables Open in List View link from variant/language switcher in node name
2018-05-01 08:11:54 +02:00
Shannon f407c3b2b3 Updates test to test for variant doc type with invariant property types 2018-05-01 13:43:27 +10:00
Shannon 39f9449dc7 Adds overloads for content ctors to pass in culture so we can more easily set the name in the API nicely, adds a unit test for paging queries with variant data. 2018-05-01 13:30:25 +10:00
Shannon 171a82e233 Adds more description to CustomRouteUrlProvider 2018-05-01 12:23:09 +10:00
Shannon 459479a7b8 Refactors how macros are stored in the DB 2018-05-01 12:12:26 +10:00
Shannon 1bdf064437 Removes the DistributedCall section along with CacheRefresher and the ConfigServerRegistrar, changes IServerMessenger to not have any servers parameters since we don't use that. 2018-05-01 10:39:04 +10:00
Stephan 92b9184706 Swap order of IContentBase.SetName parameters 2018-04-30 22:05:07 +02:00
Stephan ff7c74ec8a Rename accessors 2018-04-30 21:29:49 +02:00
Stephan dbf310caf1 Now use empty string for invariant in published 2018-04-30 21:03:43 +02:00
Shannon 2afd257838 more cleanup of unused files 2018-05-01 01:55:40 +10:00
Shannon 19edfdb2a4 Removes unused and obsoleted code 2018-05-01 01:30:36 +10:00
Shannon 6faa2ff177 Removes unused and obsoleted code 2018-05-01 01:27:25 +10:00
Shannon c8d2ea141b Removes more xslt, more very old code and configurations that aren't used anymore 2018-05-01 01:15:43 +10:00
Shannon 310a31b03e More xslt removal and other file cleanup 2018-05-01 01:01:24 +10:00
Shannon 0a18306d40 More xslt removal 2018-05-01 00:45:05 +10:00
Shannon 0a5db8f97b Fixes up macros and file trees 2018-05-01 00:35:49 +10:00
Robert a4b24bf198 Content language picker now contains (if needed) Draft state to be consistent with the Publish dialog 2018-04-30 16:23:32 +02:00
Robert 92d88d5a4c Publish dialog should show only variants in Draft state 2018-04-30 16:18:35 +02:00
Shannon 6db5ebf6f9 More xslt removal 2018-05-01 00:15:05 +10:00
Robert a7f9628b48 Updated ContentItemDisplay model to contain IsEdited property 2018-04-30 16:06:53 +02:00
Shannon 9a2797303b cleaning up files 2018-04-30 23:30:08 +10:00
Shannon 51d608125d updates editor config file with vs specific rules 2018-04-30 23:29:44 +10:00
Shannon 890b5f30a1 Merge remote-tracking branch 'origin/dev-v7' into temp8
# Conflicts:
#	src/Umbraco.Core/Configuration/UmbracoSettings/IRepositoriesSection.cs
#	src/Umbraco.Core/Configuration/UmbracoSettings/IRepository.cs
#	src/Umbraco.Core/Configuration/UmbracoSettings/RepositoriesCollection.cs
#	src/Umbraco.Core/Configuration/UmbracoSettings/RepositoriesElement.cs
#	src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryConfigExtensions.cs
#	src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs
#	src/Umbraco.Core/Configuration/UmbracoSettings/UmbracoSettingsSection.cs
#	src/Umbraco.Core/Services/PackagingService.cs
#	src/Umbraco.Tests/Configurations/UmbracoSettings/PackageRepositoriesElementDefaultTests.cs
#	src/Umbraco.Tests/Configurations/UmbracoSettings/PackageRepositoriesElementTests.cs
#	src/Umbraco.Tests/Plugins/PluginManagerTests.cs
#	src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js
#	src/Umbraco.Web.UI/config/umbracoSettings.config
#	src/Umbraco.Web.UI/umbraco/developer/Packages/installer.aspx
#	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadPackager.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadPackages.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/installer.aspx.cs
#	src/umbraco.cms/umbraco.cms.csproj
2018-04-30 23:25:07 +10:00
Stephan 038fc87a40 Cleanup, fix tests 2018-04-30 15:11:01 +02:00
Warren 954098eb7e Comments out & leaves comment about removing the open in split view link (otherwise we will forget) 2018-04-30 13:52:05 +01:00
Stephan bcd0c95ec1 Refactor getting urls 2018-04-30 09:14:14 +02:00
Stephan 7dd1efb29f Refactor content culture & variations 2018-04-30 09:14:14 +02:00
Stephan 6959e595f5 IPublishedContent.UrlSegment 2018-04-30 09:14:14 +02:00
Stephan ce8775b3e7 Cleanup IPublishedContent 2018-04-30 09:14:13 +02:00
Stephan 27390afe86 All tests green 2018-04-30 09:13:21 +02:00
Stephan 923fdf9199 ISystemDefaultCultureAccessor 2018-04-30 09:13:21 +02:00
Stephan 908589277a U4-11227 - default variations and fallback (wip) 2018-04-30 09:13:21 +02:00
Stephan 8873fa9dd4 Merge pull request #2600 from umbraco/temp8-U4-11220
U4-11220 Implement routing for variants
2018-04-30 09:04:33 +02:00
Shannon a26d7747b6 removes commented out code 2018-04-30 15:51:05 +10:00
Stephan 8f13fa3ae5 ISystemDefaultCultureProvider 2018-04-27 18:21:06 +02:00
Stephan aa46e1e282 Test nullref on NPocoSqlExtensions 2018-04-27 17:54:49 +02:00
Stephan dbf1b1e0d4 Refactor DomainHelper 2018-04-27 17:54:49 +02:00
Stephan 9407f75522 Fix importing test 2018-04-27 17:54:40 +02:00
Shannon 5b555d35d3 adds test 2018-04-27 15:35:11 +10:00
Shannon f6984438a0 Fixes cases where there are no domains assigned, ensures there can't be duplicate URLs returned to the UI 2018-04-27 15:26:50 +10:00
Shannon 335cf65663 fixes more of my test logic 2018-04-27 14:01:29 +10:00
Shannon c19dbeda23 Adds a couple of tests which yielded some other issues with getting urls by culture, those are now fixed 2018-04-27 13:27:15 +10:00
Shannon 73567ffdce Fixes IPublishedShapshot and friends 2018-04-27 11:38:50 +10:00
Shannon ad6a745681 Changes CultureInfo to string where required, fixes tests 2018-04-27 11:08:20 +10:00
Shannon 59b6665ff3 Removes NiceUrl methods, renames NiceUrl test cases 2018-04-27 10:57:51 +10:00
Shannon 3cdc0e1142 Removes IShortStringHelper.ReplaceMany, this should just be a normal string extension and removes the need to load in IUmbracoSettings for this simple purpose, this fixes some unit tests 2018-04-27 10:26:32 +10:00
Shannon 270f3a75ff Fixes more tests 2018-04-27 09:57:04 +10:00
Shannon 12d56cd201 fixes null check which fixes a whole lot of failing tests 2018-04-26 23:48:07 +10:00
Shannon cb3cba5b05 Updates DefaultUrlProvider so that hieararchy of nodes that are variant and invariant still generate URLs correctly 2018-04-26 23:34:06 +10:00
Shannon ffd85b4e94 Fixes more bugs and outbound routing for additional urls 2018-04-26 22:54:36 +10:00
Shannon 23c40cbf2c Fixes a couple issues, changes name from PublishValues to TryPublishValues 2018-04-26 21:37:29 +10:00
Shannon e99c519032 Merge remote-tracking branch 'origin/temp8' into temp8-U4-11220
# Conflicts:
#	src/Umbraco.Web/PublishedCache/NuCache/DataSource/BTree.cs
2018-04-26 19:18:14 +10:00
Shannon Deminick c435597d7e Merge pull request #2599 from umbraco/temp8-U4-11250
Refine Variants [U4-11250]
2018-04-26 16:32:17 +10:00
Mads Rasmussen c71d00cd7e wip closing editors 2018-04-25 17:55:27 +02:00
Stephan 40f94d23d4 Cleanup 2018-04-25 17:39:02 +02:00
Stephan f3bf5d86d2 Cleanup BTree 2018-04-25 17:39:02 +02:00
Stephan 16aac382d1 Merge branch 'temp8' into temp8-U4-11220 2018-04-25 17:38:36 +02:00
Mads Rasmussen ef3b3326fc always take up all available space when editor is not the last opened one 2018-04-25 14:44:20 +02:00
Mads Rasmussen 79f303ddcf wip animation experiments 2018-04-25 10:29:18 +02:00
Stephan 87f9e8c72e Merge branch temp8 into temp8-U4-11250 2018-04-24 19:21:12 +02:00
Stephan aba5e849c1 Fix tests 2018-04-24 18:56:03 +02:00
Stephan ef2fd52482 Cleanup 2018-04-24 17:59:26 +02:00
Stephan 7b82208677 Implement getting avail/edit/publish cultures 2018-04-24 17:43:08 +02:00
Stephan 23333710f5 Implement culture available/edited 2018-04-24 16:50:13 +02:00
Shannon 2e38f7b27b Fixes PublishedContent.cs when the property index doesn't contain the alias index (due to adding a new property type and the json not matchin) 2018-04-24 17:28:57 +10:00
Shannon c5ca61f249 Fixes PublishedContent.cs when the property index doesn't contain the alias index (due to adding a new property type and the json not matchin) 2018-04-24 17:15:35 +10:00
Shannon 6db75d4226 Fixes PublishedContent.cs when the property index doesn't contain the alias index (due to adding a new property type and the json not matchin) 2018-04-24 17:11:09 +10:00
Shannon 43ca9593d4 fixes AliasUrlProvider 2018-04-24 16:29:55 +10:00
Shannon a1cd80a0f6 Removes GetLanguageByCultureCode since it is kind of useless and the name is also very misleading 2018-04-24 15:59:16 +10:00
Shannon f49fa7b567 don't show the variation toggle on a property type if the content type doesn't have it enabled, ensure the default variation is set on a new property type based on the content type setting 2018-04-24 15:41:50 +10:00
Shannon d552d5dadb Updates UI and mapping to update a property type to allow being culture variant 2018-04-24 15:27:33 +10:00
Shannon de2784c281 Adds culture optional parameters to all GetUrl methods on UrlProvider 2018-04-24 14:51:27 +10:00
Shannon 7c05f2e86c fixes routing cache key 2018-04-24 14:39:52 +10:00
Shannon e9bfad3c09 Merge remote-tracking branch 'origin/temp8' into temp8-U4-11220 2018-04-24 13:18:34 +10:00
Shannon 9044c9328d Gets inbound routing working, reduces the amount of non injected dependencies, reduces the amount of DomainHelper instances 2018-04-24 13:07:18 +10:00
Shannon 48641166b9 WIP - gets 'inbound' routing working to generate culture specific URLs 2018-04-24 01:31:01 +10:00
Stephan 6dfb618efe Merge branch 'temp8' into HEAD 2018-04-23 12:57:12 +02:00
Mads Rasmussen 7e383ea961 fix issue with infinite mode and create route param in media editor 2018-04-23 11:13:01 +02:00
Robert 5e14af7d38 Merge pull request #2598 from umbraco/temp8-U4-11219
U4-11219 Wire up new APIs for Variant names
2018-04-23 11:09:18 +02:00
Mads Rasmussen 312b2ff435 Merge branch 'dev-v8' into temp-U4-11218 2018-04-23 09:43:22 +02:00
Stephan 6b9adfa929 Move IsCultureAvailable to IContentBase 2018-04-21 11:11:31 +02:00
Stephan a69019aea0 From int languageId to string culture 2018-04-21 09:57:28 +02:00
Shannon 7d349ef518 Replaces instances of UmbracoTemplatePage with UmbracoViewPage 2018-04-20 17:40:01 +10:00
Shannon 5dfa0e7446 Updates EntityRepository to support normal get operations adds another unit tests, adds notes. 2018-04-20 16:07:34 +10:00
Shannon 9325d30e7c adds some notes to the setVariantStatusColor 2018-04-20 13:44:20 +10:00
Shannon d99beb0c8b Gets the tree to display the culture specific name 2018-04-20 13:26:45 +10:00
Shannon e9f0e98d2c Updates EntityRepository to get the variant names for content items ... for the non-paged query which we can use in the tree 2018-04-20 13:12:55 +10:00
Shannon c84087e96b Gets the variant names working in the editor 2018-04-20 00:59:23 +10:00
Shannon d4252a3dc8 Merge branch 'dev-v8' into temp8-U4-11219 2018-04-20 00:12:31 +10:00
Shannon 6b12fe7c57 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8
# Conflicts:
#	src/Umbraco.Web/PropertyEditors/ParameterEditors/MultipleContentPickerParameterEditor.cs
2018-04-20 00:10:44 +10:00
Shannon 04da7cfd20 doh, fixes csproj merge 2018-04-20 00:09:12 +10:00
Shannon d5ebe12983 removes ununsed aliases 2018-04-20 00:05:45 +10:00
Stephan 5d1abaa713 Import missing parameter editor from v7 merge 2018-04-19 16:03:54 +02:00
Shannon e9e0274ad8 fixes MultipleContentPickerParameterEditor 2018-04-20 00:03:19 +10:00
Shannon 966de9b9f4 Merge branch 'dev-v8' into temp8-U4-11219 2018-04-19 23:49:06 +10:00
Shannon c46d4e9e43 Merge remote-tracking branch 'origin/dev-v7' into dev-v8
# Conflicts:
#	src/SolutionInfo.cs
#	src/Umbraco.Core/Configuration/UmbracoVersion.cs
#	src/Umbraco.Core/Persistence/Migrations/MigrationRunner.cs
#	src/Umbraco.Core/Persistence/PetaPoco.cs
#	src/Umbraco.Core/Scoping/NoScope.cs
#	src/Umbraco.Core/Scoping/ScopeProvider.cs
#	src/Umbraco.Core/Services/ContentService.cs
#	src/Umbraco.Core/Services/IContentService.cs
#	src/Umbraco.Tests/Persistence/Migrations/MigrationStartupHandlerTests.cs
#	src/Umbraco.Tests/UI/LegacyDialogTests.cs
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
#	src/Umbraco.Web.UI/umbraco/config/create/UI.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/zh.xml
#	src/Umbraco.Web/BatchedDatabaseServerMessenger.cs
#	src/Umbraco.Web/Editors/ContentController.cs
#	src/Umbraco.Web/Editors/MediaTypeController.cs
#	src/Umbraco.Web/HealthCheck/Checks/Security/ClickJackingCheck.cs
#	src/Umbraco.Web/HealthCheck/Checks/Security/ExcessiveHeadersCheck.cs
#	src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
#	src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs
#	src/Umbraco.Web/Models/Mapping/ContentPropertyDisplayConverter.cs
#	src/Umbraco.Web/Models/Mapping/ContentPropertyDtoConverter.cs
#	src/Umbraco.Web/Models/Mapping/ContentPropertyModelMapper.cs
#	src/Umbraco.Web/PropertyEditors/NestedContentPropertyEditor.cs
#	src/Umbraco.Web/PropertyEditors/ParameterEditors/MultipleContentPickerParameterEditor.cs
#	src/Umbraco.Web/Trees/ContentTreeControllerBase.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs
2018-04-19 23:41:35 +10:00
Mads Rasmussen ee853f0189 Merge branch 'dev-v8' into temp-U4-11218 2018-04-19 15:15:10 +02:00
Shannon 1d0d6e78de fixes tree again 2018-04-19 22:32:48 +10:00
Shannon 8ae27ecc27 Updates doc type editor to be able to change update the doc type to support being culture variant 2018-04-19 22:06:02 +10:00
Shannon 642ce36f59 updates when the tree does it's initialization , fixes migration 2018-04-19 21:58:59 +10:00
Shannon Deminick db5ffd6b29 Merge pull request #2594 from umbraco/temp8-U4-11128
Manage content variations [U4-11128]
2018-04-19 21:49:13 +10:00
Shannon 158eb18de0 Merge remote-tracking branch 'origin/dev-v8' into temp8-U4-11128 2018-04-19 18:16:49 +10:00
Mads Rasmussen 03ac073c02 Merge branch 'dev-v8' into temp-U4-11218
# Conflicts:
#	src/Umbraco.Web.UI/umbraco/Views/Default.cshtml
2018-04-19 09:59:31 +02:00
Robert 8e02aad2bb Merge pull request #2590 from umbraco/temp-U4-11177
U4-11177 Update tree nodes with the new node names based on variant/language
2018-04-19 08:35:01 +02:00
Stephan a68e37c67b Fix availability and names 2018-04-18 18:43:17 +02:00
Stephan dea47dfafe Fix availability and names 2018-04-18 18:28:47 +02:00
Stephan 5b1bdd84ee Fix availability and content name (WIP) 2018-04-18 16:04:33 +02:00
Stephan 4f17ecbdee Fix tests 2018-04-18 14:43:13 +02:00
Stephan ec7b038569 Variant names, availability, etc 2018-04-18 14:43:07 +02:00
Stephan d4244d3807 Fix faster languages 2018-04-18 14:42:20 +02:00
Stephan 46487fa466 Variant names, availability, etc 2018-04-18 11:14:08 +02:00
Shannon Deminick 415810ecfe Merge pull request #2589 from umbraco/temp-U4-11196
Fixes - U4-11196 Validation UI is not working for the content name field
2018-04-18 11:16:38 +10:00
Shannon fd3129f166 fixes TODOs 2018-04-18 09:42:30 +10:00
Stephan 58e4e2398a Variant names, availability, etc 2018-04-17 19:08:53 +02:00
Stephan 392965bb3a Faster languages 2018-04-17 19:08:44 +02:00
Stephan 26af63549f Fix vsts - wip 2018-04-17 10:52:32 +02:00
Stephan 70e3f895da Fix vsts - wip 2018-04-17 10:11:14 +02:00
Mads Rasmussen e6a69ccb0d add feature toggle for media grid edit button 2018-04-17 09:55:31 +02:00
Shannon f80a27f5d7 adds notes 2018-04-17 17:09:58 +10:00
Shannon f3d68276fe Fixes more angular promise chaining, fixes issue with the tree node UI not updating when sycn tree is called. 2018-04-17 17:04:52 +10:00
Shannon 2872d0b0a2 Fixes tree init logic when user isn't logged in, moves sequential promise chaining to a helper funciton, updates the route promise chaining to actual chain. 2018-04-17 14:43:17 +10:00
Mads Rasmussen 97548df146 rename folder 2018-04-16 21:42:11 +02:00
Mads Rasmussen ebf3ab3a41 add helpers to open media picker and media editor 2018-04-16 21:27:07 +02:00
Stephan c97822a430 Fix vsts 2018-04-16 17:48:45 +02:00
Shannon 319bd783ff Merge remote-tracking branch 'origin/dev-v8' into temp-U4-11177 2018-04-17 01:45:32 +10:00
Shannon e234eb22f6 ensure the language tree changing is done after the digest 2018-04-17 01:41:06 +10:00
Shannon d45112f2ab Gets the content tree controller to return the names for items per language (with mock data), wires up the navigation.controller to re-build the tree for the new language 2018-04-17 01:37:35 +10:00
Stephan 6b3c6eba8d Fix csproj, nuspec 2018-04-16 17:04:23 +02:00
Shannon f7719773f2 fixes passing in the element and clicking on a root node 2018-04-17 00:38:32 +10:00
Stephan 15c6e28354 Fix nuspec 2018-04-16 16:29:37 +02:00
Shannon b5b643e04c fixes up the activeTree issue 2018-04-17 00:09:53 +10:00
Stephan dc589f9b96 Fix csproj, nuspec 2018-04-16 16:08:26 +02:00
Mads Rasmussen 7a4ff7b9c0 Merge pull request #2588 from umbraco/temp-v8-UI-infinite-editing
Temp v8 ui infinite editing
2018-04-16 15:38:33 +02:00
Mads Rasmussen d0f9021bcf Merge branch 'temp-U4-11218' into temp-v8-UI-infinite-editing 2018-04-16 15:27:29 +02:00
Shannon a92361bd00 Tree refactor, cleanup legacy support, remove odd jquery callback object, removes unused files, removes publish dialog 2018-04-16 23:07:00 +10:00
Robert f7ce8af24d Language picker is now included in the invalid field prompt (red border) so it makes sense aesthetically. 2018-04-16 14:58:54 +02:00
Robert aebfc33037 Class renamed in .less file to bring back UI validation for content name 2018-04-13 14:51:02 +02:00
Stephan ed3e693308 Umbraco.Compat7.die.die.die 2018-04-13 11:03:35 +02:00
Warren Buckley 1c70c34d57 Merge pull request #2581 from umbraco/temp-U4-11209
fixes: U4-11209 Update layout for developer dashboards to fit new styles
2018-04-13 09:28:13 +02:00
Stephan ca00cde043 VSO build wip 2018-04-12 22:58:46 +02:00
Mads Rasmussen bf78bb16dd fixes: U4-11209 Update layout for developer dashboards to fit new styles 2018-04-12 18:37:37 +02:00
Shannon b53400ceca Fixes up promise chains for the tree, adds logic to the tree picker to track the deepest paths expanded and then when a language is changed, we reload the tree with the new language and also sync all paths so the user can continue where they left off but with the new language nodes. 2018-04-13 00:09:28 +10:00
Shannon Deminick e9c8df55ec Merge pull request #2579 from umbraco/temp-U4-11179
Fixes - U4-11179 Support selecting variants in content pickers
2018-04-12 21:59:38 +10:00
Shannon f903c42d1b Gets the tree reloading when the customtreeparams change too so now the language selection will auto trigger the tree to reload ... next task we'll make it re-sycn and work. 2018-04-12 21:56:49 +10:00
Shannon fddea8c815 Fixes data type pre-value issues with MNTP, removes unecessary contentpicker.html and memberpicker.html overlays since treepicker.html is all that should be used, cleans up the treepicker one to be more inline with our current angular standards. Removes uneeded event handling from treepicker 2018-04-12 21:29:36 +10:00
Shannon 80d682c22a Merge branch 'dev-v8' into temp-U4-11179 2018-04-12 14:30:50 +10:00
Warren d8459bf4b4 Changes to build script & references etc with Stephan 2018-04-11 18:06:33 +02:00
Warren Buckley fd75a59e13 Merge pull request #2575 from umbraco/temp-U4-11174
U4-11174 - Wire up new publish dialog when editing content/variants
2018-04-11 16:39:48 +02:00
Robert 01332db0a6 "split not a function" error fix 2018-04-11 15:44:43 +02:00
Robert 905a7d4a16 Added language drop-down in the content picker dialog window 2018-04-11 13:26:03 +02:00
Robert f9dcfbbf95 Merge pull request #2577 from umbraco/temp-U4-11176
fixes: U4-11176 Language Selector for the main content tree
2018-04-11 09:35:30 +02:00
Shannon a334a9999d Merge and simplify the variants selector to use routing logic now that we have routing built in for languages, now the pending changes alert is just using the default route change 2018-04-11 09:21:12 +10:00
Shannon 5eec80b8ae fixes trashing/trashed event dispatching 2018-04-11 09:05:02 +10:00
Warren Buckley 7d947afdf0 Merge pull request #2576 from umbraco/temp-U4-11178
Fixes - U4-11178 Browse to content node as a different variant/language
2018-04-10 16:42:25 +02:00
Mads Rasmussen cc2a90a697 set max-height on language dropdown 2018-04-10 15:36:26 +02:00
Mads Rasmussen d9e433b3ea emit and listen for events when languages are created/deleted 2018-04-10 15:36:06 +02:00
Mads Rasmussen b869e095e6 don't show the dropdown if there is only one language 2018-04-10 14:34:40 +02:00
Mads Rasmussen b30f414c15 remove padding in dropdown + node language dropdown 2018-04-10 13:56:44 +02:00
Mads Rasmussen e1394a18e5 add tree language selector + load in languages 2018-04-10 13:56:14 +02:00
Robert f3e473f64d Wrong property 2018-04-10 12:08:47 +02:00
Robert aba0b0448d Can change content node variants trough routeParams (languageId) 2018-04-10 11:50:37 +02:00
Robert 8d654e3630 Ctrl + K + D 2018-04-10 11:28:05 +02:00
Mads Rasmussen 9233a9f08a fix width of getting started dashboard 2018-04-10 10:24:36 +02:00
Shannon 53dc83ca16 removes unused method 2018-04-10 13:49:09 +10:00
Shannon c17217fc10 Merge remote-tracking branch 'origin/dev-v8' into temp-U4-11174 2018-04-10 13:40:12 +10:00
Shannon Deminick bfcad4f46d Merge pull request #2558 from umbraco/temp-U4-11127
WIP - U4-11127 Update ContentController for editing variants
2018-04-10 13:39:47 +10:00
Shannon 2ee955e664 Fixes media picker property editor attribute declaration, fixes promise chaining when saving content, fixes the boolean pre-value editor to accept a 'true' boolean value 2018-04-10 13:37:54 +10:00
Shannon 3d92ce96f3 Make sure client side validation executes before the publish dialog launches, then check the validation results, if there isn't any variant validations then close the dialog. 2018-04-10 12:41:11 +10:00
Shannon 09b0d61ab8 Ensures current variant is at the top of the publish list and is selected, disable the publish button if there are none selected 2018-04-10 12:26:19 +10:00
Shannon bf296158b0 Fixes displaying the audit trail on the info tab 2018-04-10 11:23:39 +10:00
Shannon 10b777a4e0 Merge remote-tracking branch 'origin/dev-v8' into temp-U4-11174 2018-04-10 10:53:10 +10:00
Shannon a23e36ffd2 Removes angularHelper.rejectedPromise since that is built into angular already 2018-04-10 10:52:39 +10:00
Shannon 584209c38d adds elipses to the publish button when there is more than one variant 2018-04-10 10:52:07 +10:00
Shannon 8a57380db4 fixes deleting a language 2018-04-10 10:50:53 +10:00
Shannon b7570ed2e0 Cleans up unused statusMessage thing 2018-04-10 10:05:19 +10:00
Shannon 07225de5cf re-binds the variants list when there is an error 2018-04-10 02:10:14 +10:00
Shannon 59f9af6eb8 Gets publish dialog mostly working with server side validation messages wired up to the dialog 2018-04-10 01:38:35 +10:00
Warren Buckley 2675669cf8 Merge pull request #2573 from umbraco/temp-U4-11171
fixes: U4-11171 Tree panel doesn't vertically scroll
2018-04-09 15:40:03 +02:00
Mads Rasmussen dfcb93abf9 fixes: U4-11171 Tree panel doesn't vertically scroll 2018-04-09 15:00:52 +02:00
Warren Buckley b98e7f2d3e Merge pull request #2567 from umbraco/temp-U4-10783
fixes: 
* The UI for the new bulk publish variants from Mads merged in
2018-04-09 13:27:21 +01:00
Shannon e61089f927 Merge remote-tracking branch 'origin/temp-U4-10783' into temp-U4-11174 2018-04-09 17:55:20 +10:00
Shannon 41d91c225f Gets validation working for trying to publish a document when there are validation problems with required languages 2018-04-09 16:59:45 +10:00
Shannon 1660d25bad ensures that only the default variant is available when creating content 2018-04-09 15:01:55 +10:00
Shannon 0971aa0ab6 fixes null check on image cropper 2018-04-09 13:35:18 +10:00
Shannon fb74b1b75f Merge remote-tracking branch 'origin/dev-v8' into temp-U4-11127 2018-04-09 13:25:02 +10:00
Mads Rasmussen c5f27aeea5 fix language tree sync 2018-04-06 11:14:25 +02:00
Mads Rasmussen 8e0133f8af return selected variants 2018-04-06 10:37:10 +02:00
Shannon d03a8098da Merge branch 'dev-v8' into temp-U4-11127 2018-04-06 14:52:28 +10:00
Shannon c760d25479 Merge remote-tracking branch 'origin/dev-v7' into dev-v8 2018-04-06 14:52:02 +10:00
Shannon e10698532b Merge branch 'dev-v8' into temp-U4-11127
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js
2018-04-06 13:56:07 +10:00
Shannon 8b88bb68ed must always register install components 2018-04-06 13:54:42 +10:00
Shannon c90d6be8ab U4-8861 Extract GlobalSettings to an interface and expose on the standard UmbracoConfig.For settings singleton including a bunch of cleanup, getting the installer and steps to be DI 2018-04-06 13:51:54 +10:00
Mads Rasmussen 7a4f7da0d6 a little bit of clean up 2018-04-05 21:10:38 +02:00
Mads Rasmussen f1c78b45a7 set overlay button state + call temp publish method 2018-04-05 16:11:30 +02:00
Mads Rasmussen 0f32b653a1 Change "Save and publish" label to "Publish" 2018-04-05 16:01:26 +02:00
Mads Rasmussen 875e05b680 add support for setting the overlay submit button state from the controller 2018-04-05 16:00:39 +02:00
Shannon 7442c96be1 removes unused methods 2018-04-05 23:15:51 +10:00
Shannon 990ca51279 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2018-04-05 23:11:24 +10:00
Shannon 262c4afb16 Removes FormsAuthentication cookie format and replaces with standard aspnet identity format, removes a bunch of old obsolete and unused code, fixes the culture setting issue, simplifies the UmbracoBackOfficeIdentity since it no longer needs to be a FormsIdentity and just a straight forward ClaimsIdentity 2018-04-05 23:10:51 +10:00
Mads Rasmussen 7636cd5eb6 add new publish overlay 2018-04-05 14:40:57 +02:00
Mads Rasmussen 54c41dfb23 open publish dialog when clicking the save and publish button 2018-04-05 14:39:57 +02:00
Mads Rasmussen 63315f6162 dont indent first center/target overlays 2018-04-05 14:39:04 +02:00
Mads Rasmussen a2356ea651 Restyle centered overlay 2018-04-05 14:37:58 +02:00
Mads Rasmussen 892eb56a2d fix backdrop z-index 2018-04-05 14:37:13 +02:00
Mads Rasmussen d09d50e013 add global overlay component + add simple service for opening and closing 2018-04-05 14:35:47 +02:00
Stephan eb6a08af31 v7@11d4189c8d 2018-04-05 14:12:15 +02:00
Warren 0dba812053 Merge branch 'patch-v7' into dev-v8 2018-04-05 10:44:34 +01:00
Shannon 798236dc85 removes unused code, cleans up web.confgi 2018-04-05 18:13:50 +10:00
Shannon 9bfe9e6bbf Ensures that the thread culture is set both in owin and in aspnet 2018-04-05 18:11:15 +10:00
Shannon a62422fac3 ensure that debug is true when developing 2018-04-05 15:09:12 +10:00
Shannon f32e787816 fixes dashboard.tabs.controller 2018-04-05 15:08:52 +10:00
Stephan 6da91b7770 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2018-04-04 17:43:26 +02:00
Stephan f7a14a03f2 Fix build, still some weird csc.exe versionning 2018-04-04 17:41:55 +02:00
Stephan 612acfac15 Fix solution 2018-04-04 09:59:01 +02:00
Warren 4047fb119d Adds in missing $scope dependency for Dynamic Dashboard Controller 2018-04-04 08:35:58 +01:00
Shannon 6d1e50c44d Merge branch 'dev-v8' into temp-U4-11127
# Conflicts:
#	src/Umbraco.Web.UI/web.Template.config
2018-04-04 16:51:00 +10:00
Stephan 683b47bae5 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2018-04-04 08:32:10 +02:00
Stephan 1b804e07e5 Push web.template.config 2018-04-04 08:28:10 +02:00
Shannon d89009bbe7 Changes targetFramework to 4.7, removes the huge assembly list, removes post build scripts since they don't work 2018-04-04 16:17:57 +10:00
Shannon e5b0b2bfb7 Merge branch 'dev-v8' into temp-U4-11127 2018-04-04 16:01:23 +10:00
Shannon 471009cfd1 nuspec for examine was incorrect 2018-04-04 16:00:14 +10:00
Shannon efeef98e55 fixes merge/build 2018-04-04 15:59:02 +10:00
Shannon c655e9c2b1 Merge branch 'dev-v8' into temp-U4-11127 2018-04-04 15:55:13 +10:00
Shannon d618151e4f Fixes the csproj, binding redirects and versions 2018-04-04 15:54:39 +10:00
Shannon f775fd8672 removes sqlce build commands since no packages folder exists anymore 2018-04-04 15:35:13 +10:00
Shannon cdd50b899a Merge remote-tracking branch 'origin/dev-v8' into temp-U4-11127
# Conflicts:
#	src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs
2018-04-04 15:04:11 +10:00
Shannon a673babfb7 Fixes Content List View installation, removes unecessary properties from the RecycleBinEventArgs, updates both the upload and image cropper property editors to properly remove all files including any associated with variants, updates several other places to deal with variants and Property.GetValue(langId), adds notes, ensures we are returning the corect IDictionary instead of Dictionary for some interfaces 2018-04-04 13:11:12 +10:00
Shannon b1d309aa16 Some updates based on PR review notes 2018-04-04 10:50:18 +10:00
Shannon 7a73175aa0 Starts wiring up the back office to the c# bits, updates controllers, mappers, models, property editors to support getting and saving data by language. The content editor now "works" with multi-lingual properties 2018-04-04 01:59:51 +10:00
Stephan d4bd4256f1 Fix models mapping 2018-04-03 16:20:19 +02:00
Stephan 553de2ea68 Cleanup ILogger 2018-04-03 16:15:59 +02:00
Stephan e3c6205d0c Fix 2018-04-03 15:32:46 +02:00
Stephan 75966dcfbd Merge branch origin/dev-v8 into dev-v8 2018-04-03 14:57:55 +02:00
Stephan cdd064ba08 Upgrade Dependencies 2018-04-03 14:54:01 +02:00
MADSRASMUSSB4A1\madsrasmussen fca9279322 update languages icon to globe instead of flag 2018-04-03 11:25:59 +02:00
Shannon e7bc4986a5 Start updating the model/controller for editing variants in the back office and wiring up the angular side of things 2018-04-03 19:25:43 +10:00
Warren Buckley c6814d41a9 Merge pull request #2557 from umbraco/dev-v8-merge-up-11164-regression
Merge upto V8 - U4-11164 Blank Login Screen regression from 7.10
2018-04-03 09:44:41 +01:00
Warren 05604880e0 Merge branch 'patch-v7' into dev-v8
* Merging up into V8 the 7.10 regression with assetsService locale stuff #U4-11164
2018-04-03 09:38:50 +01:00
Shannon 271a100759 Obsolete the methods we want to remove from ILogger 2018-04-03 16:38:31 +10:00
Shannon 26134cd616 updates nuspec and install.core.ps1 to not include the old dlls 2018-04-03 13:10:08 +10:00
Shannon 9d5156d7f0 fixes some tests 2018-04-03 13:01:01 +10:00
Shannon 1719d33a48 Fixes tests, updates examine, fixes how __Path is stored 2018-04-03 12:33:21 +10:00
Warren Buckley 1e9aad5a0c Merge pull request #2553 from umbraco/temp-U4-11165
U4-11165 Integrate language UI with the language controller in the back end
2018-03-30 21:03:20 +01:00
Warren ad14fbd1f8 Set the language to be mandatory too as well 2018-03-30 21:01:24 +01:00
Stephan f89816111b Wire NuCache and IdkMap 2018-03-30 14:00:44 +02:00
Stephan c75d4e5b5b Fix post-merge 2018-03-30 11:00:07 +02:00
Stephan f7a3c97da0 Fix build 2018-03-30 10:29:19 +02:00
Stephan 62b6efc4da Fix upgrading 2018-03-30 10:28:49 +02:00
Warren a9c184b4fd Updates the JS to remove unneeded services injected in
Updates view to be simpler if statement - that by having something set to it then we can show the UI
2018-03-29 20:54:20 +01:00
Warren 14b4c12cdb Adds NPM package.json lock file - so we ensure dependencies are consistent for all 2018-03-29 20:11:14 +01:00
Warren 1049a7be12 Updates UI .csproj - to remove the broken Analyzers for now (Not sure we use the lovely VS C# analyzers & more of a R# team) 2018-03-29 20:09:58 +01:00
Shannon 6d2bf71824 adds required check back in 2018-03-30 01:23:51 +11:00
Shannon 7f27862943 Gets correct validation working with languages, we can now create and update 2018-03-30 01:20:40 +11:00
Shannon b9d0c63002 Starts wiring up the language editor with the controller, ensure that you cannot delete a language at the repo level and makes sure that we return and show validation messages when the user tries to delete the default or last language. 2018-03-29 23:48:54 +11:00
Shannon Deminick 3489e66d64 Merge pull request #2546 from umbraco/temp-U4-11124
U4-11124 - Prevents deleting a default language (API Controller & Service Layers)
2018-03-29 22:48:24 +11:00
Shannon 826102ea4d Merge remote-tracking branch 'origin/temp-v8-UI' into dev-v8 2018-03-29 22:42:18 +11:00
Shannon 7fd9caf889 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8
# Conflicts:
#	src/Umbraco.Web/PublishedContentQuery.cs
2018-03-29 22:35:46 +11:00
Shannon 83e90969b3 i guess trying to rename the thing didn't work 2018-03-29 22:15:46 +11:00
Shannon 8f01a2ab0a fixes merge issues 2018-03-29 22:13:41 +11:00
Stephan 23e8632df6 Merge pull request #2549 from umbraco/temp-U4-11102
Examine v1.0.0 integration to Umbraco v8
2018-03-29 11:32:13 +02:00
Stephan c72ce0b759 Fix Examine PR, fix migrations and upgrades 2018-03-29 11:31:33 +02:00
Shannon 881fbb7f76 Merge remote-tracking branch 'origin/dev-v7' into dev-v8
# Conflicts:
#	build/Modules/Umbraco.Build/Umbraco.Build.psm1
#	src/SolutionInfo.cs
#	src/Umbraco.Core/Configuration/UmbracoVersion.cs
#	src/Umbraco.Core/DatabaseContext.cs
#	src/Umbraco.Core/IO/FileSystemProviderManager.cs
#	src/Umbraco.Core/ObjectExtensions.cs
#	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSevenZero/AddUserGroupTables.cs
#	src/Umbraco.Core/PropertyEditors/ValueConverters/IntegerValueConverter.cs
#	src/Umbraco.Core/Services/IdkMap.cs
#	src/Umbraco.Core/Services/UserService.cs
#	src/Umbraco.Core/packages.config
#	src/Umbraco.Tests.Benchmarks/app.config
#	src/Umbraco.Tests/UI/LegacyDialogTests.cs
#	src/Umbraco.Web/Cache/MediaCacheRefresher.cs
#	src/Umbraco.Web/Cache/UnpublishedPageCacheRefresher.cs
#	src/Umbraco.Web/Features/DisabledFeatures.cs
#	src/Umbraco.Web/Mvc/RenderRouteHandler.cs
#	src/Umbraco.Web/Mvc/UmbracoAuthorizeAttribute.cs
#	src/Umbraco.Web/PublishedCache/ContextualPublishedCache.cs
#	src/Umbraco.Web/PublishedCache/ContextualPublishedContentCache.cs
#	src/Umbraco.Web/PublishedCache/ContextualPublishedMediaCache.cs
#	src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedContentCache.cs
#	src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedMediaCache.cs
#	src/Umbraco.Web/PublishedContentQuery.cs
#	src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs
#	src/Umbraco.Web/packages.config
#	src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs
2018-03-29 20:01:14 +11:00
Stephan 295f727c90 Merge origin/dev-v8 into temp-U4-11102 2018-03-29 10:57:38 +02:00
Stephan 8cb92b95cb Fix migration plan 2018-03-29 09:39:37 +02:00
Shannon fb89f0a795 Merge commit '2aa0dfb2c5' into dev-v8
Force merging v7 -> v8, ignoring any conflicts and choosing "our" version (v8)
since we've manually merged it alraedy
2018-03-29 18:07:45 +11:00
Shannon 10dec4115d Updates to latest examine and replaces IExamineIndexCollectionAccessor since we now have IExamineManager 2018-03-29 16:42:11 +11:00
Shannon 5010cbbf30 Gets the examine stuff re-merged and updated after the great merge 2018-03-29 15:39:48 +11:00
Shannon 5482b8f2f0 Merge remote-tracking branch 'origin/dev-v8' into temp-U4-11102
# Conflicts:
#	src/NuGet.Config
#	src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs
#	src/Umbraco.Web/IPublishedContentQuery.cs
#	src/Umbraco.Web/PublishedContentQuery.cs
#	src/Umbraco.Web/Search/ExamineComponent.cs
#	src/Umbraco.Web/WebServices/ExamineManagementApiController.cs
2018-03-29 14:00:20 +11:00
Stephan 796d931f65 Fix tests & apps 2018-03-28 18:07:53 +02:00
Shannon 2c132fe15f ignores search properties that should not be discovered 2018-03-28 23:00:03 +11:00
Shannon 4b32387aec fixes bug with getting indexer properties in the mgmt controller 2018-03-28 22:50:31 +11:00
Shannon 3d42ce166f fixes bug with getting indexer properties in the mgmt controller 2018-03-28 22:48:04 +11:00
Shannon 53f66d2a1b removes unused class 2018-03-28 22:38:40 +11:00
Shannon 7d13704cf9 Updates to latest examine beta, cleans up more code, always reference a searcher by it's indexer 2018-03-28 22:23:17 +11:00
Stephan 14592a227b Merge origin/dev-v8 into v7 temp merge 2018-03-28 12:58:39 +02:00
Stephan 7adc986472 Cleanup various migration stuff 2018-03-28 12:40:52 +02:00
Stephan 0ecc333a90 Fix port, tests 2018-03-28 11:28:32 +02:00
Shannon 52aa02668f Gets examine working with proper events, tests are working, etc... 2018-03-28 16:12:43 +11:00
Shannon f0a342d84e Merge branch 'dev-v8' into temp-U4-11102 2018-03-28 12:58:42 +11:00
Shannon 487e4cbe20 Fixes various migration stuff - language migration was broken (public ctor), the custom sql in KeyValueService was incorrect, moved to migration syntax, InsertDataExpression didn't work, fixed with v7 code that does work, changes some Database.Execute to Execute.Sql so logging occurs. Fixes packages.config inclusion 2018-03-28 12:50:15 +11:00
Shannon c2707f3806 updates to latest examine and fixes a test 2018-03-28 12:46:34 +11:00
Stephan 0d22478186 Port v7@2aa0dfb2c5 - WIP 2018-03-27 17:59:53 +02:00
Warren e9380b048b Throw a HTTP Bad Request if an API request in backoffice is made to try & delete the Default Language 2018-03-27 16:33:28 +01:00
Stephan 6b1ed89cb0 Port v7@2aa0dfb2c5 - WIP 2018-03-27 16:42:52 +02:00
Stephan c2e1ba21b2 Port v7@2aa0dfb2c5 - WIP 2018-03-27 16:18:51 +02:00
Stephan d40a835701 Port v7@2aa0dfb2c5 - WIP 2018-03-27 10:51:41 +02:00
Stephan 0a4878d2a3 Port v7@2aa0dfb2c5 - WIP 2018-03-27 10:04:07 +02:00
Shannon c66365e11a gets some tests working 2018-03-27 18:35:16 +11:00
Shannon 88d66cfb53 Examine v1.0.0 integration, it now builds! now to run tests and fixup 2018-03-27 18:14:21 +11:00
Robert e5c7c5eb2d Merge pull request #2541 from umbraco/temp-U4-11121
U4-11121 New LanguagesController (back office editor controller) for …
2018-03-26 13:14:18 +02:00
Claus 19a408fcae U4-11121 New LanguagesController (back office editor controller) for persisting language changes 2018-03-26 10:55:49 +02:00
Mads Rasmussen 486ead0983 Merge pull request #2537 from umbraco/temp-U4-11129
U4-11129 Updates Content Delete Dialog with new copy/warning about variants
2018-03-23 14:57:46 +01:00
Warren Buckley 5449de6426 Merge pull request #2538 from umbraco/temp-U4-11126-variant-switch-prompt
Temp u4 11126 variant switch prompt
2018-03-23 13:50:31 +00:00
Mads Rasmussen 4fa27c09fa fix user dialog toggle 2018-03-23 14:47:12 +01:00
Mads Rasmussen fe32481b6e bring dashboards back to life 2018-03-23 14:14:25 +01:00
Mads Rasmussen cf81f97f73 show discard changes prompt when swithing variant 2018-03-23 11:28:27 +01:00
Mads Rasmussen 26b575b2f6 remove console log 2018-03-23 11:27:42 +01:00
Mads Rasmussen 8e8102a51d update styling for discard changes dialog 2018-03-23 11:27:24 +01:00
Warren 7b17539022 Merge branch 'temp-v8-UI' into temp-U4-11129 2018-03-23 10:05:01 +00:00
Warren 9269a257e8 Adds new info bar to content delete dialog with warning about variants/languages 2018-03-23 10:04:26 +00:00
Mads Rasmussen edeb9c61ac Merge pull request #2535 from umbraco/temp-U4-11125
U4-11125 - Updates Langugae Keys for when changing default language in info bar
2018-03-23 10:07:48 +01:00
Warren 8d0441ee08 Update language keys for changing default language warning 2018-03-23 09:03:06 +00:00
Stephan 59bac5c2a6 Fix a few things, the v8 way 2018-03-22 17:51:34 +01:00
Stephan a2a4edb3be Port v7@2aa0dfb2c5 - WIP 2018-03-22 17:41:13 +01:00
Mads Rasmussen 2250943c87 remove gray bg in context menu header 2018-03-22 15:43:13 +01:00
Claus 3a3d6239f0 U4-11144 GetManifestFiles fails if there's no App_Plugins folder 2018-03-22 15:35:51 +01:00
Claus a4c9d8f1bf typos 2018-03-22 15:34:28 +01:00
Claus e6010fcd1e Merge pull request #2534 from umbraco/temp-U4-11122
U4-11122 - Update DB and Service/Repo layer to handle language changes: mandatory, default
2018-03-22 15:18:15 +01:00
Claus 730c4eaf2d Merge pull request #2529 from umbraco/temp-U4-11123-take2
U4-11123 (Take 2) Updates Language Tree to not show having children or right click menu
2018-03-22 13:48:43 +01:00
Shannon 01b48a5aab adds logic for repository and unit tests 2018-03-22 23:15:52 +11:00
Warren Buckley c5365b7d0d Merge pull request #2528 from umbraco/temp-U4-11120
Temp u4 11120
2018-03-22 11:37:44 +00:00
Stephan 62c5f0f1ef Port v7@2aa0dfb2c5 - WIP 2018-03-22 11:25:38 +01:00
Stephan 8bfb8e2b72 Port v7@2aa0dfb2c5 - WIP 2018-03-22 11:25:33 +01:00
Stephan 41948607d0 Port v7@2aa0dfb2c5 - WIP 2018-03-22 11:25:25 +01:00
Stephan a9147f1473 Port v7@2aa0dfb2c5 - WIP 2018-03-22 11:25:22 +01:00
Stephan 8199b7710c Port v7@2aa0dfb2c5 - WIP 2018-03-22 11:25:18 +01:00
Stephan 0cbfebe21c Port v7@2aa0dfb2c5 - WIP 2018-03-22 11:25:08 +01:00
Mads Rasmussen f3859f891e localize "add language" 2018-03-22 10:46:38 +01:00
Mads Rasmussen bb7c96f408 better naming of tree language selector 2018-03-22 09:59:49 +01:00
Shannon b3fb23a67a Adds language entity changes and tests 2018-03-22 17:51:38 +11:00
Shannon d852c43559 oops, didn't mean to commit new lang tests 2018-03-22 17:33:16 +11:00
Shannon 0710311e70 uncomments an ignore attribute on a test that should definitely be passable 2018-03-22 17:27:34 +11:00
Shannon 422fd8e274 Fixes many hard coded SQL table names with the proposed new prefix 2018-03-22 17:17:01 +11:00
Shannon 448d490eb7 Adds TODO note about GlobalSettings 2018-03-22 16:35:16 +11:00
Shannon e2d039d984 Changes db prefix to 'umbraco' 2018-03-22 15:10:05 +11:00
Warren d8c1e2fa98 Makes sure to set no child nodes & menu url
Removes the child arrow for tree items
Removes the 3 dots for the context menu item that had nothing in it
2018-03-21 15:53:09 +00:00
Mads Rasmussen c701bf5a74 fix unit tests 2018-03-21 16:51:08 +01:00
Stephan 10972002d9 Fix install issues with super user 2018-03-21 16:10:33 +01:00
Mads Rasmussen 32daf0f8d7 only show default language info when toggle is turned on 2018-03-21 15:31:51 +01:00
Claus 37870e906c Merge pull request #2527 from umbraco/temp-U4-11123
Temp U4-11123 - Sets Language Root Tree Node to use custom UI
2018-03-21 14:36:11 +01:00
Claus 49a9a249d0 removes using statements. 2018-03-21 14:35:43 +01:00
Mads Rasmussen a23f122f5f only delete language when allowed 2018-03-21 14:01:48 +01:00
Mads Rasmussen bc4e97be48 fixes: U4-11120 Create new Language dashboard to create/remove/set default languages - angular 2018-03-21 13:39:16 +01:00
Warren 82bc05e0a0 Sets language tree root node with flag icon that child items had & sets the route for a custom UI
Removes child tree items as we will now use new UI to manage them
Removes menu items (as no need for create, refresh, delete etc)
2018-03-21 11:42:09 +00:00
Stephan 33a24e0e2f Fix the install process 2018-03-21 11:32:07 +01:00
Shannon df312309a3 ensure the key/value table is created 2018-03-21 16:53:21 +11:00
Shannon bd6dd13295 Updates the user Id to the new -1 2018-03-21 14:49:10 +11:00
Stephan c6986ef0ab With ModelsBuilder alpha.15 2018-03-20 16:56:05 +01:00
Stephan 32e6aa4f6b Version alpha.32 for ModelsBuilder 2018-03-20 16:21:26 +01:00
Stephan fe03f1af57 Merge remote-tracking branch 'origin/dev-v8' into dev-v8 2018-03-20 09:32:07 +01:00
Stephan 39cc7add80 Rename Umbraco.Whatever2 editors 2018-03-19 18:39:34 +01:00
Stephan 54122cc0c6 Troubleshoot, fix 2018-03-19 13:36:31 +01:00
Stephan dda696bde5 Troubleshoot, fix 2018-03-16 09:11:59 +01:00
Mads Rasmussen 2d263447cf lighten border on tree 2018-03-16 08:19:03 +01:00
Mads Rasmussen 26defd8f29 Merge branch 'dev-v7' into temp-v8-UI 2018-03-08 11:52:08 +01:00
Stephan 3637e1e5af Cleanup 2018-03-07 10:26:02 +01:00
Stephan c9f868dd3c UserId zero means null users, not super 2018-03-07 09:35:28 +01:00
Stephan e2ea849211 Cleanup 2018-03-07 09:34:41 +01:00
Stephan 2a3f284554 Cleanup 2018-03-06 17:24:28 +01:00
Stephan 0277ddc584 DataType troubleshooting 2018-03-05 14:59:23 +01:00
Stephan 030c97ef26 Super user is not a Zero 2018-03-02 16:00:15 +01:00
Stephan 20a7d9926b Improve ReflectionUtilities 2018-03-01 14:50:42 +01:00
Stephan a39511bf55 Troubleshooting 2018-02-27 16:13:23 +01:00
Stephan 1f60314348 Refactor editing, cleanup 2018-02-25 10:43:16 +01:00
Mads Rasmussen 725fec5b3c add active state to language dropdown 2018-02-22 10:08:27 +01:00
Mads Rasmussen a13711318e Merge branch 'dev-v7.8' into temp-v8-UI 2018-02-19 20:13:59 +01:00
Mads Rasmussen b0303a9e45 add more margin bottom to expansion panels 2018-02-19 19:53:03 +01:00
Mads Rasmussen f32513066f add border to node name input 2018-02-19 19:52:43 +01:00
Mads Rasmussen fecb5e7979 don't open splitview when publishing 2018-02-19 19:52:13 +01:00
Stephan 47d7677948 Refactor editing, all tests green 2018-02-16 12:00:45 +01:00
Stephan cfd2ba3b5a Refactor editing 2018-02-15 14:53:29 +01:00
Stephan d30842e1bf Cleanup editing 2018-02-14 16:55:42 +01:00
Stephan af7df0c6b5 Cleanup 2018-02-09 18:22:59 +01:00
Stephan aa614f1e20 Cleanup 2018-02-09 15:33:44 +01:00
Stephan 15d7fa76a8 Cleanup 2018-02-09 14:59:41 +01:00
Stephan fcb6dfdfdf Cleanup 2018-02-09 14:34:28 +01:00
Mads Rasmussen d5e32249ed fix split view on publish 2018-02-09 12:42:42 +01:00
Mads Rasmussen 3c78d59c67 Merge branch 'temp-v8-UI' into temp-v8-UI-infinite-editing 2018-02-08 20:58:36 +01:00
Mads Rasmussen 1de2d536c2 fixes styling of fixed header 2018-02-08 20:30:26 +01:00
Stephan f9a8f82434 DataTypes refactoring - getting frontend to work 2018-02-08 18:28:53 +01:00
Stephan c0439b3c4e DataTypes refactoring - troubleshooting 2018-02-08 16:08:52 +01:00
Mads Rasmussen 14a8045351 check for $scope.model 2018-02-08 14:26:17 +01:00
Mads Rasmussen 3fa59a6ac1 Merge branch 'temp-v8-UI' into temp-v8-UI-infinite-editing 2018-02-08 13:44:46 +01:00
Mads Rasmussen 2d337923a3 adjustments to editor header layout 2018-02-08 13:42:42 +01:00
Mads Rasmussen c9986a9aeb prototyping media picker 2018-02-08 11:04:56 +01:00
Mads Rasmussen 06714c2e31 add component and services to control infinite editors 2018-02-07 13:44:48 +01:00
Stephan 450854a209 DataType refactoring - polish 2018-02-07 13:35:59 +01:00
Mads Rasmussen 806b375e29 use umb-property-editor component instead of umb-editor 2018-02-06 09:52:39 +01:00
Stephan a97900515b DataType refactoring - polish 2018-02-05 17:48:54 +01:00
Mads Rasmussen 34c985dc19 Merge branch 'dev-v7.8' into temp-v8-UI
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/components/application/umb-navigation.html
#	src/Umbraco.Web.UI.Client/src/views/users/user.html
2018-02-05 13:59:09 +01:00
Stephan 947d08c947 DataType refactoring - troubleshooting 2018-02-02 19:50:48 +01:00
Stephan c748a2bc41 DataType refactoring - all tests green 2018-02-01 17:53:32 +01:00
Stephan b416079e12 DataType refactoring - troubleshooting tags and fixing tests 2018-02-01 14:14:45 +01:00
Mads Rasmussen 466e97086b remove border on sub header sections 2018-01-31 20:45:37 +01:00
Mads Rasmussen d1fac8885c adjust size on header icons 2018-01-31 20:44:59 +01:00
Mads Rasmussen 288048175f fix tree options 2018-01-31 20:43:54 +01:00
Mads Rasmussen 162d3ce47d show variant publish state in variant dropdown 2018-01-31 15:41:39 +01:00
Mads Rasmussen 21bf5cd4ec truncate tree node names 2018-01-31 15:39:27 +01:00
Stephan f5546ca870 DataType refactoring - troubleshooting and fixing tests 2018-01-29 19:23:25 +01:00
Mads Rasmussen 59612e9539 fine tuning the variant selector 2018-01-29 11:45:51 +01:00
Stephan e60a5a4a83 DataType refactoring - in progress 2018-01-26 17:55:20 +01:00
Mads Rasmussen 23c04ad830 added animations 2018-01-26 09:42:32 +01:00
Mads Rasmussen 9064d205bf move help drawer to right side 2018-01-25 16:37:17 +01:00
Mads Rasmussen 5f069670aa overlays shouldn't cover app header 2018-01-25 15:53:00 +01:00
Mads Rasmussen bff344dc70 small style adjustments 2018-01-25 15:45:54 +01:00
Mads Rasmussen 8368b81528 add close splitview icon 2018-01-25 15:43:30 +01:00
Mads Rasmussen 7fee6f7389 fix umb-table styling 2018-01-25 15:42:52 +01:00
Mads Rasmussen 78398fb8bb start on split view prototype 2018-01-24 14:46:53 +01:00
Stephan f7f42f893b DataType refactoring - in progress 2018-01-24 13:37:14 +01:00
Stephan c3e6886ac0 DataType refactoring - in progress 2018-01-24 11:44:44 +01:00
Stephan 97a058b817 DataType refactoring 2018-01-20 12:31:42 +01:00
Stephan e30d8f79ef DataType refactoring 2018-01-20 12:09:40 +01:00
Stephan 2f7f22961b Version alpha.31 with ModelsBuilder alpha.14 2018-01-20 10:21:01 +01:00
Stephan eff2e7a65b Manifest refactoring 2018-01-20 10:19:57 +01:00
Stephan 506d810cf6 DataType refactoring preparation - Entity refactoring 2018-01-15 15:54:06 +01:00
Stephan cc47276095 DataType refactoring preparation - Entity refactoring 2018-01-15 13:44:49 +01:00
Stephan d23933a5b1 DataType refactoring preparation - Entity refactoring 2018-01-15 13:28:35 +01:00
Stephan 988aa661ea DataType refactoring preparation - Entity refactoring 2018-01-12 10:48:36 +01:00
Mads Rasmussen 80c2cbdfe5 add umb-box to users 2018-01-10 22:23:54 +01:00
Mads Rasmussen e58b759d10 move user group back button to header 2018-01-10 22:11:35 +01:00
Mads Rasmussen d04d37ec90 move user back button to header 2018-01-10 22:09:43 +01:00
Mads Rasmussen b6528c533c add box to create/invite user 2018-01-10 22:06:10 +01:00
Mads Rasmussen b56e4e8b40 add umb-box to user sidebar 2018-01-10 20:37:00 +01:00
Mads Rasmussen 3b9d56f557 Merge branch 'dev-v7.8' into temp-v8-UI 2018-01-10 20:08:50 +01:00
Stephan b5856803e1 DataType refactoring preparation - Entity refactoring 2018-01-10 12:48:51 +01:00
Mads Rasmussen 2fea966a49 decrease space between sidebar and main content on info tab 2018-01-05 20:41:08 +01:00
Mads Rasmussen f1f4d64e85 update data type editor to use umb-box directive 2018-01-05 20:40:29 +01:00
Mads Rasmussen 9260c04a08 update styling + wip node variant picker 2018-01-05 14:01:51 +01:00
Warren Buckley 3a4e5a2027 Update client build NPM dependancy for gulp-connect to use 5.0.0 as next/latest version required you to use CoffeeScript to compile their src code to use the module/component 2018-01-03 12:00:01 +00:00
Stephan 2cb6378c26 Reorg code, move stuff 2017-12-28 09:27:57 +01:00
Stephan edf7df043f Reorg code, move services 2017-12-28 09:18:09 +01:00
Stephan af43ea0beb Reorg code, move dtos 2017-12-28 09:06:33 +01:00
Stephan 3be8f9f645 Variants - invariant segments, property values 2017-12-27 15:11:29 +01:00
Stephan 26f02ea6f2 Migrations refactoring - kill migrations table 2017-12-26 19:58:06 +01:00
Stephan bd3e762d9b Migrations refactoring - WIP - namespaces 2017-12-26 19:01:22 +01:00
Stephan a9d9221548 Migrations refactoring - WIP - cleanup 2017-12-26 12:54:27 +01:00
Stephan 8c8fac5d52 Migrations refactoring - WIP - plan 2017-12-26 11:37:57 +01:00
Stephan 16c919c1a5 Migrations refactoring - WIP - plan 2017-12-22 16:14:09 +01:00
Stephan 772c8ba242 Migrations refactoring, troubleshoot and fix, tests 2017-12-21 15:16:28 +01:00
Stephan 8066b2d4ed Migrations refactoring - WIP - immediate 2017-12-20 11:18:17 +01:00
Stephan a47320301d Migrations refactoring - WIP - immediate 2017-12-19 19:13:53 +01:00
Mads Rasmussen 46b1781567 fix navigation resize 2017-12-19 15:58:10 +01:00
Mads Rasmussen 40b4976a22 add user avatar to header 2017-12-19 13:47:23 +01:00
Mads Rasmussen 760d7897d8 prototype apps for media section 2017-12-19 13:07:22 +01:00
Mads Rasmussen 62954b4d7d expand all content panels when node is loaded 2017-12-19 11:27:26 +01:00
Stephan 2182b0f18f Migrations refactoring - WIP - move code 2017-12-19 11:00:46 +01:00
Stephan f6314e1361 Cleanup 2017-12-18 17:13:29 +01:00
Stephan bbff74fa51 UnitOfWork RIP, troubleshoot and fix, tests 2017-12-18 17:02:15 +01:00
Mads Rasmussen 46aee1d0af add back button to header 2017-12-18 15:44:42 +01:00
Mads Rasmussen aa975445f5 fix sections tray 2017-12-18 14:37:46 +01:00
Mads Rasmussen ba120e9627 remove search from tree + add languages to dropdown 2017-12-18 09:53:14 +01:00
Mads Rasmussen dcf64222da add shadow to header and footer 2017-12-15 18:29:02 +01:00
Mads Rasmussen 830ab2692f styling tweaks 2017-12-15 14:41:51 +01:00
Stephan 0ab2f6cc9f Faster variants in Property 2017-12-15 11:58:11 +01:00
Stephan e4b375f72d UnitOfWork RIP, build tests 2017-12-15 11:19:03 +01:00
Mads Rasmussen 7d080ff337 style umb-table 2017-12-15 10:51:42 +01:00
Mads Rasmussen 84a4b4007b add list view as an app 2017-12-15 10:22:49 +01:00
Stephan 33b4af0340 UnitOfWork RIP, IScopeAccessor 2017-12-14 17:04:44 +01:00
Mads Rasmussen 7b13feb29b change tabs to groups and add apps + first round of styling 2017-12-14 15:21:01 +01:00
Mads Rasmussen b29f591084 start on moving sections to new top bar 2017-12-14 11:24:37 +01:00
Stephan 6d4644c118 UnitOfWork RIP 2017-12-12 15:04:13 +01:00
Stephan 84f9242aa0 Persistence Shakeup 2017-12-07 16:45:25 +01:00
Stephan 269531c570 Published variants in NuCache 2017-12-07 13:22:32 +01:00
Stephan b392d72bc2 Published variants - WIP 2017-12-06 11:51:35 +01:00
Stephan 995f47e6d9 Add variants support to SetValue for files 2017-12-06 10:20:15 +01:00
Stephan d48cb8a66d Fix content event tests 2017-12-06 09:58:50 +01:00
Stephan 5ed82fe297 Fix content event tests 2017-12-02 16:14:21 +01:00
Stephan eb1b1f669c Remove rollback service method 2017-12-02 14:51:01 +01:00
Stephan eca51631b7 Refactor validation and publishing 2017-12-02 14:30:20 +01:00
Stephan eea1392ef4 Fix UI namespaces issues 2017-12-02 13:13:02 +01:00
Stephan aa25990681 Integer version ID, cleanup 2017-12-01 20:00:33 +01:00
Stephan 9b9c7c8e3a Refactor content service 2017-11-30 13:57:40 +01:00
Stephan 94127e9aa2 Implement content- and property-type variations 2017-11-27 19:17:50 +01:00
Stephan 62712cef3d More segment-only values 2017-11-23 16:30:04 +01:00
Stephan 23c0687ae0 Minor variant fixes, support segment-only values 2017-11-22 18:48:43 +01:00
Stephan e843b2c7ea Troubleshoot variants migration 2017-11-22 12:45:09 +01:00
Stephan c6514a6ee1 Troubleshooting variants, running the back-office 2017-11-22 08:39:54 +01:00
Stephan 228c8e7935 PropertyData evo.2 (tests) 2017-11-15 19:44:32 +01:00
Stephan ef11fda272 More content refactoring (tests) 2017-11-15 08:53:20 +01:00
Stephan fcf2b27953 More content refactoring (tests) 2017-11-10 11:27:12 +01:00
Stephan 09f499d5d6 More content refactoring (WIP, barely builds) 2017-11-08 08:39:36 +01:00
Stephan 6ce23ee8fd Migrate documents (WIP) 2017-11-01 16:27:24 +01:00
Stephan b66412e2d6 Complete PropertyData table migration 2017-11-01 15:35:37 +01:00
Stephan 8157daaf23 Cleanup migrations, PropertyData table name 2017-11-01 11:32:48 +01:00
Stephan e5b22bf731 Migrate PropertyData table 2017-11-01 10:42:46 +01:00
Stephan 472cb41190 Begin implementing Constants.DatabaseSchema 2017-10-31 18:03:40 +01:00
Stephan 829d995154 Simplicity 2017-10-31 12:50:30 +01:00
Stephan ec6ba01cbf So long Facade 2017-10-31 12:48:24 +01:00
Stephan ab758001ef Cleanup more build 2017-10-26 17:52:51 +02:00
Stephan 7463852202 Cleanup build 2017-10-26 12:49:49 +02:00
Stephan 2305426dda Version -alpha.30 with ModelsBuilder -alpha.13 2017-10-26 11:25:01 +02:00
Stephan edc5b398bd Version 8.0.0-alpha.29 2017-10-25 14:25:52 +02:00
Stephan cf46a51866 Getting NestedContent and ModelsBuilder happy 2017-10-25 13:23:14 +02:00
Stephan 0fe96a58c1 Migrate to Umbraco.Build 2017-10-20 17:53:41 +02:00
Stephan 14eb4fe6e0 Refactor PublishedContentTypes 2017-10-19 12:00:55 +02:00
Stephan cfe5350269 Refactor model type mapping in IPublishedModelFactory 2017-10-17 09:07:01 +02:00
Stephan c62513bd04 Remove ISharpZipLib dependencies where possible 2017-10-16 18:26:03 +02:00
Stephan 890b87a1cf More build fixing 2017-10-16 17:51:53 +02:00
Stephan 4a2ee801d4 Fix build 2017-09-29 22:07:48 +02:00
Stephan bcbd4289ea Facade cleanup and refactoring 2017-09-29 18:33:34 +02:00
Stephan ccd54392b7 More reflection utilities 2017-09-29 18:33:34 +02:00
Stephan d32f18f9e7 Relax versionning, version 8.0.0-alpha.26 2017-09-29 18:33:33 +02:00
Stephan 101ba8f620 Facade cleanup and refactoring 2017-09-29 18:33:16 +02:00
Stephan e7a0d79ea7 Bugfix, getting things to run 2017-09-27 16:14:11 +02:00
Stephan be00851b50 Installer image 2017-09-27 12:02:04 +02:00
Stephan 477acb4de3 Fix build, version 8.0.0-alpha024 2017-09-27 11:35:51 +02:00
Stephan 05cb03af11 Fix, now boots and runs 2017-09-27 10:26:37 +02:00
Stephan c24fdc0ddf Facade cleanup and refactoring 2017-09-27 10:26:36 +02:00
Stephan 91b8f073ad Reflection and model factory 2017-09-27 10:26:35 +02:00
Stephan d61ca898c4 PropertySet => PublishedElement 2017-09-27 10:26:34 +02:00
Stephan 057d1a3395 EditorConfig to CrLf 2017-09-24 22:10:19 +02:00
Stephan e71c9740cd More SqlTemplates 2017-09-24 18:54:31 +02:00
Stephan 5ba2ffcbf3 CrLfTab 2017-09-23 10:08:18 +02:00
Stephan c1e2625de0 Use ISqlContext 2017-09-22 19:19:28 +02:00
Stephan ee1941b9bf Refactor ISqlContext and SqlTemplates 2017-09-22 18:30:38 +02:00
Stephan c43bf6c741 Get tests green 2017-09-22 15:23:46 +02:00
Stephan dca3b74542 Refactor and fix tests 2017-09-20 20:06:46 +02:00
Stephan bcf3916e54 Refactor test options attribute 2017-09-19 18:47:07 +02:00
Stephan 1341a37f2b Cleanup Constants.ObjectTypes 2017-09-19 18:19:05 +02:00
Stephan 1308b4cc8b Import NPoco tests 2017-09-19 17:14:26 +02:00
Stephan 8721478fd3 Port 7.7 - WIP 2017-09-19 17:14:12 +02:00
Stephan ca0d5e365a Port 7.7 - WIP 2017-09-19 16:46:49 +02:00
Stephan 9ed6576908 Port 7.7 - WIP 2017-09-19 15:51:47 +02:00
Stephan d54658009c Port 7.7 - WIP 2017-09-18 15:33:13 +02:00
Stephan 9a28250a8d Port 7.7 - WIP 2017-09-15 18:22:19 +02:00
Stephan d9aaba192c Port 7.7 - WIP 2017-09-14 19:29:12 +02:00
Stephan 4634eb28e7 Port 7.7 - WIP 2017-09-14 11:41:46 +02:00
Stephan 37171d96bc Port 7.7 - WIP 2017-09-13 17:35:20 +02:00
Stephan e6de96cb90 Port 7.7 - WIP 2017-09-13 14:40:10 +02:00
Stephan 96c08f24ee Port 7.7 - WIP 2017-09-12 16:22:16 +02:00
Stephan 1c96df83cd Port 7.7 - WIP 2017-09-08 19:39:13 +02:00
Stephan 00d2ea928d Port 7.7 - WIP 2017-09-08 12:35:34 +02:00
Stephan 4dedd52e37 Port 7.7 - WIP 2017-08-26 17:39:23 +02:00
Stephan ac1e4bdfe3 Port 7.7 - WIP 2017-08-25 17:55:26 +02:00
Stephan 934d03e63f Port 7.7 - WIP 2017-08-24 21:24:14 +02:00
Stephan ab8fc33691 Port 7.7 - WIP 2017-08-14 18:21:48 +02:00
Stephan 1a40dd8d78 Build - remove Umbraco.MSBuild tasks 2017-08-09 11:19:11 +02:00
Stephan 9029d8dbd9 PropertyValueConverter - cleanup WIP 2017-07-31 11:27:29 +02:00
Stephan a0fe56ee7c Rename UmbracoExamine to Umbraco.Examine 2017-07-27 12:01:38 +02:00
Stephan 42a046b80c Cleanup AssemblyInfo 2017-07-27 11:18:41 +02:00
Stephan 4bfea6044a PropertyValueConverter - more WIP 2017-07-27 11:09:55 +02:00
Stephan 76569d58fe Cleanup DotSettings 2017-07-26 19:26:55 +02:00
Stephan db9eccc220 Cleanup versions 2017-07-25 18:06:28 +02:00
Stephan af25d5b0d1 Version 8.0.0-alpha0024 2017-07-25 15:27:18 +02:00
Stephan 83f84f05b9 PropertyValueConverter - refactoring WIP 2017-07-25 13:57:42 +02:00
Stephan 0e832d195a Benchmark dynamic ctors 2017-07-25 13:57:38 +02:00
Stephan c31cbf6b6d PropertySet - rename and refactor 2017-07-24 12:39:35 +02:00
Stephan 5d1c0d916c Build - remove Umbraco MSBuild tasks 2017-07-24 12:39:26 +02:00
Stephan 7dce104afb Build - fixes from v7 2017-07-21 10:08:06 +02:00
Stephan c76403077f Normalize cr/lf/tab 2017-07-20 11:21:28 +02:00
Stephan fa6c147a65 NuCache+Scope - caches 2017-07-19 19:59:46 +02:00
Stephan 2a9072609d Update AutoMapper to v6 2017-07-19 18:23:23 +02:00
Stephan 6098ba42a2 Update common dependencies 2017-07-19 18:23:14 +02:00
Stephan 1ff0338d35 NuCache+Scope - tests 2017-07-19 13:33:26 +02:00
Stephan d24ea3c95b NuCache+Scope - tests 2017-07-18 19:57:45 +02:00
Stephan c8052def7a NuCache+Scope add scope lock to ContentStore 2017-07-18 19:57:45 +02:00
Stephan 6d02ad3ce8 Build - fixes from v7 2017-07-18 19:57:45 +02:00
Stephan ea72b0a7b6 NuCache+Scope - more SnapDictionary scoping 2017-07-18 19:57:44 +02:00
Stephan b0303ca753 NuCache+Scope - add scope lock to SnapDictionary 2017-07-18 19:57:44 +02:00
Stephan ab42f8d6e0 NuCache - code cleanup 2017-07-18 19:57:44 +02:00
Stephan f668c25346 Cleanup 2017-07-18 19:57:44 +02:00
Stephan 291b4364c3 Scope/UnitOfWork db context and locking 2017-07-18 19:57:43 +02:00
Stephan 5897881ca8 CacheRefresherBase.This not .Instance 2017-07-11 19:21:13 +02:00
Stephan 41cc622260 Current.DistributedCache 2017-07-11 19:13:45 +02:00
Stephan 9619066a50 Persistence - cleanup 2017-07-11 16:29:44 +02:00
Stephan 5fe38d6aaf Build - Verify NuGet 2017-07-10 17:42:44 +02:00
Stephan 5c136483cc Fix NuSpec consistency 2017-07-10 12:30:53 +02:00
Stephan 35c979e33e Build - fix build.ps1, build docs 2017-07-09 18:46:10 +02:00
Stephan 59f4fd9713 Build - import build.ps1 2017-07-07 16:42:27 +02:00
Stephan 32d4d36847 Upgrade more dependencies 2017-06-30 21:39:26 +02:00
Stephan 534e11ae1e Upgrade ModelsBuilder 2017-06-30 21:29:30 +02:00
Stephan cf011a8366 Fix NuSpec 2017-06-30 21:29:14 +02:00
Stephan 410f3a32cc Fix build 2017-06-29 20:24:20 +02:00
Stephan 1cc6c91c52 Build Compat7 2017-06-29 19:31:26 +02:00
Stephan b120bb929a Fix dependencies 2017-06-29 19:23:14 +02:00
Stephan f6f00a2cda Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2017-06-29 17:26:38 +02:00
Stephan 10a7e4b5cf Fix tests 2017-06-29 17:22:28 +02:00
Claus f8274e4e99 Merge pull request #1439 from Mantus667/U4-7542
U4 7542
2017-06-29 14:28:04 +02:00
Stephan fc8bba188c Include NUnit3 Test Adapter 2017-06-29 08:21:00 +02:00
Stephan 9dee84a21d Fix build 2017-06-29 08:11:07 +02:00
Stephan 95bfc89ec0 Fix build 2017-06-28 21:27:56 +02:00
Stephan 7126234e80 Fix build 2017-06-28 21:11:02 +02:00
Stephan 777175c3fe v8-alpha0021 + migrations (wip) 2017-06-28 20:57:23 +02:00
Stephan 6c710dac93 Log4Net fixing 2017-06-28 20:57:23 +02:00
Stephan 8397fc8e1b Build with PS - fix 2017-06-28 20:57:22 +02:00
Stephan d37100e2d8 Build with PS 2017-06-28 13:38:06 +02:00
Stephan f85a688a0b Remove unwanted dependencies 2017-06-28 12:41:47 +02:00
Stephan 64b2a094f3 Fix WebProfiler for back-office 2017-06-28 12:33:48 +02:00
Stephan 45438c032e Upgrade to NUnit 3 2017-06-28 12:33:48 +02:00
Stephan a243af8a06 Consolidate and Update NuGet dependencies 2017-06-28 12:33:46 +02:00
Stephan 9e7b9ea5b5 From umbraco.dll to Umbraco.Web.dll 2017-06-28 12:33:45 +02:00
Stephan 687ccee100 Fix assembly version 2017-06-27 16:35:06 +02:00
Stephan faec8f7d94 Fixing tests - all green or ignored 2017-06-27 16:09:33 +02:00
Stephan e87be7ad9d Fixing tests - and all sorts of issues 2017-06-23 18:58:08 +02:00
Stephan 08ce8bc4dc Remove legacy projects 2017-06-20 12:12:29 +02:00
Stephan ddd89fa6e8 Remove legacy refs from Umbraco.Web 2017-06-20 11:00:09 +02:00
Stephan 3bf232ec3c Remove legacy refs from Umbraco.Web.UI 2017-06-19 09:41:58 +02:00
Stephan c369c93710 Remove legacy refs from UmbracoExamine 2017-06-19 09:25:23 +02:00
Stephan f62121d880 Move some tests 2017-06-14 09:56:14 +02:00
Stephan e11b267ef4 Bugfix FileSystems vs Scopes 2017-06-02 14:00:09 +02:00
Stephan d0abbf0664 Better boot fail error reporting 2017-05-31 15:25:07 +02:00
Stephan e17417c49f Get rid of IScopeInternal, add IScopeContext 2017-05-31 10:57:22 +02:00
Stephan d3133abcab Get rid of Mandate 2017-05-31 10:10:47 +02:00
Stephan 1e62ea8b16 Get rid of IScopeProviderInternal 2017-05-30 19:41:37 +02:00
Stephan 2435449854 Break ScopeProvider vs FileSystems circular dependency 2017-05-30 18:59:15 +02:00
Stephan 7ea9c9c8e2 Move Web.Current to Composing 2017-05-30 18:13:11 +02:00
Stephan 1f5c47f029 Move Plugins to Composing 2017-05-30 15:56:30 +02:00
Stephan 81234cd702 Rename DI to Composing 2017-05-30 15:46:25 +02:00
Stephan b251d23a57 Refactor DI and type loading 2017-05-30 15:33:57 +02:00
Stephan d34a425dd1 porting 7.6@5c5baca into 8 2017-05-30 12:54:22 +02:00
Stephan 13ec3db2d3 fix 7.6-rc1 port 2017-05-24 12:25:59 +02:00
Stephan 9c58410d6c vs2017 csproj wip 2017-05-24 12:25:44 +02:00
Stephan 0be86efc50 remove old files 2017-05-24 12:25:40 +02:00
Stephan 8561d85f7a porting 7.6-rc1 into 8 2017-05-24 12:25:39 +02:00
Stephan ade6c2f057 All projects use C# 7.0 2017-04-20 19:16:41 +02:00
Stephan 53f1cb0b0a temp-build 2017-03-14 19:13:08 +01:00
Stephan 824cf30e2e PluginManager TLC from v7 2017-03-05 11:59:11 +01:00
Stephan 3576794a64 Cleanup DI 2016-12-19 17:37:18 +01:00
Stephan 9eb467f38a Fix tests 2016-12-16 18:45:41 +01:00
Stephan 7f39f7748f Persistence reorg, killed DatabaseContext 2016-12-16 17:56:10 +01:00
Stephan 49d54f497d Persistence reorg 2016-12-16 17:20:51 +01:00
Stephan 467f71e392 Tests reorg, kill TestWithApplicationBase 2016-12-16 11:25:20 +01:00
Stephan d17959d1a8 Tests reorg 2016-12-16 10:40:14 +01:00
Stephan 1276415ea4 Improve components, proper cache refresher ordering 2016-12-15 13:15:49 +01:00
Stephan 37ca66f42e Fix tests 2016-12-15 08:57:23 +01:00
Stephan 621eb94225 Fix database scope, get the application to run 2016-12-14 19:22:00 +01:00
Stephan a7e5759526 Fix tests and cleanup 2016-12-14 18:40:16 +01:00
Stephan 68f84908c4 Fix build 2016-12-14 14:19:45 +01:00
Stephan 07a05317ff Merge dev-v7.6 into dev-v8 2016-12-14 14:06:30 +01:00
Stephan 04066e901f Fix tests 2016-12-13 15:41:55 +01:00
Stephan a55ae8ba57 Refactor Query in repos 2016-12-01 08:46:58 +01:00
Stephan fe3b28261f Deal with FIXMEs in persistence layer 2016-11-30 19:23:20 +01:00
Stephan 800b60ad68 Deal with FIXMEs 2016-11-30 18:32:22 +01:00
Stephan 39f6d5dacc Cleanup MapperCollectionBuilder init 2016-11-30 18:30:34 +01:00
Stephan f4d9e73da7 Copy Compat7 DLL over to UI only in VS 2016-11-30 13:31:03 +01:00
Stephan 6313a65824 Define COMPAT7 in Release mode too, to copy the DLL over to UI 2016-11-30 11:59:55 +01:00
Stephan e29f8bedb5 Fix tests 2016-11-29 19:05:36 +01:00
Sebastiaan Janssen 677cc74a61 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2016-11-29 18:02:49 +01:00
Sebastiaan Janssen 4855466b38 Merge remote-tracking branch 'origin/dev-v7.6' into dev-v8
# Conflicts:
#	build/NuSpecs/UmbracoCms.Core.nuspec
#	src/Umbraco.Core/DatabaseContext.cs
#	src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs
#	src/Umbraco.Core/Persistence/PetaPoco.cs
#	src/Umbraco.Core/Persistence/UmbracoDatabase.cs
#	src/Umbraco.Core/Services/ContentTypeService.cs
#	src/Umbraco.Core/UmbracoApplicationBase.cs
#	src/Umbraco.Web.UI/packages.config
#	src/Umbraco.Web/Scheduling/LogScrubber.cs
#	src/Umbraco.Web/Scheduling/ScheduledPublishing.cs
#	src/Umbraco.Web/Search/ExamineEvents.cs
#	src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs
#	src/Umbraco.Web/UI/Controls/UmbracoControl.cs
#	src/Umbraco.Web/UI/Controls/UmbracoUserControl.cs
#	src/Umbraco.Web/Umbraco.Web.csproj
#	src/Umbraco.Web/UmbracoModule.cs
#	src/Umbraco.Web/packages.config
#	src/Umbraco.Web/umbraco.presentation/content.cs
#	src/Umbraco.Web/umbraco.presentation/library.cs
#	src/Umbraco.Web/umbraco.presentation/macro.cs
#	src/Umbraco.Web/umbraco.presentation/template.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadMacros.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/create/macroTasks.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/editMacro.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/insertMacro.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/umbracoField.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertMacro.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/settings/editTemplate.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/PreValueExtensions.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/RelationTypeExtensions.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-Content.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-DataTypes.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-PreValues.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-UmbracoObjectType.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/webservices/TagsAutoCompleteHandler.ashx.cs
#	src/UmbracoExamine/DataServices/UmbracoContentService.cs
#	src/umbraco.businesslogic/BasePages/BasePage.cs
#	src/umbraco.businesslogic/Log.cs
#	src/umbraco.businesslogic/User.cs
#	src/umbraco.cms/businesslogic/CMSNode.cs
#	src/umbraco.cms/businesslogic/Content.cs
#	src/umbraco.cms/businesslogic/ContentType.cs
#	src/umbraco.cms/businesslogic/Dictionary.cs
#	src/umbraco.cms/businesslogic/Packager/Package.cs
#	src/umbraco.cms/businesslogic/Property/Property.cs
#	src/umbraco.cms/businesslogic/RecycleBin.cs
#	src/umbraco.cms/businesslogic/Tags/Tag.cs
#	src/umbraco.cms/businesslogic/datatype/BaseDataType.cs
#	src/umbraco.cms/businesslogic/datatype/DataEditorSettingsStorage.cs
#	src/umbraco.cms/businesslogic/datatype/DefaultData.cs
#	src/umbraco.cms/businesslogic/datatype/DefaultPreValueEditor.cs
#	src/umbraco.cms/businesslogic/datatype/PreValue.cs
#	src/umbraco.cms/businesslogic/datatype/PreValues.cs
#	src/umbraco.cms/businesslogic/macro/macroPropertyType.cs
#	src/umbraco.cms/businesslogic/member/Member.cs
#	src/umbraco.cms/businesslogic/member/MemberGroup.cs
#	src/umbraco.cms/businesslogic/propertytype/propertytype.cs
#	src/umbraco.cms/businesslogic/relation/Relation.cs
#	src/umbraco.cms/businesslogic/relation/RelationType.cs
#	src/umbraco.cms/businesslogic/template/Template.cs
#	src/umbraco.cms/businesslogic/web/Document.cs
#	src/umbraco.cms/businesslogic/web/DocumentType.cs
#	src/umbraco.cms/businesslogic/workflow/Notification.cs
#	src/umbraco.cms/packages.config
#	src/umbraco.datalayer/SqlHelpers/MySql/MySqlInstaller.cs
#	src/umbraco.editorControls/BaseDataType.cs
#	src/umbraco.editorControls/DefaultData.cs
#	src/umbraco.editorControls/DefaultDataKeyValue.cs
#	src/umbraco.editorControls/DefaultPrevalueEditor.cs
#	src/umbraco.editorControls/KeyValuePrevalueEditor.cs
#	src/umbraco.editorControls/PickerRelations/PickerRelationsDataEditor.cs
#	src/umbraco.editorControls/PickerRelations/PickerRelationsEventHandler.cs
#	src/umbraco.editorControls/SettingControls/Pickers/Field.cs
#	src/umbraco.editorControls/imagecropper/PrevalueEditor.cs
#	src/umbraco.editorControls/macrocontainer/PrevalueEditor.cs
#	src/umbraco.editorControls/mediapicker/MediaPickerPrevalueEditor.cs
#	src/umbraco.editorControls/memberpicker/memberPicker.cs
#	src/umbraco.editorControls/packages.config
#	src/umbraco.editorControls/tags/PrevalueEditor.cs
#	src/umbraco.editorControls/tinymce/tinyMCEPreValueConfigurator.cs
#	src/umbraco.editorControls/ultimatepicker/ultimatePickerPrevalueEditor.cs
#	src/umbraco.editorControls/umbraco.editorControls.csproj
#	src/umbraco.editorControls/uploadfield/uploadFieldPreValue.cs
#	src/umbraco.editorControls/userControlWrapper/usercontrolPrevalueEditor.cs
2016-11-29 18:01:43 +01:00
Stephan 80503c92ce Fix cmsContentNu table creation during install 2016-11-29 11:34:51 +01:00
Stephan 581f3d791f Fix persistence layer refactoring 2016-11-29 11:31:38 +01:00
Stephan 6f91f8c2d7 Improve BootLoader logging in case of errors 2016-11-29 11:31:29 +01:00
Stephan feea4430f6 Fix dependencies 2016-11-29 10:48:47 +01:00
Stephan d407038141 Fix owin:AppStartup setting 2016-11-29 10:32:43 +01:00
Stephan a49af20275 More persistence layer refactoring 2016-11-29 10:31:25 +01:00
Stephan 74604c69f9 Fix tests after merge 2016-11-25 14:08:23 +01:00
Stephan 8e056aba66 Merge origin/dev-v7.6 into dev-v8-zbwip (builds, not tested) 2016-11-23 10:33:12 +01:00
Stephan 50f7af2823 Making tests less random! 2016-11-08 18:11:28 +01:00
Stephan 5d632b2426 More structuring & minor fixes 2016-11-08 17:38:05 +01:00
Stephan babf00f510 Keep structuring tests 2016-11-07 20:50:14 +01:00
Stephan 2967add41a Keep structuring tests 2016-11-07 19:12:09 +01:00
Stephan 224986d56c Trying to cleanup and refactor tests 2016-11-07 18:32:44 +01:00
Stephan b9d39db995 Refactor build, put tests in the right place 2016-11-05 17:57:29 +01:00
Stephan dc75b20bc6 Refactor build, tests configuration is always Debug 2016-11-05 15:40:45 +01:00
Stephan ed9abcf181 Refactor build, better to build tests 2016-11-05 15:33:27 +01:00
Stephan d33083a2e6 Refactor build, why build tests separately? 2016-11-05 13:44:03 +01:00
Stephan 8aa730d986 Ensure U4-8720 is properly merged into v8 2016-11-05 13:16:22 +01:00
Stephan 467ed87c3b Ensure U4-8729 is properly merged into v8 2016-11-05 10:32:09 +01:00
Stephan bbe1825847 Ensure U4-8663 is properly merged into v8 2016-11-05 10:23:39 +01:00
Stephan a28b916534 Fix NPoco stuff 2016-11-04 19:19:16 +01:00
Stephan c6e4e3b3ed Merge origin/dev-v7-deploy into dev-v8-zbwip 2016-11-04 18:40:42 +01:00
Stephan a4c3d3ec2d Not supposed to have jquery.unobtrusive-ajax.min.js anymore? 2016-11-04 12:36:41 +01:00
Stephan f825ed6bb4 Post-merge fixing (running) 2016-11-04 12:14:42 +01:00
Stephan 3f4306a05f Consolidate and update dependencies 2016-11-04 12:05:51 +01:00
Stephan b29bc66026 Post-merge fixing & refactoring (tests ok) 2016-11-04 11:36:58 +01:00
Stephan b26b415096 Merge origin/dev-v7-deploy into dev-v8-zbwip (builds) 2016-11-03 10:31:44 +01:00
Stephan d44ee715a9 Minor cleanup 2016-10-20 12:22:08 +02:00
Stephan ec68993448 Cleanup hybrid accessors 2016-10-20 10:52:11 +02:00
Stephan acca83a6b1 Boot time optimization 2016-10-19 15:35:27 +02:00
Stephan c9adb39946 Explicitely register persistence mappers 2016-10-19 15:35:26 +02:00
Stephan b7ef002da5 Cleanup SignalR 2016-10-19 15:35:25 +02:00
Stephan a1c11d17ea Fix typo 2016-10-19 13:56:58 +02:00
Stephan 42adb46f2a Move Examine entirely to its own component 2016-10-19 13:56:57 +02:00
Stephan 33a773a0b9 Cleanup UmbracoContext 2016-10-18 17:28:36 +02:00
Stephan 88593b0bf3 Deal with fixme in FacadeRouter 2016-10-18 16:16:46 +02:00
Stephan 0fdd94e489 More fixes in Core DI 2016-10-17 18:53:21 +02:00
Stephan 422fef84ff Minor fix in Core DI 2016-10-17 15:16:07 +02:00
Stephan d8ba9723c8 Fix Umbraco.Core dependencies 2016-10-17 12:44:31 +02:00
Stephan 60a172343f Build TLC 2016-10-17 12:40:43 +02:00
Stephan 92c55e302f Oops, U4-8626 colateral WIP 2016-10-17 11:00:19 +02:00
Stephan 341e817fd5 Get tests to run, troubleshoot 2016-10-17 11:00:18 +02:00
Stephan 422a9cf162 Stop LightInject scanning of assemblies 2016-10-17 11:00:15 +02:00
Stephan 3c698cbf8c Refactor UmbracoContext, PublishedContentRequest... 2016-10-17 11:00:14 +02:00
Stephan 187e5ed751 Add and use ArgumentNullOrEmptyException 2016-10-17 11:00:13 +02:00
Stephan a00ee8d275 Rename DependencyInjection into DI, cleanup components, compose 2016-10-17 11:00:12 +02:00
Stephan 172ae81924 Build TLC 2016-10-17 11:00:09 +02:00
Stephan 11e41ee07e Restoring most resolvers in Compat7 2016-10-17 11:00:08 +02:00
Stephan 3bee1d3bce Version 8.0.0-alpha0020 2016-10-17 11:00:07 +02:00
Stephan 7784dfbbcb Upgrade ModelsBuilder to 8.0.0-alpha0005 2016-09-19 16:33:49 +02:00
Stephan 3a34e1fb90 Introduce Umbraco.Compat7 2016-09-19 16:33:48 +02:00
Stephan e9648f8d7b Introduce SafeCallContext 2016-09-19 16:33:48 +02:00
Stephan 5c2232aa3b Refactor logging and profiling, boot reporting 2016-09-19 16:33:47 +02:00
Stephan 091816a2ea RIP IApplicationEventHandler 2016-09-19 16:33:45 +02:00
Stephan 9fb9472193 Refactor hybrid accessors for async 2016-09-19 16:33:44 +02:00
Stephan 0597eea72b Resvolution - Components, Runtime & Booting 2016-09-19 16:33:43 +02:00
Stephan 18f3a7fbab Resvolution - Runtime components, fixing, cleanup 2016-09-19 16:33:42 +02:00
Stephan f32d984fbb Resvolution - Components 2016-09-19 16:33:41 +02:00
Stephan e25e77f167 Resvolution - WIP running without Resolution 2016-09-19 16:33:40 +02:00
Stephan 9dcc6b285f Resvolution - Booting 2016-09-19 16:33:39 +02:00
Stephan 9949f07a46 Resvolution - Loggers & Booting 2016-09-19 16:33:38 +02:00
Stephan 3707db6c21 Resvolution - ShortStringHelperResolver 2016-09-19 16:33:37 +02:00
Stephan 376dec2fed Resvolution - CultureDictionaryFactoryResolver 2016-09-19 16:33:36 +02:00
Stephan 352e02f064 Resvolution - ServerRegistrarResolver 2016-09-19 16:33:36 +02:00
Stephan 9782fc7083 Resvolution - ServerMessengerResolver 2016-09-19 16:33:35 +02:00
Stephan d5dd17746d Resvolution - PublishedContentModelFactoryResolver 2016-09-19 16:33:34 +02:00
Stephan 784f290f7b Resvolution - DefaultRenderMvcControllerResolver 2016-09-19 16:33:33 +02:00
Stephan 3b46539c98 Resvolution - SiteDomainHelperResolver 2016-09-19 16:33:32 +02:00
Stephan ce5ba3be2a Resvolution - FacadeServiceResolver 2016-09-19 16:33:32 +02:00
Stephan 1535079ee7 Resvolution - Kill 2016-09-19 16:33:31 +02:00
Stephan c4a00dbfb2 Resvolution - ImageUrlProviderResolver 2016-09-19 16:33:30 +02:00
Stephan 7ba122f124 Resvolution - FilteredControllerFactoriesResolver 2016-09-19 16:33:29 +02:00
Stephan cd432ddc57 Resvolution - SurfaceControllerResolver 2016-09-19 16:33:28 +02:00
Stephan 169735dab9 Resvolution - UmbracoApiControllerResolver 2016-09-19 16:33:28 +02:00
Stephan cac14d57eb Resvolution - ThumbnailProvidersResolver 2016-09-19 16:33:27 +02:00
Stephan 39e46ae0d6 Resvolution - PropertyValueConvertersResolver 2016-09-19 16:33:26 +02:00
Stephan 9608e9ca97 Resvolution - Prepare 2016-09-19 16:33:25 +02:00
Stephan efcd1d5483 Resvolution - Kill 2016-09-19 16:33:24 +02:00
Stephan 1b9aa68bb2 Resvolution - PackageActionsResolver 2016-09-19 16:33:24 +02:00
Stephan 713484eb26 Resvolution - Prepare, Tests 2016-09-19 16:30:45 +02:00
Stephan 69ab8c7afd Resvolution - XsltExtensionsResolver 2016-09-19 16:30:44 +02:00
Stephan a45ffb71a4 Resvolution - ValidatorsResolver 2016-09-19 16:30:43 +02:00
Stephan b1d6757952 Resvolution - EditorValidationResolver 2016-09-19 16:30:42 +02:00
Stephan 6b17156fe8 Resvolution - ParameterEditorResolver 2016-09-19 16:30:41 +02:00
Stephan aa8b8c7736 Resvolution - MappingResolver 2016-09-19 16:30:40 +02:00
Stephan 648632bd36 Resvolution - ContentLastChanceFinderResolver 2016-09-19 16:30:39 +02:00
Stephan 55eb813536 Resvolution - PropertyEditorResolver 2016-09-19 16:30:38 +02:00
Stephan 33ed19da1b Resvolution - ContentFinderResolver 2016-09-19 16:30:37 +02:00
Stephan e49a3f4c72 Resvolution - MigrationResolver 2016-09-19 16:30:36 +02:00
Stephan bbd632f644 Resvolution - ActionResolver 2016-09-19 16:30:35 +02:00
Stephan d8d736edda Resvolution - HealthCheckResolver 2016-09-19 16:30:35 +02:00
Stephan ebaeb98a4a Resvolution - UrlProviderResolver 2016-09-19 16:30:34 +02:00
Stephan da685167f7 Resvolution - UrlSegmentProviderResolver 2016-09-19 16:30:33 +02:00
Stephan caf3c4280a Resvolution - CacheRefresherResolver 2016-09-19 16:30:32 +02:00
Stephan ac271dfc3f Resvolution - Refactor 2016-09-19 16:30:31 +02:00
Stephan 09c3894209 Resvolution - Refactor, UrlProviderResolver 2016-09-19 16:30:30 +02:00
Stephan bda2dbfb88 Resvolution - Refactor 2016-09-19 16:30:30 +02:00
Stephan 5ee6a8c47b Resvolution - UrlSegmentProviderResolver 2016-09-19 16:30:29 +02:00
Stephan f43967c7b1 Resvolution - Refactor 2016-09-19 16:30:28 +02:00
Stephan 4e368f8d42 Resvolution - UrlSegmentProvider 2016-09-19 16:30:27 +02:00
Stephan 0817ffdd28 Resvolution - Prepare 2016-09-19 16:30:26 +02:00
Stephan dbdff2e2c4 Resvolution - PluginManager 2016-09-19 16:30:25 +02:00
Stephan 10c202cb9e Bugfix - ioc and replacing singletons 2016-09-19 16:30:24 +02:00
David Brendel 25130065f7 U4-7542
Moved member type tree to settings
2016-08-17 17:22:53 +02:00
David Brendel a53a572335 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v8' into dev-v8 2016-08-17 17:07:30 +02:00
Stephan e3343e6a2f UrlRedirect - bugfix 2016-08-15 13:08:00 +02:00
Stephan 17585e14e8 TEMP - HealthCheck and NuCache 2016-07-21 14:55:19 +02:00
Stephan 3fb2b97069 Fix lazy container resolver 2016-07-21 14:54:43 +02:00
Stephan 86968f218c Version 8.0.0-alpha0016 2016-07-21 11:07:34 +02:00
Stephan 4c74bd577a Fix build after rebase 2016-07-21 11:07:25 +02:00
Stephan 670659cca5 Feature - live SignalR preview - files 2016-07-21 10:31:29 +02:00
Stephan b7421537c5 Version 8.0.0-alpha0015 2016-07-21 10:27:04 +02:00
Stephan e5d3a777f2 Bugfix - Container resolvers & conflict issues 2016-07-21 10:27:04 +02:00
Stephan de68c02dfc Feature - live SignalR preview - nuget 2016-07-21 10:25:44 +02:00
Stephan bd2fa49581 Version 8.0.0-alpha0011 2016-07-21 10:25:44 +02:00
Stephan 61aa38a11f Bugfix - controller injection in Release mode 2016-07-21 10:23:29 +02:00
Stephan dbd7dc4252 Bugfix - views web.config 2016-07-21 10:23:29 +02:00
Stephan 9798e7d70c Bugfix - NuSpec for ModelsBuilder 2016-07-21 10:23:29 +02:00
Stephan 93539e4702 Bugfix - resolvers and ioc 2016-07-21 10:23:29 +02:00
Stephan 73185e93c2 NuCache - minor cleanup 2016-07-21 10:23:29 +02:00
Stephan bf22954abc Bugfix - MainDom must accept duplicate callback weights 2016-07-21 10:23:29 +02:00
Stephan 466438484a Upgrade ModelsBuilder to 8.0.0-alpha0003 2016-07-21 10:23:29 +02:00
Stephan 515b880e70 Bugfix - ContainerSingleObjectResolver 2016-07-21 10:23:29 +02:00
Stephan 6afe04837a Cleanup - PublishedContentModelFactory 2016-07-21 10:23:29 +02:00
Stephan 5497261eed Upgrade ModelsBuilder to 8.0.0-alpha0002 2016-07-21 10:23:29 +02:00
Stephan a43b47f9ba Upgrade ModelsBuilder to 8.0.0-alpha0001 2016-07-21 10:23:29 +02:00
Stephan 1f55f1c443 Version 8.0.0-alpha0007 2016-07-21 10:22:20 +02:00
Stephan 8f2522dd3e Fix NuSpec ranges 2016-07-21 10:21:53 +02:00
Stephan 9edffa010d Upgrade NuGet dependencies 2016-07-21 10:20:23 +02:00
Stephan 5cb3a3be2b Consolidate NuGet dependencies 2016-07-21 10:07:12 +02:00
Stephan 36c60c9b81 U4-8710 - from Umbraco.Field... try to re-implement 2016-07-21 10:03:11 +02:00
Stephan ffb30123cc U4-8710 - from Umbraco.Field, GetPropertyValue to Value 2016-07-21 10:03:11 +02:00
Stephan 9332335dff U4-8709 - refactor UmbracoViewPage, RenderModel 2016-07-21 10:03:11 +02:00
Stephan d2de66ab5c U4-8626 - kill typed queries 2016-07-21 10:03:11 +02:00
Stephan cdb1f29ec0 U4-8626 - kill dynamic support 2016-07-21 10:03:11 +02:00
Stephan 216329c096 Cleanup - kill IScopeContextAdapter, use accessors 2016-07-21 09:59:37 +02:00
Stephan f4ff50a03f Cleanup - file permission helper 2016-07-21 09:51:27 +02:00
Stephan a8bb18ecae Refactor - IPublishedContent, converters, fragments (cont) 2016-07-21 09:49:06 +02:00
Stephan 12e5372148 U4-8649 - apply to v8 2016-07-21 09:49:06 +02:00
Stephan d08412c0fe Refactor - IPublishedContent, converters, fragments 2016-07-21 09:37:40 +02:00
Stephan 78ab9c087d U4-7014 - merge IServerRegistrar2 into IServerRegistrar 2016-07-21 09:34:17 +02:00
Stephan a8975e6c41 NuCache - bugfix, must sort nodes when reloading from local db 2016-07-21 09:34:17 +02:00
Stephan f7e86eab3e Feature - live SignalR preview 2016-07-21 09:34:17 +02:00
Claus 71dc910623 Feature - live SignalR preview 2016-07-20 19:31:52 +02:00
Stephan a4a73d5586 Bugfix - container-based many resolvers 2016-07-20 19:31:30 +02:00
Stephan 0987b2d646 Cleanup - Attempt 2016-07-20 19:31:02 +02:00
Stephan be2d81154b U4-6674 - Kill ToContentSet, becomes ToIndexedArray 2016-07-20 19:30:42 +02:00
Stephan cfa91f000b Merge IPublishedContentWithKey into IPublishedContent 2016-07-20 19:30:42 +02:00
Stephan 9fe9f9d167 Cleanup - DisposableObject & disposing UmbracoContext 2016-07-20 19:30:15 +02:00
Stephan 5a839c3654 Cleanup - preview & forcing preview 2016-07-20 19:30:15 +02:00
Stephan e87e579e90 Cleanup - fix current UmbracoContext in async (but, really...) 2016-07-20 19:30:15 +02:00
Stephan df8dca6dee Cleanup - lazy PublishedPropertyType initialization 2016-07-20 19:28:17 +02:00
Stephan c0b9b050e9 Cleanup - fix broken stuff after cleanup 2016-07-20 19:28:17 +02:00
Stephan 74b8e5ba36 Cleanup - UmbracoContext and injection 2016-07-20 19:28:17 +02:00
Stephan ef013f9d3b Cleanup - Examine events 2016-07-20 19:23:09 +02:00
Stephan 5261a53a5d Cleanup - domains 2016-07-20 19:23:09 +02:00
Stephan fae688b896 Cleanup - membership 2016-07-20 19:23:09 +02:00
Stephan 2345d0c543 Cleanup - macros 2016-07-20 19:23:09 +02:00
Stephan f8d6c90193 Cleanup - ContentController ctor 2016-07-20 19:23:09 +02:00
Stephan ffeeb4f7d4 Cleanup - more distributed cache cleanup 2016-07-20 19:23:09 +02:00
Stephan ecadb918f2 Cleanup - no more stylesheet cache refresher 2016-07-20 19:23:09 +02:00
Stephan 0b041b28fa Cleanup - kill IsInRecycleBin and trust Trashed 2016-07-20 19:23:09 +02:00
Stephan 79195c5c7d Cleanup - minor stuff 2016-07-20 19:23:09 +02:00
Stephan 6e8fc27c13 U4-8397 - Cleanup server registration db & cache 2016-07-20 19:23:09 +02:00
Stephan f1fd918120 Cleanup - member (group) service 2016-07-20 19:23:09 +02:00
Stephan b2830f0c7d Cleanup - deleting non-empty containers 2016-07-20 19:23:09 +02:00
Stephan 88f9deda95 Cleanup - MediaService & ContentService 2016-07-20 19:23:09 +02:00
Stephan ccc701c298 Cleanup - TypeHelper 2016-07-20 19:23:09 +02:00
Stephan 2c12f4a82a Cleanup - VersionableRepositoryBase 2016-07-20 19:23:09 +02:00
Stephan b092c09c4b Cleanup - repository events = todo 2016-07-20 19:23:09 +02:00
Stephan 0c8cfbb7fa Cleanup - sub-repositories 2016-07-20 19:23:09 +02:00
Stephan ded5848e4c Cleanup - NPoco bulk inserts 2016-07-20 19:23:09 +02:00
Stephan d9fe474269 Cleanup - legacy template 2016-07-20 19:23:09 +02:00
Stephan f90f2e50c3 Cleanup - published member 2016-07-20 19:23:09 +02:00
Stephan c85626a4f1 Facade - cleanup 2016-07-20 19:23:09 +02:00
Stephan 03107dc82b Facade - use NoCache policy when reloading 2016-07-20 19:23:09 +02:00
Stephan 7c5542dca3 Facade - Cleanup access to 'current' 2016-07-20 19:23:09 +02:00
Stephan bc45dd8d6a U4-8536 - removing db.GetTransaction wherever possible 2016-07-20 19:22:26 +02:00
Stephan f584404324 U4-8551 - import NuCache code 2016-07-20 18:43:53 +02:00
Stephan 6e84e085c1 Merge branch dev-v8 into temp-u4-8497 2016-07-20 18:04:41 +02:00
Sebastiaan Janssen fe61553243 Also restore Examine packages to get it in the correct path for Build.bat 2016-07-20 17:41:56 +02:00
Stephan a0f2d63451 Fix build batch (is it real? take11) 2016-07-20 17:11:34 +02:00
Stephan 4a98c63de1 Fix build batch (is it real? take10) 2016-07-20 16:53:29 +02:00
Stephan 81341f7c32 Fix build batch (is it real? take9) 2016-07-20 16:36:54 +02:00
Stephan 21bf1c9c42 Fix build batch (is it real? take8) 2016-07-20 16:29:50 +02:00
Stephan 4ec0038b71 Fix build batch (is it real? take7) 2016-07-20 16:24:42 +02:00
Stephan 3fe84472a6 Fix build batch (is it real? take6) 2016-07-20 16:23:22 +02:00
Stephan 6528e6a204 Fix build batch (is it real? take5) 2016-07-20 16:03:12 +02:00
Stephan 77a38a6a32 Fix build batch (is it real? take4) 2016-07-20 16:01:11 +02:00
Stephan 16fb2cee26 Fix build batch (is it real? take3) 2016-07-20 15:37:14 +02:00
Stephan 247d9f8029 Fix build batch (is it real? take2) 2016-07-20 15:25:49 +02:00
Stephan f4aad94505 Fix build batch (is it real?) 2016-07-20 15:10:33 +02:00
Stephan f9fd8b67b1 Fix build after merge 2016-07-20 13:33:47 +02:00
Stephan 5df967355a Fix appveyor.yml (need blank lines) 2016-07-20 12:42:20 +02:00
Stephan c37effa668 Fix appveyor.yml (need blank lines) 2016-07-20 12:41:19 +02:00
Stephan ecee4d3702 Merge branch dev-v8 into temp-u4-8497 2016-07-20 12:38:57 +02:00
Stephan d6462370fc Fix after merge 2016-07-20 11:31:20 +02:00
Stephan c9152e3aca Fix build after merge 2016-07-18 15:00:08 +02:00
Stephan 77c2766d55 Merge branch origin/dev-v7 into dev-v8 2016-07-18 14:42:06 +02:00
Stephan d04efbf5a4 Retarget migrations after merge 2016-07-18 10:54:27 +02:00
Stephan 2594fa423f Cleanup after merge 2016-07-18 10:50:41 +02:00
Stephan a66cf484e8 Fix more tests after merge 2016-07-18 10:37:37 +02:00
Stephan 554b943931 Fix tests after merge 2016-07-08 19:20:57 +02:00
Stephan e19471fea7 Build - cleanup build.bat 2016-07-08 19:10:34 +02:00
Stephan be056869f0 Fix build after merge 2016-07-08 18:31:37 +02:00
Stephan 3c7245f9ba Merge origin/dev-v7 into dev-v8 2016-07-08 16:32:06 +02:00
Stephan f8b315dad0 Build - fix warnings 2016-07-08 14:17:49 +02:00
Stephan 9792aebf00 Build - fix InstallGit.cmd 2016-07-08 14:16:36 +02:00
Sebastiaan Janssen 7d6cbee9e6 Add msbuild.log to artifacts so we can easily figure out build errors if they occur 2016-07-08 14:15:03 +02:00
Stephan 263109d6ad Can we fix build.bat? 2016-07-08 13:47:32 +02:00
Sebastiaan Janssen 45e48c483d Makes the build of the Tests project quiet too
Do not PAUSE if the build fails, the build server will get stuck or an hour
2016-07-08 13:47:19 +02:00
Sebastiaan Janssen 423df156c1 Makes the build output only show warnings and errors so it's easier to pinpoint problems 2016-07-08 13:47:07 +02:00
Stephan 853e2c7888 Build - cleanup InstallGit 2016-07-08 13:46:23 +02:00
Sebastiaan Janssen 54009a04c3 Makes sense, recent commit removed one of these classes 2016-06-21 17:58:04 +02:00
Stephan f54022c5d2 Fix exception in DefaultDatabaseFactory during installs 2016-06-21 17:38:08 +02:00
Sebastiaan Janssen f58c9b5056 Merge branch 'u4-8191' of https://github.com/AndyButland/Umbraco-CMS into AndyButland-u4-8191
Conflicts:
	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/UserPermissions.cs
2016-06-21 17:33:57 +02:00
Stephan a512880855 U4-8553 - NPoco 3.3.4 2016-06-20 16:42:25 +02:00
Stephan bc0a4a8b05 U4-8497 - don't load content cache before running upgrades 2016-06-07 16:42:24 +02:00
Stephan f9dc594e25 Merge branch 'dev-v8' into temp-u4-8497 2016-06-02 15:15:31 +02:00
Shannon Deminick 9959d58fbc Merge pull request #1300 from umbraco/temp-u4-8400
U4-8400 (part) - cleanup repository cache policies
2016-06-02 14:51:29 +02:00
Stephan bc375e5fc2 U4-8400 - kill repository cache policy factories 2016-06-02 10:44:06 +02:00
Stephan 743a1451f5 U4-8400 - cleanup and document repository cache policies 2016-06-02 10:36:19 +02:00
Stephan 90500af915 Merge dev-v8 into temp-u4-8497 2016-06-02 10:03:14 +02:00
Sebastiaan Janssen 4ba1692b49 Remove some debug info an unnecessary path modification 2016-06-01 22:34:38 +02:00
Sebastiaan Janssen 8ec981f72e Missing CDF dependency 2016-06-01 22:04:09 +02:00
Sebastiaan Janssen 3314d4ccdf Trying to get datalayer to build 2016-06-01 21:56:43 +02:00
Sebastiaan Janssen 5732d12f8d Seems like we're gettting there.. 2016-06-01 14:08:21 +02:00
Sebastiaan Janssen 988b0485b9 Oops, forgot to remove experiments 2016-06-01 14:02:09 +02:00
Sebastiaan Janssen e627b55ec7 Okay, let's put the packages where AppVeyor is actually looking for them then 2016-06-01 13:55:58 +02:00
Sebastiaan Janssen 3b74e660a7 Is this path supported? 2016-06-01 13:45:59 +02:00
Sebastiaan Janssen 518e266832 AppVeyor recommends this method for doing package restore 2016-06-01 13:27:46 +02:00
Shannon bad6785ac6 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2016-06-01 13:24:23 +02:00
Shannon 1c82d8ac4e argh! no more extension methods that depend on singletons 2016-06-01 13:24:12 +02:00
Sebastiaan Janssen 570fd86919 Letting this restore be verbose for a minute because I think it has some problems 2016-06-01 13:16:18 +02:00
Shannon Deminick f5f7cf8d63 Merge pull request #1277 from umbraco/temp-u4-8447
U4-8447
2016-06-01 12:57:01 +02:00
Sebastiaan Janssen 0f0718db80 Hopefully fixes the build 2016-06-01 12:51:08 +02:00
Sebastiaan Janssen 347732463f Continued from PR 1254 (#1296)
* Changes Umbraco.Core to use project.json for package references, instead of nuget (next is the Web proj)

Changes the build to use correct version of MSBuild
Updates the Web.UI project to reference Microsoft.CodeDom.Providers.DotNetCompilerPlatform so that we can use c# 6 in views
Updates all other projects to use auto-package restore instead of the legacy nuget target restore

* Updates Umbraco.Web to use project.json - removes the lock file (will ignore)

* updates ignore to ignore lock files

* forgot about the tests project, removed the old nuget targets

* Need to restore some packages before we can build

* Update to latest nuget.exe which understands project.json

* This happened automatically, I'm guessing new NuGet removed these

* Correctly restore all necessary packages

* Fix merge problems and package version dependency conflicts

* Removes unnecessary file

* Removes unnecessary file

* Some things didn't make it during the merge, re-applying

* And even more changes that got reverted

* And even more changes that got reverted
2016-06-01 12:37:52 +02:00
Shannon b7985cb2c8 Merge remote-tracking branch 'origin/dev-v7' into dev-v8
# Conflicts:
#	src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs
#	src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs
#	src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs
2016-06-01 12:20:12 +02:00
Shannon 11552da6ec reverts change made to remove the 'child container' - this actually works well and doesn't interfere with the main container's scope mananger. Ignores the one failing test, need to ask Stephan 2016-06-01 00:36:10 +02:00
Shannon df9160b3cd Removes the 'Child Container' idea (that was bad and would consume lots of mem) and instead we use Scopes. Ensures that the app event handlers are creating during a single Scope operation in the CoreBootManager. Changes MigrationBase and all sub-classes to have an IMigrationContext as a ctor param. Updates the MigrationResolver to resolve Migration instances with the passed in IMigrationContext value. Simplifies MigrationBase since now we know we have a context to work with, there's no need to GetUp/GetDown Expression methods. Updates the MigrationRunner to use the MigrationContext instead of creating one itself. 2016-05-31 23:29:15 +02:00
Shannon a1b6240299 Fixes more merge issues and tests, removes lucene dependency from core (not sure why it was there), creates IExamineIndexCollectionAccessor for better testing for classes that require access to the indexers like the GridPropertyEditor. 2016-05-31 19:24:33 +02:00
Shannon c025dd463f Fixes up merging issues, bit of manual process with this one 2016-05-31 17:24:40 +02:00
Shannon 6a5a736877 Merge remote-tracking branch 'origin/dev-v7' into dev-v8
# Conflicts:
#	.gitignore
#	build/UmbracoVersion.txt
#	src/Umbraco.Core/Configuration/UmbracoVersion.cs
#	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateRelatedLinksData.cs
#	src/Umbraco.Core/Services/DataTypeService.cs
#	src/Umbraco.Core/Xml/XmlHelper.cs
#	src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs
#	src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs
#	src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs
#	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
#	src/Umbraco.Web.UI/config/ClientDependency.config
#	src/Umbraco.Web.UI/umbraco/config/lang/da.xml
#	src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs
#	src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs
#	src/Umbraco.Web/PropertyEditors/LabelPropertyEditor.cs
#	src/Umbraco.Web/PropertyEditors/MultipleMediaPickerPropertyEditor.cs
#	src/Umbraco.Web/Routing/ContentFinderByLegacy404.cs
#	src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs
#	src/Umbraco.Web/Umbraco.Web.csproj
#	src/Umbraco.Web/umbraco.presentation/content.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/create/DLRScriptingTasks.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/create/language.ascx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/developer/Python/editPython.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sendToTranslation.aspx.cs
#	src/umbraco.cms/businesslogic/Packager/Installer.cs
#	src/umbraco.cms/businesslogic/translation/Translation.cs
2016-05-31 16:00:32 +02:00
Shannon 2f44241439 fixes test 2016-05-31 15:17:00 +02:00
Stephan 18351b57b4 Consolidate on NewtonSoft.Json 8.0.3 2016-05-31 11:28:33 +02:00
Stephan ec4373a4df Upgraded to NPoco 3.3.3 2016-05-31 11:27:51 +02:00
Stephan a71894f1ec Merge branch 'temp-u4-8447' into temp-u4-8497 2016-05-30 18:45:47 +02:00
Stephan 7a9ff1fc3b U4-8447 - bugfix 2016-05-30 18:45:33 +02:00
Stephan 669d64dff4 Merge temp-u4-8447 into temp-u4-8497 2016-05-30 18:38:47 +02:00
Stephan a514ffc258 U4-8447 - fix xml serialization 2016-05-30 18:32:32 +02:00
Stephan 8c33a31f37 U4-8447 - fix services setup 2016-05-30 17:56:25 +02:00
Stephan ba7638793f U4-8497 - fixing... tests green 2016-05-27 12:48:38 +02:00
Stephan 2e4e8a3fbc U4-8497 - fixing tests... 2016-05-26 19:20:33 +02:00
Stephan 23ce1e5b6e U4-8447 - prepare for NuCache (fixing, now builds) 2016-05-26 18:48:35 +02:00
Stephan 06574b8b40 U4-8447 - prepare for NuCache (work-in-progress) 2016-05-26 17:12:04 +02:00
Stephan 8682940efb Merge branch 'dev-v8' into temp-u4-8447 2016-05-23 13:58:34 +02:00
Stephan 6b88714cdc U4-8447 - MediaService & MemberService 2016-05-23 13:56:59 +02:00
Stephan 4d852102e8 Refactor tests 2016-05-23 13:56:58 +02:00
Stephan 4870c228dc Fix tests 2016-05-20 11:24:30 +02:00
Shannon 1d2b629b66 Removes legacy MemberGroup business logic. 2016-05-19 19:44:46 +02:00
Shannon 23394b4eff Removes Relation and RelationType legacy business logic classes! 2016-05-19 19:36:30 +02:00
Shannon db1cac6086 Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2016-05-19 19:21:00 +02:00
Shannon b268f76aa9 Removes umbraco.cms.businesslogic.Dictionary !!! 2016-05-19 19:20:49 +02:00
Stephan a8850f8c0b Merge pull request #1247 from umbraco/dev-v8-ExamineV2
Examine v2 integration
2016-05-19 18:52:31 +02:00
Stephan 21fb67654b Merge dev-v8 into dev-v8-ExamineV2 2016-05-19 18:52:09 +02:00
Stephan 63a86704b6 Cleanup 2016-05-19 18:50:05 +02:00
Stephan b3a83e274f Fix tests 2016-05-19 18:42:07 +02:00
Shannon 9ba095508e Removes MySql stuff from the old data layer project since we need to remove this whole project anyways and these aren't used 2016-05-19 18:41:44 +02:00
Shannon 7621006200 updates trees.Release.config with correct tree 2016-05-19 18:17:49 +02:00
Shannon 1d8e0eb280 Merge branch 'u4-8192' of https://github.com/AndyButland/Umbraco-CMS into AndyButland-u4-8192
# Conflicts:
#	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
2016-05-19 18:16:47 +02:00
Stephan ed40ce0695 Merge branch 'dev-v8' into dev-v8-ExamineV2 2016-05-19 18:13:19 +02:00
Shannon c53d074aaf Merge branch 'U4-8195' of https://github.com/Mantus667/Umbraco-CMS into Mantus667-U4-8195
# Conflicts:
#	src/Umbraco.Web.UI/config/trees.Release.config
#	src/Umbraco.Web.UI/config/trees.config
#	src/Umbraco.Web/Umbraco.Web.csproj
2016-05-19 17:56:11 +02:00
Shannon b91da2949b Merge remote-tracking branch 'origin/dev-v8' into dev-v8-ExamineV2 2016-05-19 17:21:43 +02:00
Shannon 4ce9964019 fix merge issues 2016-05-19 17:21:34 +02:00
Stephan b7ed3b4fe2 Fix tests 2016-05-19 17:17:02 +02:00
Stephan dd29e692d6 minor scheduled publish fixes 2016-05-19 17:00:06 +02:00
Shannon f9ba3fe76f Merge branch 'dev-v8' into dev-v8-ExamineV2
# Conflicts:
#	src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs
#	src/Umbraco.Core/Plugins/PluginManager.cs
#	src/Umbraco.Core/Services/ContentService.cs
#	src/Umbraco.Core/Services/IContentService.cs
#	src/Umbraco.Core/Umbraco.Core.csproj
#	src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs
#	src/Umbraco.Tests/Services/ContentServiceTests.cs
#	src/Umbraco.Tests/Services/MediaServiceTests.cs
#	src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs
#	src/Umbraco.Web.UI/config/ClientDependency.config
#	src/Umbraco.Web/Editors/ContentController.cs
#	src/UmbracoExamine/UmbracoContentIndexer.cs
2016-05-19 16:32:22 +02:00
Shannon 6975642a98 puts the scheduled publish in a uow + lock 2016-05-19 15:45:46 +02:00
Shannon Deminick 0ad2a2bfa4 Merge pull request #1219 from MangoPieface/PublicAccessServiceExtension-HasAccessRemoval
U4-8199 - Removal of the internal unused obsolete HasAccess method in PublicAccessServiceExtensions.cs
2016-05-19 11:18:56 +02:00
Shannon 8127731f72 Namespace and file cleanup - Profiling --> Logging, root cache stuff moved to Cache, XmlHelper --> Xml, TypeFinder, etc.. --> Plugins 2016-05-18 23:34:56 +02:00
Shannon 7fb1b4fb3b Updates all cache refreshers to use ctor injection, no more applicationcontext singleton usages 2016-05-18 18:44:08 +02:00
Shannon 2880190b6f Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2016-05-18 18:13:04 +02:00
Shannon f51a98435f removes LegacyTransientObjectsResolver (no longer needed), makes CacheRefreshersResolver into a container resolver so we can ctor inject into them (these should NOT be transient instances), Fixes more extension methods that rely on ApplicationContext.Current which exposes a few issues like DescendantsAndSelf since that was only getting them for content types! 2016-05-18 18:12:41 +02:00
Stephan 57ee598fc5 Make sure to dispose UnitOfWork in tests 2016-05-18 16:53:32 +02:00
Shannon 885595b1e6 Hides and Obsoletes crappy extension methods that rely on ApplicationContext.Current and updates all usages to not use them - this is most important because the services were using extensions methods that go back out to the ApplicationContext.Current (booo!) 2016-05-18 16:06:59 +02:00
Shannon e20c1cd0bb U4-8465 Remove Core.Publishing namespace and classes 2016-05-18 13:10:36 +02:00
Stephan ddf38407d8 U4-4847 Refactor ContentService (#1266)
* U4-4748 - refactor Content-, Media- and MemberTypeRepository

* Cleanup Attempt

* Cleanup OperationStatus

* U4-4748 - refactor Content-, Media- and MemberTypeService

* U4-4748 - cleanup locking

* U4-4748 - refactor Content-, Media- and MemberRepository

* U4-4748 - refactor ContentService (in progress)

* U4-4748 - all unit of work must be completed

* U4-4748 - refactor locks, fix tests

* U4-4748 - deal with fixmes

* U4-4748 - lock table migration

* Update UmbracoVersion

* Fix AuthorizeUpgrade

* U4-4748 - cleanup+bugfix lock objects

* U4-4748 - bugfix

* updates a string interpolation
2016-05-18 10:55:19 +02:00
Stephan 12f4873c90 Kill IHttpContextAccessor 2016-05-17 19:41:02 +02:00
Stephan 9ac2c94373 post-merge + bugfixing 2016-05-17 18:56:33 +02:00
Stephan edda877fd6 Merge origin/dev-v8 into dev-v8-ExamineV2 2016-05-17 13:21:47 +02:00
Stephan 04ae479476 Fix build.bat so it supports C# 6 2016-05-13 14:16:47 +02:00
Stephan 4891bbf9a4 Update UmbracoVersion 2016-05-13 14:16:27 +02:00
David Brendel 75613fa60e Merge remote-tracking branch 'refs/remotes/umbraco/dev-v8' into dev-v8 2016-05-12 20:31:30 +02:00
Stephan 9458fad190 Upgrade to NPoco 3.3.0-beta3 2016-05-10 08:48:49 +02:00
Shannon 1a522f2136 Removes Auditing namespace 2016-05-09 10:10:26 +02:00
Shannon 648fbdd3f3 moves packaging models to models/packaging 2016-05-09 10:05:55 +02:00
AndyButland 1e0602bc45 Updated project reference to deleted file 2016-05-08 08:52:14 +02:00
AndyButland aed1986520 Removed legacy tree 2016-05-08 08:06:11 +02:00
AndyButland 1b4d7c3733 Migrated user permissions tree to new format; updated icon to indicate single user being acted on 2016-05-07 23:52:47 +02:00
Stephan aee7973c11 IScopeContextAdapter uses LogicalCallContext 2016-05-04 08:31:21 +02:00
Shannon Deminick 892935469d Merge pull request #1251 from umbraco/dev-v8-context
From IScopeContext/Factory to IScopeContextAdapter
2016-05-03 22:33:48 +02:00
Shannon a2bc99fabd Removes AmbientContext 2016-05-03 22:33:29 +02:00
Shannon 4619b7b67b fixes merge/rebase 2016-05-03 22:30:45 +02:00
Stephan 0b1f12c823 From IScopeContext/Factory to IScopeContextAdapter 2016-05-03 22:23:42 +02:00
Shannon Deminick 5d72bcdc86 Merge pull request #1249 from umbraco/temp-u4-6147
U4-6147
2016-05-03 22:19:53 +02:00
Stephan 4f0718ef3f U4-6147 - cleanup 2016-05-03 15:50:10 +02:00
Shannon c25f12b1cd Updates all examine refs - uses Nuget 2016-05-03 13:00:55 +02:00
Stephan 715e03d1c5 U4-6147 - fix tests 2016-05-03 11:15:04 +02:00
Stephan 94c82c7cf7 U4-6147 - cleanup units of work 2016-05-03 11:14:55 +02:00
Stephan 8f820d2ecf Merge dev-v8 into temp-u4-6147 2016-05-03 09:07:36 +02:00
Shannon f90a9c2e5e fixes unit tests, all should pass now 2016-05-02 18:29:35 +02:00
Shannon 3c446cbf82 Adds IQueryFactory property to IDatabaseFactory, DatabaseContext.
Changes exposed Query<T> to correct IQuery<T>
Creates interface for QueryFactory: IQueryFactory
Updates all repositories with these changes
2016-05-02 15:38:45 +02:00
Stephan dbaede43af U4-6147 - GetUnitOfWork becomes CreateUnitOfWork 2016-05-02 12:24:13 +02:00
Stephan dc0456e108 U4-6147 - stop injecting RepositoryFactory into services (it's in uow) 2016-05-02 12:18:25 +02:00
Stephan be32448426 U4-6147 - cleanup persistence units of work (in progress) 2016-05-02 12:12:21 +02:00
Stephan 578cb6eafb U4-6147 - repositories are not disposable (in progress) 2016-04-29 19:14:02 +02:00
Shannon 8ab482dbfb Merge branch 'dev-v8' into dev-v8-ExamineV2
Conflicts:
	src/Umbraco.Tests/packages.config
	src/Umbraco.Web.UI/config/ClientDependency.config
2016-04-29 17:12:59 +02:00
Shannon a5cbca348f re-delete files ... argh thanks gitkraken. 2016-04-29 17:11:51 +02:00
Shannon bd31dd6caf Fixes issue with ThreadStatic db
Uses IScopeContext which wraps either HttpContext or CallContext which is created/injected via IOC factory.
2016-04-29 17:08:34 +02:00
Shannon 5c24a3a734 Fixes AuthorizeUpgrade HtmlHelper reference 2016-04-29 15:22:07 +02:00
Shannon Deminick e0a5ad5236 Merge pull request #1226 from umbraco/dev-v8-persistclr
Core.Persistence - post-NPoco cleanup & refactor
2016-04-29 15:18:33 +02:00
Shannon 74b83f30c3 Gets all tests passing and updates content/media svc/repos with filters
The content/media services & repos are now consistent with their filter, filterargs parameters and tests have been updated to support this, we can now pass in more robust filters to these methods which is required by Examine to get published content from the db.
2016-04-29 10:50:03 +02:00
Stephan 8ab61039ed U4-6147 - refactor RepositoryFactory and all IUnitOfWork (in progress) 2016-04-29 09:10:00 +02:00
Shannon 209e9373d0 Rebuild on startup working
Gets indexes rebuilding at startup, gets indexes rebuilding with published content which required some updates to the content service/repo to pass in a more robust filter when paging. Added more tasks to fix up more of the examine parts like the local storage sync which currently just throws exceptions.
2016-04-29 00:50:26 +02:00
Shannon 734f5f35dc Fixes tests 2016-04-28 22:12:55 +02:00
Shannon cba64aeb49 cleans up the UmbracoExamineSearcher class
makes sure the temp storage stuff works - but this will be only configuration based searchers (legacy)
2016-04-28 20:19:38 +02:00
Shannon 0f2c59b735 Obsolete code updated to correct usages
Updates most of the code in the umbraco examine indexers to use current (non deprecated examine code)
2016-04-28 18:39:52 +02:00
Stephan b0a33844b1 Fixing tests - database 2016-04-27 19:59:01 +02:00
Shannon f992c47111 all tests passing 2016-04-27 16:37:57 +02:00
Shannon e42ac644a3 Merge branch 'dev-v8' into dev-v8-ExamineV2
Conflicts:
	src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs
	src/UmbracoExamine/DataServices/PropertyAliasDto.cs
	src/UmbracoExamine/packages.config
2016-04-27 14:30:10 +02:00
Shannon 0f2f439477 Updates examine, fixes more tests, ensures the correct FieldDefinitions are set 2016-04-27 12:58:43 +02:00
Shannon 589b80ca03 Gets all index tests passing 2016-04-26 17:29:40 +02:00
Shannon 2de8f5117c Adds parent id option, finally getting some examine tests passing 2016-04-26 15:48:25 +02:00
Shannon af95e4bb29 a little more integration, working on getting unit tests passing 2016-04-24 11:16:48 +02:00
Shannon 46e714208d More refactoring with new examine 2 version, it builds again but nothing will quite work yet, now to work on the unit tests. 2016-04-23 18:57:13 +02:00
Shannon 4491d033e9 it builds! ... now to fix a bunch more. 2016-04-22 23:23:27 +02:00
Stephan ae7b93609b Fixing tests - application context 2016-04-22 12:03:30 +02:00
Stephan 1f85f51ecd Fixing tests - services test object 2016-04-22 09:58:02 +02:00
Stephan 3daf2bf9a0 Fixing test - MultiValuePropertyEditorTests, FindingMigrationsTest 2016-04-22 09:34:12 +02:00
Shannon 1f2838cb0a fixes merge issues 2016-04-21 14:38:39 +02:00
Shannon 2027cd7b07 Merge branch 'dev-v8' into dev-v8-persistclr
Conflicts:
	src/Umbraco.Core/Persistence/UmbracoDatabase.cs
	src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs
	src/Umbraco.Tests/Umbraco.Tests.csproj
2016-04-21 12:19:14 +02:00
Shannon Deminick afc78317ca Merge pull request #1236 from umbraco/temp-u4-8354
U4-8354 - fix v8 tests
2016-04-21 12:15:55 +02:00
Shannon 081d6ecc07 adds notes 2016-04-21 12:15:39 +02:00
Shannon 55ae0d3af6 Ensure the correct services are injected in to property editors so they are not using singletons 2016-04-21 11:38:43 +02:00
Stephan 23817cdce5 Fixing tests - MigrationStartupHandler is IDisposable 2016-04-20 22:52:48 +02:00
Stephan 07b410459f Fixing tests - file systems 2016-04-20 22:52:48 +02:00
Stephan 4e702c7c79 Fixing tests - kill KegacyShortStringHelper 2016-04-20 22:52:48 +02:00
Stephan 41f6012eb3 Fixing tests - ServiceContext 2016-04-20 22:52:48 +02:00
Stephan bf51be950f Fixing tests - CoreBootManager 2016-04-20 22:52:48 +02:00
Stephan 7e8b4d13a7 Fixing tests - ValueListPreValueEditor 2016-04-20 22:52:48 +02:00
Stephan b04e070757 Fixing tests - Plugin and TypeFinder 2016-04-20 22:52:48 +02:00
Shannon 3ef204a46f Merge remote-tracking branch 'origin/dev-v7' into dev-v8
Conflicts:
	src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
	src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs
	src/Umbraco.Core/Persistence/UmbracoDatabase.cs
	src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
2016-04-20 15:53:13 +02:00
Shannon 289d5f5741 removes the need for the custom regex for the order by since we no longer have an order by sub-query 2016-04-20 12:51:42 +02:00
Shannon f149ca9c76 Fixes SqlCe and MySQL sorting on custom properties for list view, this also makes the query work much better and there is no longer a requirement for a sub-query in the order by statement. 2016-04-20 12:50:52 +02:00
Stephan 3b612bf346 Core.Persistence - more cleanup 2016-04-14 18:20:07 +02:00
Stephan 5b935dbd90 Core.Persistence - post-cleanup debugging 2016-04-13 21:21:20 +02:00
Stephan 01d46944b7 Core.Persistence - post-cleanup debugging 2016-04-13 18:27:39 +02:00
Stephan e6f6444034 Core.Persistence - post-cleanup debugging 2016-04-13 17:33:25 +02:00
Stephan aceaf4b15d Core.Persistence - massive cleanup 2016-04-13 17:33:09 +02:00
Shannon b8d8c9e59a fixes merge - but the sorting on custom field will not currently work, need to fix that now. 2016-04-13 16:41:45 +02:00
Shannon df016813ea Merge remote-tracking branch 'origin/dev-v7.5' into dev-v8
Conflicts:
	src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
	src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs
	src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
	src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs
	src/Umbraco.Core/Services/ContentService.cs
	src/Umbraco.Core/Services/MediaService.cs
	src/Umbraco.Core/Services/MemberService.cs
	src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs
	src/Umbraco.Web/Editors/AuthenticationController.cs
	src/Umbraco.Web/Editors/BackOfficeController.cs
	src/UmbracoExamine/UmbracoMemberIndexer.cs
	src/umbraco.businesslogic/UmbracoSettings.cs
2016-04-13 16:18:58 +02:00
Shannon 43f0d77c10 Merge remote-tracking branch 'origin/dev-v7' into dev-v8 2016-04-13 16:09:14 +02:00
Shannon a3158b48ac fix merge 2016-04-12 15:18:14 +02:00
Shannon 06ce26989a Merge remote-tracking branch 'origin/dev-v7' into dev-v8
Conflicts:
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web/PropertyEditors/RelatedLinksPropertyEditor.cs
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/WebApi/Filters/DisableBrowserCacheAttribute.cs
2016-04-12 15:16:19 +02:00
Stephan 365a01a476 From PetaPoco to NPoco (#1207)
* NPoco - 2.x (builds)

* NPoco - v3.1 (does not build)

* NPoco - builds

* NPoco - configure database factory (tests fail)

* Pick fix from 7.4

* NPoco - stock v3.1 - sort-of working

* NPoco - fix merge

* Fix Newtonsoft.Json in web.Template.Debug.config

* NPoco - fix SELECT *

* NPoco - fixing repositories

* NPoco - fix EntityRepository

* NPoco - fix EntityRepository

* NPoco - cosmetic

* NPoco - use 3.1.0-u001 from github/zpqrtbnk/NPoco

* Fixes build, NPoco needed to be referenced in the cms and UmbracoExamine projects

* Fixes lots of tests

* fixes more tests

* NPoco - bugfixing

* Bugfix CacheHelper in tests

* Bugfix connection mocking in tests

* NPoco - inject database in Sql.Select<>

* NPoco - discovery retry policy only once

* Enable C# 6 for Umbraco.Core

* NPoco - introduce UmbracoSql, cleanup

* NPoco - more cleanup and fixing

* NPoco - fix UserRepository

* Optimize InGroupsOf

* Implement UmbracoDatabase.FetchByGroups

* NPoco - fix Select

* NPoco - simplify GetPagedResultsByQuery

* Cherry-pick DisableBrowserCacheAttribute fix from 7.4

* Upgrade NPoco to use Sql<TContext>

* U4-8257 - cleanup relators

* 4-8257 - cleanup more relators

* Upgrade NPoco with more OOTB version

* fixes a couple tests, changes double check lock to Lazy<T>
2016-04-12 15:11:07 +02:00
sna 21f2929ab3 U4-8199 Remove the internal obsolete HasAccess method.
It it not used and marked as obsolete.
2016-04-08 14:37:33 +01:00
Shannon 1b8747bd6d removes legacy disable user menu item and uses the new/normal way of dealing with menu items. 2016-03-31 19:41:42 +02:00
Shannon c6a586274e Merge branch 'U4-8189' of https://github.com/danlister/Umbraco-CMS into danlister-U4-8189
Conflicts:
	src/Umbraco.Core/Constants-Applications.cs
	src/Umbraco.Web/Umbraco.Web.csproj
2016-03-31 19:40:07 +02:00
Shannon 4df5ddcb4c Removes old serializers for old tree formats 2016-03-31 18:50:25 +02:00
Shannon cf822be04f Merge branch 'MangoPieface-dev-v8' into dev-v8
Conflicts:
	src/Umbraco.Web/Umbraco.Web.csproj
2016-03-31 18:46:26 +02:00
Shannon b6f88895dc re-adds images that are still required for some of the legacy file editors 2016-03-31 14:35:49 +02:00
Shannon 734392bb0e Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2016-03-31 14:31:21 +02:00
Shannon b22fda1e80 fixes some ysods 2016-03-31 14:28:41 +02:00
Shannon Deminick aefe2ee1c3 Merge pull request #1196 from BatJan/dev-v8
Part 1 of U4-8226 Remove all unused/un-needed webforms files from the Umbraco.Web and Umbraco.Web.UI projects
2016-03-31 14:27:31 +02:00
Shannon 79bebb9e14 Merge remote-tracking branch 'origin/dev-v8' into dev-v8
Conflicts:
	src/Umbraco.Web.UI/config/trees.Release.config
	src/Umbraco.Web/Umbraco.Web.csproj
2016-03-30 16:08:08 +02:00
Shannon 74e1078c31 Merge branch 'U4-8198_file_system' of https://github.com/yannisgu/Umbraco-CMS into yannisgu-U4-8198_file_system
Conflicts:
	src/Umbraco.Web/Umbraco.Web.csproj
2016-03-30 16:07:45 +02:00
Warren Buckley 659af0ba48 Merge branch 'U4-8194' of https://github.com/jamescoxhead/Umbraco-CMS into jamescoxhead-U4-8194
# Conflicts:
#	src/Umbraco.Web/Umbraco.Web.csproj
2016-03-30 14:44:03 +01:00
Shannon Deminick 3c697436b1 Merge pull request #1195 from yannisgu/U4-8193
U4-8193  replaced loadMacros with MacrosTreeController
2016-03-30 15:15:41 +02:00
Shannon 429d7e2aff WIP - starts porting umbraco over to lucene 3 and Examine v2 2016-03-30 15:12:30 +02:00
James Coxhead efa8bf44f9 Merge remote-tracking branch 'upstream/dev-v8' into U4-8194
# Conflicts:
#	src/Umbraco.Web.UI/config/trees.Release.config
#	src/Umbraco.Web.UI/config/trees.config
#	src/Umbraco.Web/Umbraco.Web.csproj
#	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadDictionary.cs
2016-03-24 20:56:44 +00:00
James Coxhead d99aef5ee8 Updated config transforms 2016-03-24 20:30:31 +00:00
Stephan e6a187a3d6 Merge pull request #1197 from yannisgu/fixNewtonsoft
Fix Newtonsoft.JSON dependency when running in debug mode in v8
2016-03-24 20:17:53 +01:00
Yannis Guedel 69dc8bc57f fix newtonsoft.json 8.0.0 when running in debug mode 2016-03-24 19:49:01 +01:00
Jan Skovgaard 2d3d36a14c Removing unused member usercontrols and master layouts. 2016-03-24 12:43:51 +01:00
Jan Skovgaard e2fbbc3df0 First commit - Could not resist the urge to get rid of a lot of unused images as well as some of the unused .ascx files. Primarily images removed in this commit and two user controls no longer used in the dashboard.config. 2016-03-24 12:02:29 +01:00
Yannis Guedel 5ec0a58d4d fixed copy paste error 2016-03-23 22:58:52 +01:00
Yannis Guedel bb7d5b4bd2 U4-8193 replaced loadMacros with MacrosTreeController 2016-03-23 22:56:42 +01:00
Shannon 4defc881d4 Removes lots of dead methods 2016-03-23 12:00:58 +01:00
Shannon 295368fc2b Merge remote-tracking branch 'origin/dev-v7' into dev-v8
Conflicts:
	.gitignore
	build/UmbracoVersion.txt
	src/Umbraco.Core/Configuration/UmbracoVersion.cs
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/config/ClientDependency.config
2016-03-23 11:04:06 +01:00
Shannon 7d3ba43816 Removes lots of Dead Code - thanks NDepend! 2016-03-23 10:58:06 +01:00
David Brendel 91ab84ef72 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v8' into dev-v8 2016-03-22 21:52:03 +01:00
Shannon fb104004e0 Updates LightInject 2016-03-22 16:39:52 +01:00
Shannon 4355761da1 U4-8228 Update to latest Newtonsoft.Json 2016-03-22 16:35:23 +01:00
Shannon 9baf344ad3 U4-8227 Change Umbraco.Core.Models.Mapping.MapperConfiguration and Umbraco.Core.Models.Mapping.IMapperConfiguration implementations AND U4-6923 Update to latest Automapper - with signed assembly 2016-03-22 16:29:04 +01:00
Shannon b90cb7304b removes old moveOrCopy dialog, removes old CMSNode.asmx service (no idea what that did), some work on U4-8224 Remove all legacy/obsolete webservices from umbraco.presentation/webservices, and some work on U4-8226 Remove all unused/un-needed webforms files from the Umbraco.Web and Umbraco.Web.UI projects 2016-03-22 15:34:23 +01:00
Shannon ed7003110b Removes legacy trashcan business logic class along with the legacy trashcan webforms files. 2016-03-22 14:46:27 +01:00
Shannon cdb58d7f8c Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2016-03-22 14:39:21 +01:00
Shannon d296bf80ff Removes legacy 'Notification' business logic, adds new SetNotifications method to INotificationService 2016-03-22 14:39:08 +01:00
Stephan bd6e273779 Merge remote-tracking branch 'origin/dev-v8' into dev-v8 2016-03-22 14:38:00 +01:00
Stephan df99edba18 GitIgnore Umbraco.Tests/media 2016-03-22 14:37:48 +01:00
Shannon 329a48edea U4-8223 Remove all old events and event classes 2016-03-22 14:18:45 +01:00
Shannon 286e43bc10 U4-8222 Remove IMacroEngine - we will only ship with the macro engines we have currently 2016-03-22 12:48:59 +01:00
Shannon f181c3041e Ensures Admin creation has translation section 2016-03-22 12:35:59 +01:00
Shannon eb59d33f42 updates dictionary tree sort + config and ensures that all new users by default have access to translations 2016-03-22 12:34:25 +01:00
Shannon Deminick bc7016384c Merge pull request #1182 from Mantus667/U4-5448
U4-5448
2016-03-22 12:28:55 +01:00
Shannon 4fb69e0c59 updates trees sort order and trees.Release.config 2016-03-22 12:26:37 +01:00
Shannon Deminick fd0af41710 Merge pull request #1189 from yannisgu/U4-7543_Move_data_type_tree_to_settings
U4-7543 Move data type tree to settings
2016-03-22 12:20:58 +01:00
Shannon 4715a17c03 updates the csproj file with the removed items, puts back in punycode.min for now since its still used, fixes a couple ysods. 2016-03-22 12:11:02 +01:00
Shannon d52f295547 Merge branch 'BatJan-dev-v8' into dev-v8 2016-03-22 11:56:14 +01:00
Shannon 31733bdb6e Merge branch 'dev-v8' of https://github.com/BatJan/Umbraco-CMS into BatJan-dev-v8 2016-03-22 11:56:02 +01:00
James Coxhead 88ad2cdc37 Removed legacy loadDictionary class 2016-03-21 23:32:56 +00:00
James Coxhead a04506ba60 Created new dictionary tree controller 2016-03-21 23:31:22 +00:00
sna 34931cae91 Merge remote-tracking branch 'upstream/dev-v8' into dev-v8 2016-03-21 21:46:26 +00:00
sna afc3126125 U4-8199 - Remove the JSONSerializer, where used for serialisation it's been replaced with JavaScriptSerializer
Also removed references to JSONSerializer.ToJSONObject  in \Umbraco-CMS\src\Umbraco.Web\umbraco.presentation\umbraco\controls\Tree\JTreeContextMenuItem.cs as it looks like this is just used by the jsTree which will be removed in a future commit.

http://issues.umbraco.org/issue/U4-8199
2016-03-21 21:41:26 +00:00
Yannis Guedel 4db83be874 U4-7543 Move data type tree to settings
data type tree belongs in settings since it is heavily tied to content
types.
2016-03-21 22:38:40 +01:00
Jan Skovgaard a533362e7c Removing unused scripts, styles and images. 2016-03-21 22:35:52 +01:00
sna bfe9bd5a20 U4-8199 - Remove the obsolete EncodedStringWriter.cs
No references, clean build - looks safe to remove

http://issues.umbraco.org/issue/U4-8199
2016-03-21 21:15:31 +00:00
Sebastiaan Janssen 8113b7e66c Fixes NuGet build 2016-03-21 20:23:43 +01:00
Shannon 0964985711 Merge branch 'MangoPieface-dev-v8' into dev-v8 2016-03-21 17:47:41 +01:00
sna 5b5ff10af0 U4-8199: Removed SerializableData.cs, this was used by the XmlTree.cs for the Serializable.XmlTree in the ToString() method.
This in turn was only used in the LegacyTree class, so I deleted this too. This also meant I could remove the old Render method in BaseTree.

http://issues.umbraco.org/issue/U4-8199
2016-03-21 16:14:25 +00:00
Shannon Deminick 0c5081b6a3 Merge pull request #1185 from danlister/U4-8190
U4-8190 Converted umbraco.cms.presentation.Trees.UserTypes to use the new tree structure
2016-03-21 11:45:21 +01:00
Shannon Deminick 68245a85f0 Merge pull request #1183 from danlister/U4-8187
U4-8187 Removed legacy loadLanguages and loadTemplates tree classes
2016-03-21 11:39:09 +01:00
Dan Lister 1e08f5f9ce U4-8190 Converted umbraco.cms.presentation.Trees.UserTypes to use the new tree structure 2016-03-18 14:58:24 +00:00
Dan Lister 7f6296b255 U4-8187 Removed legacy loadLanguages and loadTemplates tree classes 2016-03-18 10:07:56 +00:00
David Brendel 0468af67d4 U4-5448
Move dictionary tree to translation section instead of settings section
2016-03-18 07:58:19 +01:00
Shannon 69e53b6510 Merge remote-tracking branch 'origin/dev-v7' into dev-v8 2016-03-17 16:46:55 +01:00
Shannon 9c1880b768 umbraco.interfaces = GONE! 2016-03-17 16:06:41 +01:00
Shannon 39c39879f9 Moves IPackageAction to _Legacy Core for now 2016-03-17 16:05:56 +01:00
Shannon 516d0365aa moves all package actions to Web _Legacy for now. 2016-03-17 16:03:12 +01:00
Shannon a4ab137c3f moves ICacheRefresher to Core 2016-03-17 15:59:35 +01:00
Shannon d4bf8287bd fixes an ioc registration for PartialViewRepository 2016-03-17 15:52:54 +01:00
Shannon c0f8532350 Removes ITree! 2016-03-17 15:48:43 +01:00
Shannon 1a880f6b68 moves the LegacyDialogHandler stuff to _Legacy namespaces for now, moves the legacy ITask and ITaskReturnUrl to the same namespace/proj. 2016-03-17 15:30:25 +01:00
Shannon bb6b9f4ebc moves legacy actions to _Legacy namespace for now 2016-03-17 15:28:46 +01:00
Shannon 7d20557937 Moves IAction and ActionsResolver to Web proj, removes IMenuElement, ITag, IUseTags 2016-03-17 15:26:22 +01:00
Shannon 12d7d060d7 Removes the super old INode and IProperty! 2016-03-17 15:13:50 +01:00
Shannon 73fdc17bc4 removes IMacroGuiRendering, all umbraco.interfaces/skinning classes, fixes CDF load in some aspx views, removes dialog/editmacro.aspx, removes macroParameterControl 2016-03-17 15:09:20 +01:00
Shannon 63cb6d96b2 Merge remote-tracking branch 'origin/dev-v7' into dev-v8 2016-03-17 14:30:02 +01:00
Shannon bcd12172eb manually merges: U4-4075 umbracoSettings help section removed 2016-03-17 14:28:06 +01:00
Shannon 430afcab90 Removes Umbraco.Core.Models.Template.GetTypeOfRenderingEngine 2016-03-17 14:21:15 +01:00
Shannon d4b0b3d31b removes IPublicAccessService.AddOrUpdateRule 2016-03-17 14:18:34 +01:00
Shannon 1ed1a8a580 umbraco.businesslogic.dll = GONE 2016-03-17 10:43:05 +01:00
Shannon a292defdb9 moves LegacySqlHelper to the only places that needs it now: umbraco.cms,marks as obsolete and internal since its temporary. 2016-03-17 10:41:21 +01:00
Shannon 4c9f4beaf9 Removes old 'Application' and renames to LegacySqlHelper 2016-03-17 10:39:39 +01:00
Shannon 24fed0de2e removes ISqlHelper usages from Web project 2016-03-17 10:35:02 +01:00
Shannon 9ac2d04aea User and User type from the old businesslogic assembly are GONE! 2016-03-16 17:52:08 +01:00
Shannon f594a1132d Remove IMediaFactory 2016-03-16 15:56:52 +01:00
Shannon 3b191239be Removes all usages of UserType 2016-03-16 15:55:26 +01:00
Shannon e1f17e848d moves the legacy serialization classes for the super old XmlTree format into Web proj so we can remove the businesslogic DLL first, we'll get to removing those classes later as it will be a bit tricky. 2016-03-16 15:29:08 +01:00
Shannon 88504306ca fixes merge 2016-03-16 15:14:00 +01:00
Shannon d37d31246e Merge remote-tracking branch 'origin/dev-v7' into dev-v8
Conflicts:
	src/Umbraco.Core/Persistence/Migrations/MigrationRunner.cs
	src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs
	src/Umbraco.Tests/Persistence/SyntaxProvider/MySqlSyntaxProviderTests.cs
	src/Umbraco.Web.UI/umbraco/create/content.ascx
	src/Umbraco.Web.UI/umbraco/create/member.ascx
	src/Umbraco.Web.UI/umbraco/create/nodeType.ascx
	src/Umbraco.Web/PropertyEditors/TrueFalsePropertyEditor.cs
	src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedMediaCache.cs
	src/Umbraco.Web/Security/Identity/BackOfficeCookieManager.cs
	src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs
	src/Umbraco.Web/Strategies/Migrations/PublishAfterUpgradeToVersionSixth.cs
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/WebBootManager.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/editstylesheet.aspx.cs
2016-03-16 15:02:53 +01:00
Shannon 2cc709c460 Removes StateHelper!! Adds a few cookie extensions and http extensions to more easily replace. 2016-03-16 14:59:21 +01:00
Shannon cbb06dcfe1 umbraco.ui is GONE :) 2016-03-15 19:54:21 +01:00
Shannon 0636ea0b16 fix build 2016-03-15 16:59:01 +01:00
Shannon b98277f573 remore ui replacements 2016-03-15 16:58:13 +01:00
Shannon fb5e998e1f remore ui replacements 2016-03-15 16:39:17 +01:00
Shannon bf36b54ac8 remore ui replacements 2016-03-11 16:11:33 +01:00
Shannon a47a9e5e64 remore ui replacements 2016-03-11 16:02:33 +01:00
Shannon 9ebe93df06 remore ui replacements 2016-03-11 15:56:00 +01:00
Shannon ca3630f9d9 remore ui replacements 2016-03-11 15:47:22 +01:00
Shannon fa0588116f remore ui replacements 2016-03-11 15:43:34 +01:00
Shannon 5eea4d039f remore ui replacements 2016-03-11 15:32:05 +01:00
Shannon 26f85e4241 remore ui replacements 2016-03-11 15:28:08 +01:00
Shannon b47eedb381 remore ui replacements 2016-03-11 15:24:26 +01:00
Shannon fd8af57167 regex is working! 2016-03-11 15:16:43 +01:00
Shannon 55301b9b6b start replacing ui.text calls... now gonna try some regex. 2016-03-11 15:14:31 +01:00
Shannon 6faa886362 removes commented lines 2016-03-11 14:11:16 +01:00
Shannon d5ec991556 doh! not sure how the identity extensions files got committed, have removed them 2016-03-11 14:01:34 +01:00
Shannon 15a48dd921 Ensures more IoC services are there, creates new GetContentXml methods on IContentServices, updates the xml cache 'content' class to use these methods, removes more checks for legacy XML structures, removes old xsd schema files. 2016-03-11 13:54:56 +01:00
Shannon 6ee5457a81 Fixes more merge issues, project builds and runs 2016-03-11 09:23:09 +01:00
Shannon 8729e00864 it builds! ... but not sure it works yet. 2016-03-10 19:47:10 +01:00
Shannon f6f54fd057 Merge branch 'master-v7' into dev-v8
Conflicts:
	build/UmbracoVersion.txt
	src/Umbraco.Core/Configuration/UmbracoVersion.cs
	src/Umbraco.Core/CoreBootManager.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateRelatedLinksData.cs
	src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
	src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs
	src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs
	src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs
	src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs
	src/Umbraco.Core/Persistence/Repositories/DomainRepository.cs
	src/Umbraco.Core/Persistence/Repositories/EntityContainerRepository.cs
	src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs
	src/Umbraco.Core/Persistence/Repositories/PublicAccessRepository.cs
	src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs
	src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs
	src/Umbraco.Core/Persistence/RepositoryFactory.cs
	src/Umbraco.Core/PropertyEditors/PropertyEditorValueConvertersResolver.cs
	src/Umbraco.Core/Services/ContentTypeService.cs
	src/Umbraco.Core/Services/FileService.cs
	src/Umbraco.Core/Services/LocalizationService.cs
	src/Umbraco.Core/Services/MemberTypeService.cs
	src/Umbraco.Core/Services/PackagingService.cs
	src/Umbraco.Core/Services/ServiceContext.cs
	src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs
	src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
	src/Umbraco.Tests/Umbraco.Tests.csproj
	src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web.UI/web.Template.config
	src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
	src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs
	src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs
	src/Umbraco.Web/PropertyEditors/ListViewPropertyEditor.cs
	src/Umbraco.Web/Services/ApplicationTreeService.cs
	src/Umbraco.Web/Services/SectionService.cs
	src/Umbraco.Web/Trees/MemberTreeController.cs
	src/Umbraco.Web/UI/Pages/ClientTools.cs
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/WebBootManager.cs
	src/Umbraco.Web/umbraco.presentation/macro.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadNodeTypes.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/channels/api.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/create/PartialViewTasksBase.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/exportDocumenttype.aspx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/protectPage.aspx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs
	src/umbraco.businesslogic/BasePages/ClientTools.cs
	src/umbraco.businesslogic/UmbracoSettings.cs
	src/umbraco.cms/businesslogic/CMSNode.cs
	src/umbraco.cms/businesslogic/Content.cs
	src/umbraco.cms/businesslogic/cache/Cache.cs
	src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs
	src/umbraco.cms/businesslogic/propertytype/propertytype.cs
	src/umbraco.cms/businesslogic/web/Document.cs
	src/umbraco.cms/helpers/DeepLink.cs
	src/umbraco.editorControls/tinyMCE3/TinyMCE.cs
2016-03-10 19:20:15 +01:00
Shannon a26bb336f1 hard codes the en-US language until we get rid of ui calls. 2016-03-10 18:35:29 +01:00
Shannon 5659f8d3f7 fixes back office rendering 2016-02-17 17:39:12 +01:00
Shannon e10fb4fd7e Gets the Services IoC working!! 2016-02-17 17:37:17 +01:00
Shannon 172c4a59d7 Creates a RegisterSingleton ext method for easier registration 2016-02-17 17:14:54 +01:00
Shannon 4fa1ce42dc WIP - moving tree and section service implementations to Web because they are web based and they need web based objects, there's no sense in coying all of the non-web objects to Core. Now we need to use IoC for the ServiceContext 2016-02-17 16:45:26 +01:00
Shannon 6e7f3b5500 Removes the old business logic ApplicationTree and affilated files, replaces with current data structures. 2015-12-28 18:44:20 +01:00
Shannon b5eee9194f fixes build errors 2015-12-28 18:11:08 +01:00
Shannon e3d153e422 wip for removing legacy Application and moving IApplication 2015-12-28 18:06:18 +01:00
Shannon ca407d78cc Removes the old Log/ILog along with the concept of an ExternalLogger, updates the IAuditService to handle what the Log used to do 2015-12-23 15:22:45 +01:00
Shannon e005c5bba6 Massive file cleanup, removed the old BasePage, UmbracoEnsuredPage, ClientTools, moved the menu 'Action' to the Web project until we can remove those too. 2015-12-23 13:51:16 +01:00
Shannon de776f86a4 Lots of code cleanup, lots of unused/obsolete classes & files removed. 2015-12-22 19:25:10 +01:00
Shannon 4f3968e837 R# cleanup, losts of obsoleted methods removed 2015-12-22 18:00:11 +01:00
Shannon 0b13e18fd5 some r# cleanup 2015-12-22 17:25:09 +01:00
Shannon 5af839693c U4-7600 Remove obsoleted string helpers, string extensions, umbraco.helper, umbraco.cms.helper.* 2015-12-22 16:48:55 +01:00
Shannon 1aa52b4cc9 removes old helpers/url 2015-12-22 16:43:11 +01:00
Shannon 24e2341115 U4-7600 Remove obsoleted string helpers, string extensions & umbraco.helper 2015-12-22 16:37:21 +01:00
Shannon fb5e11fea6 Merge remote-tracking branch 'origin/temp-U4-7591' into dev-v8
Conflicts:
	src/Umbraco.Web/umbraco.presentation/umbraco/create/content.ascx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/create/member.ascx.cs
2015-12-22 16:28:27 +01:00
Shannon 516b59a12a Merge remote-tracking branch 'origin/temp-U4-7591' into dev-v8
Conflicts:
	src/Umbraco.Tests/UI/LegacyDialogTests.cs
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web/Umbraco.Web.csproj
2015-12-22 16:23:55 +01:00
Shannon 6078b822c6 Merge remote-tracking branch 'origin/7.4.0' into dev-v8 2015-12-22 16:22:30 +01:00
Shannon 9f0cc15822 U4-7600 Remove obsoleted string helpers, string extensions & umbraco.helper 2015-12-22 16:22:17 +01:00
Shannon c7eaf9a591 U4-7600 Remove obsoleted string helpers & string extensions 2015-12-22 16:07:45 +01:00
Shannon d6779619ea U4-6899 Change UmbracoHelper.TagQuery to return ITagQuery instead of the current hack to return a non interface 2015-12-22 15:45:15 +01:00
Shannon 880e17601b U4-5071 Update MiniProfiler to latest major version 2015-12-21 21:28:35 +01:00
Shannon 395e904df3 U4-6923 Update to latest Automapper - with signed assembly 2015-12-21 20:48:20 +01:00
Shannon ebbfe4edad U4-1324 log4net assembly Umbraco uses custom log4net build that is not strongly typed 2015-12-21 19:33:58 +01:00
Shannon afe06ffb02 U4-5424 Upgrade to latest .Net framework version (4.6.1) 2015-12-21 19:23:13 +01:00
Shannon c242383430 removes some obsolete code, ensures that UmbracoHelper is added to the container. 2015-12-21 17:50:00 +01:00
Shannon 2f5616a21c Content is now rendering 2015-12-21 17:09:31 +01:00
Shannon e17720a5f7 updates LightInject, saves a ton of code for repo registrations. 2015-12-21 16:33:09 +01:00
Shannon 5f6ae3683e removes files that shouldn't be committed 2015-12-21 15:03:10 +01:00
Shannon fbf93e2059 Umbraco now installs and can install the starter kit... not much else though ;) 2015-12-21 15:02:21 +01:00
Shannon 6593f4eaaa creates ServicesCompositionRoot 2015-12-21 14:27:36 +01:00
Shannon 69e1df87df only 22 tests failing now 2015-12-21 14:08:05 +01:00
Shannon 34a379ac5f Merge branch 'dev-v8' of https://github.com/umbraco/Umbraco-CMS into dev-v8 2015-12-21 13:41:11 +01:00
Shannon eaf8d55d48 WIP - refactored RepositoryFactory to use IoC, everything builds, haven't tested anything yet. 2015-12-21 13:36:58 +01:00
Shannon Deminick 91dc7576ea Merge pull request #965 from umbraco/temp-v8macros
Fixing failing macro tests.
2015-12-21 10:51:21 +01:00
Claus 46bdae7492 Fixing failing macro tests. 2015-12-21 10:45:14 +01:00
Shannon 96c336e34c now only 24 tests failing, that's pretty good! 2015-12-20 20:40:49 +01:00
Shannon 7ec63ad491 fixes some macro unit tests (some still need fixing though) 2015-12-20 20:17:57 +01:00
Shannon 04e7979fe6 Fixes some merge issues, gets a bunch more tests operational. 2015-12-20 20:09:25 +01:00
Shannon 4d0b2b745a first unit tests passing 2015-12-20 17:28:38 +01:00
Shannon 0bcf38b267 Removes LightInject as Source and adds it as DLL dependencies, updates to latest Light Inject. 2015-12-20 17:09:46 +01:00
Shannon 0fd9a074d8 WIP sln is now building... though i doubt anything works atm, working on that now. 2015-12-20 16:49:24 +01:00
Shannon 73cc4b4e3f Web proj is building 2015-12-18 14:58:22 +01:00
Shannon f09f3c4129 ok, now Core proj is building 2015-12-18 14:45:28 +01:00
Shannon 6f43230a9b Core is more or less building (i think) 2015-12-18 14:24:17 +01:00
Shannon 5c5a5d12cc WIP working on getting Core project to build 2015-12-18 13:29:12 +01:00
Shannon 2ea9418fd7 Merge remote-tracking branch 'origin/7.4.0' into dev-v8
Conflicts:
	build/UmbracoVersion.txt
	src/Umbraco.Core/ApplicationContext.cs
	src/Umbraco.Core/Configuration/UmbracoConfig.cs
	src/Umbraco.Core/Configuration/UmbracoVersion.cs
	src/Umbraco.Core/CoreBootManager.cs
	src/Umbraco.Core/DatabaseContext.cs
	src/Umbraco.Core/Dictionary/CultureDictionaryFactoryResolver.cs
	src/Umbraco.Core/Manifest/ManifestParser.cs
	src/Umbraco.Core/Models/DataTypeDefinition.cs
	src/Umbraco.Core/ObjectResolution/ApplicationEventsResolver.cs
	src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs
	src/Umbraco.Core/Persistence/Factories/MemberTypeFactory.cs
	src/Umbraco.Core/Persistence/Migrations/MigrationBase.cs
	src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs
	src/Umbraco.Core/Persistence/Migrations/MigrationResolver.cs
	src/Umbraco.Core/Persistence/Migrations/MigrationRunner.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/AlterSyntaxBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Column/AlterColumnBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Table/AlterTableBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Column/CreateColumnBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Create/CreateBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Table/CreateTableBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/DeleteBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteSqlStatementExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateColumnExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateIndexExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Insert/Expressions/InsertDataExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Insert/InsertBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/RenameBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs
	src/Umbraco.Core/Persistence/Migrations/Syntax/Update/UpdateBuilder.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AddIndexToCmsMacroTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/MigrateAndRemoveTemplateMasterColumn.cs
	src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
	src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs
	src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs
	src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs
	src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs
	src/Umbraco.Core/Persistence/Repositories/DomainRepository.cs
	src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
	src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs
	src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs
	src/Umbraco.Core/Persistence/Repositories/ServerRegistrationRepository.cs
	src/Umbraco.Core/Persistence/Repositories/TagRepository.cs
	src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs
	src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs
	src/Umbraco.Core/Persistence/RepositoryFactory.cs
	src/Umbraco.Core/Persistence/UmbracoDatabase.cs
	src/Umbraco.Core/PropertyEditors/IPropertyEditorValueConverter.cs
	src/Umbraco.Core/PropertyEditors/PropertyEditor.cs
	src/Umbraco.Core/PropertyEditors/PropertyEditorResolver.cs
	src/Umbraco.Core/Services/ContentService.cs
	src/Umbraco.Core/Services/ContentTypeService.cs
	src/Umbraco.Core/Services/DataTypeService.cs
	src/Umbraco.Core/Services/EntityService.cs
	src/Umbraco.Core/Services/LocalizationService.cs
	src/Umbraco.Core/Services/MacroService.cs
	src/Umbraco.Core/Services/MediaService.cs
	src/Umbraco.Core/Services/MemberGroupService.cs
	src/Umbraco.Core/Services/MemberService.cs
	src/Umbraco.Core/Services/MemberTypeService.cs
	src/Umbraco.Core/Services/PackagingService.cs
	src/Umbraco.Core/Services/ServerRegistrationService.cs
	src/Umbraco.Core/Services/ServiceContext.cs
	src/Umbraco.Core/Services/TagService.cs
	src/Umbraco.Core/Services/UserService.cs
	src/Umbraco.Core/Strings/DefaultShortStringHelper.cs
	src/Umbraco.Core/Sync/ConfigServerRegistrar.cs
	src/Umbraco.Core/Sync/DatabaseServerMessenger.cs
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Core/UmbracoApplicationBase.cs
	src/Umbraco.Core/packages.config
	src/Umbraco.Tests/BootManagers/CoreBootManagerTests.cs
	src/Umbraco.Tests/Macros/MacroTests.cs
	src/Umbraco.Tests/Manifest/ManifestParserTests.cs
	src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs
	src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs
	src/Umbraco.Tests/Migrations/Stubs/FiveZeroMigration.cs
	src/Umbraco.Tests/Migrations/Stubs/FourElevenMigration.cs
	src/Umbraco.Tests/Migrations/Stubs/SixZeroMigration1.cs
	src/Umbraco.Tests/Migrations/Stubs/SixZeroMigration2.cs
	src/Umbraco.Tests/Migrations/TargetVersionSixthMigrationsTest.cs
	src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs
	src/Umbraco.Tests/Migrations/Upgrades/SqlCeDataUpgradeTest.cs
	src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs
	src/Umbraco.Tests/Persistence/BaseTableByTableTest.cs
	src/Umbraco.Tests/Persistence/DatabaseContextTests.cs
	src/Umbraco.Tests/Persistence/Mappers/PropertyGroupMapperTest.cs
	src/Umbraco.Tests/Persistence/MySqlDatabaseCreationTest.cs
	src/Umbraco.Tests/Persistence/Querying/ContentTypeRepositorySqlClausesTest.cs
	src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs
	src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs
	src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs
	src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs
	src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs
	src/Umbraco.Tests/Services/ContentServiceTests.cs
	src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs
	src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs
	src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs
	src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs
	src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs
	src/Umbraco.Tests/Umbraco.Tests.csproj
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.cs
	src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx
	src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.cs
	src/Umbraco.Web/BatchedDatabaseServerMessenger.cs
	src/Umbraco.Web/Cache/CacheRefresherEventHandler.cs
	src/Umbraco.Web/Cache/DataTypeCacheRefresher.cs
	src/Umbraco.Web/Cache/DistributedCacheExtensions.cs
	src/Umbraco.Web/Editors/AuthenticationController.cs
	src/Umbraco.Web/Editors/BackOfficeController.cs
	src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs
	src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs
	src/Umbraco.Web/Media/ThumbnailProviders/ThumbnailProvidersResolver.cs
	src/Umbraco.Web/Mvc/DefaultRenderMvcControllerResolver.cs
	src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs
	src/Umbraco.Web/PropertyEditors/FolderBrowserPropertyEditor.cs
	src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs
	src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs
	src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs
	src/Umbraco.Web/Trees/MediaTreeController.cs
	src/Umbraco.Web/Trees/MemberTreeController.cs
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/UmbracoApplication.cs
	src/Umbraco.Web/UmbracoModule.cs
	src/Umbraco.Web/WebBootManager.cs
	src/Umbraco.Web/packages.config
	src/Umbraco.Web/umbraco.presentation/content.cs
	src/Umbraco.Web/umbraco.presentation/keepAliveService.cs
	src/Umbraco.Web/umbraco.presentation/macro.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadDictionary.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/rollBack.aspx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx
	src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditNodeTypeNew.aspx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/users/EditUser.aspx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/webService.asmx.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/webservices/MediaUploader.ashx.cs
	src/UmbracoExamine/UmbracoContentIndexer.cs
	src/UmbracoExamine/UmbracoMemberIndexer.cs
	src/umbraco.MacroEngines/RazorCore/UmbracoCultureDictionary.cs
	src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs
	src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethods.cs
	src/umbraco.MacroEngines/app.config
	src/umbraco.MacroEngines/packages.config
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
	src/umbraco.businesslogic/UmbracoSettings.cs
	src/umbraco.cms/businesslogic/Content.cs
	src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs
	src/umbraco.cms/businesslogic/datatype/DefaultPreValueEditor.cs
	src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs
	src/umbraco.cms/businesslogic/translation/Translation.cs
	src/umbraco.cms/businesslogic/web/Document.cs
	src/umbraco.cms/packages.config
	src/umbraco.editorControls/DefaultPrevalueEditor.cs
	src/umbraco.editorControls/MultiNodeTreePicker/MNTPResources.Designer.cs
	src/umbraco.editorControls/MultiNodeTreePicker/MNTPResources.resx
	src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataType.cs
	src/umbraco.editorControls/app.config
	src/umbraco.editorControls/macrocontainer/PrevalueEditor.cs
	src/umbraco.editorControls/packages.config
	src/umbraco.editorControls/textfieldmultiple/textfieldMultipleDataType.cs
	src/umbraco.editorControls/umbraco.editorControls.csproj
	src/umbraco.editorControls/uploadfield/uploadField.cs
	src/umbraco.editorControls/userControlWrapper/usercontrolPrevalueEditor.cs
	src/umbraco.providers/app.config
2015-12-18 11:23:58 +01:00
Shannon 19c5eee791 Merge remote-tracking branch 'origin/7.3.0' into dev-v8
Conflicts:
	src/Umbraco.Core/UmbracoApplicationBase.cs
2015-05-14 08:45:57 +10:00
Shannon b5b6ce8bf9 fixes merge 2015-05-13 16:50:45 +10:00
Shannon f7bcae1aa7 Merge remote-tracking branch 'origin/7.3.0' into dev-v8
Conflicts:
	src/Umbraco.Core/Services/DomainService.cs
	src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs
	src/Umbraco.Web/umbraco.presentation/NotFoundHandlers.cs
2015-05-13 16:47:33 +10:00
Shannon 0a921c0701 fixes merge issues 2015-05-13 16:46:53 +10:00
Shannon 8c771660a7 Merge remote-tracking branch 'origin/7.3.0' into dev-v8
Conflicts:
	src/Umbraco.Core/Services/UserService.cs
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web/Routing/ContentFinderByLegacy404.cs
	src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs
	src/Umbraco.Web/umbraco.presentation/NotFoundHandlers.cs
	src/Umbraco.Web/umbraco.presentation/library.cs
	src/umbraco.MacroEngines/app.config
	src/umbraco.MacroEngines/packages.config
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
	src/umbraco.editorControls/app.config
	src/umbraco.providers/UsersMembershipProvider.cs
	src/umbraco.providers/app.config
2015-05-13 14:49:11 +10:00
Shannon 177a1e336f Converts UrlProviderResolver to a container resolver and also ensures any container many resolver is added to the container itself 2015-05-05 19:14:56 +10:00
Shannon dc7b3612bc converts PropertyValueConvertersResolver to a container resolver and updates IPropertyValueConverter that were relying on singletons to use DependencyInjection 2015-05-05 19:01:49 +10:00
Shannon 939fc8a92c Changes ParameterEditorResolver to a Container resolver 2015-05-05 18:51:33 +10:00
Shannon 36f3948835 Fixes most tests, only 4 failing but they are arbitrary... now we can look to start cleaning/deleting more stuff :) 2015-05-05 18:24:31 +10:00
Shannon fba98eb7f6 Fixes merges, sln builds now, just need to run tests and fix them 2015-05-05 16:53:52 +10:00
Shannon 2ea4acbc6f Merge branch '7.3.0' into dev-v8
Conflicts:
	src/Umbraco.Core/Configuration/UmbracoConfig.cs
	src/Umbraco.Core/CoreBootManager.cs
	src/Umbraco.Core/Manifest/ManifestBuilder.cs
	src/Umbraco.Core/Manifest/ManifestParser.cs
	src/Umbraco.Core/Persistence/Migrations/MigrationResolver.cs
	src/Umbraco.Core/Persistence/Migrations/MigrationRunner.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionFourNineZero/RemoveUmbracoAppConstraints.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AddIndexToCmsMacroPropertyTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AddIndexToCmsMacroTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AddPropertyEditorAliasColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterCmsMacroPropertyTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterTagRelationsTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterTagsTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterUserTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AssignMissingKeysAndIndexes.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/DropControlIdColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/RemoveCmsMacroPropertyTypeTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateControlIdToPropertyEditorAlias.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateRelatedLinksData.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenOneZero/AssignMissingPrimaryForMySqlKeys.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/MigrateAndRemoveTemplateMasterColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/RemoveHelpTextColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/UpdateUniqueIdToHaveCorrectIndexType.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/AddIndexToUmbracoNodeTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/AddMissingForeignKeyForContentType.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/AlterDataTypePreValueTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/RemoveCmsDocumentAliasColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/DeleteAppTables.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/EnsureAppsTreesUpdated.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/MoveMasterContentTypeData.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/NewCmsContentType2ContentTypeTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/RemoveMasterContentTypeColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/RenameCmsTabTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/RenameTabIdColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/UpdateCmsContentTypeAllowedContentTypeTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/UpdateCmsContentTypeTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/UpdateCmsContentVersionTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSix/UpdateCmsPropertyTypeGroupTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixOneZero/CreateServerRegistryTable.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AddChangeDocumentTypePermission.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AdditionalIndexesAndKeys.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AssignMissingPrimaryForMySqlKeys.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AssignMissingPrimaryForMySqlKeys2.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/ChangePasswordColumn.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/UpdateToNewMemberPropertyAliases.cs
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixZeroOne/UpdatePropertyTypesAndGroups.cs
	src/Umbraco.Core/Persistence/RepositoryFactory.cs
	src/Umbraco.Core/PropertyEditors/ParameterEditorResolver.cs
	src/Umbraco.Core/PropertyEditors/PropertyEditorResolver.cs
	src/Umbraco.Core/Services/MemberService.cs
	src/Umbraco.Core/Services/ServerRegistrationService.cs
	src/Umbraco.Core/Sync/ConfigServerRegistrar.cs
	src/Umbraco.Core/Sync/ServerMessengerResolver.cs
	src/Umbraco.Core/Sync/ServerRegistrarResolver.cs
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs
	src/Umbraco.Tests/CodeFirst/Definitions/ContentTypeDefinitionFactory.cs
	src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs
	src/Umbraco.Tests/Migrations/Stubs/AlterUserTableMigrationStub.cs
	src/Umbraco.Tests/Migrations/TargetVersionSixthMigrationsTest.cs
	src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs
	src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs
	src/Umbraco.Tests/Plugins/TypeFinderTests.cs
	src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web.UI/umbraco/Views/Default.cshtml
	src/Umbraco.Web/BaseRest/BaseRestHandler.cs
	src/Umbraco.Web/Cache/DistributedCacheExtensions.cs
	src/Umbraco.Web/Editors/AuthenticationController.cs
	src/Umbraco.Web/Editors/BackOfficeController.cs
	src/Umbraco.Web/Routing/ContentFinderByIdPath.cs
	src/Umbraco.Web/Routing/ContentFinderByNiceUrlAndTemplate.cs
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/WebBootManager.cs
	src/Umbraco.Web/umbraco.presentation/NotFoundHandlers.cs
	src/Umbraco.Web/umbraco.presentation/content.cs
	src/Umbraco.Web/umbraco.presentation/page.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs
	src/UmbracoExamine/UmbracoMemberIndexer.cs
	src/umbraco.MacroEngines/app.config
	src/umbraco.MacroEngines/packages.config
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
	src/umbraco.editorControls/app.config
	src/umbraco.editorControls/packages.config
	src/umbraco.editorControls/umbraco.editorControls.csproj
	src/umbraco.providers/app.config
2015-05-05 16:11:06 +10:00
Shannon cc27d2c483 fix merge issues 2015-02-23 13:49:53 +01:00
Shannon dc513570a5 Merge remote-tracking branch 'origin/7.3.0' into dev-v8
Conflicts:
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/AddPublicAccessTables.cs
	src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
	src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs
	src/Umbraco.Core/Persistence/RepositoryFactory.cs
	src/Umbraco.Core/Services/ServiceContext.cs
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web/Search/ExamineEvents.cs
	src/Umbraco.Web/UmbracoHelper.cs
	src/Umbraco.Web/umbraco.presentation/content.cs
	src/Umbraco.Web/umbraco.presentation/requestModule.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/translation/default.aspx.cs
	src/umbraco.MacroEngines/RazorDynamicNode/RazorLibraryCore.cs
	src/umbraco.businesslogic/IO/SystemFiles.cs
	src/umbraco.cms/businesslogic/Dictionary.cs
	src/umbraco.cms/businesslogic/web/Document.cs
2015-02-23 13:41:34 +01:00
Shannon e5b88a9a75 removes commented out code 2015-02-23 13:21:10 +01:00
Shannon 2dcc03ee3f more tests fixed, decouples more of the MappingResolver.Current singleton 2015-02-23 13:20:14 +01:00
Shannon 0ff5780944 fixes lots of tests 2015-02-23 11:29:11 +01:00
Shannon c76be66028 starts fixing up all the tests 2015-02-23 00:02:12 +01:00
Shannon 3e18c93cf5 More singleton reduction, created new IMappingResolver which is used by the Query<T> object instead of relying on a singleton, creates a new QueryFactory to create Query<T>, removes all standalone stuff (will create that again later). It builds, but most tests will still be failing. 2015-02-22 23:09:20 +01:00
Shannon 905e58e3b6 Completes: U4-6104 Remove SqlSyntaxContext - quite a large refactor and cleanup since the SqlSyntaxContext was used everywhere :( haven't run tests, etc... yet but the project builds now. 2015-02-22 21:36:02 +01:00
Shannon 693384bdf6 completes: U4-5546 Remove user 'channels', weblog api, and all code / db tables relevant to those 2015-02-22 17:16:39 +01:00
Shannon c4ca50dd5f fixes an ioc registration 2015-02-22 17:16:21 +01:00
Shannon 9f5f8e57af fixes merge issues 2015-02-22 16:59:40 +01:00
Shannon 1851303343 Merge remote-tracking branch 'origin/dev-v7' into dev-v8
Conflicts:
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.cs
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/umbraco.presentation/macro.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs
	src/umbraco.MacroEngines/RazorDynamicNode/ExtensionMethodFinder.cs
	src/umbraco.MacroEngines/Resources/Web.config
	src/umbraco.MacroEngines/packages.config
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
	src/umbraco.cms/businesslogic/Dictionary.cs
	src/umbraco.editorControls/packages.config
	src/umbraco.editorControls/umbraco.editorControls.csproj
2015-02-22 16:56:02 +01:00
Shannon bd34193cfd Completes: U4-6186 Remove all support for legacy xml schema 2015-01-27 15:18:58 +11:00
Shannon 7c5e68dd1c Merge remote-tracking branch 'origin/7.3.0' into dev-v8
Conflicts:
	src/Umbraco.Core/Services/ServiceContext.cs
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs
	src/Umbraco.Tests/Persistence/BaseTableByTableTest.cs
	src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs
2015-01-27 15:00:23 +11:00
Shannon 64787f8576 Fixes tests, decouples the UrlSegmentProviderResolver a little bit, removes lots of obsoleted ctors 2015-01-27 14:58:33 +11:00
Shannon 3e410e6a41 starts fixing up tests 2015-01-23 20:09:42 +11:00
Shannon 887ccaae83 WIP - Updates property editor resolver to use IoC, updates base prop editor class to require an ILogger which now get's ctor injected. This is a WIP because even though it builds there's a bunch of stuff not working, need to run/fix all tests (soon) 2015-01-23 20:00:44 +11:00
Shannon a292c60402 completes: U4-5148 Remove TidyNet from the core and anything that references/uses it 2015-01-23 18:05:55 +11:00
Shannon ea5575c1f5 Deletes a bunch of old unused files - mostly in umbraco_client 2015-01-23 17:10:10 +11:00
Shannon 7222058dd4 Deletes a bunch of old unused files - mostly in umbraco_client 2015-01-23 17:01:24 +11:00
Shannon 0df22a16b5 fixes merge issues 2015-01-23 12:28:27 +11:00
Shannon c94eff9089 Merge remote-tracking branch 'origin/7.3.0' into dev-v8
Conflicts:
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
	src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs
	src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs
	src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs
	src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs
	src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs
	src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs
	src/Umbraco.Web/Cache/CacheRefresherEventHandler.cs
	src/umbraco.MacroEngines/packages.config
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
	src/umbraco.cms/businesslogic/Property/Property.cs
	src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs
2015-01-23 12:25:07 +11:00
Shannon 9710e6f9e2 refactors where the container is created 2015-01-21 13:21:36 +11:00
Shannon 13a4d5c81c WIP - have added LightInject as a fast and tiny IoC container that is embedded. Have updated all required SingleObjectResolverBase and non lazy ManyObjectResolverBase to use a Container implementation. Have updated the boot managers to use IoC to instantiate all their requirements. This is so much nicer now by using IoC to ctor all of the objects in these resolvers we can get ctor injection OOTB so no more singletons. Need to create resolver to support the lazy resolver with IoC next. Updated IContentFinders, IThumbnailProviders to use ctor injection. 2015-01-21 12:48:08 +11:00
Shannon 215113d635 more unused code removed 2015-01-20 18:17:11 +11:00
Shannon 2342ba5537 removes old unused code 2015-01-20 18:15:22 +11:00
Shannon f6a547d681 Merge remote-tracking branch 'origin/7.3.0' into dev-v8 2015-01-19 19:10:56 +11:00
Shannon 631c8e3944 fixes up some tests 2015-01-19 19:03:58 +11:00
Shannon 6ad895d7db Fixes merge issues - proj now builds (not sure if it works yet though) 2015-01-19 13:38:51 +11:00
Shannon f9159a0afc Merge remote-tracking branch 'origin/7.3.0' into dev-v8
Conflicts:
	build/UmbracoVersion.txt
	src/Umbraco.Core/Configuration/UmbracoVersion.cs
	src/Umbraco.Core/CoreBootManager.cs
	src/Umbraco.Core/DataTypesResolver.cs
	src/Umbraco.Core/PropertyEditors/PropertyEditorValueConvertersResolver.cs
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Tests/CodeFirst/Definitions/ContentTypeDefinitionFactory.cs
	src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs
	src/Umbraco.Tests/Macros/MacroTests.cs
	src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
	src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
	src/Umbraco.Tests/Plugins/PluginManagerTests.cs
	src/Umbraco.Tests/Plugins/TypeFinderTests.cs
	src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs
	src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs
	src/Umbraco.Tests/TestHelpers/BaseSeleniumTest.cs
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadStylesheetProperty.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadStylesheets.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadTemplates.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/property/EditStyleSheetProperty.aspx.cs
	src/umbraco.cms/businesslogic/CMSNode.cs
	src/umbraco.cms/businesslogic/propertytype/propertytype.cs
	src/umbraco.cms/businesslogic/web/StyleSheet.cs
	src/umbraco.editorControls/tinyMCE3/TinyMCE.cs
2015-01-19 13:16:56 +11:00
Shannon 02a903f77b Merge remote-tracking branch 'origin/dev-v7' into dev-v8
Conflicts:
	build/UmbracoVersion.txt
	src/Umbraco.Core/Configuration/UmbracoVersion.cs
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/UmbracoHelper.cs
	src/Umbraco.Web/umbraco.presentation/CompatibilityHelper.cs
	src/Umbraco.Web/umbraco.presentation/library.cs
	src/Umbraco.Web/umbraco.presentation/macro.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs
	src/umbraco.MacroEngines/RazorDynamicNode/DynamicBackingItem.cs
	src/umbraco.MacroEngines/app.config
	src/umbraco.MacroEngines/packages.config
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
	src/umbraco.cms/businesslogic/Packager/Installer.cs
	src/umbraco.editorControls/app.config
	src/umbraco.editorControls/packages.config
	src/umbraco.editorControls/umbraco.editorControls.csproj
	src/umbraco.providers/app.config
2015-01-19 13:11:51 +11:00
Shannon 7a53fa3ba7 remove more unused code 2014-11-21 17:42:05 +11:00
Shannon 3cd949d49c Completes: U4-5861 and removes the very old legacy umbraco context, server, request, etc... stuff 2014-11-21 17:19:06 +11:00
Shannon 072c77989f Completes: U4-5415, almost completes U4-5416 2014-11-21 17:05:39 +11:00
Shannon 9cc584ae52 Completes: U4-5484 Remove /base REST support 2014-11-21 16:39:27 +11:00
Shannon c3523a09ec WIP WIP WIP. Started working on U4-5648 which led to quite a lot of other things, once IDataType was removed (U4-5858), this lead to U4-5546, U4-5416, U4-5484, U4-5805. So much of this stuff is etched deep into the codebase, so nice to get rid of it. Had to remove the codefirst tests too for now since they relied on old apis and we don't really support it/use it. Commented out all of the code relating to the document type editor UI bits since they need to be rewritten and removed. 2014-11-21 16:34:47 +11:00
Shannon 854bf5acbf remove more obsolete code 2014-11-14 18:48:42 +11:00
Shannon 1e7197d28c removes obsolete io classes 2014-11-14 18:45:29 +11:00
Shannon acfa63f592 removes a ton more of the legacy tinymce files 2014-11-14 18:41:34 +11:00
Shannon c839264ad8 Removes more old tinymce files, removes unused js files, removes unused search controls 2014-11-14 18:39:13 +11:00
Shannon ae79a7cd7a Completes: U4-5810 Remove umbraco.providers assembly and classes - old membership providers 2014-11-14 18:26:01 +11:00
Shannon 4fce47cff3 Completes: U4-5808 All old legacy 'datatypes' since they are not supported or used 2014-11-14 18:22:31 +11:00
Shannon 07fdd81801 Fixes up a bunch of code errors with 'hiding' members, i'm actually surprised our sln even built with this sort of stuff 2014-11-14 18:10:41 +11:00
Shannon bdcf8f8fc0 Removes more unused code 2014-11-14 17:57:44 +11:00
Shannon c08db70e82 Removing more unused code and working on U4-5805 2014-11-14 17:52:18 +11:00
Shannon 1d9da125c4 Removing more unused code and working on U4-5808 2014-11-14 17:49:10 +11:00
Shannon 0ff5c72862 Removing unused code and also working on U4-5805 2014-11-14 17:46:21 +11:00
Shannon 6a7c7d396b Completes: U4-5807 2014-11-14 17:27:07 +11:00
Shannon fbb023f844 working on U4-5648 Remove legacy razor macro's entirely - removes lots of legacy 2014-11-14 17:15:38 +11:00
Shannon d7948a79e2 working on U4-5648 Remove legacy razor macro's entirely - removes old config section, bumps version to 8 2014-11-14 15:11:46 +11:00
Shannon fba48cb845 fixes dotless dependencies so it builds 2014-11-14 14:46:25 +11:00
Shannon ed518feb4c working on U4-5648 Remove legacy razor macro's entirely 2014-11-14 14:24:35 +11:00
Shannon 5aeecf7701 working on U4-5648 Remove legacy razor macro's entirely 2014-11-14 14:05:46 +11:00
Shannon b7bc98fccc removes legacy RazorBuildProvider 2014-11-14 13:46:37 +11:00
5460 changed files with 201683 additions and 335794 deletions
+15 -1
View File
@@ -8,9 +8,23 @@ root = true
# Use 4 spaces as indentation
[*]
insert_final_newline = true
end_of_line = lf
indent_style = space
indent_size = 4
# Trim trailing whitespace, limited support.
# https://github.com/editorconfig/editorconfig/wiki/Property-research:-Trim-trailing-spaces
trim_trailing_whitespace = true
trim_trailing_whitespace = true
[*.{cs,vb}]
dotnet_style_predefined_type_for_locals_parameters_members = true:error
dotnet_naming_rule.private_members_with_underscore.symbols = private_fields
dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore
dotnet_naming_rule.private_members_with_underscore.severity = suggestion
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _
+41 -13
View File
@@ -1,29 +1,49 @@
#
# Umbraco Cms Git Ignore
#
# common files
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
*.orig
*.suo
*.vs10x
*.ndproj
# common directories
.DS_Store
._.DS_Store
[Bb]in
.vs/
/local/
# build directories
[Bb]in/
[Db]ebug*/
obj/
[Rr]elease*/
obj/
# tools
_ReSharper*/
_NCrunch_*/
*.ncrunchsolution
*.ncrunchsolution.user
*.ncrunchproject
*.crunchsolution.cache
tools/NDepend/
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
*.suo
[sS]ource
[sS]andbox
umbraco.config
*.vs10x
App_Data/TEMP/*
[Uu]mbraco/[Pp]resentation/[Uu]mbraco/[Pp]lugins/*
[Uu]mbraco/[Pp]resentation/[Uu]ser[Cc]ontrols/*
@@ -46,12 +66,11 @@ src/Umbraco.Web.UI/Web.*.config.transformed
umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx
umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx
*.ncrunchsolution
src/Umbraco.Tests/config/applications.config
src/Umbraco.Tests/config/trees.config
src/Umbraco.Web.UI/web.config
src/Umbraco.Web.UI/Config/ClientDependency.config
*.orig
src/Umbraco.Tests/config/404handlers.config
src/Umbraco.Web.UI/[Vv]iews/*.cshtml
src/Umbraco.Web.UI/[Vv]iews/*.vbhtml
@@ -89,17 +108,16 @@ src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI.Client/[Bb]uild/*
src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/
src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
tools/NDepend/
src/Umbraco.Web.UI/App_Plugins/*
src/*.psess
src/*.vspx
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js.*
NDependOut/*
*.ndproj
QueryResult.htm
*.ndproj
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
@@ -115,6 +133,9 @@ src/Umbraco.Web.UI.Client/bower_components/*
/src/Umbraco.Web.UI/Umbraco/preview
/src/Umbraco.Web.UI/Umbraco/preview.old
# ignore rule for clearing out Belle (avoid rebuilding all the time)
preserve.belle
#Ignore Rule for output of generated documentation files from Grunt docserve
src/Umbraco.Web.UI.Client/docs/api
src/*.boltdata/
@@ -126,19 +147,26 @@ src/*.boltdata/
src/umbraco.sln.ide/*
src/.vs/
src/Umbraco.Web.UI/umbraco/js/install.loader.js
src/Umbraco.Web.UI/js/*
src/Umbraco.Tests/media
tools/docfx/*
apidocs/_site/*
src/*/project.lock.json
src/.idea/*
apidocs/api/*
build/docs.zip
build/ui-docs.zip
build/csharp-docs.zip
.vs/
src/packages/
src/PrecompiledWeb/*
# build
build.out/
build.tmp/
build/Modules/*/temp/
/src/.idea/*
build/hooks/
build/temp/
# eof
+20 -42
View File
@@ -6,19 +6,13 @@ Umbraco Cms Build
To build Umbraco, fire PowerShell and move to Umbraco's repository root (the directory that contains `src`, `build`, `README.md`...). There, trigger the build with the following command:
build\build.ps1
build/build.ps1
By default, this builds the current version. It is possible to specify a different version as a parameter to the build script:
build\build.ps1 7.6.44
Valid version strings are defined in the `Set-UmbracoVersion` documentation below.
## PowerShell Quirks
There is a good chance that running `build.ps1` ends up in error, with messages such as
>The file ...\build\build.ps1 is not digitally signed. You cannot run this script on the current system. For more information about running scripts and setting execution policy, see about_Execution_Policies.
>The file ...\build.ps1 is not digitally signed. You cannot run this script on the current system. For more information about running scripts and setting execution policy, see about_Execution_Policies.
PowerShell has *Execution Policies* that may prevent the script from running. You can check the current policies with:
@@ -42,7 +36,7 @@ Alternatively, you can do it at machine level, from within an elevated PowerShel
And *then* the script should run. It *might* however still complain about executing scripts, with messages such as:
>Security warning - Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the Unblock-File cmdlet to allow the script to run without this warning message. Do you want to run ...\build\build.ps1?
>Security warning - Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the Unblock-File cmdlet to allow the script to run without this warning message. Do you want to run ...\build.ps1?
[D] Do not run [R] Run once [S] Suspend [?] Help (default is "D"):
This is usually caused by the scripts being *blocked*. And that usually happens when the source code has been downloaded as a Zip file. When Windows downloads Zip files, they are marked as *blocked* (technically, they have a Zone.Identifier alternate data stream, with a value of "3" to indicate that they were downloaded from the Internet). And when such a Zip file is un-zipped, each and every single file is also marked as blocked.
@@ -51,30 +45,20 @@ The best solution is to unblock the Zip file before un-zipping: right-click the
PS> Get-ChildItem -Recurse *.* | Unblock-File
## Notes
## Git Quirks
Git might have issues dealing with long file paths during build. You may want/need to enable `core.longpaths` support (see [this page](https://github.com/msysgit/msysgit/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path) for details).
# Build
# Build Infrastructure
The Umbraco Build solution relies on a PowerShell module. The module needs to be imported into PowerShell. From within Umbraco's repository root:
The Umbraco Build infrastructure relies on a PowerShell object. The object can be retrieved with:
build\build.ps1 -ModuleOnly
$ubuild = build/build.ps1 -get
Or the abbreviated form:
build\build.ps1 -mo
Once the module has been imported, a set of commands are added to PowerShell.
## Get-UmbracoBuildEnv
Gets the Umbraco build environment ie NuGet, Semver, Visual Studio, etc. Downloads things that can be downloaded such as NuGet. Examples:
$uenv = Get-UmbracoBuildEnv
Write-Host $uenv.SolutionRoot
&$uenv.NuGet help
The object exposes various properties and methods that can be used to fine-grain build Umbraco. Some, but not all, of them are detailed below.
## Properties
The object exposes the following properties:
* `SolutionRoot`: the absolute path to the solution root
@@ -92,11 +76,11 @@ The Visual Studio object is `null` when Visual Studio has not been detected (eg
* `Minor`: Visual Studio minor version
* `MsBUild`: the absolute path to the MsBuild executable
## Get-UmbracoVersion
## GetUmbracoVersion
Gets an object representing the current Umbraco version. Example:
$v = Get-UmbracoVersion
$v = $ubuild.GetUmbracoVersion()
Write-Host $v.Semver
The object exposes the following properties:
@@ -106,28 +90,24 @@ The object exposes the following properties:
* `Comment`: the pre release part of the version (eg `alpha02`)
* `Build`: the build number part of the version (eg `1234`)
## Set-UmbracoVersion
## SetUmbracoVersion
Modifies Umbraco files with the new version.
>This entirely replaces the legacy `UmbracoVersion.txt` file.
>This entirely replaces the legacy `UmbracoVersion.txt` file. Do *not* edit version infos in files.
The version must be a valid semver version. It can include a *pre release* part (eg `alpha02`) and/or a *build number* (eg `1234`). Examples:
Set-UmbracoVersion 7.6.33
Set-UmbracoVersion 7.6.33-alpha02
Set-UmbracoVersion 7.6.33+1234
Set-UmbracoVersion 7.6.33-beta05+5678
$ubuild.SetUmbracoVersion("7.6.33")
$ubuild.SetUmbracoVersion("7.6.33-alpha.2")
$ubuild.SetUmbracoVersion("7.6.33+1234")
$ubuild.SetUmbracoVersion("7.6.33-beta.5+5678")
Note that `Set-UmbracoVersion` enforces a slightly more restrictive naming scheme than what semver would tolerate. The pre release part can only be composed of a-z and 0-9, therefore `alpha033` is considered valid but not `alpha.033` nor `alpha033-preview` nor `RC2` (would need to be lowercased `rc2`).
>It is considered best to add trailing zeroes to pre releases, else NuGet gets the order of versions wrong. So if you plan to have more than 10, but no more that 100 alpha versions, number the versions `alpha00`, `alpha01`, etc.
## Build-Umbraco
## Build
Builds Umbraco. Temporary files are generated in `build.tmp` while the actual artifacts (zip files, NuGet packages...) are produced in `build.out`. Example:
Build-Umbraco
$ubuild.Build()
Some log files, such as MsBuild logs, are produced in `build.tmp` too. The `build` directory should remain clean during a build.
@@ -181,6 +161,4 @@ We should increment versions as soon as a version is released. Ie, as soon as `7
NuGet / NuSpec consistency checks are performed in tests. We should move it so it is done as part of the PowerShell script even before we try to compile and run the tests.
There are still a few commands in `build` (to build docs, install Git or cleanup the install) that will need to be migrated to PowerShell.
/eof
+3 -1
View File
@@ -2,7 +2,7 @@
👍🎉 First off, thanks for taking the time to contribute! 🎉👍
The following is a set of guidelines for contributing to Umbraco CMS.
The following is a set of guidelines for contributing to Umbraco CMS.
These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request.
@@ -10,6 +10,8 @@ Remember, we're a friendly bunch and are happy with whatever contribution you mi
#### Table Of Contents
__[Quick start guide for Umbraco v8](https://github.com/umbraco/Umbraco-CMS/blob/temp8/V8_GETTING_STARTED.md)__
[Code of Conduct](#code-of-conduct)
[How Can I Contribute?](#how-can-i-contribute)
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!--
this is Umbraco's NuGet configuration,
content of this file is merged with the system-wide configuration,
at %APPDATA%\NuGet\NuGet.config
-->
<packageSources>
<add key="UmbracoCoreMyGet" value="https://www.myget.org/F/umbracocore/api/v3/index.json" />
<add key="ExamineAppVeyor" value="https://ci.appveyor.com/nuget/examine-f73l6qv0oqfh/" />
</packageSources>
</configuration>
+3 -1
View File
@@ -1,4 +1,6 @@
[![Build status](https://ci.appveyor.com/api/projects/status/6by6harxtxt0ocdx/branch/dev-v7?svg=true)](https://ci.appveyor.com/project/Umbraco/umbraco-cms-b2cri/branch/dev-v7)
_Looking for Umbraco version 7? [Click here](https://github.com/umbraco/Umbraco-CMS) to go to the v7 branch_
__Ready to try out Version 8? [See the quick start guide](https://github.com/umbraco/Umbraco-CMS/blob/temp8/V8_GETTING_STARTED.md).__
Umbraco CMS
===========
+30
View File
@@ -0,0 +1,30 @@
## A quick start guide for getting up and runnning with Umbraco v8
### What you need:
* [Visual Studio 2017 Community (Free)](https://www.visualstudio.com/vs/community/), or Professional, Enterprise, etc...
* .NET Framework 4.7.2 installed, get it here: https://www.microsoft.com/net/download/thank-you/net472?survey=false
* .NET Framework 4.7.2 developer pack, get it here: https://www.microsoft.com/net/download/thank-you/net472-developer-pack _(be sure this is the ENU file which will be named `NDP472-DevPack-ENU.exe`)_
* Clone the Umbraco repository and ensure you have the `temp8` branch checked out
### Start the solution
* Open the `/src/umbraco.sln` Visual Studio solution
* Start the solution (easiest way is to use `ctrl + F5`)
* When the solution is first built this may take some time since it will restore all nuget, npm and bower packages, build the .net solution and also build the angular solution.
* When the website starts you'll see the Umbraco installer and just follow the prompts
* Your all set!
### Making code changes
* _The process for making code changes in v8 is the same as v7_
* Any .NET changes you make you just need to compile
* Any Angular/JS changes you make you will need to make sure you are running the Gulp build. Easiest way to do this is from within Visual Studio in the `Task Runner Explorer`. You can find this window by pressing `ctrl + q` and typing in `Task Runner Explorer`. In this window you'll see all Gulp tasks, double click on the `dev` task, this will compile the angular solution and start a file watcher, then any html/js changes you make are automatically built.
* When making js changes, you should have the chrome developer tools open to ensure that cache is disabled
### What to work on?
We are keeping track of [known issues and limitations here](http://issues.umbraco.org/issue/U4-11279). These line items will eventually be turned into actual tasks to be worked on. Feel free to help us keep this list updated if you find issues and even help fix some of these items. If there is a particular item you'd like to help fix please mention this on the task and we'll create a sub task for the item to continue discussion there.
There's [a list of tasks for v8 that haven't been completed](http://issues.umbraco.org/issues/U4?q=Due+in+version%3A+8.0.0+%23Unresolved+). If you are interested in helping out with any of these please mention this on the task. This list will be constantly updated as we begin to document and design some of the other tasks that still need to get done.
-62
View File
@@ -1,62 +0,0 @@
version: '{build}'
shallow_clone: true
init:
- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
build_script:
- cmd: >-
SET SLN=%CD%
SET SRC=%SLN%\src
SET PACKAGES=%SRC%\packages
CD build
SET "release="
FOR /F "skip=1 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED release SET "release=%%i"
ECHO "Restoring NuGet into %PACKAGES%"
%SRC%\.nuget\NuGet.exe sources Add -Name MyGetUmbracoCore -Source https://www.myget.org/F/umbracocore/api/v2/ >NUL
%SRC%\.nuget\NuGet.exe restore %SRC%\umbraco.sln -Verbosity Quiet -NonInteractive -PackagesDirectory %PACKAGES%
ECHO Building Release %release% build%APPVEYOR_BUILD_NUMBER%
SET PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH%
SET MSBUILD="C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe"
XCOPY "%SRC%\Umbraco.Tests\unit-test-log4net.CI.config" "%SRC%\Umbraco.Tests\unit-test-log4net.config" /Y
%MSBUILD% "%SLN%/src/Umbraco.Tests/Umbraco.Tests.csproj" /consoleloggerparameters:Summary;ErrorsOnly;WarningsOnly /p:NugetPackagesDirectory=%PACKAGES%
build.bat -integration -release:%release% -comment:build%APPVEYOR_BUILD_NUMBER% -nugetfolder:%PACKAGES%
test:
assemblies: src\Umbraco.Tests\bin\Debug\Umbraco.Tests.dll
artifacts:
- path: build\UmbracoCms.*
name: UmbracoFiles
- path: build\msbuild.log
name: BuildLog
deploy:
- provider: AzureBlob
storage_account_name: umbraconightlies
storage_access_key:
secure: bmEMml2SF7QLHULiePa/a01XOeIa2SxJeXuaZ+1R27b+Vb2nNUQVYiPlUyF2cZAFSHI/zO/LekRsVU1rTescGhJjF7SSjKybymI3p+F/OWpwqiu2WfFee1ofXBFx8QHw
container: umbraco-750
artifact: UmbracoFiles
on:
branch: dev-v7
notifications:
- provider: Slack
auth_token:
secure: v2csJi2V5ghR0rPdODK8GJdOGNCA+XaK84iQ9MdPOClqB+VU+40ybdKp6gPirGSH
channel: '#build-umbraco-core'
on_build_success: false
on_build_failure: true
on_build_status_changed: false
-14
View File
@@ -1,14 +0,0 @@
@ECHO OFF
powershell .\build\build.ps1
IF ERRORLEVEL 1 (
GOTO :error
) ELSE (
GOTO :EOF
)
:error
ECHO.
ECHO Can not run build\build.ps1.
ECHO If this is due to a SecurityError then please refer to BUILD.md for help!
ECHO.
@@ -1,112 +0,0 @@
#
function Build-UmbracoDocs
{
$uenv = Get-UmbracoBuildEnv
$src = "$($uenv.SolutionRoot)\src"
$out = "$($uenv.SolutionRoot)\build.out"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$buildTemp = "$PSScriptRoot\temp"
$cache = 2
Prepare-Build -keep $uenv
################ Do the UI docs
# get a temp clean node env (will restore)
Sandbox-Node $uenv
Write-Host "Executing gulp docs"
push-location "$($uenv.SolutionRoot)\src\Umbraco.Web.UI.Client"
write "node version is:" > $tmp\belle-docs.log
&node -v >> $tmp\belle-docs.log 2>&1
write "npm version is:" >> $tmp\belle-docs.log 2>&1
&npm -v >> $tmp\belle-docs.log 2>&1
write "executing npm install" >> $tmp\belle-docs.log 2>&1
&npm install >> $tmp\belle-docs.log 2>&1
write "executing bower install" >> $tmp\belle-docs.log 2>&1
&npm install -g bower >> $tmp\belle-docs.log 2>&1
write "installing gulp" >> $tmp\belle-docs.log 2>&1
&npm install -g gulp >> $tmp\belle-docs.log 2>&1
write "installing gulp-cli" >> $tmp\belle-docs.log 2>&1
&npm install -g gulp-cli --quiet >> $tmp\belle-docs.log 2>&1
write "building docs using gulp" >> $tmp\belle-docs.log 2>&1
&gulp docs >> $tmp\belle-docs.log 2>&1
pop-location
Write-Host "Completed gulp docs build"
# fixme - should we filter the log to find errors?
#get-content .\build.tmp\belle-docs.log | %{ if ($_ -match "build") { write $_}}
# change baseUrl
$baseUrl = "https://our.umbraco.org/apidocs/ui/"
$indexPath = "$src/Umbraco.Web.UI.Client/docs/api/index.html"
(Get-Content $indexPath).Replace("origin + location.href.substr(origin.length).replace(rUrl, indexFile)", "'$baseUrl'") `
| Set-Content $indexPath
# restore
Restore-Node
# zip
&$uenv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Client\docs\api\*.*" `
> $null
################ Do the c# docs
Write-Host "Build C# documentation"
# Build the solution in debug mode
# FIXME no only a simple compilation should be enough!
# FIXME we MUST handle msbuild & co error codes!
# FIXME deal with weird things in gitconfig?
#Build-Umbraco -Configuration Debug
Restore-NuGet $uenv
Compile-Umbraco $uenv "Debug" # FIXME different log file!
Restore-WebConfig "$src\Umbraco.Web.UI"
# ensure we have docfx
Get-DocFx $uenv $buildTemp
# clear
$docFxOutput = "$($uenv.SolutionRoot)\apidocs\_site"
if (test-path($docFxOutput))
{
Remove-Directory $docFxOutput
}
# run
$docFxJson = "$($uenv.SolutionRoot)\apidocs\docfx.json"
push-location "$($uenv.SolutionRoot)\build" # silly docfx.json wants this
Write-Host "Run DocFx metadata"
Write-Host "Logging to $tmp\docfx.metadata.log"
&$uenv.DocFx metadata $docFxJson > "$tmp\docfx.metadata.log"
Write-Host "Run DocFx build"
Write-Host "Logging to $tmp\docfx.build.log"
&$uenv.DocFx build $docFxJson > "$tmp\docfx.build.log"
pop-location
# zip
&$uenv.Zip a -tzip -r "$out\csharp-docs.zip" "$docFxOutput\*.*" `
> $null
}
function Get-DocFx($uenv, $buildTemp)
{
$docFx = "$buildTemp\docfx"
if (-not (test-path $docFx))
{
$source = "https://github.com/dotnet/docfx/releases/download/v2.19.2/docfx.zip"
Write-Host "Download DocFx from $source"
Invoke-WebRequest $source -OutFile "$buildTemp\docfx.zip"
&$uenv.Zip x "$buildTemp\docfx.zip" -o"$buildTemp\docfx" -aos > $nul
Remove-File "$buildTemp\docfx.zip"
}
$uenv | add-member -memberType NoteProperty -name DocFx -value "$docFx\docfx.exe"
}
@@ -1,182 +0,0 @@
#
# Get-UmbracoBuildEnv
# Gets the Umbraco build environment
# Downloads tools if necessary
#
function Get-UmbracoBuildEnv
{
# store tools in the module's directory
# and cache them for two days
$path = "$PSScriptRoot\temp"
$src = "$PSScriptRoot\..\..\..\src"
$cache = 2
if (-not (test-path $path))
{
mkdir $path > $null
}
# ensure we have NuGet
$nuget = "$path\nuget.exe"
$source = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
if ((test-path $nuget) -and ((ls $nuget).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
{
Remove-File $nuget
}
if (-not (test-path $nuget))
{
Write-Host "Download NuGet..."
Invoke-WebRequest $source -OutFile $nuget
}
# ensure we have 7-Zip
$sevenZip = "$path\7za.exe"
if ((test-path $sevenZip) -and ((ls $sevenZip).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
{
Remove-File $sevenZip
}
if (-not (test-path $sevenZip))
{
Write-Host "Download 7-Zip..."
&$nuget install 7-Zip.CommandLine -configFile "$src\NuGet.config" -OutputDirectory $path -Verbosity quiet
$dir = ls "$path\7-Zip.CommandLine.*" | sort -property Name -descending | select -first 1
$file = ls -path "$dir" -name 7za.exe -recurse
$file = ls -path "$dir" -name 7za.exe -recurse | select -first 1 #A select is because there is tools\7za.exe & tools\x64\7za.exe
mv "$dir\$file" $sevenZip
Remove-Directory $dir
}
# ensure we have vswhere
$vswhere = "$path\vswhere.exe"
if ((test-path $vswhere) -and ((ls $vswhere).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
{
Remove-File $vswhere
}
if (-not (test-path $vswhere))
{
Write-Host "Download VsWhere..."
&$nuget install vswhere -configFile "$src\NuGet.config" -OutputDirectory $path -Verbosity quiet
$dir = ls "$path\vswhere.*" | sort -property Name -descending | select -first 1
$file = ls -path "$dir" -name vswhere.exe -recurse
mv "$dir\$file" $vswhere
Remove-Directory $dir
}
# ensure we have semver
$semver = "$path\Semver.dll"
if ((test-path $semver) -and ((ls $semver).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
{
Remove-File $semver
}
if (-not (test-path $semver))
{
Write-Host "Download Semver..."
&$nuget install semver -configFile "$src\NuGet.config" -OutputDirectory $path -Verbosity quiet
$dir = ls "$path\semver.*" | sort -property Name -descending | select -first 1
$file = "$dir\lib\net452\Semver.dll"
if (-not (test-path $file))
{
Write-Error "Failed to file $file"
return
}
mv "$file" $semver
Remove-Directory $dir
}
try
{
[Reflection.Assembly]::LoadFile($semver) > $null
}
catch
{
Write-Error -Exception $_.Exception -Message "Failed to load $semver"
break
}
# ensure we have node
$node = "$path\node-v6.9.1-win-x86"
$source = "http://nodejs.org/dist/v6.9.1/node-v6.9.1-win-x86.7z"
if (-not (test-path $node))
{
Write-Host "Download Node..."
Invoke-WebRequest $source -OutFile "$path\node-v6.9.1-win-x86.7z"
&$sevenZip x "$path\node-v6.9.1-win-x86.7z" -o"$path" -aos > $nul
Remove-File "$path\node-v6.9.1-win-x86.7z"
}
# note: why? node already brings everything we need!
## ensure we have npm
#$npm = "$path\npm.*"
#$getNpm = $true
#if (test-path $npm)
#{
# $getNpm = $false
# $tmpNpm = ls "$path\npm.*" | sort -property Name -descending | select -first 1
# if ($tmpNpm.CreationTime -lt [DateTime]::Now.AddDays(-$cache))
# {
# $getNpm = $true
# }
# else
# {
# $npm = $tmpNpm.ToString()
# }
#}
#if ($getNpm)
#{
# Write-Host "Download Npm..."
# &$nuget install npm -OutputDirectory $path -Verbosity quiet
# $npm = ls "$path\npm.*" | sort -property Name -descending | select -first 1
# $npm.CreationTime = [DateTime]::Now
# $npm = $npm.ToString()
#}
# find visual studio
# will not work on VSO but VSO does not need it
$vsPath = ""
$vsVer = ""
$msBuild = $null
&$vswhere | foreach {
if ($_.StartsWith("installationPath:")) { $vsPath = $_.SubString("installationPath:".Length).Trim() }
if ($_.StartsWith("installationVersion:")) { $vsVer = $_.SubString("installationVersion:".Length).Trim() }
}
if ($vsPath -ne "")
{
$vsVerParts = $vsVer.Split('.')
$vsMajor = [int]::Parse($vsVerParts[0])
$vsMinor = [int]::Parse($vsVerParts[1])
if ($vsMajor -eq 15) {
$msBuild = "$vsPath\MSBuild\$vsMajor.0\Bin"
}
elseif ($vsMajor -eq 14) {
$msBuild = "c:\Program Files (x86)\MSBuild\$vsMajor\Bin"
}
else
{
$msBuild = $null
}
}
$vs = $null
if ($msBuild)
{
$vs = new-object -typeName PsObject
$vs | add-member -memberType NoteProperty -name Path -value $vsPath
$vs | add-member -memberType NoteProperty -name Major -value $vsMajor
$vs | add-member -memberType NoteProperty -name Minor -value $vsMinor
$vs | add-member -memberType NoteProperty -name MsBuild -value "$msBuild\MsBuild.exe"
}
$solutionRoot = Get-FullPath "$PSScriptRoot\..\..\.."
$uenv = new-object -typeName PsObject
$uenv | add-member -memberType NoteProperty -name SolutionRoot -value $solutionRoot
$uenv | add-member -memberType NoteProperty -name VisualStudio -value $vs
$uenv | add-member -memberType NoteProperty -name NuGet -value $nuget
$uenv | add-member -memberType NoteProperty -name Zip -value $sevenZip
$uenv | add-member -memberType NoteProperty -name VsWhere -value $vswhere
$uenv | add-member -memberType NoteProperty -name Semver -value $semver
$uenv | add-member -memberType NoteProperty -name NodePath -value $node
#$uenv | add-member -memberType NoteProperty -name NpmPath -value $npm
return $uenv
}
@@ -1,26 +0,0 @@
#
# Get-UmbracoVersion
# Gets the Umbraco version
#
function Get-UmbracoVersion
{
$uenv = Get-UmbracoBuildEnv
# parse SolutionInfo and retrieve the version string
$filepath = "$($uenv.SolutionRoot)\src\SolutionInfo.cs"
$text = [System.IO.File]::ReadAllText($filepath)
$match = [System.Text.RegularExpressions.Regex]::Matches($text, "AssemblyInformationalVersion\(`"(.+)?`"\)")
$version = $match.Groups[1]
# semver-parse the version string
$semver = [SemVer.SemVersion]::Parse($version)
$release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch
$versions = new-object -typeName PsObject
$versions | add-member -memberType NoteProperty -name Semver -value $semver
$versions | add-member -memberType NoteProperty -name Release -value $release
$versions | add-member -memberType NoteProperty -name Comment -value $semver.PreRelease
$versions | add-member -memberType NoteProperty -name Build -value $semver.Build
return $versions
}
@@ -1,30 +0,0 @@
# finds msbuild
function Get-VisualStudio($vswhere)
{
$vsPath = ""
$vsVer = ""
&$vswhere | foreach {
if ($_.StartsWith("installationPath:")) { $vsPath = $_.SubString("installationPath:".Length).Trim() }
if ($_.StartsWith("installationVersion:")) { $vsVer = $_.SubString("installationVersion:".Length).Trim() }
}
if ($vsPath -eq "") { return $null }
$vsVerParts = $vsVer.Split('.')
$vsMajor = [int]::Parse($vsVerParts[0])
$vsMinor = [int]::Parse($vsVerParts[1])
if ($vsMajor -eq 15) {
$msBuild = "$vsPath\MSBuild\$vsMajor.$vsMinor\Bin"
}
elseif ($vsMajor -eq 14) {
$msBuild = "c:\Program Files (x86)\MSBuild\$vsMajor\Bin"
}
else { return $null }
$msBuild = "$msBuild\MsBuild.exe"
$vs = new-object -typeName PsObject
$vs | add-member -memberType NoteProperty -name Path -value $vsPath
$vs | add-member -memberType NoteProperty -name Major -value $vsMajor
$vs | add-member -memberType NoteProperty -name Minor -value $vsMinor
$vs | add-member -memberType NoteProperty -name MsBuild -value $msBuild
return $vs
}
@@ -1,30 +0,0 @@
#
# Set-UmbracoContinuousVersion
# Sets the Umbraco version for continuous integration
#
# -Version <version>
# where <version> is a Semver valid version
# eg 1.2.3, 1.2.3-alpha, 1.2.3-alpha+456
#
# -BuildNumber <buildNumber>
# where <buildNumber> is a string coming from the build server
# eg 34, 126, 1
#
function Set-UmbracoContinuousVersion
{
param (
[Parameter(Mandatory=$true)]
[string]
$version,
[Parameter(Mandatory=$true)]
[string]
$buildNumber
)
Write-Host "Version is currently set to $version"
$umbracoVersion = "$($version.Trim())-alpha$($buildNumber)"
Write-Host "Setting Umbraco Version to $umbracoVersion"
Set-UmbracoVersion $umbracoVersion
}
@@ -1,117 +0,0 @@
#
# Set-UmbracoVersion
# Sets the Umbraco version
#
# -Version <version>
# where <version> is a Semver valid version
# eg 1.2.3, 1.2.3-alpha, 1.2.3-alpha+456
#
function Set-UmbracoVersion
{
param (
[Parameter(Mandatory=$true)]
[string]
$version
)
$uenv = Get-UmbracoBuildEnv
try
{
[Reflection.Assembly]::LoadFile($uenv.Semver) > $null
}
catch
{
Write-Error "Failed to load $uenv.Semver"
break
}
# validate input
$ok = [Regex]::Match($version, "^[0-9]+\.[0-9]+\.[0-9]+(\-[a-z0-9]+)?(\+[0-9]+)?$")
if (-not $ok.Success)
{
Write-Error "Invalid version $version"
break
}
# parse input
try
{
$semver = [SemVer.SemVersion]::Parse($version)
}
catch
{
Write-Error "Invalid version $version"
break
}
#
$release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch
# edit files and set the proper versions and dates
Write-Host "Update UmbracoVersion.cs"
Replace-FileText "$($uenv.SolutionRoot)\src\Umbraco.Core\Configuration\UmbracoVersion.cs" `
"(\d+)\.(\d+)\.(\d+)(.(\d+))?" `
"$release"
Replace-FileText "$($uenv.SolutionRoot)\src\Umbraco.Core\Configuration\UmbracoVersion.cs" `
"CurrentComment { get { return `"(.+)`"" `
"CurrentComment { get { return `"$($semver.PreRelease)`""
Write-Host "Update SolutionInfo.cs"
Replace-FileText "$($uenv.SolutionRoot)\src\SolutionInfo.cs" `
"AssemblyFileVersion\(`"(.+)?`"\)" `
"AssemblyFileVersion(`"$release`")"
Replace-FileText "$($uenv.SolutionRoot)\src\SolutionInfo.cs" `
"AssemblyInformationalVersion\(`"(.+)?`"\)" `
"AssemblyInformationalVersion(`"$semver`")"
$year = [System.DateTime]::Now.ToString("yyyy")
Replace-FileText "$($uenv.SolutionRoot)\src\SolutionInfo.cs" `
"AssemblyCopyright\(`"Copyright © Umbraco (\d{4})`"\)" `
"AssemblyCopyright(`"Copyright © Umbraco $year`")"
# edit csproj and set IIS Express port number
# this is a raw copy of ReplaceIISExpressPortNumber.exe
# it probably can be achieved in a much nicer way - l8tr
$source = @"
using System;
using System.IO;
using System.Xml;
using System.Globalization;
namespace Umbraco
{
public static class PortUpdater
{
public static void Update(string path, string release)
{
XmlDocument xmlDocument = new XmlDocument();
string fullPath = Path.GetFullPath(path);
xmlDocument.Load(fullPath);
int result = 1;
int.TryParse(release.Replace(`".`", `"`"), out result);
while (result < 1024)
result *= 10;
XmlNode xmlNode1 = xmlDocument.GetElementsByTagName(`"IISUrl`").Item(0);
if (xmlNode1 != null)
xmlNode1.InnerText = `"http://localhost:`" + (object) result;
XmlNode xmlNode2 = xmlDocument.GetElementsByTagName(`"DevelopmentServerPort`").Item(0);
if (xmlNode2 != null)
xmlNode2.InnerText = result.ToString((IFormatProvider) CultureInfo.InvariantCulture);
xmlDocument.Save(fullPath);
}
}
}
"@
$assem = (
"System.Xml",
"System.IO",
"System.Globalization"
)
Write-Host "Update Umbraco.Web.UI.csproj"
add-type -referencedAssemblies $assem -typeDefinition $source -language CSharp
$csproj = "$($uenv.SolutionRoot)\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj"
[Umbraco.PortUpdater]::Update($csproj, $release)
return $semver
}
@@ -1,615 +0,0 @@
# Umbraco.Build.psm1
#
# $env:PSModulePath = "$pwd\build\Modules\;$env:PSModulePath"
# Import-Module Umbraco.Build -Force -DisableNameChecking
#
# PowerShell Modules:
# https://msdn.microsoft.com/en-us/library/dd878324%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
#
# PowerShell Module Manifest:
# https://msdn.microsoft.com/en-us/library/dd878337%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
#
# See also
# http://www.powershellmagazine.com/2014/08/15/pstip-taking-control-of-verbose-and-debug-output-part-5/
. "$PSScriptRoot\Utilities.ps1"
. "$PSScriptRoot\Get-VisualStudio.ps1"
. "$PSScriptRoot\Get-UmbracoBuildEnv.ps1"
. "$PSScriptRoot\Set-UmbracoVersion.ps1"
. "$PSScriptRoot\Set-UmbracoContinuousVersion.ps1"
. "$PSScriptRoot\Get-UmbracoVersion.ps1"
. "$PSScriptRoot\Verify-NuGet.ps1"
. "$PSScriptRoot\Build-UmbracoDocs.ps1"
#
# Prepares the build
#
function Prepare-Build
{
param (
$uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv)
[Alias("k")]
[switch]
$keep = $false
)
Write-Host ">> Prepare Build"
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
# clear
Write-Host "Clear folders and files"
Remove-Directory "$src\Umbraco.Web.UI.Client\bower_components"
if (-not $keep)
{
Remove-Directory "$tmp"
Remove-Directory "$out"
}
if (-not (Test-Path "$tmp"))
{
mkdir "$tmp" > $null
}
if (-not (Test-Path "$out"))
{
mkdir "$out" > $null
}
# ensure proper web.config
$webUi = "$src\Umbraco.Web.UI"
Store-WebConfig $webUi
Write-Host "Create clean web.config"
Copy-File "$webUi\web.Template.config" "$webUi\web.config"
}
function Clear-EnvVar($var)
{
$value = [Environment]::GetEnvironmentVariable($var)
if (test-path "env:$var") { rm "env:$var" }
return $value
}
function Set-EnvVar($var, $value)
{
if ($value)
{
[Environment]::SetEnvironmentVariable($var, $value)
}
else
{
if (test-path "env:$var") { rm "env:$var" }
}
}
function Sandbox-Node
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
$global:node_path = $env:path
$nodePath = $uenv.NodePath
$gitExe = (get-command git).Source
$gitPath = [System.IO.Path]::GetDirectoryName($gitExe)
$env:path = "$nodePath;$gitPath"
$global:node_nodepath = Clear-EnvVar "NODEPATH"
$global:node_npmcache = Clear-EnvVar "NPM_CONFIG_CACHE"
$global:node_npmprefix = Clear-EnvVar "NPM_CONFIG_PREFIX"
}
function Restore-Node
{
$env:path = $node_path
Set-EnvVar "NODEPATH" $node_nodepath
Set-EnvVar "NPM_CONFIG_CACHE" $node_npmcache
Set-EnvVar "NPM_CONFIG_PREFIX" $node_npmprefix
}
#
# Builds the Belle UI project
#
function Compile-Belle
{
param (
$uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv)
$version # an Umbraco version object (see Get-UmbracoVersion)
)
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$src = "$($uenv.SolutionRoot)\src"
Write-Host ">> Compile Belle"
Write-Host "Logging to $tmp\belle.log"
# get a temp clean node env (will restore)
Sandbox-Node $uenv
push-location "$($uenv.SolutionRoot)\src\Umbraco.Web.UI.Client"
write "node version is:" > $tmp\belle.log
&node -v >> $tmp\belle.log 2>&1
write "npm version is:" >> $tmp\belle.log 2>&1
&npm -v >> $tmp\belle.log 2>&1
write "cleaning npm cache" >> $tmp\belle.log 2>&1
&npm cache clean >> $tmp\belle.log 2>&1
write "installing bower" >> $tmp\belle.log 2>&1
&npm install -g bower >> $tmp\belle.log 2>&1
write "installing gulp" >> $tmp\belle.log 2>&1
&npm install -g gulp >> $tmp\belle.log 2>&1
write "installing gulp-cli" >> $tmp\belle.log 2>&1
&npm install -g gulp-cli --quiet >> $tmp\belle.log 2>&1
write "executing npm install" >> $tmp\belle.log 2>&1
&npm install >> $tmp\belle.log 2>&1
write "executing gulp build for version $version" >> $tmp\belle.log 2>&1
&gulp build --buildversion=$version.Release >> $tmp\belle.log 2>&1
pop-location
# fixme - should we filter the log to find errors?
#get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}}
# restore
Restore-Node
# setting node_modules folder to hidden
# used to prevent VS13 from crashing on it while loading the websites project
# also makes sure aspnet compiler does not try to handle rogue files and chokes
# in VSO with Microsoft.VisualC.CppCodeProvider -related errors
# use get-item -force 'cos it might be hidden already
write "Set hidden attribute on node_modules"
$dir = get-item -force "$src\Umbraco.Web.UI.Client\node_modules"
$dir.Attributes = $dir.Attributes -bor ([System.IO.FileAttributes]::Hidden)
}
#
# Compiles Umbraco
#
function Compile-Umbraco
{
param (
$uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv)
[string] $buildConfiguration = "Release"
)
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
if ($uenv.VisualStudio -eq $null)
{
Write-Error "Build environment does not provide VisualStudio."
break
}
$toolsVersion = "4.0"
if ($uenv.VisualStudio.Major -eq 15)
{
$toolsVersion = "15.0"
}
Write-Host ">> Compile Umbraco"
Write-Host "Logging to $tmp\msbuild.umbraco.log"
# beware of the weird double \\ at the end of paths
# see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
&$uenv.VisualStudio.MsBuild "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" `
/p:WarningLevel=0 `
/p:Configuration=$buildConfiguration `
/p:Platform=AnyCPU `
/p:UseWPP_CopyWebApplication=True `
/p:PipelineDependsOnBuild=False `
/p:OutDir=$tmp\bin\\ `
/p:WebProjectOutputDir=$tmp\WebApp\\ `
/p:Verbosity=minimal `
/t:Clean`;Rebuild `
/tv:$toolsVersion `
/p:UmbracoBuild=True `
> $tmp\msbuild.umbraco.log
# /p:UmbracoBuild tells the csproj that we are building from PS
}
#
# Prepare Tests
#
function Prepare-Tests
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
Write-Host ">> Prepare Tests"
# fixme - idea is to avoid rebuilding everything for tests
# but because of our weird assembly versioning (with .* stuff)
# everything gets rebuilt all the time...
#Copy-Files "$tmp\bin" "." "$tmp\tests"
# data
Write-Host "Copy data files"
if (-Not (Test-Path -Path "$tmp\tests\Packaging" ) )
{
Write-Host "Create packaging directory"
mkdir "$tmp\tests\Packaging" > $null
}
Copy-Files "$src\Umbraco.Tests\Packaging\Packages" "*" "$tmp\tests\Packaging\Packages"
# required for package install tests
if (-Not (Test-Path -Path "$tmp\tests\bin" ) )
{
Write-Host "Create bin directory"
mkdir "$tmp\tests\bin" > $null
}
}
#
# Compiles Tests
#
function Compile-Tests
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$tmp\tests"
$buildConfiguration = "Release"
if ($uenv.VisualStudio -eq $null)
{
Write-Error "Build environment does not provide VisualStudio."
break
}
$toolsVersion = "4.0"
if ($uenv.VisualStudio.Major -eq 15)
{
$toolsVersion = "15.0"
}
Write-Host ">> Compile Tests"
Write-Host "Logging to $tmp\msbuild.tests.log"
# beware of the weird double \\ at the end of paths
# see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
&$uenv.VisualStudio.MsBuild "$src\Umbraco.Tests\Umbraco.Tests.csproj" `
/p:WarningLevel=0 `
/p:Configuration=$buildConfiguration `
/p:Platform=AnyCPU `
/p:UseWPP_CopyWebApplication=True `
/p:PipelineDependsOnBuild=False `
/p:OutDir=$out\\ `
/p:Verbosity=minimal `
/t:Build `
/tv:$toolsVersion `
/p:UmbracoBuild=True `
/p:NugetPackages=$src\packages `
> $tmp\msbuild.tests.log
# /p:UmbracoBuild tells the csproj that we are building from PS
}
#
# Cleans things up and prepare files after compilation
#
function Prepare-Packages
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
Write-Host ">> Prepare Packages"
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
$buildConfiguration = "Release"
# restore web.config
Restore-WebConfig "$src\Umbraco.Web.UI"
# cleanup build
Write-Host "Clean build"
Remove-File "$tmp\bin\*.dll.config"
Remove-File "$tmp\WebApp\bin\*.dll.config"
# cleanup presentation
Write-Host "Cleanup presentation"
Remove-Directory "$tmp\WebApp\umbraco.presentation"
# create directories
Write-Host "Create directories"
mkdir "$tmp\Configs" > $null
mkdir "$tmp\Configs\Lang" > $null
mkdir "$tmp\WebApp\App_Data" > $null
#mkdir "$tmp\WebApp\Media" > $null
#mkdir "$tmp\WebApp\Views" > $null
# copy various files
Write-Host "Copy xml documentation"
cp -force "$tmp\bin\*.xml" "$tmp\WebApp\bin"
Write-Host "Copy transformed configs and langs"
# note: exclude imageprocessor/*.config as imageprocessor pkg installs them
Copy-Files "$tmp\WebApp\config" "*.config" "$tmp\Configs" `
{ -not $_.RelativeName.StartsWith("imageprocessor") }
Copy-Files "$tmp\WebApp\config" "*.js" "$tmp\Configs"
Copy-Files "$tmp\WebApp\config\lang" "*.xml" "$tmp\Configs\Lang"
Copy-File "$tmp\WebApp\web.config" "$tmp\Configs\web.config.transform"
Write-Host "Copy transformed web.config"
Copy-File "$src\Umbraco.Web.UI\web.$buildConfiguration.Config.transformed" "$tmp\WebApp\web.config"
# offset the modified timestamps on all umbraco dlls, as WebResources
# break if date is in the future, which, due to timezone offsets can happen.
Write-Host "Offset dlls timestamps"
ls -r "$tmp\*.dll" | foreach {
$_.CreationTime = $_.CreationTime.AddHours(-11)
$_.LastWriteTime = $_.LastWriteTime.AddHours(-11)
}
# copy libs
Write-Host "Copy SqlCE libraries"
Copy-Files "$src\packages\SqlServerCE.4.0.0.1" "*.*" "$tmp\bin" `
{ -not $_.Extension.StartsWith(".nu") -and -not $_.RelativeName.StartsWith("lib\") }
Copy-Files "$src\packages\SqlServerCE.4.0.0.1" "*.*" "$tmp\WebApp\bin" `
{ -not $_.Extension.StartsWith(".nu") -and -not $_.RelativeName.StartsWith("lib\") }
# copy Belle
Write-Host "Copy Belle"
Copy-Files "$src\Umbraco.Web.UI\umbraco\assets" "*" "$tmp\WebApp\umbraco\assets"
Copy-Files "$src\Umbraco.Web.UI\umbraco\js" "*" "$tmp\WebApp\umbraco\js"
Copy-Files "$src\Umbraco.Web.UI\umbraco\lib" "*" "$tmp\WebApp\umbraco\lib"
Copy-Files "$src\Umbraco.Web.UI\umbraco\views" "*" "$tmp\WebApp\umbraco\views"
}
#
# Creates the Zip packages
#
function Package-Zip
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
Write-Host ">> Create Zip packages"
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
Write-Host "Zip all binaries"
&$uenv.Zip a -r "$out\UmbracoCms.AllBinaries.$($version.Semver).zip" `
"$tmp\bin\*" `
"-x!dotless.Core.*" `
> $null
Write-Host "Zip cms"
&$uenv.Zip a -r "$out\UmbracoCms.$($version.Semver).zip" `
"$tmp\WebApp\*" `
"-x!dotless.Core.*" "-x!Content_Types.xml" "-x!*.pdb"`
> $null
}
#
# Prepares NuGet
#
function Prepare-NuGet
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
Write-Host ">> Prepare NuGet"
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
# add Web.config transform files to the NuGet package
Write-Host "Add web.config transforms to NuGet package"
mv "$tmp\WebApp\Views\Web.config" "$tmp\WebApp\Views\Web.config.transform"
# fixme - that one does not exist in .bat build either?
#mv "$tmp\WebApp\Xslt\Web.config" "$tmp\WebApp\Xslt\Web.config.transform"
}
#
# Restores NuGet
#
function Restore-NuGet
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
Write-Host ">> Restore NuGet"
Write-Host "Logging to $tmp\nuget.restore.log"
&$uenv.NuGet restore "$src\Umbraco.sln" -configfile "$src\NuGet.config" > "$tmp\nuget.restore.log"
}
#
# Copies the Azure Gallery script to output
#
function Prepare-AzureGallery
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
$psScript = "$($uenv.SolutionRoot)\build\azuregalleryrelease.ps1"
Write-Host ">> Copy azuregalleryrelease.ps1 to output folder"
Copy-Item $psScript $out
}
#
# Creates the NuGet packages
#
function Package-NuGet
{
param (
$uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv)
$version # an Umbraco version object (see Get-UmbracoVersion)
)
$src = "$($uenv.SolutionRoot)\src"
$tmp = "$($uenv.SolutionRoot)\build.tmp"
$out = "$($uenv.SolutionRoot)\build.out"
$nuspecs = "$($uenv.SolutionRoot)\build\NuSpecs"
Write-Host ">> Create NuGet packages"
# see https://docs.microsoft.com/en-us/nuget/schema/nuspec
# note - warnings about SqlCE native libs being outside of 'lib' folder,
# nothing much we can do about it as it's intentional yet there does not
# seem to be a way to disable the warning
&$uenv.NuGet Pack "$nuspecs\UmbracoCms.Core.nuspec" `
-Properties BuildTmp="$tmp" `
-Version $version.Semver.ToString() `
-Symbols -Verbosity quiet -outputDirectory $out
&$uenv.NuGet Pack "$nuspecs\UmbracoCms.nuspec" `
-Properties BuildTmp="$tmp" `
-Version $version.Semver.ToString() `
-Verbosity quiet -outputDirectory $out
}
#
# Builds Umbraco
#
function Build-Umbraco
{
[CmdletBinding()]
param (
[string]
$target = "all",
[string]
$buildConfiguration = "Release"
)
$target = $target.ToLowerInvariant()
Write-Host ">> Build-Umbraco <$target> <$buildConfiguration>"
Write-Host "Get Build Environment"
$uenv = Get-UmbracoBuildEnv
Write-Host "Get Version"
$version = Get-UmbracoVersion
Write-Host "Version $($version.Semver)"
if ($target -eq "pre-build")
{
Prepare-Build $uenv
#Compile-Belle $uenv $version
# set environment variables
$env:UMBRACO_VERSION=$version.Semver.ToString()
$env:UMBRACO_RELEASE=$version.Release
$env:UMBRACO_COMMENT=$version.Comment
$env:UMBRACO_BUILD=$version.Build
# set environment variable for VSO
# https://github.com/Microsoft/vsts-tasks/issues/375
# https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md
Write-Host ("##vso[task.setvariable variable=UMBRACO_VERSION;]$($version.Semver.ToString())")
Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($version.Release)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($version.Comment)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($version.Build)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($uenv.SolutionRoot)\build.tmp")
}
elseif ($target -eq "pre-tests")
{
Prepare-Tests $uenv
}
elseif ($target -eq "compile-tests")
{
Compile-Tests $uenv
}
elseif ($target -eq "compile-umbraco")
{
Compile-Umbraco $uenv $buildConfiguration
}
elseif ($target -eq "pre-packages")
{
Prepare-Packages $uenv
}
elseif ($target -eq "pre-nuget")
{
Prepare-NuGet $uenv
}
elseif ($target -eq "restore-nuget")
{
Restore-NuGet $uenv
}
elseif ($target -eq "pkg-zip")
{
Package-Zip $uenv
}
elseif ($target -eq "compile-belle")
{
Compile-Belle $uenv $version
}
elseif ($target -eq "prepare-azuregallery")
{
Prepare-AzureGallery $uenv
}
elseif ($target -eq "all")
{
Prepare-Build $uenv
Restore-NuGet $uenv
Compile-Belle $uenv $version
Compile-Umbraco $uenv $buildConfiguration
Prepare-Tests $uenv
Compile-Tests $uenv
# not running tests...
Prepare-Packages $uenv
Package-Zip $uenv
Verify-NuGet $uenv
Prepare-NuGet $uenv
Package-NuGet $uenv $version
Prepare-AzureGallery $uenv
}
else
{
Write-Error "Unsupported target `"$target`"."
}
}
#
# export functions
#
Export-ModuleMember -function Get-UmbracoBuildEnv
Export-ModuleMember -function Set-UmbracoVersion
Export-ModuleMember -function Set-UmbracoContinuousVersion
Export-ModuleMember -function Get-UmbracoVersion
Export-ModuleMember -function Build-Umbraco
Export-ModuleMember -function Build-UmbracoDocs
Export-ModuleMember -function Verify-NuGet
#eof
-95
View File
@@ -1,95 +0,0 @@
# returns the full path if $file is relative to $pwd
function Get-FullPath($file)
{
$path = [System.IO.Path]::Combine($pwd, $file)
$path = [System.IO.Path]::GetFullPath($path)
return $path
}
# removes a directory, doesn't complain if it does not exist
function Remove-Directory($dir)
{
remove-item $dir -force -recurse -errorAction SilentlyContinue > $null
}
# removes a file, doesn't complain if it does not exist
function Remove-File($file)
{
remove-item $file -force -errorAction SilentlyContinue > $null
}
# copies a file, creates target dir if needed
function Copy-File($source, $target)
{
$ignore = new-item -itemType file -path $target -force
cp -force $source $target
}
# copies files to a directory
function Copy-Files($source, $select, $target, $filter)
{
$files = ls -r "$source\$select"
$files | foreach {
$relative = $_.FullName.SubString($source.Length+1)
$_ | add-member -memberType NoteProperty -name RelativeName -value $relative
}
if ($filter -ne $null) {
$files = $files | where $filter
}
$files |
foreach {
if ($_.PsIsContainer) {
$ignore = new-item -itemType directory -path "$target\$($_.RelativeName)" -force
}
else {
Copy-File $_.FullName "$target\$($_.RelativeName)"
}
}
}
# regex-replaces content in a file
function Replace-FileText($filename, $source, $replacement)
{
$filepath = Get-FullPath $filename
$text = [System.IO.File]::ReadAllText($filepath)
$text = [System.Text.RegularExpressions.Regex]::Replace($text, $source, $replacement)
$utf8bom = New-Object System.Text.UTF8Encoding $true
[System.IO.File]::WriteAllText($filepath, $text, $utf8bom)
}
# store web.config
function Store-WebConfig($webUi)
{
if (test-path "$webUi\web.config")
{
if (test-path "$webUi\web.config.temp-build")
{
Write-Host "Found existing web.config.temp-build"
$i = 0
while (test-path "$webUi\web.config.temp-build.$i")
{
$i = $i + 1
}
Write-Host "Save existing web.config as web.config.temp-build.$i"
Write-Host "(WARN: the original web.config.temp-build will be restored during post-build)"
mv "$webUi\web.config" "$webUi\web.config.temp-build.$i"
}
else
{
Write-Host "Save existing web.config as web.config.temp-build"
Write-Host "(will be restored during post-build)"
mv "$webUi\web.config" "$webUi\web.config.temp-build"
}
}
}
# restore web.config
function Restore-WebConfig($webUi)
{
if (test-path "$webUi\web.config.temp-build")
{
Write-Host "Restoring existing web.config"
Remove-File "$webUi\web.config"
mv "$webUi\web.config.temp-build" "$webUi\web.config"
}
}
@@ -1,444 +0,0 @@
#
# Verify-NuGet
#
function Format-Dependency
{
param ( $d )
$m = $d.Id + " "
if ($d.MinInclude) { $m = $m + "[" }
else { $m = $m + "(" }
$m = $m + $d.MinVersion
if ($d.MaxVersion -ne $d.MinVersion) { $m = $m + "," + $d.MaxVersion }
if ($d.MaxInclude) { $m = $m + "]" }
else { $m = $m + ")" }
return $m
}
function Write-NuSpec
{
param ( $name, $deps )
Write-Host ""
Write-Host "$name NuSpec dependencies:"
foreach ($d in $deps)
{
$m = Format-Dependency $d
Write-Host " $m"
}
}
function Write-Package
{
param ( $name, $pkgs )
Write-Host ""
Write-Host "$name packages:"
foreach ($p in $pkgs)
{
Write-Host " $($p.Id) $($p.Version)"
}
}
function Verify-NuGet
{
param (
$uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
)
if ($uenv -eq $null)
{
$uenv = Get-UmbracoBuildEnv
}
$source = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using Semver;
namespace Umbraco.Build
{
public class NuGet
{
public static Dependency[] GetNuSpecDependencies(string filename)
{
NuSpec nuspec;
var serializer = new XmlSerializer(typeof(NuSpec));
using (var reader = new StreamReader(filename))
{
nuspec = (NuSpec) serializer.Deserialize(reader);
}
var nudeps = nuspec.Metadata.Dependencies;
var deps = new List<Dependency>();
foreach (var nudep in nudeps)
{
var dep = new Dependency();
dep.Id = nudep.Id;
var parts = nudep.Version.Split(',');
if (parts.Length == 1)
{
dep.MinInclude = parts[0].StartsWith("[");
dep.MaxInclude = parts[0].EndsWith("]");
SemVersion version;
if (!SemVersion.TryParse(parts[0].Substring(1, parts[0].Length-2).Trim(), out version)) continue;
dep.MinVersion = dep.MaxVersion = version; //parts[0].Substring(1, parts[0].Length-2).Trim();
}
else
{
SemVersion version;
if (!SemVersion.TryParse(parts[0].Substring(1).Trim(), out version)) continue;
dep.MinVersion = version; //parts[0].Substring(1).Trim();
if (!SemVersion.TryParse(parts[1].Substring(0, parts[1].Length-1).Trim(), out version)) continue;
dep.MaxVersion = version; //parts[1].Substring(0, parts[1].Length-1).Trim();
dep.MinInclude = parts[0].StartsWith("[");
dep.MaxInclude = parts[1].EndsWith("]");
}
deps.Add(dep);
}
return deps.ToArray();
}
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(/*this*/ IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> knownKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
public static Package[] GetProjectsPackages(string src, string[] projects)
{
var l = new List<Package>();
foreach (var project in projects)
{
var path = Path.Combine(src, project);
var packageConfig = Path.Combine(path, "packages.config");
if (File.Exists(packageConfig))
ReadPackagesConfig(packageConfig, l);
var csprojs = Directory.GetFiles(path, "*.csproj");
foreach (var csproj in csprojs)
{
ReadCsProj(csproj, l);
}
}
IEnumerable<Package> p = l.OrderBy(x => x.Id);
p = DistinctBy(p, x => x.Id + ":::" + x.Version);
return p.ToArray();
}
public static object[] GetPackageErrors(Package[] pkgs)
{
return pkgs
.GroupBy(x => x.Id)
.Where(x => x.Count() > 1)
.ToArray();
}
public static object[] GetNuSpecErrors(Package[] pkgs, Dependency[] deps)
{
var d = pkgs.ToDictionary(x => x.Id, x => x.Version);
return deps
.Select(x =>
{
SemVersion v;
if (!d.TryGetValue(x.Id, out v)) return null;
var ok = true;
/*
if (x.MinInclude)
{
if (v < x.MinVersion) ok = false;
}
else
{
if (v <= x.MinVersion) ok = false;
}
if (x.MaxInclude)
{
if (v > x.MaxVersion) ok = false;
}
else
{
if (v >= x.MaxVersion) ok = false;
}
*/
if (!x.MinInclude || v != x.MinVersion) ok = false;
return ok ? null : new { Dependency = x, Version = v };
})
.Where(x => x != null)
.ToArray();
}
/*
public static Package[] GetProjectPackages(string path)
{
var l = new List<Package>();
var packageConfig = Path.Combine(path, "packages.config");
if (File.Exists(packageConfig))
ReadPackagesConfig(packageConfig, l);
var csprojs = Directory.GetFiles(path, "*.csproj");
foreach (var csproj in csprojs)
{
ReadCsProj(csproj, l);
}
return l.ToArray();
}
*/
public static string GetDirectoryName(string filename)
{
return Path.GetFileName(Path.GetDirectoryName(filename));
}
public static void ReadPackagesConfig(string filename, List<Package> packages)
{
//Console.WriteLine("read " + filename);
PackagesConfigPackages pkgs;
var serializer = new XmlSerializer(typeof(PackagesConfigPackages));
using (var reader = new StreamReader(filename))
{
pkgs = (PackagesConfigPackages) serializer.Deserialize(reader);
}
foreach (var p in pkgs.Packages)
{
SemVersion version;
if (!SemVersion.TryParse(p.Version, out version)) continue;
packages.Add(new Package { Id = p.Id, Version = version, Project = GetDirectoryName(filename) });
}
}
public static void ReadCsProj(string filename, List<Package> packages)
{
//Console.WriteLine("read " + filename);
// if xmlns then it's not a VS2017 with PackageReference
var text = File.ReadAllLines(filename);
var line = text.FirstOrDefault(x => x.Contains("<Project"));
if (line == null) return;
if (line.Contains("xmlns")) return;
CsProjProject proj;
var serializer = new XmlSerializer(typeof(CsProjProject));
using (var reader = new StreamReader(filename))
{
proj = (CsProjProject) serializer.Deserialize(reader);
}
foreach (var p in proj.ItemGroups.Where(x => x.Packages != null).SelectMany(x => x.Packages))
{
var sversion = p.VersionE ?? p.VersionA;
SemVersion version;
if (!SemVersion.TryParse(sversion, out version)) continue;
packages.Add(new Package { Id = p.Id, Version = version, Project = GetDirectoryName(filename) });
}
}
public class Dependency
{
public string Id { get; set; }
public SemVersion MinVersion { get; set; }
public SemVersion MaxVersion { get; set; }
public bool MinInclude { get; set; }
public bool MaxInclude { get; set; }
}
public class Package
{
public string Id { get; set; }
public SemVersion Version { get; set; }
public string Project { get; set; }
}
[XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
[XmlRoot(Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", IsNullable = false, ElementName = "package")]
public class NuSpec
{
[XmlElement("metadata")]
public NuSpecMetadata Metadata { get; set; }
}
[XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", TypeName = "metadata")]
public class NuSpecMetadata
{
[XmlArray("dependencies")]
[XmlArrayItem("dependency", IsNullable = false)]
public NuSpecDependency[] Dependencies { get; set; }
}
[XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", TypeName = "dependencies")]
public class NuSpecDependency
{
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "version")]
public string Version { get; set; }
}
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false, ElementName = "packages")]
public class PackagesConfigPackages
{
[XmlElement("package")]
public PackagesConfigPackage[] Packages { get; set; }
}
[XmlType(AnonymousType = true, TypeName = "package")]
public class PackagesConfigPackage
{
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "version")]
public string Version { get; set; }
}
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false, ElementName = "Project")]
public class CsProjProject
{
[XmlElement("ItemGroup")]
public CsProjItemGroup[] ItemGroups { get; set; }
}
[XmlType(AnonymousType = true, TypeName = "ItemGroup")]
public class CsProjItemGroup
{
[XmlElement("PackageReference")]
public CsProjPackageReference[] Packages { get; set; }
}
[XmlType(AnonymousType = true, TypeName = "PackageReference")]
public class CsProjPackageReference
{
[XmlAttribute(AttributeName = "Include")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "Version")]
public string VersionA { get; set; }
[XmlElement("Version")]
public string VersionE { get; set;}
}
}
}
"@
Write-Host ">> Verify NuGet consistency"
$assem = (
"System.Xml",
"System.Core", # "System.Collections.Generic"
"System.Linq",
"System.Xml.Serialization",
"System.IO",
"System.Globalization",
$uenv.Semver
)
try
{
# as long as the code hasn't changed it's fine to re-add, but if the code
# has changed this will throw - better warn the dev that we have an issue
add-type -referencedAssemblies $assem -typeDefinition $source -language CSharp
}
catch
{
if ($_.FullyQualifiedErrorId.StartsWith("TYPE_ALREADY_EXISTS,"))
{ Write-Error "Failed to add type, did you change the code?" }
else
{ Write-Error $_ }
}
if (-not $?) { break }
$nuspecs = (
"UmbracoCms",
"UmbracoCms.Core"
)
$projects = (
"Umbraco.Core",
"Umbraco.Web",
"Umbraco.Web.UI",
"UmbracoExamine"#,
#"Umbraco.Tests",
#"Umbraco.Tests.Benchmarks"
)
$src = "$($uenv.SolutionRoot)\src"
$pkgs = [Umbraco.Build.NuGet]::GetProjectsPackages($src, $projects)
if (-not $?) { break }
#Write-Package "All" $pkgs
$errs = [Umbraco.Build.NuGet]::GetPackageErrors($pkgs)
if (-not $?) { break }
if ($errs.Length -gt 0)
{
Write-Host ""
}
foreach ($err in $errs)
{
Write-Host $err.Key
foreach ($e in $err)
{
Write-Host " $($e.Version) required by $($e.Project)"
}
}
if ($errs.Length -gt 0)
{
Write-Error "Found non-consolidated package dependencies"
break
}
$nuerr = $false
$nupath = "$($uenv.SolutionRoot)\build\NuSpecs"
foreach ($nuspec in $nuspecs)
{
$deps = [Umbraco.Build.NuGet]::GetNuSpecDependencies("$nupath\$nuspec.nuspec")
if (-not $?) { break }
#Write-NuSpec $nuspec $deps
$errs = [Umbraco.Build.NuGet]::GetNuSpecErrors($pkgs, $deps)
if (-not $?) { break }
if ($errs.Length -gt 0)
{
Write-Host ""
Write-Host "$nuspec requires:"
$nuerr = $true
}
foreach ($err in $errs)
{
$m = Format-Dependency $err.Dependency
Write-Host " $m but projects require $($err.Version)"
}
}
if ($nuerr)
{
Write-Error "Found inconsistent NuGet dependencies"
break
}
}
+86 -107
View File
@@ -1,107 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.4.4">
<id>UmbracoCms.Core</id>
<version>7.0.0</version>
<title>Umbraco Cms Core Binaries</title>
<authors>Umbraco HQ</authors>
<owners>Umbraco HQ</owners>
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Contains the core assemblies needed to run Umbraco Cms. This package only contains assemblies and can be used for package development. Use the UmbracoCms-package to setup Umbraco in Visual Studio as an ASP.NET project.</description>
<summary>Contains the core assemblies needed to run Umbraco Cms</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<dependency id="log4net" version="[2.0.8,3.0.0)" />
<dependency id="Log4Net.Async" version="[2.0.4,3.0.0)" />
<dependency id="Microsoft.AspNet.Mvc" version="[5.2.3,6.0.0)" />
<dependency id="Microsoft.AspNet.WebApi" version="[5.2.3,6.0.0)" />
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.1, 3.0.0)" />
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.1, 3.0.0)" />
<dependency id="Microsoft.Owin.Security.Cookies" version="[3.1.0, 4.0.0)" />
<dependency id="Microsoft.Owin.Security.OAuth" version="[3.1.0, 4.0.0)" />
<dependency id="Microsoft.Owin.Host.SystemWeb" version="[3.1.0, 4.0.0)" />
<dependency id="MiniProfiler" version="[2.1.0, 3.0.0)" />
<dependency id="HtmlAgilityPack" version="[1.4.9.5, 2.0.0)" />
<dependency id="Lucene.Net" version="[2.9.4.1, 3.0.0.0)" />
<dependency id="MySql.Data" version="[6.9.9, 7.0.0)" />
<dependency id="ClientDependency" version="[1.9.6, 2.0.0)" />
<dependency id="ClientDependency-Mvc5" version="[1.8.0.0, 2.0.0)" />
<dependency id="AutoMapper" version="[3.3.1, 4.0.0)" />
<dependency id="Newtonsoft.Json" version="[10.0.2, 11.0.0)" />
<dependency id="Examine" version="[0.1.89, 1.0.0)" />
<dependency id="ImageProcessor" version="[2.5.6, 3.0.0)" />
<dependency id="ImageProcessor.Web" version="[4.8.7, 5.0.0)" />
<dependency id="semver" version="[1.1.2, 3.0.0)" />
<!-- Markdown can not be updated due to: https://github.com/hey-red/markdownsharp/issues/71#issuecomment-233585487 -->
<dependency id="Markdown" version="[1.14.7, 2.0.0)" />
<dependency id="System.Threading.Tasks.Dataflow" version="[4.7.0, 5.0.0)" />
<dependency id="System.ValueTuple" version="[4.4.0, 5.0.0)" />
</dependencies>
</metadata>
<files>
<file src="$BuildTmp$\WebApp\bin\businesslogic.dll" target="lib\net45\businesslogic.dll" />
<file src="$BuildTmp$\WebApp\bin\businesslogic.xml" target="lib\net45\businesslogic.xml" />
<file src="$BuildTmp$\WebApp\bin\cms.dll" target="lib\net45\cms.dll" />
<file src="$BuildTmp$\WebApp\bin\cms.xml" target="lib\net45\cms.xml" />
<file src="$BuildTmp$\WebApp\bin\controls.dll" target="lib\net45\controls.dll" />
<file src="$BuildTmp$\WebApp\bin\controls.xml" target="lib\net45\controls.xml" />
<file src="$BuildTmp$\WebApp\bin\interfaces.dll" target="lib\net45\interfaces.dll" />
<file src="$BuildTmp$\WebApp\bin\interfaces.xml" target="lib\net45\interfaces.xml" />
<file src="$BuildTmp$\WebApp\bin\log4net.dll" target="lib\net45\log4net.dll" />
<file src="$BuildTmp$\WebApp\bin\Microsoft.ApplicationBlocks.Data.dll" target="lib\net45\Microsoft.ApplicationBlocks.Data.dll" />
<file src="$BuildTmp$\WebApp\bin\SQLCE4Umbraco.dll" target="lib\net45\SQLCE4Umbraco.dll" />
<file src="$BuildTmp$\WebApp\bin\SQLCE4Umbraco.xml" target="lib\net45\SQLCE4Umbraco.xml" />
<file src="$BuildTmp$\WebApp\bin\System.Data.SqlServerCe.dll" target="lib\net45\System.Data.SqlServerCe.dll" />
<file src="$BuildTmp$\WebApp\bin\System.Data.SqlServerCe.Entity.dll" target="lib\net45\System.Data.SqlServerCe.Entity.dll" />
<file src="$BuildTmp$\WebApp\bin\TidyNet.dll" target="lib\net45\TidyNet.dll" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Core.dll" target="lib\net45\Umbraco.Core.dll" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Core.xml" target="lib\net45\Umbraco.Core.xml" />
<file src="$BuildTmp$\WebApp\bin\umbraco.DataLayer.dll" target="lib\net45\umbraco.DataLayer.dll" />
<file src="$BuildTmp$\WebApp\bin\umbraco.DataLayer.xml" target="lib\net45\umbraco.DataLayer.xml" />
<file src="$BuildTmp$\WebApp\bin\umbraco.dll" target="lib\net45\umbraco.dll" />
<file src="$BuildTmp$\WebApp\bin\umbraco.xml" target="lib\net45\umbraco.xml" />
<file src="$BuildTmp$\WebApp\bin\umbraco.editorControls.dll" target="lib\net45\umbraco.editorControls.dll" />
<file src="$BuildTmp$\WebApp\bin\umbraco.editorControls.xml" target="lib\net45\umbraco.editorControls.xml" />
<file src="$BuildTmp$\WebApp\bin\umbraco.MacroEngines.dll" target="lib\net45\umbraco.MacroEngines.dll" />
<file src="$BuildTmp$\WebApp\bin\umbraco.MacroEngines.xml" target="lib\net45\umbraco.MacroEngines.xml" />
<file src="$BuildTmp$\WebApp\bin\umbraco.providers.dll" target="lib\net45\umbraco.providers.dll" />
<file src="$BuildTmp$\WebApp\bin\umbraco.providers.xml" target="lib\net45\umbraco.providers.xml" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.UI.dll" target="lib\net45\Umbraco.Web.UI.dll" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.UI.xml" target="lib\net45\Umbraco.Web.UI.xml" />
<file src="$BuildTmp$\WebApp\bin\UmbracoExamine.dll" target="lib\net45\UmbracoExamine.dll" />
<file src="$BuildTmp$\WebApp\bin\UmbracoExamine.xml" target="lib\net45\UmbracoExamine.xml" />
<file src="tools\install.core.ps1" target="tools\install.ps1" />
<!-- Added to be able to produce a symbols package -->
<file src="$BuildTmp$\bin\SQLCE4Umbraco.pdb" target="lib" />
<file src="..\..\src\SQLCE4Umbraco\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\SQLCE4Umbraco" />
<file src="$BuildTmp$\bin\businesslogic.pdb" target="lib" />
<file src="..\..\src\umbraco.businesslogic\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.businesslogic" />
<file src="$BuildTmp$\bin\cms.pdb" target="lib" />
<file src="..\..\src\umbraco.cms\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.cms" />
<file src="$BuildTmp$\bin\controls.pdb" target="lib" />
<file src="..\..\src\umbraco.controls\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.controls" />
<file src="$BuildTmp$\bin\interfaces.pdb" target="lib" />
<file src="..\..\src\umbraco.interfaces\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.interfaces" />
<file src="$BuildTmp$\bin\Umbraco.Core.pdb" target="lib" />
<file src="..\..\src\Umbraco.Core\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.Core" />
<file src="$BuildTmp$\bin\umbraco.DataLayer.pdb" target="lib" />
<file src="..\..\src\umbraco.datalayer\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.datalayer" />
<file src="$BuildTmp$\bin\umbraco.editorControls.pdb" target="lib" />
<file src="..\..\src\umbraco.editorControls\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.editorControls" />
<file src="$BuildTmp$\bin\umbraco.MacroEngines.pdb" target="lib" />
<file src="..\..\src\umbraco.MacroEngines\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.MacroEngines" />
<file src="$BuildTmp$\bin\umbraco.providers.pdb" target="lib" />
<file src="..\..\src\umbraco.providers\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\umbraco.providers" />
<file src="$BuildTmp$\bin\umbraco.pdb" target="lib" />
<file src="..\..\src\Umbraco.Web\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.Web" />
<file src="$BuildTmp$\bin\Umbraco.Web.UI.pdb" target="lib" />
<file src="..\..\src\Umbraco.Web.UI\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.Web.UI" />
<file src="$BuildTmp$\bin\UmbracoExamine.pdb" target="lib" />
<file src="..\..\src\UmbracoExamine\**\*.cs" exclude="..\..\src\**\TemporaryGeneratedFile*.cs" target="src\UmbracoExamine" />
</files>
</package>
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.4.4">
<id>UmbracoCms.Core</id>
<version>8.0.0</version>
<title>Umbraco Cms Core Binaries</title>
<authors>Umbraco HQ</authors>
<owners>Umbraco HQ</owners>
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Contains the core assemblies needed to run Umbraco Cms. This package only contains assemblies and can be used for package development. Use the UmbracoCms-package to setup Umbraco in Visual Studio as an ASP.NET project.</description>
<summary>Contains the core assemblies needed to run Umbraco Cms</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<dependency id="AutoMapper" version="[6.2.2,6.666666)" />
<dependency id="ClientDependency" version="[1.9.6,1.666666)" />
<dependency id="ClientDependency-Mvc5" version="[1.8.0,1.666666)" />
<dependency id="CSharpTest.Net.Collections" version="[14.906.1403.1082,14.666666)" />
<dependency id="Examine" version="[1.0.0-beta025,1.666666)" />
<dependency id="HtmlAgilityPack" version="[1.7.2,1.666666)" />
<dependency id="ImageProcessor" version="[2.6.1.19,2.666666)" />
<dependency id="ImageProcessor.Web" version="[4.9.2.19,4.666666)" />
<dependency id="ImageProcessor.Web.Config" version="[2.4.1.19,2.666666)" />
<dependency id="LightInject" version="[5.1.2,5.666666)" />
<dependency id="LightInject.Annotation" version="[1.1.0,1.666666)" />
<dependency id="LightInject.Mvc" version="[2.0.0,2.666666)" />
<dependency id="LightInject.WebApi" version="[2.0.0,2.666666)" />
<dependency id="log4net" version="[2.0.8,2.666666)" />
<dependency id="Log4Net.Async" version="[2.0.4,2.666666)" />
<dependency id="Lucene.Net.Contrib" version="[3.0.3,3.666666)" />
<dependency id="Markdown" version="[2.2.1,2.666666)" />
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.1,2.666666)" />
<dependency id="Microsoft.AspNet.Mvc" version="[5.2.6,5.666666)" />
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.3,2.666666)" />
<dependency id="Microsoft.AspNet.WebApi" version="[5.2.6,5.666666)" />
<dependency id="Microsoft.CodeAnalysis.CSharp" version="[2.8.0,2.666666)" />
<dependency id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="[1.0.8,1.666666)" />
<dependency id="Microsoft.Net.Compilers" version="[2.8.0,2.666666)" />
<dependency id="Microsoft.Owin.Host.SystemWeb" version="[4.0.0,4.666666)" />
<dependency id="Microsoft.Owin.Security.Cookies" version="[4.0.0,4.666666)" />
<dependency id="Microsoft.Owin.Security.OAuth" version="[4.0.0,4.666666)" />
<dependency id="Microsoft.Web.Xdt" version="[2.1.2,2.666666)" />
<dependency id="MiniProfiler" version="[3.2.0.157,3.666666)" />
<dependency id="MySql.Data" version="[6.10.7,6.666666)" />
<dependency id="Newtonsoft.Json" version="[11.0.2,11.666666)" />
<dependency id="NPoco" version="[3.9.3,3.666666)" />
<dependency id="Semver" version="[2.0.4,2.666666)" />
<dependency id="System.Reflection.Primitives" version="[4.3.0,4.666666)" />
<dependency id="System.Runtime.Handles" version="[4.3.0,4.666666)" />
<dependency id="System.Security.Cryptography.X509Certificates" version="[4.3.2,4.666666)" />
<dependency id="System.Threading.Tasks.Dataflow" version="[4.8.0,4.666666)" />
<dependency id="Umbraco.SqlServerCE" version="[4.0.0.1,4.666666)" />
</dependencies>
</metadata>
<files>
<file src="$BuildTmp$\WebApp\bin\Umbraco.Core.dll" target="lib\net472\Umbraco.Core.dll" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.dll" target="lib\net472\Umbraco.Web.dll" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.UI.dll" target="lib\net472\Umbraco.Web.UI.dll" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Examine.dll" target="lib\net472\Umbraco.Examine.dll" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.ModelsBuilder.dll" target="lib\net472\Umbraco.ModelsBuilder.dll" />
<!-- docs -->
<file src="$BuildTmp$\WebApp\bin\Umbraco.Core.xml" target="lib\Umbraco.Core.xml" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.xml" target="lib\Umbraco.Web.xml" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.UI.xml" target="lib\Umbraco.Web.UI.xml" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.Examine.xml" target="lib\Umbraco.Examine.xml" />
<file src="$BuildTmp$\WebApp\bin\Umbraco.ModelsBuilder.xml" target="lib\Umbraco.ModelsBuilder.xml" />
<file src="tools\install.core.ps1" target="tools\install.ps1" />
<!-- symbols -->
<file src="$BuildTmp$\bin\Umbraco.Core.pdb" target="lib" />
<file src="$BuildTmp$\..\src\Umbraco.Core\**\*.cs" exclude="$BuildTmp$\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.Core" />
<file src="$BuildTmp$\bin\Umbraco.Web.pdb" target="lib" />
<file src="$BuildTmp$\..\src\Umbraco.Web\**\*.cs" exclude="$BuildTmp$\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.Web" />
<file src="$BuildTmp$\bin\Umbraco.Web.UI.pdb" target="lib" />
<file src="$BuildTmp$\..\src\Umbraco.Web.UI\**\*.cs" exclude="$BuildTmp$\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.Web.UI" />
<file src="$BuildTmp$\bin\Umbraco.Examine.pdb" target="lib" />
<file src="$BuildTmp$\..\src\Umbraco.Examine\**\*.cs" exclude="$BuildTmp$\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.Examine" />
<file src="$BuildTmp$\bin\Umbraco.ModelsBuilder.pdb" target="lib" />
<file src="$BuildTmp$\..\src\Umbraco.ModelsBuilder\**\*.cs" exclude="$BuildTmp$\..\src\**\TemporaryGeneratedFile*.cs" target="src\Umbraco.ModelsBuilder" />
</files>
</package>
+53 -53
View File
@@ -1,53 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.4.4">
<id>UmbracoCms</id>
<version>7.0.0</version>
<title>Umbraco Cms</title>
<authors>Umbraco HQ</authors>
<owners>Umbraco HQ</owners>
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Installs Umbraco Cms in your Visual Studio ASP.NET project</description>
<summary>Installs Umbraco Cms in your Visual Studio ASP.NET project</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<dependency id="UmbracoCms.Core" version="[$version$]" />
<dependency id="Newtonsoft.Json" version="[10.0.2, 11.0.0)" />
<dependency id="Umbraco.ModelsBuilder" version="[3.0.10, 4.0.0)" />
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.1, 3.0.0)" />
<dependency id="ImageProcessor.Web.Config" version="[2.3.1, 3.0.0)" />
</dependencies>
</metadata>
<files>
<file src="$BuildTmp$\Configs\**" target="Content\Config" exclude="$BuildTmp$\Configs\Web.config.transform" />
<file src="$BuildTmp$\WebApp\Views\**" target="Content\Views" exclude="$BuildTmp$\WebApp\Views\Web.config" />
<file src="$BuildTmp$\WebApp\default.aspx" target="Content\default.aspx" />
<file src="$BuildTmp$\WebApp\Global.asax" target="Content\Global.asax" />
<file src="$BuildTmp$\WebApp\Web.config" target="UmbracoFiles\Web.config" />
<file src="$BuildTmp$\WebApp\App_Browsers\**" target="UmbracoFiles\App_Browsers" />
<file src="$BuildTmp$\WebApp\bin\amd64\**" target="UmbracoFiles\bin\amd64" />
<file src="$BuildTmp$\WebApp\bin\x86\**" target="UmbracoFiles\bin\x86" />
<file src="$BuildTmp$\WebApp\config\splashes\**" target="UmbracoFiles\Config\splashes" />
<file src="$BuildTmp$\WebApp\config\BackOfficeTours\**" target="Content\Config\BackOfficeTours" />
<file src="$BuildTmp$\WebApp\umbraco\**" target="UmbracoFiles\umbraco" />
<file src="$BuildTmp$\WebApp\umbraco_client\**" target="UmbracoFiles\umbraco_client" />
<file src="$BuildTmp$\WebApp\Media\Web.config" target="Content\Media\Web.config" />
<file src="tools\install.ps1" target="tools\install.ps1" />
<file src="tools\Readme.txt" target="tools\Readme.txt" />
<file src="tools\ReadmeUpgrade.txt" target="tools\ReadmeUpgrade.txt" />
<file src="tools\Web.config.install.xdt" target="Content\Web.config.install.xdt" />
<file src="tools\applications.config.install.xdt" target="Content\config\applications.config.install.xdt" />
<file src="tools\ClientDependency.config.install.xdt" target="Content\config\ClientDependency.config.install.xdt" />
<file src="tools\Dashboard.config.install.xdt" target="Content\config\Dashboard.config.install.xdt" />
<file src="tools\trees.config.install.xdt" target="Content\config\trees.config.install.xdt" />
<file src="tools\umbracoSettings.config.install.xdt" target="Content\config\umbracoSettings.config.install.xdt" />
<file src="tools\Views.Web.config.install.xdt" target="Views\Web.config.install.xdt" />
<file src="tools\processing.config.install.xdt" target="Content\Config\imageprocessor\processing.config.install.xdt" />
<file src="tools\cache.config.install.xdt" target="Content\Config\imageprocessor\cache.config.install.xdt" />
<file src="build\**" target="build" />
</files>
</package>
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.4.4">
<id>UmbracoCms</id>
<version>8.0.0</version>
<title>Umbraco Cms</title>
<authors>Umbraco HQ</authors>
<owners>Umbraco HQ</owners>
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Installs Umbraco Cms in your Visual Studio ASP.NET project</description>
<summary>Installs Umbraco Cms in your Visual Studio ASP.NET project</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<dependency id="UmbracoCms.Core" version="[$version$]" />
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.3, 3.0.0)" />
</dependencies>
</metadata>
<files>
<file src="$BuildTmp$\Configs\**" target="Content\Config" exclude="$BuildTmp$\Configs\Web.config.transform" />
<file src="$BuildTmp$\WebApp\Views\**" target="Content\Views" exclude="$BuildTmp$\WebApp\Views\Web.config" />
<file src="$BuildTmp$\WebApp\default.aspx" target="Content\default.aspx" />
<file src="$BuildTmp$\WebApp\Global.asax" target="Content\Global.asax" />
<file src="$BuildTmp$\WebApp\Web.config" target="UmbracoFiles\Web.config" />
<file src="$BuildTmp$\WebApp\App_Browsers\**" target="UmbracoFiles\App_Browsers" />
<file src="$BuildTmp$\WebApp\config\splashes\**" target="UmbracoFiles\Config\splashes" />
<file src="$BuildTmp$\WebApp\config\BackOfficeTours\**" target="Content\Config\BackOfficeTours" />
<file src="$BuildTmp$\WebApp\umbraco\**" target="UmbracoFiles\umbraco" />
<file src="$BuildTmp$\WebApp\umbraco_client\**" target="UmbracoFiles\umbraco_client" />
<file src="$BuildTmp$\WebApp\Media\Web.config" target="Content\Media\Web.config" />
<file src="$BuildTmp$\WebApp\App_Plugins\ModelsBuilder\modelsbuilder.htm" target="Content\App_Plugins\ModelsBuilder\modelsbuilder.htm" />
<file src="$BuildTmp$\WebApp\App_Plugins\ModelsBuilder\modelsbuilder.controller.js" target="Content\App_Plugins\ModelsBuilder\modelsbuilder.controller.js" />
<file src="$BuildTmp$\WebApp\App_Plugins\ModelsBuilder\modelsbuilder.resource.js" target="Content\App_Plugins\ModelsBuilder\modelsbuilder.resource.js" />
<file src="$BuildTmp$\WebApp\App_Plugins\ModelsBuilder\package.manifest" target="Content\App_Plugins\ModelsBuilder\package.manifest" />
<file src="tools\install.ps1" target="tools\install.ps1" />
<file src="tools\Readme.txt" target="tools\Readme.txt" />
<file src="tools\ReadmeUpgrade.txt" target="tools\ReadmeUpgrade.txt" />
<file src="tools\Web.config.install.xdt" target="Content\Web.config.install.xdt" />
<file src="tools\applications.config.install.xdt" target="Content\config\applications.config.install.xdt" />
<file src="tools\ClientDependency.config.install.xdt" target="Content\config\ClientDependency.config.install.xdt" />
<file src="tools\Dashboard.config.install.xdt" target="Content\config\Dashboard.config.install.xdt" />
<file src="tools\trees.config.install.xdt" target="Content\config\trees.config.install.xdt" />
<file src="tools\umbracoSettings.config.install.xdt" target="Content\config\umbracoSettings.config.install.xdt" />
<file src="tools\Views.Web.config.install.xdt" target="Views\Web.config.install.xdt" />
<file src="build\**" target="build" />
</files>
</package>
+38 -249
View File
@@ -2,9 +2,8 @@
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections xdt:Transform="InsertIfMissing" />
<configSections>
<section name="BaseRestExtensions" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="FileSystemProviders" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="ExamineLuceneIndexSets" type="Examine.LuceneEngine.Config.IndexSets, Examine" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="SetAttributes(type,requirePermission)" />
<section name="ExamineLuceneIndexSets" type="Umbraco.Examine.Config.IndexSets, Umbraco.Examine" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="SetAttributes(type,requirePermission)" />
<sectionGroup name="applicationSettings" xdt:Locator="Match(name)">
<section name="umbraco.presentation.Properties.Settings" xdt:Locator="Match(name)" xdt:Transform="Remove" />
@@ -12,7 +11,6 @@
<sectionGroup name="system.web.webPages.razor" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<sectionGroup name="umbracoConfiguration" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing">
<section name="settings" type="Umbraco.Core.Configuration.UmbracoSettings.UmbracoSettingsSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
<section name="BaseRestExtensions" type="Umbraco.Core.Configuration.BaseRest.BaseRestSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
<section name="FileSystemProviders" type="Umbraco.Core.Configuration.FileSystemProvidersSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
<section name="dashBoard" type="Umbraco.Core.Configuration.Dashboard.DashboardSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
<section name="HealthChecks" type="Umbraco.Core.Configuration.HealthChecks.HealthChecksSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
@@ -29,14 +27,12 @@
<umbracoConfiguration xdt:Transform="InsertIfMissing">
<settings configSource="config\umbracoSettings.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<BaseRestExtensions configSource="config\BaseRestExtensions.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<FileSystemProviders configSource="config\FileSystemProviders.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<dashBoard configSource="config\Dashboard.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<HealthChecks configSource="config\HealthChecks.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
</umbracoConfiguration>
<FileSystemProviders xdt:Transform="Remove" />
<BaseRestExtensions xdt:Transform="Remove" />
<system.data xdt:Transform="InsertIfMissing">
<DbProviderFactories xdt:Transform="InsertIfMissing">
@@ -67,190 +63,6 @@
<profile defaultProvider="DefaultProfileProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>>
<sessionState customProvider="DefaultSessionProvider" xdt:Locator="Match(customProvider)" xdt:Transform="Remove"/>
<compilation xdt:Transform="InsertIfMissing" />
<compilation>
<assemblies xdt:Transform="InsertIfMissing" />
<assemblies>
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Collections, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Collections.Concurrent, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel.Annotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel.EventBasedAsync, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Contracts, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Debug, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Tools, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Dynamic.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Globalization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Expressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Queryable, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.NetworkInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.Requests, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ObjectModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit.ILGeneration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit.Lightweight, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Resources.ResourceManager, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.InteropServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.InteropServices.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Json, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Security.Principal, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Duplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.NetTcp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.Encoding.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.RegularExpressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading.Tasks.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.ReaderWriter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.XDocument, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.XmlSerializer, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
</assemblies>
</compilation>
<compilation>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Collections" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Collections.Concurrent" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel.Annotations" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel.EventBasedAsync" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Contracts" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Debug" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Tools" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Tracing" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Dynamic.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Globalization" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.IO" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Expressions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Queryable" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.NetworkInformation" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Requests" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ObjectModel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit.ILGeneration" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit.Lightweight" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Resources.ResourceManager" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.InteropServices" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.InteropServices.WindowsRuntime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Numerics" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Json" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Xml" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Security.Principal" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Duplex" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.NetTcp" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Security" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.Encoding" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.Encoding.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.RegularExpressions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading.Tasks" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading.Tasks.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.ReaderWriter" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.XDocument" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.XmlSerializer" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
</assemblies>
</compilation>
<compilation>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Collections" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Collections.Concurrent" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel.Annotations" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel.EventBasedAsync" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Contracts" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Debug" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Tools" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Tracing" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Dynamic.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Globalization" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.IO" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Expressions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Queryable" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.NetworkInformation" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Requests" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ObjectModel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit.ILGeneration" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit.Lightweight" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Resources.ResourceManager" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.InteropServices" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.InteropServices.WindowsRuntime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Numerics" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Json" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Xml" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Security.Principal" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Duplex" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.NetTcp" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Security" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.Encoding" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.Encoding.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.RegularExpressions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading.Tasks" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading.Tasks.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.ReaderWriter" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.XDocument" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.XmlSerializer" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
</assemblies>
</compilation>
<xhtmlConformance xdt:Transform="Remove" />
@@ -276,9 +88,6 @@
<remove name="umbracoRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<remove name="viewstateMoverModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<remove name="umbracoBaseRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<remove name="WebDAVModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<!-- Inserts it as the first element. Also see http://stackoverflow.com/a/19041487/5018 -->
<remove name="WebDAVModule" xdt:Locator="Match(name)" xdt:Transform="Insert" />
<add name="umbracoRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="viewstateMoverModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
@@ -341,62 +150,42 @@
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="HtmlAgilityPack" publicKeyToken="bd319b19eaf3b43a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.4.9.5" newVersion="1.4.9.5" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="AutoMapper" publicKeyToken="be96cd2c38ef1005" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.3.1.0" newVersion="3.3.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0"/>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845DCD8080CC91" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1"/>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.1.0" newVersion="1.2.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
@@ -416,4 +205,4 @@
</system.webServer>
</location>
</configuration>
</configuration>
+3 -13
View File
@@ -33,26 +33,16 @@ if ($project) {
robocopy $umbracoBinFolder $umbracoBinBackupPath /e /LOG:$copyLogsPath\UmbracoBinBackup.log
# Delete files Umbraco ships with
if(Test-Path $umbracoBinFolder\businesslogic.dll) { Remove-Item $umbracoBinFolder\businesslogic.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\cms.dll) { Remove-Item $umbracoBinFolder\cms.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\controls.dll) { Remove-Item $umbracoBinFolder\controls.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\interfaces.dll) { Remove-Item $umbracoBinFolder\interfaces.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\log4net.dll) { Remove-Item $umbracoBinFolder\log4net.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.ApplicationBlocks.Data.dll) { Remove-Item $umbracoBinFolder\Microsoft.ApplicationBlocks.Data.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\SQLCE4Umbraco.dll) { Remove-Item $umbracoBinFolder\SQLCE4Umbraco.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Data.SqlServerCe.dll) { Remove-Item $umbracoBinFolder\System.Data.SqlServerCe.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Data.SqlServerCe.Entity.dll) { Remove-Item $umbracoBinFolder\System.Data.SqlServerCe.Entity.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\TidyNet.dll) { Remove-Item $umbracoBinFolder\TidyNet.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\umbraco.dll) { Remove-Item $umbracoBinFolder\umbraco.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Web.dll) { Remove-Item $umbracoBinFolder\Umbraco.Web.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Core.dll) { Remove-Item $umbracoBinFolder\Umbraco.Core.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\umbraco.DataLayer.dll) { Remove-Item $umbracoBinFolder\umbraco.DataLayer.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\umbraco.editorControls.dll) { Remove-Item $umbracoBinFolder\umbraco.editorControls.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\umbraco.MacroEngines.dll) { Remove-Item $umbracoBinFolder\umbraco.MacroEngines.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.ModelsBuilder.dll) { Remove-Item $umbracoBinFolder\Umbraco.ModelsBuilder.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.ModelsBuilder.AspNet.dll) { Remove-Item $umbracoBinFolder\Umbraco.ModelsBuilder.AspNet.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\umbraco.providers.dll) { Remove-Item $umbracoBinFolder\umbraco.providers.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Web.UI.dll) { Remove-Item $umbracoBinFolder\Umbraco.Web.UI.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\UmbracoExamine.dll) { Remove-Item $umbracoBinFolder\UmbracoExamine.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Examine.dll) { Remove-Item $umbracoBinFolder\Umbraco.Examine.dll -Force -Confirm:$false }
# Delete files Umbraco depends upon
$amd64Folder = Join-Path $umbracoBinFolder "amd64"
@@ -102,4 +92,4 @@ if ($project) {
if(Test-Path $umbracoBinFolder\System.Web.WebPages.Deployment.dll) { Remove-Item $umbracoBinFolder\System.Web.WebPages.Deployment.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.WebPages.Razor.dll) { Remove-Item $umbracoBinFolder\System.Web.WebPages.Razor.dll -Force -Confirm:$false }
}
}
}
@@ -86,9 +86,6 @@
<add application="developer" alias="relationTypes" title="Relation Types" type="umbraco.loadRelationTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add initialize="true" sortOrder="5" alias="xslt" application="developer" iconClosed="icon-folder" iconOpen="icon-folder-open" type="Umbraco.Web.Trees.XsltTreeController, umbraco"
xdt:Locator="Match(application,alias)"
xdt:Transform="SetAttributes()" />
<add application="developer" alias="partialViewMacros" type="Umbraco.Web.Trees.PartialViewMacrosTree, umbraco"
xdt:Locator="Match(application,alias,type)"
+2 -2
View File
@@ -22,7 +22,7 @@ echo Removing bin files
del ..\src\Umbraco.Web.UI\bin\*.*
echo Building solution
%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe ..\src\umbraco.sln /t:Clean,Build
"%ProgramFiles(x86)%"\MSBuild\14.0\Bin\MSBuild.exe ..\src\umbraco.sln /t:Clean,Build
echo Resetting installedPackages.config
echo ^<?xml version="1.0" encoding="utf-8"?^>^<packages^>^</packages^> >..\src\Umbraco.Web.UI\App_Data\packages\installed\installedPackages.config
@@ -86,7 +86,7 @@ echo Removing bin files
FOR %%A IN (..\src\Umbraco.Web.UI\bin\*.*) DO DEL %%A
echo Building solution
%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe ..\src\umbraco.sln /t:Clean,Build
"%ProgramFiles(x86)%"\MSBuild\14.0\Bin\MSBuild.exe ..\src\umbraco.sln /t:Clean,Build
echo Resetting installedPackages.config
echo ^<?xml version="1.0" encoding="utf-8"?^>^<packages^>^</packages^> >..\src\Umbraco.Web.UI\App_Data\packages\installed\installedPackages.config
+92
View File
@@ -0,0 +1,92 @@
# this script should be dot-sourced into the build.ps1 scripts
# right after the parameters declaration
# ie
# . "$PSScriptRoot\build-bootstrap.ps1"
# THIS FILE IS DISTRIBUTED AS PART OF UMBRACO.BUILD
# DO NOT MODIFY IT - ALWAYS USED THE COMMON VERSION
# ################################################################
# BOOTSTRAP
# ################################################################
# reset errors
$error.Clear()
# ensure we have temp folder for downloads
$scriptRoot = "$PSScriptRoot"
$scriptTemp = "$scriptRoot\temp"
if (-not (test-path $scriptTemp)) { mkdir $scriptTemp > $null }
# get NuGet
$cache = 4
$nuget = "$scriptTemp\nuget.exe"
if (-not $local)
{
$source = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
if ((test-path $nuget) -and ((ls $nuget).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
{
Remove-Item $nuget -force -errorAction SilentlyContinue > $null
}
if (-not (test-path $nuget))
{
Write-Host "Download NuGet..."
Invoke-WebRequest $source -OutFile $nuget
if (-not $?) { throw "Failed to download NuGet." }
}
}
elseif (-not (test-path $nuget))
{
throw "Failed to locate NuGet.exe."
}
# NuGet notes
# As soon as we use -ConfigFile, NuGet uses that file, and only that file, and does not
# merge configuration from system level. See comments in NuGet.Client solution, class
# NuGet.Configuration.Settings, method LoadDefaultSettings.
# For NuGet to merge configurations, it needs to "find" the file in the current directory,
# or above. Which means we cannot really use -ConfigFile but instead have to have Umbraco's
# NuGet.config file at root, and always run NuGet.exe while at root or in a directory below
# root.
$solutionRoot = "$scriptRoot\.."
$testPwd = [System.IO.Path]::GetFullPath($pwd.Path) + "\"
$testRoot = [System.IO.Path]::GetFullPath($solutionRoot) + "\"
if (-not $testPwd.ToLower().StartsWith($testRoot.ToLower()))
{
throw "Cannot run outside of the solution's root."
}
# get the build system
if (-not $local)
{
$params = "-OutputDirectory", $scriptTemp, "-Verbosity", "quiet", "-PreRelease"
&$nuget install Umbraco.Build @params
if (-not $?) { throw "Failed to download Umbraco.Build." }
}
# ensure we have the build system
$ubuildPath = ls "$scriptTemp\Umbraco.Build.*" | sort -property CreationTime -descending | select -first 1
if (-not $ubuildPath)
{
throw "Failed to locate the build system."
}
# boot the build system
# this creates $global:ubuild
return &"$ubuildPath\ps\Boot.ps1"
# at that point the build.ps1 script must boot the build system
# eg
# $ubuild.Boot($ubuildPath.FullName, [System.IO.Path]::GetFullPath("$scriptRoot\.."),
# @{ Local = $local; With7Zip = $false; WithNode = $false },
# @{ continue = $continue })
# if (-not $?) { throw "Failed to boot the build system." }
#
# and it's good practice to report
# eg
# Write-Host "Umbraco.Whatever Build"
# Write-Host "Umbraco.Build v$($ubuild.BuildVersion)"
# eof
+460 -56
View File
@@ -1,67 +1,471 @@
param (
param (
# get, don't execute
[Parameter(Mandatory=$false)]
[string]
$version,
[Alias("g")]
[switch] $get = $false,
# run local, don't download, assume everything is ready
[Parameter(Mandatory=$false)]
[Alias("mo")]
[switch]
$moduleOnly = $false
)
[Alias("l")]
[Alias("loc")]
[switch] $local = $false,
# the script can run either from the solution root,
# or from the ./build directory - anything else fails
if ([System.IO.Path]::GetFileName($pwd) -eq "build")
{
$mpath = [System.IO.Path]::GetDirectoryName($pwd) + "\build\Modules\"
}
else
{
$mpath = "$pwd\build\Modules\"
}
# keep the build directories, don't clear them
[Parameter(Mandatory=$false)]
[Alias("c")]
[Alias("cont")]
[switch] $continue = $false
)
# look for the module and throw if not found
if (-not [System.IO.Directory]::Exists($mpath + "Umbraco.Build"))
{
Write-Error "Could not locate Umbraco build Powershell module."
break
}
# ################################################################
# BOOTSTRAP
# ################################################################
# add the module path (if not already there)
if (-not $env:PSModulePath.Contains($mpath))
{
$env:PSModulePath = "$mpath;$env:PSModulePath"
}
# create and boot the buildsystem
$ubuild = &"$PSScriptRoot\build-bootstrap.ps1"
if (-not $?) { return }
$ubuild.Boot($PSScriptRoot,
@{ Local = $local; },
@{ Continue = $continue })
if ($ubuild.OnError()) { return }
# force-import (or re-import) the module
Write-Host "Import Umbraco build Powershell module"
Import-Module Umbraco.Build -Force -DisableNameChecking
Write-Host "Umbraco Cms Build"
Write-Host "Umbraco.Build v$($ubuild.BuildVersion)"
# module only?
if ($moduleOnly)
{
if (-not [string]::IsNullOrWhiteSpace($version))
# ################################################################
# TASKS
# ################################################################
$ubuild.DefineMethod("SetMoreUmbracoVersion",
{
Write-Host "(module only: ignoring version parameter)"
}
else
param ( $semver )
$release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch
Write-Host "Update UmbracoVersion.cs"
$this.ReplaceFileText("$($this.SolutionRoot)\src\Umbraco.Core\Configuration\UmbracoVersion.cs", `
"(\d+)\.(\d+)\.(\d+)(.(\d+))?", `
"$release")
$this.ReplaceFileText("$($this.SolutionRoot)\src\Umbraco.Core\Configuration\UmbracoVersion.cs", `
"CurrentComment => `"(.+)`"", `
"CurrentComment => `"$($semver.PreRelease)`"")
Write-Host "Update IIS Express port in csproj"
$updater = New-Object "Umbraco.Build.ExpressPortUpdater"
$csproj = "$($this.SolutionRoot)\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj"
$updater.Update($csproj, $release)
})
$ubuild.DefineMethod("SandboxNode",
{
Write-Host "(module only)"
$global:node_path = $env:path
$nodePath = $this.BuildEnv.NodePath
$gitExe = (Get-Command git).Source
$gitPath = [System.IO.Path]::GetDirectoryName($gitExe)
$env:path = "$nodePath;$gitPath"
$global:node_nodepath = $this.ClearEnvVar("NODEPATH")
$global:node_npmcache = $this.ClearEnvVar("NPM_CONFIG_CACHE")
$global:node_npmprefix = $this.ClearEnvVar("NPM_CONFIG_PREFIX")
})
$ubuild.DefineMethod("RestoreNode",
{
$env:path = $node_path
$this.SetEnvVar("NODEPATH", $node_nodepath)
$this.SetEnvVar("NPM_CONFIG_CACHE", $node_npmcache)
$this.SetEnvVar("NPM_CONFIG_PREFIX", $node_npmprefix)
})
$ubuild.DefineMethod("CompileBelle",
{
$src = "$($this.SolutionRoot)\src"
$log = "$($this.BuildTemp)\belle.log"
Write-Host "Compile Belle"
Write-Host "Logging to $log"
# get a temp clean node env (will restore)
$this.SandboxNode()
# stupid PS is going to gather all "warnings" in $error
# so we have to take care of it else they'll bubble and kill the build
if ($error.Count -gt 0) { return }
Push-Location "$($this.SolutionRoot)\src\Umbraco.Web.UI.Client"
Write-Output "" > $log
Write-Output "### node version is:" > $log
&node -v >> $log 2>&1
if (-not $?) { throw "Failed to report node version." }
Write-Output "### npm version is:" >> $log 2>&1
&npm -v >> $log 2>&1
if (-not $?) { throw "Failed to report npm version." }
Write-Output "### clean npm cache" >> $log 2>&1
&npm cache clean --force >> $log 2>&1
$error.Clear() # that one can fail 'cos security bug - ignore
Write-Output "### npm install" >> $log 2>&1
&npm install >> $log 2>&1
Write-Output ">> $? $($error.Count)" >> $log 2>&1
Write-Output "### install bower" >> $log 2>&1
&npm install -g bower >> $log 2>&1
$error.Clear() # that one fails 'cos bower is deprecated - ignore
Write-Output "### install gulp" >> $log 2>&1
&npm install -g gulp >> $log 2>&1
$error.Clear() # that one fails 'cos deprecated stuff - ignore
Write-Output "### install gulp-cli" >> $log 2>&1
&npm install -g gulp-cli --quiet >> $log 2>&1
if (-not $?) { throw "Failed to install gulp-cli" } # that one is expected to work
Write-Output "### gulp build for version $($this.Version.Release)" >> $log 2>&1
&gulp build --buildversion=$this.Version.Release >> $log 2>&1
if (-not $?) { throw "Failed to build" } # that one is expected to work
Pop-Location
# fixme - should we filter the log to find errors?
#get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}}
# restore
$this.RestoreNode()
# setting node_modules folder to hidden
# used to prevent VS13 from crashing on it while loading the websites project
# also makes sure aspnet compiler does not try to handle rogue files and chokes
# in VSO with Microsoft.VisualC.CppCodeProvider -related errors
# use get-item -force 'cos it might be hidden already
Write-Host "Set hidden attribute on node_modules"
$dir = Get-Item -force "$src\Umbraco.Web.UI.Client\node_modules"
$dir.Attributes = $dir.Attributes -bor ([System.IO.FileAttributes]::Hidden)
})
$ubuild.DefineMethod("CompileUmbraco",
{
$buildConfiguration = "Release"
$src = "$($this.SolutionRoot)\src"
$log = "$($this.BuildTemp)\msbuild.umbraco.log"
if ($this.BuildEnv.VisualStudio -eq $null)
{
throw "Build environment does not provide VisualStudio."
}
Write-Host "Compile Umbraco"
Write-Host "Logging to $log"
# beware of the weird double \\ at the end of paths
# see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
&$this.BuildEnv.VisualStudio.MsBuild "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" `
/p:WarningLevel=0 `
/p:Configuration=$buildConfiguration `
/p:Platform=AnyCPU `
/p:UseWPP_CopyWebApplication=True `
/p:PipelineDependsOnBuild=False `
/p:OutDir="$($this.BuildTemp)\bin\\" `
/p:WebProjectOutputDir="$($this.BuildTemp)\WebApp\\" `
/p:Verbosity=minimal `
/t:Clean`;Rebuild `
/tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" `
/p:UmbracoBuild=True `
> $log
if (-not $?) { throw "Failed to compile Umbraco.Web.UI." }
# /p:UmbracoBuild tells the csproj that we are building from PS, not VS
})
$ubuild.DefineMethod("PrepareTests",
{
Write-Host "Prepare Tests"
# fixme - idea is to avoid rebuilding everything for tests
# but because of our weird assembly versioning (with .* stuff)
# everything gets rebuilt all the time...
#Copy-Files "$tmp\bin" "." "$tmp\tests"
# data
Write-Host "Copy data files"
if (-not (Test-Path -Path "$($this.BuildTemp)\tests\Packaging" ))
{
Write-Host "Create packaging directory"
mkdir "$($this.BuildTemp)\tests\Packaging" > $null
}
$this.CopyFiles("$($this.SolutionRoot)\src\Umbraco.Tests\Packaging\Packages", "*", "$($this.BuildTemp)\tests\Packaging\Packages")
# required for package install tests
if (-not (Test-Path -Path "$($this.BuildTemp)\tests\bin" ))
{
Write-Host "Create bin directory"
mkdir "$($this.BuildTemp)\tests\bin" > $null
}
})
$ubuild.DefineMethod("CompileTests",
{
$buildConfiguration = "Release"
$log = "$($this.BuildTemp)\msbuild.tests.log"
if ($this.BuildEnv.VisualStudio -eq $null)
{
throw "Build environment does not provide VisualStudio."
}
Write-Host "Compile Tests"
Write-Host "Logging to $log"
# beware of the weird double \\ at the end of paths
# see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
&$this.BuildEnv.VisualStudio.MsBuild "$($this.SolutionRoot)\src\Umbraco.Tests\Umbraco.Tests.csproj" `
/p:WarningLevel=0 `
/p:Configuration=$buildConfiguration `
/p:Platform=AnyCPU `
/p:UseWPP_CopyWebApplication=True `
/p:PipelineDependsOnBuild=False `
/p:OutDir="$($this.BuildTemp)\tests\\" `
/p:Verbosity=minimal `
/t:Build `
/tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" `
/p:UmbracoBuild=True `
> $log
if (-not $?) { throw "Failed to compile tests." }
# /p:UmbracoBuild tells the csproj that we are building from PS
})
$ubuild.DefineMethod("PreparePackages",
{
Write-Host "Prepare Packages"
$src = "$($this.SolutionRoot)\src"
$tmp = "$($this.BuildTemp)"
$out = "$($this.BuildOutput)"
$buildConfiguration = "Release"
# restore web.config
$this.TempRestoreFile("$src\Umbraco.Web.UI\web.config")
# cleanup build
Write-Host "Clean build"
$this.RemoveFile("$tmp\bin\*.dll.config")
$this.RemoveFile("$tmp\WebApp\bin\*.dll.config")
# cleanup presentation
Write-Host "Cleanup presentation"
$this.RemoveDirectory("$tmp\WebApp\umbraco.presentation")
# create directories
Write-Host "Create directories"
mkdir "$tmp\Configs" > $null
mkdir "$tmp\Configs\Lang" > $null
mkdir "$tmp\WebApp\App_Data" > $null
#mkdir "$tmp\WebApp\Media" > $null
#mkdir "$tmp\WebApp\Views" > $null
# copy various files
Write-Host "Copy xml documentation"
Copy-Item -force "$tmp\bin\*.xml" "$tmp\WebApp\bin"
Write-Host "Copy transformed configs and langs"
# note: exclude imageprocessor/*.config as imageprocessor pkg installs them
$this.CopyFiles("$tmp\WebApp\config", "*.config", "$tmp\Configs", `
{ -not $_.RelativeName.StartsWith("imageprocessor") })
$this.CopyFiles("$tmp\WebApp\config", "*.js", "$tmp\Configs")
$this.CopyFiles("$tmp\WebApp\config\lang", "*.xml", "$tmp\Configs\Lang")
$this.CopyFile("$tmp\WebApp\web.config", "$tmp\Configs\web.config.transform")
Write-Host "Copy transformed web.config"
$this.CopyFile("$src\Umbraco.Web.UI\web.$buildConfiguration.Config.transformed", "$tmp\WebApp\web.config")
# offset the modified timestamps on all umbraco dlls, as WebResources
# break if date is in the future, which, due to timezone offsets can happen.
Write-Host "Offset dlls timestamps"
Get-ChildItem -r "$tmp\*.dll" | ForEach-Object {
$_.CreationTime = $_.CreationTime.AddHours(-11)
$_.LastWriteTime = $_.LastWriteTime.AddHours(-11)
}
# copy libs
Write-Host "Copy SqlCE libraries"
$nugetPackages = [System.Environment]::ExpandEnvironmentVariables("%userprofile%\.nuget\packages")
$this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\bin\x86")
$this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\bin\amd64")
$this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\WebApp\bin\x86")
$this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\WebApp\bin\amd64")
# copy Belle
Write-Host "Copy Belle"
$this.CopyFiles("$src\Umbraco.Web.UI\umbraco\assets", "*", "$tmp\WebApp\umbraco\assets")
$this.CopyFiles("$src\Umbraco.Web.UI\umbraco\js", "*", "$tmp\WebApp\umbraco\js")
$this.CopyFiles("$src\Umbraco.Web.UI\umbraco\lib", "*", "$tmp\WebApp\umbraco\lib")
$this.CopyFiles("$src\Umbraco.Web.UI\umbraco\views", "*", "$tmp\WebApp\umbraco\views")
})
$ubuild.DefineMethod("PackageZip",
{
Write-Host "Create Zip packages"
$src = "$($this.SolutionRoot)\src"
$tmp = $this.BuildTemp
$out = $this.BuildOutput
Write-Host "Zip all binaries"
&$this.BuildEnv.Zip a -r "$out\UmbracoCms.AllBinaries.$($this.Version.Semver).zip" `
"$tmp\bin\*" `
"-x!dotless.Core.*" `
> $null
if (-not $?) { throw "Failed to zip UmbracoCms.AllBinaries." }
Write-Host "Zip cms"
&$this.BuildEnv.Zip a -r "$out\UmbracoCms.$($this.Version.Semver).zip" `
"$tmp\WebApp\*" `
"-x!dotless.Core.*" "-x!Content_Types.xml" "-x!*.pdb" `
> $null
if (-not $?) { throw "Failed to zip UmbracoCms." }
})
$ubuild.DefineMethod("PrepareBuild",
{
Write-Host "Clear folders and files"
$this.RemoveDirectory("$($this.SolutionRoot)\src\Umbraco.Web.UI.Client\bower_components")
$this.TempStoreFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config")
Write-Host "Create clean web.config"
$this.CopyFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.Template.config", "$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config")
Write-host "Set environment"
$env:UMBRACO_VERSION=$this.Version.Semver.ToString()
$env:UMBRACO_RELEASE=$this.Version.Release
$env:UMBRACO_COMMENT=$this.Version.Comment
$env:UMBRACO_BUILD=$this.Version.Build
if ($args -and $args[0] -eq "vso")
{
Write-host "Set VSO environment"
# set environment variable for VSO
# https://github.com/Microsoft/vsts-tasks/issues/375
# https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md
Write-Host ("##vso[task.setvariable variable=UMBRACO_VERSION;]$($this.Version.Semver.ToString())")
Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($this.Version.Release)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($this.Version.Comment)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($this.Version.Build)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($this.SolutionRoot)\build.tmp")
}
})
$ubuild.DefineMethod("PrepareNuGet",
{
Write-Host "Prepare NuGet"
# add Web.config transform files to the NuGet package
Write-Host "Add web.config transforms to NuGet package"
mv "$($this.BuildTemp)\WebApp\Views\Web.config" "$($this.BuildTemp)\WebApp\Views\Web.config.transform"
})
$ubuild.DefineMethod("RestoreNuGet",
{
Write-Host "Restore NuGet"
Write-Host "Logging to $($this.BuildTemp)\nuget.restore.log"
&$this.BuildEnv.NuGet restore "$($this.SolutionRoot)\src\Umbraco.sln" > "$($this.BuildTemp)\nuget.restore.log"
if (-not $?) { throw "Failed to restore NuGet packages." }
})
$ubuild.DefineMethod("PackageNuGet",
{
$nuspecs = "$($this.SolutionRoot)\build\NuSpecs"
Write-Host "Create NuGet packages"
&$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.Core.nuspec" `
-Properties BuildTmp="$($this.BuildTemp)" `
-Version "$($this.Version.Semver.ToString())" `
-Symbols -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmscore.log"
if (-not $?) { throw "Failed to pack NuGet UmbracoCms.Core." }
&$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.nuspec" `
-Properties BuildTmp="$($this.BuildTemp)" `
-Version $this.Version.Semver.ToString() `
-Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cms.log"
if (-not $?) { throw "Failed to pack NuGet UmbracoCms." }
# run hook
if ($this.HasMethod("PostPackageNuGet"))
{
Write-Host "Run PostPackageNuGet hook"
$this.PostPackageNuGet();
if (-not $?) { throw "Failed to run hook." }
}
})
$ubuild.DefineMethod("VerifyNuGet",
{
$this.VerifyNuGetConsistency(
("UmbracoCms", "UmbracoCms.Core"),
("Umbraco.Core", "Umbraco.Web", "Umbraco.Web.UI", "Umbraco.Examine"))
if ($this.OnError()) { return }
})
$ubuild.DefineMethod("PrepareAzureGallery",
{
Write-Host "Prepare Azure Gallery"
$this.CopyFile("$($this.SolutionRoot)\build\Azure\azuregalleryrelease.ps1", $this.BuildOutput)
})
$ubuild.DefineMethod("Build",
{
$error.Clear()
$this.PrepareBuild()
if ($this.OnError()) { return }
$this.RestoreNuGet()
if ($this.OnError()) { return }
$this.CompileBelle()
if ($this.OnError()) { return }
$this.CompileUmbraco()
if ($this.OnError()) { return }
$this.PrepareTests()
if ($this.OnError()) { return }
$this.CompileTests()
if ($this.OnError()) { return }
# not running tests
$this.PreparePackages()
if ($this.OnError()) { return }
$this.PackageZip()
if ($this.OnError()) { return }
$this.VerifyNuGet()
if ($this.OnError()) { return }
$this.PrepareNuGet()
if ($this.OnError()) { return }
$this.PackageNuGet()
if ($this.OnError()) { return }
$this.PrepareAzureGallery()
if ($this.OnError()) { return }
})
# ################################################################
# RUN
# ################################################################
# configure
$ubuild.ReleaseBranches = @( "master" )
# run
if (-not $get)
{
$ubuild.Build()
if ($ubuild.OnError()) { return }
}
break
}
# get build environment
Write-Host "Setup Umbraco build Environment"
$uenv = Get-UmbracoBuildEnv
# set the version if any
if (-not [string]::IsNullOrWhiteSpace($version))
{
Write-Host "Set Umbraco version to $version"
Set-UmbracoVersion $version
}
# full umbraco build
Write-Host "Build Umbraco"
Build-Umbraco
Write-Host "Done"
if ($get) { return $ubuild }
-18
View File
@@ -1,18 +0,0 @@
# Usage: powershell .\setversion.ps1 7.6.8
# Or: powershell .\setversion 7.6.8-beta001
param (
[Parameter(Mandatory=$true)]
[string]
$version
)
# report
Write-Host "Setting Umbraco version to $version"
# import Umbraco Build PowerShell module - $pwd is ./build
$env:PSModulePath = "$pwd\Modules\;$env:PSModulePath"
Import-Module Umbraco.Build -Force -DisableNameChecking
# run commands
$version = Set-UmbracoVersion -Version $version
-7
View File
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://www.nuget.org/api/v2/" />
<add key="umbracocore" value="https://www.myget.org/F/umbracocore/api/v3/index.json" />
</packageSources>
</configuration>
@@ -1,21 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("SqlCE4Umbraco")]
[assembly: AssemblyDescription("Umbraco specific Sql Ce Provider")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("Umbraco CMS")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("04436b0a-1dc6-4ee1-9d96-4c04f1a9f429")]
[assembly: InternalsVisibleTo("Umbraco.Tests")]
-101
View File
@@ -1,101 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{5BA5425F-27A7-4677-865E-82246498AA2E}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>SQLCE4Umbraco</RootNamespace>
<AssemblyName>SQLCE4Umbraco</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SccProjectName>
</SccProjectName>
<SccLocalPath>
</SccLocalPath>
<SccAuxPath>
</SccAuxPath>
<SccProvider>
</SccProvider>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\SQLCE4Umbraco.XML</DocumentationFile>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<HintPath>..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.dll</HintPath>
</Reference>
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<HintPath>..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\SolutionInfo.cs">
<Link>Properties\SolutionInfo.cs</Link>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SqlCeApplicationBlock.cs" />
<Compile Include="SqlCeContextGuardian.cs" />
<Compile Include="SqlCEDataReader.cs" />
<Compile Include="SqlCEHelper.cs" />
<Compile Include="SqlCEInstaller.cs" />
<Compile Include="SqlCEParameter.cs" />
<Compile Include="SqlCeProviderException.cs" />
<Compile Include="SqlCETableUtility.cs" />
<Compile Include="SqlCEUtility.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config">
<SubType>Designer</SubType>
</None>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\umbraco.datalayer\umbraco.datalayer.csproj">
<Project>{C7CB79F0-1C97-4B33-BFA7-00731B579AE2}</Project>
<Name>umbraco.datalayer</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -1,2 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp50</s:String></wpf:ResourceDictionary>
-44
View File
@@ -1,44 +0,0 @@
/************************************************************************************
*
* Umbraco Data Layer
* MIT Licensed work
* ©2008 Ruben Verborgh
*
***********************************************************************************/
using System.Data.SqlServerCe;
using umbraco.DataLayer;
namespace SqlCE4Umbraco
{
/// <summary>
/// Class that adapts a SqlDataReader.SqlDataReader to a RecordsReaderAdapter.
/// </summary>
public class SqlCeDataReaderHelper : RecordsReaderAdapter<SqlCeDataReader>
{
#region Public Constructors
/// <summary>
/// Initializes a new instance of the <see cref="SqlServerDataReader"/> class.
/// </summary>
/// <param name="dataReader">The data reader.</param>
public SqlCeDataReaderHelper(System.Data.SqlServerCe.SqlCeDataReader dataReader) : base(dataReader) { }
#endregion
#region RecordsReaderAdapter Members
/// <summary>
/// Gets a value indicating whether this instance has records.
/// </summary>
/// <value>
/// <c>true</c> if this instance has records; otherwise, <c>false</c>.
/// </value>
public override bool HasRecords
{
get { return DataReader.HasRows; }
}
#endregion
}
}
-253
View File
@@ -1,253 +0,0 @@
/************************************************************************************
*
* Umbraco Data Layer
* MIT Licensed work
* ©2008 Ruben Verborgh
*
***********************************************************************************/
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlServerCe;
using System.Linq;
using System.Xml;
using System.Diagnostics;
using umbraco.DataLayer;
using umbraco.DataLayer.SqlHelpers.SqlServer;
namespace SqlCE4Umbraco
{
/// <summary>
/// Sql Helper for an SQL Server database.
/// </summary>
public class SqlCEHelper : SqlHelper<SqlCeParameter>
{
/// <summary>
/// Initializes a new instance of the <see cref="SqlCEHelper"/> class.
/// </summary>
/// <param name="connectionString">The connection string.</param>
public SqlCEHelper(string connectionString) : base(connectionString)
{
m_Utility = new SqlCEUtility(this);
}
/// <summary>
/// Checks if the actual database exists, if it doesn't then it will create it
/// </summary>
internal void CreateEmptyDatabase()
{
var localConnection = new SqlCeConnection(ConnectionString);
if (!System.IO.File.Exists(ReplaceDataDirectory(localConnection.Database)))
{
using (var sqlCeEngine = new SqlCeEngine(ConnectionString))
{
sqlCeEngine.CreateDatabase();
}
}
}
/// <summary>
/// Most likely only will be used for unit tests but will remove all tables from the database
/// </summary>
internal void ClearDatabase()
{
// drop constraints before tables to avoid exceptions
// looping on try/catching exceptions was not really nice
// http://stackoverflow.com/questions/536350/drop-all-the-tables-stored-procedures-triggers-constriants-and-all-the-depend
var localConnection = new SqlCeConnection(ConnectionString);
if (System.IO.File.Exists(ReplaceDataDirectory(localConnection.Database)))
{
List<string> tables;
// drop foreign keys
// SQL may need "where constraint_catalog=DB_NAME() and ..."
tables = new List<string>();
using (var reader = ExecuteReader("select table_name from information_schema.table_constraints where constraint_type = 'FOREIGN KEY' order by table_name"))
{
while (reader.Read()) tables.Add(reader.GetString("table_name").Trim());
}
foreach (var table in tables)
{
var constraints = new List<string>();
using (var reader = ExecuteReader("select constraint_name from information_schema.table_constraints where constraint_type = 'FOREIGN KEY' and table_name = '" + table + "' order by constraint_name"))
{
while (reader.Read()) constraints.Add(reader.GetString("constraint_name").Trim());
}
foreach (var constraint in constraints)
{
// SQL may need "[dbo].[table]"
ExecuteNonQuery("alter table [" + table + "] drop constraint [" + constraint + "]");
}
}
// drop primary keys
// SQL may need "where constraint_catalog=DB_NAME() and ..."
tables = new List<string>();
using (var reader = ExecuteReader("select table_name from information_schema.table_constraints where constraint_type = 'PRIMARY KEY' order by table_name"))
{
while (reader.Read()) tables.Add(reader.GetString("table_name").Trim());
}
foreach (var table in tables)
{
var constraints = new List<string>();
using (var reader = ExecuteReader("select constraint_name from information_schema.table_constraints where constraint_type = 'PRIMARY KEY' and table_name = '" + table + "' order by constraint_name"))
{
while (reader.Read()) constraints.Add(reader.GetString("constraint_name").Trim());
}
foreach (var constraint in constraints)
{
// SQL may need "[dbo].[table]"
ExecuteNonQuery("alter table [" + table + "] drop constraint [" + constraint + "]");
}
}
// drop tables
tables = new List<string>();
using (var reader = ExecuteReader("select table_name from information_schema.tables where table_type <> 'VIEW' order by table_name"))
{
while (reader.Read()) tables.Add(reader.GetString("table_name").Trim());
}
foreach (var table in tables)
{
ExecuteNonQuery("drop table [" + table + "]");
}
}
}
/// <summary>
/// Drops all foreign keys on a table.
/// </summary>
/// <param name="table">The name of the table.</param>
/// <remarks>To be used in unit tests.</remarks>
internal void DropForeignKeys(string table)
{
var constraints = new List<string>();
using (var reader = ExecuteReader("select constraint_name from information_schema.table_constraints where constraint_type = 'FOREIGN KEY' and table_name = '" + table + "' order by constraint_name"))
{
while (reader.Read()) constraints.Add(reader.GetString("constraint_name").Trim());
}
foreach (var constraint in constraints)
{
// SQL may need "[dbo].[table]"
ExecuteNonQuery("alter table [" + table + "] drop constraint [" + constraint + "]");
}
}
/// <summary>
/// Replaces the data directory with a local path.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>A local path with the resolved 'DataDirectory' mapping.</returns>
private string ReplaceDataDirectory(string path)
{
if (!string.IsNullOrWhiteSpace(path) && path.Contains("|DataDirectory|"))
{
var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory") as string;
if (!string.IsNullOrEmpty(dataDirectory))
{
path = path.Contains(@"|\")
? path.Replace("|DataDirectory|", dataDirectory)
: path.Replace("|DataDirectory|", dataDirectory + System.IO.Path.DirectorySeparatorChar);
}
}
return path;
}
/// <summary>
/// Creates a new parameter for use with this specific implementation of ISqlHelper.
/// </summary>
/// <param name="parameterName">Name of the parameter.</param>
/// <param name="value">Value of the parameter.</param>
/// <returns>A new parameter of the correct type.</returns>
/// <remarks>Abstract factory pattern</remarks>
public override IParameter CreateParameter(string parameterName, object value)
{
return new SqlCEParameter(parameterName, value);
}
/// <summary>
/// Executes a command that returns a single value.
/// </summary>
/// <param name="commandText">The command text.</param>
/// <param name="parameters">The parameters.</param>
/// <returns>The return value of the command.</returns>
protected override object ExecuteScalar(string commandText, SqlCeParameter[] parameters)
{
#if DEBUG && DebugDataLayer
// Log Query Execution
Trace.TraceInformation(GetType().Name + " SQL ExecuteScalar: " + commandText);
#endif
using (var cc = UseCurrentConnection)
{
return SqlCeApplicationBlock.ExecuteScalar(
(SqlCeConnection) cc.Connection, (SqlCeTransaction) cc.Transaction,
CommandType.Text, commandText, parameters);
}
}
/// <summary>
/// Executes a command and returns the number of rows affected.
/// </summary>
/// <param name="commandText">The command text.</param>
/// <param name="parameters">The parameters.</param>
/// <returns>
/// The number of rows affected by the command.
/// </returns>
protected override int ExecuteNonQuery(string commandText, SqlCeParameter[] parameters)
{
#if DEBUG && DebugDataLayer
// Log Query Execution
Trace.TraceInformation(GetType().Name + " SQL ExecuteNonQuery: " + commandText);
#endif
using (var cc = UseCurrentConnection)
{
return SqlCeApplicationBlock.ExecuteNonQuery(
(SqlCeConnection) cc.Connection, (SqlCeTransaction) cc.Transaction,
CommandType.Text, commandText, parameters);
}
}
/// <summary>
/// Executes a command and returns a records reader containing the results.
/// </summary>
/// <param name="commandText">The command text.</param>
/// <param name="parameters">The parameters.</param>
/// <returns>
/// A data reader containing the results of the command.
/// </returns>
protected override IRecordsReader ExecuteReader(string commandText, SqlCeParameter[] parameters)
{
#if DEBUG && DebugDataLayer
// Log Query Execution
Trace.TraceInformation(GetType().Name + " SQL ExecuteReader: " + commandText);
#endif
using (var cc = UseCurrentConnection)
{
return new SqlCeDataReaderHelper(SqlCeApplicationBlock.ExecuteReader(
(SqlCeConnection) cc.Connection, (SqlCeTransaction) cc.Transaction,
CommandType.Text, commandText, parameters));
}
}
internal IRecordsReader ExecuteReader(string commandText)
{
return ExecuteReader(commandText, new SqlCEParameter(string.Empty, string.Empty));
}
internal int ExecuteNonQuery(string commandText)
{
return ExecuteNonQuery(commandText, new SqlCEParameter(string.Empty, string.Empty));
}
}
}
-141
View File
@@ -1,141 +0,0 @@
/************************************************************************************
*
* Umbraco Data Layer
* MIT Licensed work
* ©2008 Ruben Verborgh
*
***********************************************************************************/
using System;
using System.Resources;
using SQLCE4Umbraco;
using umbraco.DataLayer.Utility.Installer;
using System.Diagnostics;
namespace SqlCE4Umbraco
{
/// <summary>
/// Database installer for an SQL Server data source.
/// </summary>
[Obsolete("The legacy installers are no longer used and will be removed from the codebase in the future")]
public class SqlCEInstaller : DefaultInstallerUtility<SqlCEHelper>
{
#region Private Constants
/// <summary>The latest database version this installer supports.</summary>
private const DatabaseVersion LatestVersionSupported = DatabaseVersion.Version4_8;
/// <summary>The specifications to determine the database version.</summary>
private static readonly VersionSpecs[] m_VersionSpecs = new VersionSpecs[] {
new VersionSpecs("SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS LEFT OUTER JOIN umbracoApp ON appAlias = appAlias WHERE CONSTRAINT_NAME = 'FK_umbracoUser2app_umbracoApp'", 0, DatabaseVersion.Version4_8),
new VersionSpecs("SELECT id FROM umbracoNode WHERE id = -21", 1, DatabaseVersion.Version4_1),
new VersionSpecs("SELECT action FROM umbracoAppTree",DatabaseVersion.Version4),
new VersionSpecs("SELECT description FROM cmsContentType",DatabaseVersion.Version3),
new VersionSpecs("SELECT id FROM sysobjects",DatabaseVersion.None) };
#endregion
#region Public Properties
/// <summary>
/// This ensures that the database exists, then runs the base method
/// </summary>
public override bool CanConnect
{
get
{
using (var sqlHelper = SqlHelper)
sqlHelper.CreateEmptyDatabase();
return base.CanConnect;
}
}
/// <summary>
/// Gets a value indicating whether the installer can upgrade the data source.
/// </summary>
/// <value>
/// <c>true</c> if the installer can upgrade the data source; otherwise, <c>false</c>.
/// </value>
/// <remarks>Empty data sources can't be upgraded, just installed.</remarks>
public override bool CanUpgrade
{
get
{
return CurrentVersion == DatabaseVersion.Version4_1;
}
}
#endregion
#region Protected Properties
/// <summary>
/// Gets the version specification for evaluation by DetermineCurrentVersion.
/// Only first matching specification is taken into account.
/// </summary>
/// <value>The version specifications.</value>
protected override VersionSpecs[] VersionSpecs
{
get { return m_VersionSpecs; }
}
#endregion
#region Public Constructors
/// <summary>
/// Initializes a new instance of the <see cref="SqlCEInstaller"/> class.
/// </summary>
/// <param name="sqlHelper">The SQL helper.</param>
public SqlCEInstaller(SqlCEHelper sqlHelper) : base(sqlHelper, LatestVersionSupported)
{ }
#endregion
#region DefaultInstaller Members
/// <summary>
/// Returns the sql to do a full install
/// </summary>
protected override string FullInstallSql
{
get { return string.Empty; }
}
/// <summary>
/// Returns the sql to do an upgrade
/// </summary>
protected override string UpgradeSql
{
get { return string.Empty; }
}
// We need to override this as the default way of detection a db connection checks for systables that doesn't exist
// in a CE db
protected override DatabaseVersion DetermineCurrentVersion()
{
DatabaseVersion version = base.DetermineCurrentVersion();
if (version != DatabaseVersion.Unavailable)
{
return version;
}
// verify connection
try
{
using (var sqlHelper = SqlHelper)
if (SqlCeApplicationBlock.VerifyConnection(sqlHelper.ConnectionString))
return DatabaseVersion.None;
}
catch (Exception e)
{
Trace.WriteLine(e.ToString());
}
return DatabaseVersion.Unavailable;
}
#endregion
}
}
-34
View File
@@ -1,34 +0,0 @@
/************************************************************************************
*
* Umbraco Data Layer
* MIT Licensed work
* ©2008 Ruben Verborgh
*
***********************************************************************************/
using System;
using System.Data.SqlServerCe;
using System.Data.SqlTypes;
using umbraco.DataLayer;
namespace SqlCE4Umbraco
{
/// <summary>
/// Parameter class for the SqlCEHelper.
/// </summary>
public class SqlCEParameter : SqlParameterAdapter<SqlCeParameter>
{
#region Public Constructors
/// <summary>
/// Initializes a new instance of the <see cref="SqlCEParameter"/> class.
/// </summary>
/// <param name="parameterName">Name of the parameter.</param>
/// <param name="value">Value of the parameter.</param>
public SqlCEParameter(string parameterName, object value)
: base(new SqlCeParameter(parameterName, value))
{ }
#endregion
}
}
-250
View File
@@ -1,250 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using umbraco.DataLayer.Utility.Table;
using umbraco.DataLayer;
using umbraco;
namespace SqlCE4Umbraco
{
/// <summary>
/// SQL Server implementation of <see cref="DefaultTableUtility&lt;S&gt;"/>.
/// </summary>
[Obsolete("The legacy installers are no longer used and will be removed from the codebase in the future")]
public class SqlCETableUtility : DefaultTableUtility<SqlCEHelper>
{
/// <summary>
/// Initializes a new instance of the <see cref="SqlCETableUtility"/> class.
/// </summary>
/// <param name="sqlHelper">The SQL helper.</param>
public SqlCETableUtility(SqlCEHelper sqlHelper)
: base(sqlHelper)
{ }
#region DefaultTableUtility<SqlCEHelper> members
/// <summary>
/// Gets the table with the specified name.
/// </summary>
/// <param name="name">The name.</param>
/// <returns>The table, or <c>null</c> if no table with that name exists.</returns>
public override ITable GetTable(string name)
{
if (name == null)
throw new ArgumentNullException("name");
ITable table = null;
// get name in correct casing
using (var sqlHelper = SqlHelper)
name = sqlHelper.ExecuteScalar<string>("SELECT name FROM sys.tables WHERE name=@name",
sqlHelper.CreateParameter("name", name));
if (name != null)
{
table = new DefaultTable(name);
using (var sqlHelper = SqlHelper)
using (IRecordsReader reader = sqlHelper.ExecuteReader(
@"SELECT c.name AS Name, st.name AS DataType, c.max_length, c.is_nullable, c.is_identity
FROM sys.tables AS t
JOIN sys.columns AS c ON t.object_id = c.object_id
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
JOIN sys.types AS ty ON ty.user_type_id = c.user_type_id
JOIN sys.types st ON ty.system_type_id = st.user_type_id
WHERE t.name = @name
ORDER BY c.column_id", sqlHelper.CreateParameter("name", name)))
{
while (reader.Read())
{
table.AddField(table.CreateField(reader.GetString("Name"), GetType(reader)));
}
}
}
return table;
}
/// <summary>
/// Saves or updates the table.
/// </summary>
/// <param name="table">The table to be saved.</param>
public override void SaveTable(ITable table)
{
if (table == null)
throw new ArgumentNullException("table");
ITable oldTable = GetTable(table.Name);
// create the table if it didn't exist, update fields otherwise
if (oldTable == null)
{
CreateTable(table);
}
else
{
foreach (IField field in table)
{
// create the field if it did't exist in the old table
if (oldTable.FindField(field.Name)==null)
{
CreateColumn(table, field);
}
}
}
}
#endregion
#region Protected Helper Methods
/// <summary>
/// Creates the table in the data source.
/// </summary>
/// <param name="table">The table.</param>
protected virtual void CreateTable(ITable table)
{
Debug.Assert(table != null);
// create enumerator and check for first field
IEnumerator<IField> fieldEnumerator = table.GetEnumerator();
bool hasNext = fieldEnumerator.MoveNext();
if(!hasNext)
throw new ArgumentException("The table must contain at least one field.");
// create query
StringBuilder createTableQuery = new StringBuilder();
using (var sqlHelper = SqlHelper)
createTableQuery.AppendFormat("CREATE TABLE [{0}] (", sqlHelper.EscapeString(table.Name));
// add fields
while (hasNext)
{
// add field name and type
IField field = fieldEnumerator.Current;
createTableQuery.Append('[').Append(field.Name).Append(']');
createTableQuery.Append(' ').Append(GetDatabaseType(field));
// append comma if a following field exists
hasNext = fieldEnumerator.MoveNext();
if (hasNext)
{
createTableQuery.Append(',');
}
}
// close CREATE TABLE x (...) bracket
createTableQuery.Append(')');
// execute query
try
{
using (var sqlHelper = SqlHelper)
sqlHelper.ExecuteNonQuery(createTableQuery.ToString());
}
catch (Exception executeException)
{
throw new UmbracoException(String.Format("Could not create table '{0}'.", table), executeException);
}
}
/// <summary>
/// Creates a new column in the table.
/// </summary>
/// <param name="table">The table.</param>
/// <param name="field">The field used to create the column.</param>
protected virtual void CreateColumn(ITable table, IField field)
{
Debug.Assert(table != null && field != null);
StringBuilder addColumnQuery = new StringBuilder();
using (var sqlHelper = SqlHelper)
addColumnQuery.AppendFormat("ALTER TABLE [{0}] ADD [{1}] {2}",
sqlHelper.EscapeString(table.Name),
sqlHelper.EscapeString(field.Name),
sqlHelper.EscapeString(GetDatabaseType(field)));
try
{
using (var sqlHelper = SqlHelper)
sqlHelper.ExecuteNonQuery(addColumnQuery.ToString());
}
catch (Exception executeException)
{
throw new UmbracoException(String.Format("Could not create column '{0}' in table '{1}'.",
field, table.Name), executeException);
}
}
/// <summary>
/// Gets the .Net type corresponding to the specified database data type.
/// </summary>
/// <param name="dataTypeReader">The data type reader.</param>
/// <returns>The .Net type</returns>
protected virtual Type GetType(IRecordsReader dataTypeReader)
{
string typeName = dataTypeReader.GetString("DataType");
switch (typeName)
{
case "bit": return typeof(bool);
case "tinyint": return typeof(byte);
case "datetime": return typeof(DateTime);
// TODO: return different decimal type according to field precision
case "decimal": return typeof(decimal);
case "uniqueidentifier": return typeof(Guid);
case "smallint": return typeof(Int16);
case "int": return typeof(Int32);
case "bigint": return typeof(Int64);
case "nvarchar": return typeof(string);
default:
throw new ArgumentException(String.Format("Cannot convert database type '{0}' to a .Net type.",
typeName));
}
}
/// <summary>
/// Gets the database type corresponding to the field, complete with field properties.
/// </summary>
/// <param name="field">The field.</param>
/// <returns>The database type.</returns>
protected virtual string GetDatabaseType(IField field)
{
StringBuilder fieldBuilder = new StringBuilder();
fieldBuilder.Append(GetDatabaseTypeName(field));
fieldBuilder.Append(field.HasProperty(FieldProperties.Identity) ? " IDENTITY(1,1)" : String.Empty);
fieldBuilder.Append(field.HasProperty(FieldProperties.NotNull) ? " NOT NULL" : " NULL");
return fieldBuilder.ToString();
}
/// <summary>
/// Gets the name of the database type, without field properties.
/// </summary>
/// <param name="field">The field.</param>
/// <returns></returns>
protected virtual string GetDatabaseTypeName(IField field)
{
switch (field.DataType.FullName)
{
case "System.Boolean": return "bit";
case "System.Byte": return "tinyint";
case "System.DateTime": return "datetime";
case "System.Decimal": return "decimal(28)";
case "System.Double": return "decimal(15)";
case "System.Single": return "decimal(7)";
case "System.Guid": return "uniqueidentifier";
case "System.Int16": return "smallint";
case "System.Int32": return "int";
case "System.Int64": return "bigint";;
case "System.String":
string type = "nvarchar";
return field.Size == 0 ? type : String.Format("{0}({1})", type, field.Size);
default:
throw new ArgumentException(String.Format("Cannot convert '{0}' to a database type.", field));
}
}
#endregion
}
}
-56
View File
@@ -1,56 +0,0 @@
/************************************************************************************
*
* Umbraco Data Layer
* MIT Licensed work
* ©2008 Ruben Verborgh
*
***********************************************************************************/
using System;
using umbraco.DataLayer.SqlHelpers.SqlServer;
using umbraco.DataLayer.Utility;
using umbraco.DataLayer.Utility.Installer;
using umbraco.DataLayer.Utility.Table;
namespace SqlCE4Umbraco
{
/// <summary>
/// Utility for an SQL Server data source.
/// </summary>
[Obsolete("The legacy installers are no longer used and will be removed from the codebase in the future")]
public class SqlCEUtility : DefaultUtility<SqlCEHelper>
{
#region Public Constructors
/// <summary>
/// Initializes a new instance of the <see cref="SqlServerUtility"/> class.
/// </summary>
/// <param name="sqlHelper">The SQL helper.</param>
public SqlCEUtility(SqlCEHelper sqlHelper) : base(sqlHelper)
{ }
#endregion
#region DefaultUtility Members
/// <summary>
/// Creates an installer.
/// </summary>
/// <returns>The SQL Server installer.</returns>
public override IInstallerUtility CreateInstaller()
{
return new SqlCEInstaller(SqlHelper);
}
/// <summary>
/// Creates a table utility.
/// </summary>
/// <returns>The table utility</returns>
public override ITableUtility CreateTableUtility()
{
return new SqlCETableUtility(SqlHelper);
}
#endregion
}
}
-270
View File
@@ -1,270 +0,0 @@
using System;
using System.Collections.Generic;
using System.Data.SqlServerCe;
using System.Data;
using System.Diagnostics;
using SQLCE4Umbraco;
namespace SqlCE4Umbraco
{
public class SqlCeApplicationBlock
{
/// <summary>
///
/// </summary>
/// <param name="connectionString"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="commandParameters"></param>
/// <returns></returns>
public static object ExecuteScalar(
string connectionString,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters
)
{
try
{
using (var conn = SqlCeContextGuardian.Open(connectionString))
{
return ExecuteScalarTry(conn, null, commandText, commandParameters);
}
}
catch (Exception ee)
{
throw new SqlCeProviderException("Error running Scalar: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee);
}
}
public static object ExecuteScalar(
SqlCeConnection conn, SqlCeTransaction trx,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters)
{
try
{
return ExecuteScalarTry(conn, trx, commandText, commandParameters);
}
catch (Exception ee)
{
throw new SqlCeProviderException("Error running Scalar: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee);
}
}
public static object ExecuteScalar(
SqlCeConnection conn,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters)
{
return ExecuteScalar(conn, null, commandType, commandText, commandParameters);
}
private static object ExecuteScalarTry(
SqlCeConnection conn, SqlCeTransaction trx,
string commandText,
params SqlCeParameter[] commandParameters)
{
object retVal;
using (var cmd = trx == null ? new SqlCeCommand(commandText, conn) : new SqlCeCommand(commandText, conn, trx))
{
AttachParameters(cmd, commandParameters);
Debug.WriteLine("---------------------------------SCALAR-------------------------------------");
Debug.WriteLine(commandText);
Debug.WriteLine("----------------------------------------------------------------------------");
retVal = cmd.ExecuteScalar();
}
return retVal;
}
/// <summary>
///
/// </summary>
/// <param name="connectionString"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="commandParameters"></param>
public static int ExecuteNonQuery(
string connectionString,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters
)
{
try
{
using (var conn = SqlCeContextGuardian.Open(connectionString))
{
return ExecuteNonQueryTry(conn, null, commandText, commandParameters);
}
}
catch (Exception ee)
{
throw new SqlCeProviderException("Error running NonQuery: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee.ToString());
}
}
public static int ExecuteNonQuery(
SqlCeConnection conn,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters
)
{
return ExecuteNonQuery(conn, null, commandType, commandText, commandParameters);
}
public static int ExecuteNonQuery(
SqlCeConnection conn, SqlCeTransaction trx,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters
)
{
try
{
return ExecuteNonQueryTry(conn, trx, commandText, commandParameters);
}
catch (Exception ee)
{
throw new SqlCeProviderException("Error running NonQuery: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee.ToString());
}
}
private static int ExecuteNonQueryTry(
SqlCeConnection conn, SqlCeTransaction trx,
string commandText,
params SqlCeParameter[] commandParameters)
{
// this is for multiple queries in the installer
if (commandText.Trim().StartsWith("!!!"))
{
commandText = commandText.Trim().Trim('!');
var commands = commandText.Split('|');
var currentCmd = string.Empty;
foreach (var command in commands)
{
try
{
currentCmd = command;
if (string.IsNullOrWhiteSpace(command)) continue;
var c = trx == null ? new SqlCeCommand(command, conn) : new SqlCeCommand(command, conn, trx);
c.ExecuteNonQuery();
}
catch (Exception e)
{
Debug.WriteLine("*******************************************************************");
Debug.WriteLine(currentCmd);
Debug.WriteLine(e);
Debug.WriteLine("*******************************************************************");
}
}
return 1;
}
Debug.WriteLine("----------------------------------------------------------------------------");
Debug.WriteLine(commandText);
Debug.WriteLine("----------------------------------------------------------------------------");
var cmd = new SqlCeCommand(commandText, conn);
AttachParameters(cmd, commandParameters);
var rowsAffected = cmd.ExecuteNonQuery();
return rowsAffected;
}
/// <summary>
///
/// </summary>
/// <param name="connectionString"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="commandParameters"></param>
/// <returns></returns>
public static SqlCeDataReader ExecuteReader(
string connectionString,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters
)
{
try
{
var conn = SqlCeContextGuardian.Open(connectionString);
return ExecuteReaderTry(conn, null, commandText, commandParameters);
}
catch (Exception ee)
{
throw new SqlCeProviderException("Error running Reader: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee.ToString());
}
}
public static SqlCeDataReader ExecuteReader(
SqlCeConnection conn,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters
)
{
return ExecuteReader(conn, commandType, commandText, commandParameters);
}
public static SqlCeDataReader ExecuteReader(
SqlCeConnection conn, SqlCeTransaction trx,
CommandType commandType,
string commandText,
params SqlCeParameter[] commandParameters
)
{
try
{
return ExecuteReaderTry(conn, trx, commandText, commandParameters);
}
catch (Exception ee)
{
throw new SqlCeProviderException("Error running Reader: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee.ToString());
}
}
private static SqlCeDataReader ExecuteReaderTry(
SqlCeConnection conn, SqlCeTransaction trx,
string commandText,
params SqlCeParameter[] commandParameters)
{
Debug.WriteLine("---------------------------------READER-------------------------------------");
Debug.WriteLine(commandText);
Debug.WriteLine("----------------------------------------------------------------------------");
try
{
var cmd = trx == null ? new SqlCeCommand(commandText, conn) : new SqlCeCommand(commandText, conn, trx);
AttachParameters(cmd, commandParameters);
return cmd.ExecuteReader();
}
catch
{
conn.Close();
throw;
}
}
public static bool VerifyConnection(string connectionString)
{
using (var conn = SqlCeContextGuardian.Open(connectionString))
{
return conn.State == ConnectionState.Open;
}
}
private static void AttachParameters(SqlCeCommand command, IEnumerable<SqlCeParameter> commandParameters)
{
foreach (var parameter in commandParameters)
{
if ((parameter.Direction == ParameterDirection.InputOutput) && (parameter.Value == null))
parameter.Value = DBNull.Value;
command.Parameters.Add(parameter);
}
}
}
}
-64
View File
@@ -1,64 +0,0 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlServerCe;
using System.Linq;
using System.Text;
namespace SQLCE4Umbraco
{
public static class SqlCeContextGuardian
{
private static SqlCeConnection _constantOpenConnection;
private static readonly object Lock = new object();
// Awesome SQL CE 4 speed improvement by Erik Ejskov Jensen - SQL CE 4 MVP
// It's not an issue with SQL CE 4 that we never close the connection
public static SqlCeConnection Open(string connectionString)
{
var connectionStringBuilder = new DbConnectionStringBuilder();
try
{
connectionStringBuilder.ConnectionString = connectionString;
}
catch (Exception ex)
{
throw new ArgumentException("Bad connection string.", "connectionString", ex);
}
connectionStringBuilder.Remove("datalayer");
// SQL CE 4 performs better when there's always a connection open in the background
EnsureOpenBackgroundConnection(connectionStringBuilder.ConnectionString);
SqlCeConnection conn = new SqlCeConnection(connectionStringBuilder.ConnectionString);
conn.Open();
return conn;
}
/// <summary>
/// Sometimes we need to ensure this is closed especially in unit tests
/// </summary>
internal static void CloseBackgroundConnection()
{
if (_constantOpenConnection != null)
_constantOpenConnection.Close();
}
private static void EnsureOpenBackgroundConnection(string connectionString)
{
lock (Lock)
{
if (_constantOpenConnection == null)
{
_constantOpenConnection = new SqlCeConnection(connectionString);
_constantOpenConnection.Open();
}
else if (_constantOpenConnection.State != ConnectionState.Open)
_constantOpenConnection.Open();
}
}
}
}
@@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SqlCE4Umbraco
{
public class SqlCeProviderException : Exception
{
public SqlCeProviderException() : base()
{
}
public SqlCeProviderException(string message) : base(message)
{
}
}
}
-39
View File
@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup></configuration>
-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="SqlServerCE" version="4.0.0.1" targetFramework="net45" />
</packages>
+11 -4
View File
@@ -6,10 +6,17 @@ using System.Resources;
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguageAttribute("en-US")]
[assembly: NeutralResourcesLanguage("en-US")]
// versions
// read https://stackoverflow.com/questions/64602/what-are-differences-between-assemblyversion-assemblyfileversion-and-assemblyin
// note: do NOT change anything here manually, use the build scripts
[assembly: AssemblyVersion("1.0.*")]
// this is the ONLY ONE the CLR cares about for compatibility
// should change ONLY when "hard" breaking compatibility (manual change)
[assembly: AssemblyVersion("8.0.0")]
[assembly: AssemblyFileVersion("7.11.0")]
[assembly: AssemblyInformationalVersion("7.11.0")]
// these are FYI and changed automatically
[assembly: AssemblyFileVersion("8.0.0")]
[assembly: AssemblyInformationalVersion("8.0.0-alpha.41")]
-98
View File
@@ -1,98 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
using umbraco.interfaces;
namespace Umbraco.Core
{
/// <summary>
/// A resolver to return all IAction objects
/// </summary>
public sealed class ActionsResolver : LazyManyObjectsResolverBase<ActionsResolver, IAction>
{
/// <summary>
/// Constructor
/// </summary>
/// <param name="serviceProvider"></param>
/// <param name="logger"></param>
/// <param name="packageActions"></param>
internal ActionsResolver(IServiceProvider serviceProvider, ILogger logger, Func<IEnumerable<Type>> packageActions)
: base(serviceProvider, logger, packageActions)
{
}
/// <summary>
/// Gets the <see cref="IAction"/> implementations.
/// </summary>
public IEnumerable<IAction> Actions
{
get
{
return Values;
}
}
/// <summary>
/// This method will return a list of IAction's based on a string (letter) list. Each character in the list may represent
/// an IAction. This will associate any found IActions based on the Letter property of the IAction with the character being referenced.
/// </summary>
/// <param name="actions"></param>
/// <returns>returns a list of actions that have an associated letter found in the action string list</returns>
public IEnumerable<IAction> FromActionSymbols(IEnumerable<string> actions)
{
var allActions = Actions.ToArray();
return actions
.Select(c => allActions.FirstOrDefault(a => a.Letter.ToString(CultureInfo.InvariantCulture) == c))
.WhereNotNull()
.ToArray();
}
/// <summary>
/// Returns the string (letter) representation of the actions that make up the actions collection
/// </summary>
/// <returns></returns>
public IEnumerable<string> ToActionSymbols(IEnumerable<IAction> actions)
{
return actions.Select(x => x.Letter.ToString(CultureInfo.InvariantCulture)).ToArray();
}
/// <summary>
/// Gets an Action if it exists.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
internal IAction GetAction<T>()
where T : IAction
{
return Actions.SingleOrDefault(x => x.GetType() == typeof (T));
}
protected override IEnumerable<IAction> CreateInstances()
{
var actions = new List<IAction>();
var foundIActions = InstanceTypes;
foreach (var type in foundIActions)
{
IAction typeInstance;
var instance = type.GetProperty("Instance", BindingFlags.Public | BindingFlags.Static);
//if the singletone initializer is not found, try simply creating an instance of the IAction if it supports public constructors
if (instance == null)
typeInstance = ServiceProvider.GetService(type) as IAction;
else
typeInstance = instance.GetValue(null, null) as IAction;
if (typeInstance != null)
{
actions.Add(typeInstance);
}
}
return actions;
}
}
}
-20
View File
@@ -1,20 +0,0 @@
namespace Umbraco.Core
{
/// <summary>
/// Helper methods for Activation
/// </summary>
internal static class ActivatorHelper
{
/// <summary>
/// Creates an instance of a type using that type's default constructor.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T CreateInstance<T>() where T : class, new()
{
return new ActivatorServiceProvider().GetService(typeof (T)) as T;
}
}
}
@@ -1,12 +0,0 @@
using System;
namespace Umbraco.Core
{
internal class ActivatorServiceProvider : IServiceProvider
{
public object GetService(Type serviceType)
{
return Activator.CreateInstance(serviceType);
}
}
}
-506
View File
@@ -1,506 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Threading;
using Semver;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.Profiling;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
using Umbraco.Core.Sync;
namespace Umbraco.Core
{
/// <summary>
/// the Umbraco Application context
/// </summary>
/// <remarks>
/// one per AppDomain, represents the global Umbraco application
/// </remarks>
public class ApplicationContext : IDisposable
{
/// <summary>
/// Constructor
/// </summary>
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
/// <param name="cache"></param>
/// <param name="logger"></param>
public ApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, ProfilingLogger logger)
{
if (dbContext == null) throw new ArgumentNullException("dbContext");
if (serviceContext == null) throw new ArgumentNullException("serviceContext");
if (cache == null) throw new ArgumentNullException("cache");
if (logger == null) throw new ArgumentNullException("logger");
_databaseContext = dbContext;
_services = serviceContext;
ApplicationCache = cache;
ProfilingLogger = logger;
Init();
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
/// <param name="cache"></param>
[Obsolete("Use the other constructor specifying a ProfilingLogger instead")]
public ApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache)
: this(dbContext, serviceContext, cache,
new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler))
{
}
/// <summary>
/// Creates a basic app context
/// </summary>
/// <param name="cache"></param>
[Obsolete("Use the other constructor specifying a ProfilingLogger instead")]
public ApplicationContext(CacheHelper cache)
{
if (cache == null) throw new ArgumentNullException("cache");
ApplicationCache = cache;
ProfilingLogger = new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler);
Init();
}
/// <summary>
/// Creates a basic app context
/// </summary>
/// <param name="cache"></param>
/// <param name="logger"></param>
public ApplicationContext(CacheHelper cache, ProfilingLogger logger)
{
if (cache == null) throw new ArgumentNullException("cache");
if (logger == null) throw new ArgumentNullException("logger");
ApplicationCache = cache;
ProfilingLogger = logger;
Init();
}
/// <summary>
/// A method used to set and/or ensure that a global ApplicationContext singleton is created.
/// </summary>
/// <param name="appContext">
/// The instance to set on the global application singleton
/// </param>
/// <param name="replaceContext">If set to true and the singleton is already set, it will be replaced</param>
/// <returns></returns>
/// <remarks>
/// This is NOT thread safe
/// </remarks>
public static ApplicationContext EnsureContext(ApplicationContext appContext, bool replaceContext)
{
if (Current != null)
{
if (!replaceContext)
return Current;
}
Current = appContext;
return Current;
}
/// <summary>
/// A method used to create and ensure that a global ApplicationContext singleton is created.
/// </summary>
/// <param name="cache"></param>
/// <param name="replaceContext">
/// If set to true will replace the current singleton instance - This should only be used for unit tests or on app
/// startup if for some reason the boot manager is not the umbraco boot manager.
/// </param>
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
/// <returns></returns>
/// <remarks>
/// This is NOT thread safe
/// </remarks>
[Obsolete("Use the other method specifying an ProfilingLogger instead")]
public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, bool replaceContext)
{
if (Current != null)
{
if (!replaceContext)
return Current;
}
var ctx = new ApplicationContext(dbContext, serviceContext, cache);
Current = ctx;
return Current;
}
/// <summary>
/// A method used to create and ensure that a global ApplicationContext singleton is created.
/// </summary>
/// <param name="cache"></param>
/// <param name="logger"></param>
/// <param name="replaceContext">
/// If set to true will replace the current singleton instance - This should only be used for unit tests or on app
/// startup if for some reason the boot manager is not the umbraco boot manager.
/// </param>
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
/// <returns></returns>
/// <remarks>
/// This is NOT thread safe
/// </remarks>
public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, ProfilingLogger logger, bool replaceContext)
{
if (Current != null)
{
if (!replaceContext)
return Current;
}
var ctx = new ApplicationContext(dbContext, serviceContext, cache, logger);
Current = ctx;
return Current;
}
/// <summary>
/// Singleton accessor
/// </summary>
public static ApplicationContext Current { get; internal set; }
/// <summary>
/// Gets the scope provider.
/// </summary>
internal IScopeProvider ScopeProvider { get { return _databaseContext == null ? null : _databaseContext.ScopeProvider; } }
/// <summary>
/// Returns the application wide cache accessor
/// </summary>
/// <remarks>
/// Any caching that is done in the application (app wide) should be done through this property
/// </remarks>
public CacheHelper ApplicationCache { get; private set; }
/// <summary>
/// Exposes the global ProfilingLogger - this should generally not be accessed via the UmbracoContext and should normally just be exposed
/// on most base classes or injected with IoC
/// </summary>
public ProfilingLogger ProfilingLogger { get; private set; }
// IsReady is set to true by the boot manager once it has successfully booted
// note - the original umbraco module checks on content.Instance in umbraco.dll
// now, the boot task that setup the content store ensures that it is ready
bool _isReady = false;
readonly ManualResetEventSlim _isReadyEvent = new ManualResetEventSlim(false);
private DatabaseContext _databaseContext;
private ServiceContext _services;
public bool IsReady
{
get
{
return _isReady;
}
internal set
{
AssertIsNotReady();
_isReady = value;
_isReadyEvent.Set();
}
}
public bool WaitForReady(int timeout)
{
return _isReadyEvent.WaitHandle.WaitOne(timeout);
}
// notes
// GlobalSettings.ConfigurationStatus returns the value that's in the web.config, so it's the "configured version"
// GlobalSettings.CurrentVersion returns the hard-coded "current version"
// the system is configured if they match
// if they don't, install runs, updates web.config (presumably) and updates GlobalSettings.ConfiguredStatus
public bool IsConfigured
{
get { return _configured.Value; }
}
/// <summary>
/// If the db is configured, there is a database context and there is an umbraco schema, but we are not 'configured' , then it means we are upgrading
/// </summary>
public bool IsUpgrading
{
get
{
if (IsConfigured == false
&& DatabaseContext != null
&& DatabaseContext.IsDatabaseConfigured)
{
var schemaresult = DatabaseContext.ValidateDatabaseSchema();
if (schemaresult.ValidTables.Count > 0) return true;
}
return false;
}
}
/// <summary>
/// The application url.
/// </summary>
/// <remarks>
/// The application url is the url that should be used by services to talk to the application,
/// eg keep alive or scheduled publishing services. It must exist on a global context because
/// some of these services may not run within a web context.
/// The format of the application url is:
/// - has a scheme (http or https)
/// - has the SystemDirectories.Umbraco path
/// - does not end with a slash
/// It is initialized on the first request made to the server, by UmbracoModule.EnsureApplicationUrl:
/// - if umbracoSettings:settings/web.routing/@umbracoApplicationUrl is set, use the value (new setting)
/// - if umbracoSettings:settings/scheduledTasks/@baseUrl is set, use the value (backward compatibility)
/// - otherwise, use the url of the (first) request.
/// Not locking, does not matter if several threads write to this.
/// See also issues:
/// - http://issues.umbraco.org/issue/U4-2059
/// - http://issues.umbraco.org/issue/U4-6788
/// - http://issues.umbraco.org/issue/U4-5728
/// - http://issues.umbraco.org/issue/U4-5391
/// </remarks>
public string UmbracoApplicationUrl
{
get
{
ApplicationUrlHelper.EnsureApplicationUrl(this);
return _umbracoApplicationUrl;
}
}
/// <summary>
/// Resets the url.
/// </summary>
public void ResetUmbracoApplicationUrl()
{
_umbracoApplicationUrl = null;
}
// ReSharper disable once InconsistentNaming
internal string _umbracoApplicationUrl;
internal List<string> _umbracoApplicationDomains = new List<string>();
internal string _umbracoApplicationDeploymentId;
private Lazy<bool> _configured;
internal MainDom MainDom { get; private set; }
private void Init()
{
MainDom = new MainDom(ProfilingLogger.Logger);
MainDom.Acquire();
//Create the lazy value to resolve whether or not the application is 'configured'
_configured = new Lazy<bool>(() =>
{
try
{
var configStatus = ConfigurationStatus;
var currentVersion = UmbracoVersion.GetSemanticVersion();
var ok =
//we are not configured if this is null
string.IsNullOrWhiteSpace(configStatus) == false
//they must match
&& configStatus == currentVersion;
if (ok)
{
//The versions are the same in config, but are they the same in the database. We can only check this
// if we have a db context available, if we don't then we are not installed anyways
if (DatabaseContext.IsDatabaseConfigured && DatabaseContext.CanConnect)
{
var found = Services.MigrationEntryService.FindEntry(Constants.System.UmbracoMigrationName, UmbracoVersion.GetSemanticVersion());
if (found == null)
{
//we haven't executed this migration in this environment, so even though the config versions match,
// this db has not been updated.
ProfilingLogger.Logger.Debug<ApplicationContext>(string.Format("The migration for version: '{0} has not been executed, there is no record in the database", currentVersion.ToSemanticString()));
ok = false;
}
}
}
else
{
ProfilingLogger.Logger.Debug<ApplicationContext>(string.Format("CurrentVersion different from configStatus: '{0}','{1}'", currentVersion.ToSemanticString(), configStatus));
}
return ok;
}
catch (Exception ex)
{
LogHelper.Error<ApplicationContext>("Error determining if application is configured, returning false", ex);
return false;
}
});
}
private string ConfigurationStatus
{
get
{
try
{
return ConfigurationManager.AppSettings["umbracoConfigurationStatus"];
}
catch
{
return String.Empty;
}
}
}
/// <summary>
/// Gets the Current Version of the Umbraco Site before an upgrade
/// by using the last/most recent Umbraco Migration that has been run
/// </summary>
/// <returns>A SemVersion of the latest Umbraco DB Migration run</returns>
/// <remarks>
/// NOTE: This existed in the InstallHelper previously but should really be here so it can be re-used if necessary
/// </remarks>
internal SemVersion CurrentVersion()
{
//Set a default version of 0.0.0
var version = new SemVersion(0);
//If we have a db context available, if we don't then we are not installed anyways
if (DatabaseContext.IsDatabaseConfigured && DatabaseContext.CanConnect)
version = DatabaseContext.ValidateDatabaseSchema().DetermineInstalledVersionByMigrations(Services.MigrationEntryService);
if (version != new SemVersion(0))
return version;
// If we aren't able to get a result from the umbracoMigrations table then use the version in web.config, if it's available
if (string.IsNullOrWhiteSpace(GlobalSettings.ConfigurationStatus))
return version;
var configuredVersion = GlobalSettings.ConfigurationStatus;
string currentComment = null;
var current = configuredVersion.Split('-');
if (current.Length > 1)
currentComment = current[1];
Version currentVersion;
if (Version.TryParse(current[0], out currentVersion))
{
version = new SemVersion(
currentVersion.Major,
currentVersion.Minor,
currentVersion.Build,
string.IsNullOrWhiteSpace(currentComment) ? null : currentComment,
currentVersion.Revision > 0 ? currentVersion.Revision.ToString() : null);
}
return version;
}
private void AssertIsNotReady()
{
if (this.IsReady)
throw new Exception("ApplicationContext has already been initialized.");
}
/// <summary>
/// Gets the current DatabaseContext
/// </summary>
/// <remarks>
/// Internal set is generally only used for unit tests
/// </remarks>
public DatabaseContext DatabaseContext
{
get
{
if (_databaseContext == null)
throw new InvalidOperationException("The DatabaseContext has not been set on the ApplicationContext");
return _databaseContext;
}
internal set { _databaseContext = value; }
}
/// <summary>
/// Gets the current ServiceContext
/// </summary>
/// <remarks>
/// Internal set is generally only used for unit tests
/// </remarks>
public ServiceContext Services
{
get
{
if (_services == null)
throw new InvalidOperationException("The ServiceContext has not been set on the ApplicationContext");
return _services;
}
internal set { _services = value; }
}
internal ServerRole GetCurrentServerRole()
{
var registrar = ServerRegistrarResolver.Current.Registrar as IServerRegistrar2;
return registrar == null ? ServerRole.Unknown : registrar.GetCurrentServerRole();
}
private volatile bool _disposed;
private readonly ReaderWriterLockSlim _disposalLocker = new ReaderWriterLockSlim();
/// <summary>
/// This will dispose and reset all resources used to run the application
/// </summary>
/// <remarks>
/// IMPORTANT: Never dispose this object if you require the Umbraco application to run, disposing this object
/// is generally used for unit testing and when your application is shutting down after you have booted Umbraco.
/// </remarks>
void IDisposable.Dispose()
{
// Only operate if we haven't already disposed
if (_disposed) return;
using (new WriteLock(_disposalLocker))
{
// Check again now we're inside the lock
if (_disposed) return;
//clear the cache
if (ApplicationCache != null)
{
ApplicationCache.RuntimeCache.ClearAllCache();
ApplicationCache.IsolatedRuntimeCache.ClearAllCaches();
}
//reset all resolvers
ResolverCollection.ResetAll();
//reset resolution itself (though this should be taken care of by resetting any of the resolvers above)
Resolution.Reset();
//reset the instance objects
this.ApplicationCache = null;
if (_databaseContext != null) //need to check the internal field here
{
if (_databaseContext.ScopeProvider.AmbientScope != null)
{
var scope = _databaseContext.ScopeProvider.AmbientScope;
scope.Dispose();
}
/*
if (DatabaseContext.IsDatabaseConfigured && DatabaseContext.Database != null)
{
DatabaseContext.Database.Dispose();
}
*/
}
this.DatabaseContext = null;
this.Services = null;
this._isReady = false; //set the internal field
// Indicate that the instance has been disposed.
_disposed = true;
}
}
}
}
-119
View File
@@ -1,119 +0,0 @@
namespace Umbraco.Core
{
/// <summary>
/// A plugin type that allows developers to execute code during the Umbraco bootup process
/// </summary>
/// <remarks>
/// Allows you to override the methods that you would like to execute code for: ApplicationInitialized, ApplicationStarting, ApplicationStarted.
///
/// By default none of these methods will execute if the Umbraco application is not configured or if the Umbraco database is not configured, however
/// if you need these methods to execute even if either of these are not configured you can override the properties:
/// ExecuteWhenApplicationNotConfigured and ExecuteWhenDatabaseNotConfigured
/// </remarks>
public abstract class ApplicationEventHandler : IApplicationEventHandler
{
public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
if (ShouldExecute(applicationContext))
{
ApplicationInitialized(umbracoApplication, applicationContext);
}
}
public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
if (ShouldExecute(applicationContext))
{
ApplicationStarting(umbracoApplication, applicationContext);
}
}
public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
if (ShouldExecute(applicationContext))
{
ApplicationStarted(umbracoApplication, applicationContext);
}
}
/// <summary>
/// Overridable method to execute when the ApplicationContext is created and other static objects that require initialization have been setup
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
protected virtual void ApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
/// <summary>
/// Overridable method to execute when All resolvers have been initialized but resolution is not frozen so they can be modified in this method
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
protected virtual void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
/// <summary>
/// Overridable method to execute when Bootup is completed, this allows you to perform any other bootup logic required for the application.
/// Resolution is frozen so now they can be used to resolve instances.
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
protected virtual void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
/// <summary>
/// Determine if the methods should execute based on the configuration status of the application.
/// </summary>
/// <param name="applicationContext"></param>
/// <returns></returns>
private bool ShouldExecute(ApplicationContext applicationContext)
{
if (applicationContext.IsConfigured && applicationContext.DatabaseContext.IsDatabaseConfigured)
{
return true;
}
if (!applicationContext.IsConfigured && ExecuteWhenApplicationNotConfigured)
{
return true;
}
if (!applicationContext.DatabaseContext.IsDatabaseConfigured && ExecuteWhenDatabaseNotConfigured)
{
return true;
}
return false;
}
/// <summary>
/// A flag to determine if the overridable methods for this class will execute even if the
/// Umbraco application is not configured
/// </summary>
/// <remarks>
/// An Umbraco Application is not configured when it requires a new install or upgrade. When the latest version in the
/// assembly does not match the version in the config.
/// </remarks>
protected virtual bool ExecuteWhenApplicationNotConfigured
{
get { return false; }
}
/// <summary>
/// A flag to determine if the overridable methods for this class will execute even if the
/// Umbraco database is not configured
/// </summary>
/// <remarks>
/// The Umbraco database is not configured when we cannot connect to the database or when the database tables are not installed.
/// </remarks>
protected virtual bool ExecuteWhenDatabaseNotConfigured
{
get { return false; }
}
}
}
+32 -32
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -6,20 +6,20 @@ using System.Reflection;
namespace Umbraco.Core
{
internal static class AssemblyExtensions
{
/// <summary>
/// Returns the file used to load the assembly
/// </summary>
/// <param name="assembly"></param>
/// <returns></returns>
public static FileInfo GetAssemblyFile(this Assembly assembly)
{
var codeBase = assembly.CodeBase;
var uri = new Uri(codeBase);
var path = uri.LocalPath;
return new FileInfo(path);
}
internal static class AssemblyExtensions
{
/// <summary>
/// Returns the file used to load the assembly
/// </summary>
/// <param name="assembly"></param>
/// <returns></returns>
public static FileInfo GetAssemblyFile(this Assembly assembly)
{
var codeBase = assembly.CodeBase;
var uri = new Uri(codeBase);
var path = uri.LocalPath;
return new FileInfo(path);
}
/// <summary>
/// Returns true if the assembly is the App_Code assembly
@@ -49,24 +49,24 @@ namespace Umbraco.Core
/// </summary>
/// <param name="assembly"></param>
/// <returns></returns>
public static bool IsGlobalAsaxAssembly(this Assembly assembly)
{
public static bool IsGlobalAsaxAssembly(this Assembly assembly)
{
//only way I can figure out how to test is by the name
return assembly.FullName.StartsWith("App_global.asax");
}
}
/// <summary>
/// Returns the file used to load the assembly
/// </summary>
/// <param name="assemblyName"></param>
/// <returns></returns>
public static FileInfo GetAssemblyFile(this AssemblyName assemblyName)
{
var codeBase = assemblyName.CodeBase;
var uri = new Uri(codeBase);
var path = uri.LocalPath;
return new FileInfo(path);
}
/// <summary>
/// Returns the file used to load the assembly
/// </summary>
/// <param name="assemblyName"></param>
/// <returns></returns>
public static FileInfo GetAssemblyFile(this AssemblyName assemblyName)
{
var codeBase = assemblyName.CodeBase;
var uri = new Uri(codeBase);
var path = uri.LocalPath;
return new FileInfo(path);
}
}
}
}
}
+6 -6
View File
@@ -69,11 +69,11 @@ namespace Umbraco.Core
public Task<IDisposable> LockAsync()
{
var wait = _semaphore != null
var wait = _semaphore != null
? _semaphore.WaitAsync()
: _semaphore2.WaitOneAsync();
return wait.IsCompleted
return wait.IsCompleted
? _releaserTask ?? Task.FromResult(CreateReleaser()) // anonymous vs named
: wait.ContinueWith((_, state) => (((AsyncLock) state).CreateReleaser()),
this, CancellationToken.None,
@@ -112,7 +112,7 @@ namespace Umbraco.Core
return _releaser ?? CreateReleaser(); // anonymous vs named
}
// note - before making those classes some structs, read
// note - before making those classes some structs, read
// about "impure methods" and mutating readonly structs...
private class NamedSemaphoreReleaser : CriticalFinalizerObject, IDisposable
@@ -140,9 +140,9 @@ namespace Umbraco.Core
_semaphore.Dispose();
}
// we WANT to release the semaphore because it's a system object, ie a critical
// we WANT to release the semaphore because it's a system object, ie a critical
// non-managed resource - and if it is not released then noone else can acquire
// the lock - so we inherit from CriticalFinalizerObject which means that the
// the lock - so we inherit from CriticalFinalizerObject which means that the
// finalizer "should" run in all situations - there is always a chance that it
// does not run and the semaphore remains "acquired" but then chances are the
// whole process (w3wp.exe...) is going down, at which point the semaphore will
@@ -200,4 +200,4 @@ namespace Umbraco.Core
}
}
}
}
}
+80 -120
View File
@@ -1,4 +1,4 @@
using System;
using System;
namespace Umbraco.Core
{
@@ -7,160 +7,120 @@ namespace Umbraco.Core
/// </summary>
public static class Attempt
{
// note:
// cannot rely on overloads only to differenciate between with/without status
// in some cases it will always be ambiguous, so be explicit w/ 'WithStatus' methods
/// <summary>
/// Creates a successful attempt with a result.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <param name="result">The result of the attempt.</param>
/// <returns>The successful attempt.</returns>
public static Attempt<T> Succeed<T>(T result)
public static Attempt<TResult> Succeed<TResult>(TResult result)
{
return Attempt<T>.Succeed(result);
return Attempt<TResult>.Succeed(result);
}
/// <summary>
/// Creates a successful attempt with a result and a status.
/// </summary>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <typeparam name="TStatus">The type of the attempted operation status.</typeparam>
/// <param name="status">The status of the attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The successful attempt.</returns>
public static Attempt<TResult, TStatus> SucceedWithStatus<TResult, TStatus>(TStatus status, TResult result)
{
return Attempt<TResult, TStatus>.Succeed(status, result);
}
/// <summary>
/// Creates a failed attempt.
/// </summary>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult> Fail<TResult>()
{
return Attempt<TResult>.Fail();
}
/// <summary>
/// Creates a failed attempt with a result.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <param name="result">The result of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<T> Fail<T>(T result)
public static Attempt<TResult> Fail<TResult>(TResult result)
{
return Attempt<T>.Fail(result);
return Attempt<TResult>.Fail(result);
}
/// <summary>
/// Creates a failed attempt with a result and a status.
/// </summary>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <typeparam name="TStatus">The type of the attempted operation status.</typeparam>
/// <param name="status">The status of the attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult, TStatus> FailWithStatus<TResult, TStatus>(TStatus status, TResult result)
{
return Attempt<TResult, TStatus>.Fail(status, result);
}
/// <summary>
/// Creates a failed attempt with a result and an exception.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <param name="result">The result of the attempt.</param>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<T> Fail<T>(T result, Exception exception)
public static Attempt<TResult> Fail<TResult>(TResult result, Exception exception)
{
return Attempt<T>.Fail(result, exception);
return Attempt<TResult>.Fail(result, exception);
}
/// <summary>
/// Creates a failed attempt with a result, an exception and a status.
/// </summary>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <typeparam name="TStatus">The type of the attempted operation status.</typeparam>
/// <param name="status">The status of the attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult, TStatus> FailWithStatus<TResult, TStatus>(TStatus status, TResult result, Exception exception)
{
return Attempt<TResult, TStatus>.Fail(status, result, exception);
}
/// <summary>
/// Creates a successful or a failed attempt, with a result.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
/// <param name="success">A value indicating whether the attempt is successful.</param>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The attempt.</returns>
public static Attempt<T> If<T>(bool success, T result)
public static Attempt<TResult> If<TResult>(bool condition, TResult result)
{
return Attempt<T>.SucceedIf(success, result);
}
/// <summary>
/// Executes an attempt function, with callbacks.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
/// <param name="attempt">The attempt returned by the attempt function.</param>
/// <param name="onSuccess">An action to execute in case the attempt succeeds.</param>
/// <param name="onFail">An action to execute in case the attempt fails.</param>
/// <returns>The outcome of the attempt.</returns>
/// <remarks>Runs <paramref name="onSuccess"/> or <paramref name="onFail"/> depending on the
/// whether the attempt function reports a success or a failure.</remarks>
public static Outcome Try<T>(Attempt<T> attempt, Action<T> onSuccess, Action<Exception> onFail = null)
{
if (attempt.Success)
{
onSuccess(attempt.Result);
return Outcome.Success;
}
if (onFail != null)
{
onFail(attempt.Exception);
}
return Outcome.Failure;
return Attempt<TResult>.If(condition, result);
}
/// <summary>
/// Represents the outcome of an attempt.
/// Creates a successful or a failed attempt, with a result.
/// </summary>
/// <remarks>Can be a success or a failure, and allows for attempts chaining.</remarks>
public struct Outcome
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <typeparam name="TStatus">The type of the attempted operation status.</typeparam>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <param name="succStatus">The status of the successful attempt.</param>
/// <param name="failStatus">The status of the failed attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The attempt.</returns>
public static Attempt<TResult, TStatus> IfWithStatus<TResult, TStatus>(bool condition, TStatus succStatus, TStatus failStatus, TResult result)
{
private readonly bool _success;
/// <summary>
/// Gets an outcome representing a success.
/// </summary>
public static readonly Outcome Success = new Outcome(true);
/// <summary>
/// Gets an outcome representing a failure.
/// </summary>
public static readonly Outcome Failure = new Outcome(false);
private Outcome(bool success)
{
_success = success;
}
/// <summary>
/// Executes another attempt function, if the previous one failed, with callbacks.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
/// <param name="nextFunction">The attempt function to execute, returning an attempt.</param>
/// <param name="onSuccess">An action to execute in case the attempt succeeds.</param>
/// <param name="onFail">An action to execute in case the attempt fails.</param>
/// <returns>If it executes, returns the outcome of the attempt, else returns a success outcome.</returns>
/// <remarks>
/// <para>Executes only if the previous attempt failed, else does not execute and return a success outcome.</para>
/// <para>If it executes, then runs <paramref name="onSuccess"/> or <paramref name="onFail"/> depending on the
/// whether the attempt function reports a success or a failure.</para>
/// </remarks>
public Outcome OnFailure<T>(Func<Attempt<T>> nextFunction, Action<T> onSuccess, Action<Exception> onFail = null)
{
return _success
? Success
: ExecuteNextFunction(nextFunction, onSuccess, onFail);
}
/// <summary>
/// Executes another attempt function, if the previous one succeeded, with callbacks.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
/// <param name="nextFunction">The attempt function to execute, returning an attempt.</param>
/// <param name="onSuccess">An action to execute in case the attempt succeeds.</param>
/// <param name="onFail">An action to execute in case the attempt fails.</param>
/// <returns>If it executes, returns the outcome of the attempt, else returns a failed outcome.</returns>
/// <remarks>
/// <para>Executes only if the previous attempt succeeded, else does not execute and return a success outcome.</para>
/// <para>If it executes, then runs <paramref name="onSuccess"/> or <paramref name="onFail"/> depending on the
/// whether the attempt function reports a success or a failure.</para>
/// </remarks>
public Outcome OnSuccess<T>(Func<Attempt<T>> nextFunction, Action<T> onSuccess, Action<Exception> onFail = null)
{
return _success
? ExecuteNextFunction(nextFunction, onSuccess, onFail)
: Failure;
}
private static Outcome ExecuteNextFunction<T>(Func<Attempt<T>> nextFunction, Action<T> onSuccess, Action<Exception> onFail = null)
{
var attempt = nextFunction();
if (attempt.Success)
{
onSuccess(attempt.Result);
return Success;
}
if (onFail != null)
{
onFail(attempt.Exception);
}
return Failure;
}
return Attempt<TResult, TStatus>.If(condition, succStatus, failStatus, result);
}
}
}
}
+133
View File
@@ -0,0 +1,133 @@
using System;
namespace Umbraco.Core
{
/// <summary>
/// Represents the result of an operation attempt.
/// </summary>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
[Serializable]
public struct Attempt<TResult>
{
// private - use Succeed() or Fail() methods to create attempts
private Attempt(bool success, TResult result, Exception exception)
{
Success = success;
Result = result;
Exception = exception;
}
/// <summary>
/// Gets a value indicating whether this <see cref="Attempt{TResult}"/> was successful.
/// </summary>
public bool Success { get; }
/// <summary>
/// Gets the exception associated with an unsuccessful attempt.
/// </summary>
public Exception Exception { get; }
/// <summary>
/// Gets the attempt result.
/// </summary>
public TResult Result { get; }
/// <summary>
/// Gets the attempt result, if successful, else a default value.
/// </summary>
public TResult ResultOr(TResult value) => Success ? Result : value;
// optimize, use a singleton failed attempt
private static readonly Attempt<TResult> Failed = new Attempt<TResult>(false, default(TResult), null);
/// <summary>
/// Creates a successful attempt.
/// </summary>
/// <returns>The successful attempt.</returns>
public static Attempt<TResult> Succeed()
{
return new Attempt<TResult>(true, default(TResult), null);
}
/// <summary>
/// Creates a successful attempt with a result.
/// </summary>
/// <param name="result">The result of the attempt.</param>
/// <returns>The successful attempt.</returns>
public static Attempt<TResult> Succeed(TResult result)
{
return new Attempt<TResult>(true, result, null);
}
/// <summary>
/// Creates a failed attempt.
/// </summary>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult> Fail()
{
return Failed;
}
/// <summary>
/// Creates a failed attempt with an exception.
/// </summary>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult> Fail(Exception exception)
{
return new Attempt<TResult>(false, default(TResult), exception);
}
/// <summary>
/// Creates a failed attempt with a result.
/// </summary>
/// <param name="result">The result of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult> Fail(TResult result)
{
return new Attempt<TResult>(false, result, null);
}
/// <summary>
/// Creates a failed attempt with a result and an exception.
/// </summary>
/// <param name="result">The result of the attempt.</param>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult> Fail(TResult result, Exception exception)
{
return new Attempt<TResult>(false, result, exception);
}
/// <summary>
/// Creates a successful or a failed attempt.
/// </summary>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <returns>The attempt.</returns>
public static Attempt<TResult> If(bool condition)
{
return condition ? new Attempt<TResult>(true, default(TResult), null) : Failed;
}
/// <summary>
/// Creates a successful or a failed attempt, with a result.
/// </summary>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The attempt.</returns>
public static Attempt<TResult> If(bool condition, TResult result)
{
return new Attempt<TResult>(condition, result, null);
}
/// <summary>
/// Implicity operator to check if the attempt was successful without having to access the 'success' property
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static implicit operator bool(Attempt<TResult> a)
{
return a.Success;
}
}
}
+142
View File
@@ -0,0 +1,142 @@
using System;
namespace Umbraco.Core
{
/// <summary>
/// Represents the result of an operation attempt.
/// </summary>
/// <typeparam name="TResult">The type of the attempted operation result.</typeparam>
/// <typeparam name="TStatus">The type of the attempted operation status.</typeparam>
[Serializable]
public struct Attempt<TResult, TStatus>
{
/// <summary>
/// Gets a value indicating whether this <see cref="Attempt{TResult,TStatus}"/> was successful.
/// </summary>
public bool Success { get; }
/// <summary>
/// Gets the exception associated with an unsuccessful attempt.
/// </summary>
public Exception Exception { get; }
/// <summary>
/// Gets the attempt result.
/// </summary>
public TResult Result { get; }
/// <summary>
/// Gets the attempt status.
/// </summary>
public TStatus Status { get; }
// private - use Succeed() or Fail() methods to create attempts
private Attempt(bool success, TResult result, TStatus status, Exception exception)
{
Success = success;
Result = result;
Status = status;
Exception = exception;
}
/// <summary>
/// Creates a successful attempt.
/// </summary>
/// <param name="status">The status of the attempt.</param>
/// <returns>The successful attempt.</returns>
public static Attempt<TResult, TStatus> Succeed(TStatus status)
{
return new Attempt<TResult, TStatus>(true, default(TResult), status, null);
}
/// <summary>
/// Creates a successful attempt with a result.
/// </summary>
/// <param name="status">The status of the attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The successful attempt.</returns>
public static Attempt<TResult, TStatus> Succeed(TStatus status, TResult result)
{
return new Attempt<TResult, TStatus>(true, result, status, null);
}
/// <summary>
/// Creates a failed attempt.
/// </summary>
/// <param name="status">The status of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult, TStatus> Fail(TStatus status)
{
return new Attempt<TResult, TStatus>(false, default(TResult), status, null);
}
/// <summary>
/// Creates a failed attempt with an exception.
/// </summary>
/// <param name="status">The status of the attempt.</param>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult, TStatus> Fail(TStatus status, Exception exception)
{
return new Attempt<TResult, TStatus>(false, default(TResult), status, exception);
}
/// <summary>
/// Creates a failed attempt with a result.
/// </summary>
/// <param name="status">The status of the attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult, TStatus> Fail(TStatus status, TResult result)
{
return new Attempt<TResult, TStatus>(false, result, status, null);
}
/// <summary>
/// Creates a failed attempt with a result and an exception.
/// </summary>
/// <param name="status">The status of the attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<TResult, TStatus> Fail(TStatus status, TResult result, Exception exception)
{
return new Attempt<TResult, TStatus>(false, result, status, exception);
}
/// <summary>
/// Creates a successful or a failed attempt.
/// </summary>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <param name="succStatus">The status of the successful attempt.</param>
/// <param name="failStatus">The status of the failed attempt.</param>
/// <returns>The attempt.</returns>
public static Attempt<TResult, TStatus> If(bool condition, TStatus succStatus, TStatus failStatus)
{
return new Attempt<TResult, TStatus>(condition, default(TResult), condition ? succStatus : failStatus, null);
}
/// <summary>
/// Creates a successful or a failed attempt, with a result.
/// </summary>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <param name="succStatus">The status of the successful attempt.</param>
/// <param name="failStatus">The status of the failed attempt.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The attempt.</returns>
public static Attempt<TResult, TStatus> If(bool condition, TStatus succStatus, TStatus failStatus, TResult result)
{
return new Attempt<TResult, TStatus>(condition, result, condition ? succStatus : failStatus, null);
}
/// <summary>
/// Implicity operator to check if the attempt was successful without having to access the 'success' property
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static implicit operator bool(Attempt<TResult, TStatus> a)
{
return a.Success;
}
}
}
-174
View File
@@ -1,174 +0,0 @@
using System;
using Umbraco.Core.Dynamics;
namespace Umbraco.Core
{
/// <summary>
/// Represents the result of an operation attempt.
/// </summary>
/// <typeparam name="T">The type of the attempted operation result.</typeparam>
[Serializable]
public struct Attempt<T>
{
private readonly bool _success;
private readonly T _result;
private readonly Exception _exception;
/// <summary>
/// Gets a value indicating whether this <see cref="Attempt{T}"/> was successful.
/// </summary>
public bool Success
{
get { return _success; }
}
/// <summary>
/// Gets the exception associated with an unsuccessful attempt.
/// </summary>
public Exception Exception { get { return _exception; } }
/// <summary>
/// Gets the exception associated with an unsuccessful attempt.
/// </summary>
/// <remarks>Keep it for backward compatibility sake.</remarks>
[Obsolete(".Error is obsolete, you should use .Exception instead.", false)]
public Exception Error { get { return _exception; } }
/// <summary>
/// Gets the attempt result.
/// </summary>
public T Result
{
get { return _result; }
}
// optimize, use a singleton failed attempt
private static readonly Attempt<T> Failed = new Attempt<T>(false, default(T), null);
/// <summary>
/// Represents an unsuccessful attempt.
/// </summary>
/// <remarks>Keep it for backward compatibility sake.</remarks>
[Obsolete(".Failed is obsolete, you should use Attempt<T>.Fail() instead.", false)]
public static readonly Attempt<T> False = Failed;
// private - use Succeed() or Fail() methods to create attempts
private Attempt(bool success, T result, Exception exception)
{
_success = success;
_result = result;
_exception = exception;
}
/// <summary>
/// Initialize a new instance of the <see cref="Attempt{T}"/> struct with a result.
/// </summary>
/// <param name="success">A value indicating whether the attempt is successful.</param>
/// <param name="result">The result of the attempt.</param>
/// <remarks>Keep it for backward compatibility sake.</remarks>
[Obsolete("Attempt ctors are obsolete, you should use Attempt<T>.Succeed(), Attempt<T>.Fail() or Attempt<T>.If() instead.", false)]
public Attempt(bool success, T result)
: this(success, result, null)
{ }
/// <summary>
/// Initialize a new instance of the <see cref="Attempt{T}"/> struct representing a failed attempt, with an exception.
/// </summary>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <remarks>Keep it for backward compatibility sake.</remarks>
[Obsolete("Attempt ctors are obsolete, you should use Attempt<T>.Succeed(), Attempt<T>.Fail() or Attempt<T>.If() instead.", false)]
public Attempt(Exception exception)
: this(false, default(T), exception)
{ }
/// <summary>
/// Creates a successful attempt.
/// </summary>
/// <returns>The successful attempt.</returns>
public static Attempt<T> Succeed()
{
return new Attempt<T>(true, default(T), null);
}
/// <summary>
/// Creates a successful attempt with a result.
/// </summary>
/// <param name="result">The result of the attempt.</param>
/// <returns>The successful attempt.</returns>
public static Attempt<T> Succeed(T result)
{
return new Attempt<T>(true, result, null);
}
/// <summary>
/// Creates a failed attempt.
/// </summary>
/// <returns>The failed attempt.</returns>
public static Attempt<T> Fail()
{
return Failed;
}
/// <summary>
/// Creates a failed attempt with an exception.
/// </summary>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<T> Fail(Exception exception)
{
return new Attempt<T>(false, default(T), exception);
}
/// <summary>
/// Creates a failed attempt with a result.
/// </summary>
/// <param name="result">The result of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<T> Fail(T result)
{
return new Attempt<T>(false, result, null);
}
/// <summary>
/// Creates a failed attempt with a result and an exception.
/// </summary>
/// <param name="result">The result of the attempt.</param>
/// <param name="exception">The exception causing the failure of the attempt.</param>
/// <returns>The failed attempt.</returns>
public static Attempt<T> Fail(T result, Exception exception)
{
return new Attempt<T>(false, result, exception);
}
/// <summary>
/// Creates a successful or a failed attempt.
/// </summary>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <returns>The attempt.</returns>
public static Attempt<T> SucceedIf(bool condition)
{
return condition ? new Attempt<T>(true, default(T), null) : Failed;
}
/// <summary>
/// Creates a successful or a failed attempt, with a result.
/// </summary>
/// <param name="condition">A value indicating whether the attempt is successful.</param>
/// <param name="result">The result of the attempt.</param>
/// <returns>The attempt.</returns>
public static Attempt<T> SucceedIf(bool condition, T result)
{
return new Attempt<T>(condition, result, null);
}
/// <summary>
/// Implicity operator to check if the attempt was successful without having to access the 'success' property
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static implicit operator bool(Attempt<T> a)
{
return a.Success;
}
}
}
-17
View File
@@ -1,17 +0,0 @@
using System;
using System.ComponentModel;
namespace Umbraco.Core.Auditing
{
[Obsolete("Use Umbraco.Core.Services.IAuditService instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static class Audit
{
public static void Add(Umbraco.Core.Auditing.AuditTypes type, string comment, int userId, int objectId)
{
ApplicationContext.Current.Services.AuditService.Add(
Enum<Umbraco.Core.Models.AuditType>.Parse(type.ToString()),
comment, userId, objectId);
}
}
}
@@ -1,351 +0,0 @@
using System;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Security;
using Umbraco.Core.Services;
namespace Umbraco.Core.Auditing
{
public sealed class AuditEventHandler : ApplicationEventHandler
{
private IAuditService _auditServiceInstance;
private IUserService _userServiceInstance;
private IEntityService _entityServiceInstance;
private IUser CurrentPerformingUser
{
get
{
var identity = Thread.CurrentPrincipal?.GetUmbracoIdentity();
return identity == null
? new User { Id = 0, Name = "SYSTEM", Email = "" }
: _userServiceInstance.GetUserById(Convert.ToInt32(identity.Id));
}
}
private IUser GetPerformingUser(int userId)
{
var found = userId >= 0 ? _userServiceInstance.GetUserById(userId) : null;
return found ?? new User {Id = 0, Name = "SYSTEM", Email = ""};
}
private string PerformingIp
{
get
{
var httpContext = HttpContext.Current == null ? (HttpContextBase) null : new HttpContextWrapper(HttpContext.Current);
var ip = httpContext.GetCurrentRequestIpAddress();
if (ip.ToLowerInvariant().StartsWith("unknown")) ip = "";
return ip;
}
}
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
_auditServiceInstance = applicationContext.Services.AuditService;
_userServiceInstance = applicationContext.Services.UserService;
_entityServiceInstance = applicationContext.Services.EntityService;
//BackOfficeUserManager.AccountLocked += ;
//BackOfficeUserManager.AccountUnlocked += ;
BackOfficeUserManager.ForgotPasswordRequested += OnForgotPasswordRequest;
BackOfficeUserManager.ForgotPasswordChangedSuccess += OnForgotPasswordChange;
BackOfficeUserManager.LoginFailed += OnLoginFailed;
//BackOfficeUserManager.LoginRequiresVerification += ;
BackOfficeUserManager.LoginSuccess += OnLoginSuccess;
BackOfficeUserManager.LogoutSuccess += OnLogoutSuccess;
BackOfficeUserManager.PasswordChanged += OnPasswordChanged;
BackOfficeUserManager.PasswordReset += OnPasswordReset;
//BackOfficeUserManager.ResetAccessFailedCount += ;
UserService.SavedUserGroup2 += OnSavedUserGroupWithUsers;
UserService.SavedUser += OnSavedUser;
UserService.DeletedUser += OnDeletedUser;
UserService.UserGroupPermissionsAssigned += UserGroupPermissionAssigned;
MemberService.Saved += OnSavedMember;
MemberService.Deleted += OnDeletedMember;
MemberService.AssignedRoles += OnAssignedRoles;
MemberService.RemovedRoles += OnRemovedRoles;
MemberService.Exported += OnMemberExported;
}
private string FormatEmail(IMember member)
{
return member == null ? string.Empty : member.Email.IsNullOrWhiteSpace() ? "" : $"<{member.Email}>";
}
private string FormatEmail(IUser user)
{
return user == null ? string.Empty : user.Email.IsNullOrWhiteSpace() ? "" : $"<{user.Email}>";
}
private void OnRemovedRoles(IMemberService sender, RolesEventArgs args)
{
var performingUser = CurrentPerformingUser;
var roles = string.Join(", ", args.Roles);
var members = sender.GetAllMembers(args.MemberIds).ToDictionary(x => x.Id, x => x);
foreach (var id in args.MemberIds)
{
members.TryGetValue(id, out var member);
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {id} \"{member?.Name ?? "(unknown)"}\" {FormatEmail(member)}",
"umbraco/member/roles/removed", $"roles modified, removed {roles}");
}
}
private void OnAssignedRoles(IMemberService sender, RolesEventArgs args)
{
var performingUser = CurrentPerformingUser;
var roles = string.Join(", ", args.Roles);
var members = sender.GetAllMembers(args.MemberIds).ToDictionary(x => x.Id, x => x);
foreach (var id in args.MemberIds)
{
members.TryGetValue(id, out var member);
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {id} \"{member?.Name ?? "(unknown)"}\" {FormatEmail(member)}",
"umbraco/member/roles/assigned", $"roles modified, assigned {roles}");
}
}
private void OnMemberExported(IMemberService sender, ExportedMemberEventArgs exportedMemberEventArgs)
{
var performingUser = CurrentPerformingUser;
var member = exportedMemberEventArgs.Member;
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {member.Id} \"{member.Name}\" {FormatEmail(member)}",
"umbraco/member/exported", "exported member data");
}
private void OnSavedUserGroupWithUsers(IUserService sender, SaveEventArgs<UserGroupWithUsers> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
foreach (var groupWithUser in saveEventArgs.SavedEntities)
{
var group = groupWithUser.UserGroup;
var dp = string.Join(", ", ((UserGroup)group).GetPreviouslyDirtyProperties());
var sections = ((UserGroup)group).WasPropertyDirty("AllowedSections")
? string.Join(", ", group.AllowedSections)
: null;
var perms = ((UserGroup)group).WasPropertyDirty("Permissions")
? string.Join(", ", group.Permissions)
: null;
var sb = new StringBuilder();
sb.Append($"updating {(string.IsNullOrWhiteSpace(dp) ? "(nothing)" : dp)};");
if (sections != null)
sb.Append($", assigned sections: {sections}");
if (perms != null)
{
if (sections != null)
sb.Append(", ");
sb.Append($"default perms: {perms}");
}
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"User Group {group.Id} \"{group.Name}\" ({group.Alias})",
"umbraco/user-group/save", $"{sb}");
// now audit the users that have changed
foreach (var user in groupWithUser.RemovedUsers)
{
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
user.Id, $"User \"{user.Name}\" {FormatEmail(user)}",
"umbraco/user-group/save", $"Removed user \"{user.Name}\" {FormatEmail(user)} from group {group.Id} \"{group.Name}\" ({group.Alias})");
}
foreach (var user in groupWithUser.AddedUsers)
{
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
user.Id, $"User \"{user.Name}\" {FormatEmail(user)}",
"umbraco/user-group/save", $"Added user \"{user.Name}\" {FormatEmail(user)} to group {group.Id} \"{group.Name}\" ({group.Alias})");
}
}
}
private void UserGroupPermissionAssigned(IUserService sender, SaveEventArgs<EntityPermission> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
var perms = saveEventArgs.SavedEntities;
foreach (var perm in perms)
{
var group = sender.GetUserGroupById(perm.UserGroupId);
var assigned = string.Join(", ", perm.AssignedPermissions);
var entity = _entityServiceInstance.Get(perm.EntityId);
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"User Group {group.Id} \"{group.Name}\" ({group.Alias})",
"umbraco/user-group/permissions-change", $"assigning {(string.IsNullOrWhiteSpace(assigned) ? "(nothing)" : assigned)} on id:{perm.EntityId} \"{entity.Name}\"");
}
}
private void OnSavedMember(IMemberService sender, SaveEventArgs<IMember> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
var members = saveEventArgs.SavedEntities;
foreach (var member in members)
{
var dp = string.Join(", ", ((Member) member).GetPreviouslyDirtyProperties());
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {member.Id} \"{member.Name}\" {FormatEmail(member)}",
"umbraco/member/save", $"updating {(string.IsNullOrWhiteSpace(dp) ? "(nothing)" : dp)}");
}
}
private void OnDeletedMember(IMemberService sender, DeleteEventArgs<IMember> deleteEventArgs)
{
var performingUser = CurrentPerformingUser;
var members = deleteEventArgs.DeletedEntities;
foreach (var member in members)
{
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {member.Id} \"{member.Name}\" {FormatEmail(member)}",
"umbraco/member/delete", $"delete member id:{member.Id} \"{member.Name}\" {FormatEmail(member)}");
}
}
private void OnSavedUser(IUserService sender, SaveEventArgs<IUser> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
var affectedUsers = saveEventArgs.SavedEntities;
foreach (var affectedUser in affectedUsers)
{
var groups = affectedUser.WasPropertyDirty("Groups")
? string.Join(", ", affectedUser.Groups.Select(x => x.Alias))
: null;
var dp = string.Join(", ", ((User)affectedUser).GetPreviouslyDirtyProperties());
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
affectedUser.Id, $"User \"{affectedUser.Name}\" {FormatEmail(affectedUser)}",
"umbraco/user/save", $"updating {(string.IsNullOrWhiteSpace(dp) ? "(nothing)" : dp)}{(groups == null ? "" : "; groups assigned: " + groups)}");
}
}
private void OnDeletedUser(IUserService sender, DeleteEventArgs<IUser> deleteEventArgs)
{
var performingUser = CurrentPerformingUser;
var affectedUsers = deleteEventArgs.DeletedEntities;
foreach (var affectedUser in affectedUsers)
_auditServiceInstance.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
affectedUser.Id, $"User \"{affectedUser.Name}\" {FormatEmail(affectedUser)}",
"umbraco/user/delete", "delete user");
}
private void OnLoginSuccess(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs)
{
var performingUser = GetPerformingUser(identityArgs.PerformingUser);
WriteAudit(performingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/sign-in/login", "login success");
}
}
private void OnLogoutSuccess(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs)
{
var performingUser = GetPerformingUser(identityArgs.PerformingUser);
WriteAudit(performingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/sign-in/logout", "logout success");
}
}
private void OnPasswordReset(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/reset", "password reset");
}
}
private void OnPasswordChanged(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/change", "password change");
}
}
private void OnLoginFailed(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, 0, identityArgs.IpAddress, "umbraco/user/sign-in/failed", "login failed", affectedDetails: "");
}
}
private void OnForgotPasswordChange(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/forgot/change", "password forgot/change");
}
}
private void OnForgotPasswordRequest(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/forgot/request", "password forgot/request");
}
}
private void WriteAudit(int performingId, int affectedId, string ipAddress, string eventType, string eventDetails, string affectedDetails = null)
{
var performingUser = _userServiceInstance.GetUserById(performingId);
var performingDetails = performingUser == null
? $"User UNKNOWN:{performingId}"
: $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}";
WriteAudit(performingId, performingDetails, affectedId, ipAddress, eventType, eventDetails, affectedDetails);
}
private void WriteAudit(IUser performingUser, int affectedId, string ipAddress, string eventType, string eventDetails)
{
var performingDetails = performingUser == null
? $"User UNKNOWN"
: $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}";
WriteAudit(performingUser?.Id ?? 0, performingDetails, affectedId, ipAddress, eventType, eventDetails);
}
private void WriteAudit(int performingId, string performingDetails, int affectedId, string ipAddress, string eventType, string eventDetails, string affectedDetails = null)
{
if (affectedDetails == null)
{
var affectedUser = _userServiceInstance.GetUserById(affectedId);
affectedDetails = affectedUser == null
? $"User UNKNOWN:{affectedId}"
: $"User \"{affectedUser.Name}\" {FormatEmail(affectedUser)}";
}
_auditServiceInstance.Write(performingId, performingDetails,
ipAddress,
DateTime.UtcNow,
affectedId, affectedDetails,
eventType, eventDetails);
}
}
}
@@ -0,0 +1,353 @@
using System;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web;
using Umbraco.Core.Components;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Security;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
namespace Umbraco.Core.Auditing
{
public sealed class AuditEventsComponent : UmbracoComponentBase, IUmbracoCoreComponent
{
private IAuditService _auditService;
private IUserService _userService;
private IEntityService _entityService;
private IUser CurrentPerformingUser
{
get
{
var identity = Thread.CurrentPrincipal?.GetUmbracoIdentity();
return identity == null
? new User { Id = 0, Name = "SYSTEM", Email = "" }
: _userService.GetUserById(Convert.ToInt32(identity.Id));
}
}
private IUser GetPerformingUser(int userId)
{
var found = userId >= 0 ? _userService.GetUserById(userId) : null;
return found ?? new User {Id = 0, Name = "SYSTEM", Email = ""};
}
private string PerformingIp
{
get
{
var httpContext = HttpContext.Current == null ? (HttpContextBase) null : new HttpContextWrapper(HttpContext.Current);
var ip = httpContext.GetCurrentRequestIpAddress();
if (ip.ToLowerInvariant().StartsWith("unknown")) ip = "";
return ip;
}
}
public void Initialize(IAuditService auditService, IUserService userService, IEntityService entityService)
{
_auditService = auditService;
_userService = userService;
_entityService = entityService;
//BackOfficeUserManager.AccountLocked += ;
//BackOfficeUserManager.AccountUnlocked += ;
BackOfficeUserManager.ForgotPasswordRequested += OnForgotPasswordRequest;
BackOfficeUserManager.ForgotPasswordChangedSuccess += OnForgotPasswordChange;
BackOfficeUserManager.LoginFailed += OnLoginFailed;
//BackOfficeUserManager.LoginRequiresVerification += ;
BackOfficeUserManager.LoginSuccess += OnLoginSuccess;
BackOfficeUserManager.LogoutSuccess += OnLogoutSuccess;
BackOfficeUserManager.PasswordChanged += OnPasswordChanged;
BackOfficeUserManager.PasswordReset += OnPasswordReset;
//BackOfficeUserManager.ResetAccessFailedCount += ;
UserService.SavedUserGroup += OnSavedUserGroupWithUsers;
UserService.SavedUser += OnSavedUser;
UserService.DeletedUser += OnDeletedUser;
UserService.UserGroupPermissionsAssigned += UserGroupPermissionAssigned;
MemberService.Saved += OnSavedMember;
MemberService.Deleted += OnDeletedMember;
MemberService.AssignedRoles += OnAssignedRoles;
MemberService.RemovedRoles += OnRemovedRoles;
MemberService.Exported += OnMemberExported;
}
private string FormatEmail(IMember member)
{
return member == null ? string.Empty : member.Email.IsNullOrWhiteSpace() ? "" : $"<{member.Email}>";
}
private string FormatEmail(IUser user)
{
return user == null ? string.Empty : user.Email.IsNullOrWhiteSpace() ? "" : $"<{user.Email}>";
}
private void OnRemovedRoles(IMemberService sender, RolesEventArgs args)
{
var performingUser = CurrentPerformingUser;
var roles = string.Join(", ", args.Roles);
var members = sender.GetAllMembers(args.MemberIds).ToDictionary(x => x.Id, x => x);
foreach (var id in args.MemberIds)
{
members.TryGetValue(id, out var member);
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {id} \"{member?.Name ?? "(unknown)"}\" {FormatEmail(member)}",
"umbraco/member/roles/removed", $"roles modified, removed {roles}");
}
}
private void OnAssignedRoles(IMemberService sender, RolesEventArgs args)
{
var performingUser = CurrentPerformingUser;
var roles = string.Join(", ", args.Roles);
var members = sender.GetAllMembers(args.MemberIds).ToDictionary(x => x.Id, x => x);
foreach (var id in args.MemberIds)
{
members.TryGetValue(id, out var member);
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {id} \"{member?.Name ?? "(unknown)"}\" {FormatEmail(member)}",
"umbraco/member/roles/assigned", $"roles modified, assigned {roles}");
}
}
private void OnMemberExported(IMemberService sender, ExportedMemberEventArgs exportedMemberEventArgs)
{
var performingUser = CurrentPerformingUser;
var member = exportedMemberEventArgs.Member;
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {member.Id} \"{member.Name}\" {FormatEmail(member)}",
"umbraco/member/exported", "exported member data");
}
private void OnSavedUserGroupWithUsers(IUserService sender, SaveEventArgs<UserGroupWithUsers> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
foreach (var groupWithUser in saveEventArgs.SavedEntities)
{
var group = groupWithUser.UserGroup;
var dp = string.Join(", ", ((UserGroup)group).GetWereDirtyProperties());
var sections = ((UserGroup)group).WasPropertyDirty("AllowedSections")
? string.Join(", ", group.AllowedSections)
: null;
var perms = ((UserGroup)group).WasPropertyDirty("Permissions")
? string.Join(", ", group.Permissions)
: null;
var sb = new StringBuilder();
sb.Append($"updating {(string.IsNullOrWhiteSpace(dp) ? "(nothing)" : dp)};");
if (sections != null)
sb.Append($", assigned sections: {sections}");
if (perms != null)
{
if (sections != null)
sb.Append(", ");
sb.Append($"default perms: {perms}");
}
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"User Group {group.Id} \"{group.Name}\" ({group.Alias})",
"umbraco/user-group/save", $"{sb}");
// now audit the users that have changed
foreach (var user in groupWithUser.RemovedUsers)
{
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
user.Id, $"User \"{user.Name}\" {FormatEmail(user)}",
"umbraco/user-group/save", $"Removed user \"{user.Name}\" {FormatEmail(user)} from group {group.Id} \"{group.Name}\" ({group.Alias})");
}
foreach (var user in groupWithUser.AddedUsers)
{
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
user.Id, $"User \"{user.Name}\" {FormatEmail(user)}",
"umbraco/user-group/save", $"Added user \"{user.Name}\" {FormatEmail(user)} to group {group.Id} \"{group.Name}\" ({group.Alias})");
}
}
}
private void UserGroupPermissionAssigned(IUserService sender, SaveEventArgs<EntityPermission> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
var perms = saveEventArgs.SavedEntities;
foreach (var perm in perms)
{
var group = sender.GetUserGroupById(perm.UserGroupId);
var assigned = string.Join(", ", perm.AssignedPermissions);
var entity = _entityService.Get(perm.EntityId);
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"User Group {group.Id} \"{group.Name}\" ({group.Alias})",
"umbraco/user-group/permissions-change", $"assigning {(string.IsNullOrWhiteSpace(assigned) ? "(nothing)" : assigned)} on id:{perm.EntityId} \"{entity.Name}\"");
}
}
private void OnSavedMember(IMemberService sender, SaveEventArgs<IMember> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
var members = saveEventArgs.SavedEntities;
foreach (var member in members)
{
var dp = string.Join(", ", ((Member) member).GetWereDirtyProperties());
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {member.Id} \"{member.Name}\" {FormatEmail(member)}",
"umbraco/member/save", $"updating {(string.IsNullOrWhiteSpace(dp) ? "(nothing)" : dp)}");
}
}
private void OnDeletedMember(IMemberService sender, DeleteEventArgs<IMember> deleteEventArgs)
{
var performingUser = CurrentPerformingUser;
var members = deleteEventArgs.DeletedEntities;
foreach (var member in members)
{
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
-1, $"Member {member.Id} \"{member.Name}\" {FormatEmail(member)}",
"umbraco/member/delete", $"delete member id:{member.Id} \"{member.Name}\" {FormatEmail(member)}");
}
}
private void OnSavedUser(IUserService sender, SaveEventArgs<IUser> saveEventArgs)
{
var performingUser = CurrentPerformingUser;
var affectedUsers = saveEventArgs.SavedEntities;
foreach (var affectedUser in affectedUsers)
{
var groups = affectedUser.WasPropertyDirty("Groups")
? string.Join(", ", affectedUser.Groups.Select(x => x.Alias))
: null;
var dp = string.Join(", ", ((User)affectedUser).GetWereDirtyProperties());
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
affectedUser.Id, $"User \"{affectedUser.Name}\" {FormatEmail(affectedUser)}",
"umbraco/user/save", $"updating {(string.IsNullOrWhiteSpace(dp) ? "(nothing)" : dp)}{(groups == null ? "" : "; groups assigned: " + groups)}");
}
}
private void OnDeletedUser(IUserService sender, DeleteEventArgs<IUser> deleteEventArgs)
{
var performingUser = CurrentPerformingUser;
var affectedUsers = deleteEventArgs.DeletedEntities;
foreach (var affectedUser in affectedUsers)
_auditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}", PerformingIp,
DateTime.UtcNow,
affectedUser.Id, $"User \"{affectedUser.Name}\" {FormatEmail(affectedUser)}",
"umbraco/user/delete", "delete user");
}
private void OnLoginSuccess(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs)
{
var performingUser = GetPerformingUser(identityArgs.PerformingUser);
WriteAudit(performingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/sign-in/login", "login success");
}
}
private void OnLogoutSuccess(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs)
{
var performingUser = GetPerformingUser(identityArgs.PerformingUser);
WriteAudit(performingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/sign-in/logout", "logout success");
}
}
private void OnPasswordReset(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/reset", "password reset");
}
}
private void OnPasswordChanged(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/change", "password change");
}
}
private void OnLoginFailed(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, 0, identityArgs.IpAddress, "umbraco/user/sign-in/failed", "login failed", affectedDetails: "");
}
}
private void OnForgotPasswordChange(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/forgot/change", "password forgot/change");
}
}
private void OnForgotPasswordRequest(object sender, EventArgs args)
{
if (args is IdentityAuditEventArgs identityArgs && identityArgs.PerformingUser >= 0)
{
WriteAudit(identityArgs.PerformingUser, identityArgs.AffectedUser, identityArgs.IpAddress, "umbraco/user/password/forgot/request", "password forgot/request");
}
}
private void WriteAudit(int performingId, int affectedId, string ipAddress, string eventType, string eventDetails, string affectedDetails = null)
{
var performingUser = _userService.GetUserById(performingId);
var performingDetails = performingUser == null
? $"User UNKNOWN:{performingId}"
: $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}";
WriteAudit(performingId, performingDetails, affectedId, ipAddress, eventType, eventDetails, affectedDetails);
}
private void WriteAudit(IUser performingUser, int affectedId, string ipAddress, string eventType, string eventDetails)
{
var performingDetails = performingUser == null
? $"User UNKNOWN"
: $"User \"{performingUser.Name}\" {FormatEmail(performingUser)}";
WriteAudit(performingUser?.Id ?? 0, performingDetails, affectedId, ipAddress, eventType, eventDetails);
}
private void WriteAudit(int performingId, string performingDetails, int affectedId, string ipAddress, string eventType, string eventDetails, string affectedDetails = null)
{
if (affectedDetails == null)
{
var affectedUser = _userService.GetUserById(affectedId);
affectedDetails = affectedUser == null
? $"User UNKNOWN:{affectedId}"
: $"User \"{affectedUser.Name}\" {FormatEmail(affectedUser)}";
}
_auditService.Write(performingId, performingDetails,
ipAddress,
DateTime.UtcNow,
affectedId, affectedDetails,
eventType, eventDetails);
}
}
}
-87
View File
@@ -1,87 +0,0 @@
using System;
using System.ComponentModel;
namespace Umbraco.Core.Auditing
{
[Obsolete("Use Umbraco.Core.Models.AuditType instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public enum AuditTypes
{
/// <summary>
/// Used when new nodes are added
/// </summary>
New,
/// <summary>
/// Used when nodes are saved
/// </summary>
Save,
/// <summary>
/// Used when nodes are opened
/// </summary>
Open,
/// <summary>
/// Used when nodes are deleted
/// </summary>
Delete,
/// <summary>
/// Used when nodes are published
/// </summary>
Publish,
/// <summary>
/// Used when nodes are send to publishing
/// </summary>
SendToPublish,
/// <summary>
/// Used when nodes are unpublished
/// </summary>
UnPublish,
/// <summary>
/// Used when nodes are moved
/// </summary>
Move,
/// <summary>
/// Used when nodes are copied
/// </summary>
Copy,
/// <summary>
/// Used when nodes are assígned a domain
/// </summary>
AssignDomain,
/// <summary>
/// Used when public access are changed for a node
/// </summary>
PublicAccess,
/// <summary>
/// Used when nodes are sorted
/// </summary>
Sort,
/// <summary>
/// Used when a notification are send to a user
/// </summary>
Notify,
/// <summary>
/// General system notification
/// </summary>
System,
/// <summary>
/// Used when a node's content is rolled back to a previous version
/// </summary>
RollBack,
/// <summary>
/// Used when a package is installed
/// </summary>
PackagerInstall,
/// <summary>
/// Used when a package is uninstalled
/// </summary>
PackagerUninstall,
/// <summary>
/// Used when a node is send to translation
/// </summary>
SendToTranslate,
/// <summary>
/// Use this log action for custom log messages that should be shown in the audit trail
/// </summary>
Custom
}
}
+6 -6
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Web;
@@ -21,7 +21,7 @@ namespace Umbraco.Core
private static readonly Regex Log4NetAssemblyPattern = new Regex("log4net, Version=([\\d\\.]+?), Culture=neutral, PublicKeyToken=\\w+$", RegexOptions.Compiled);
private const string Log4NetReplacement = "log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a";
/// <summary>
/// This is used to do an assembly binding redirect via code - normally required due to signature changes in assemblies
/// </summary>
@@ -30,12 +30,12 @@ namespace Umbraco.Core
/// <returns></returns>
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
//log4net:
//log4net:
if (Log4NetAssemblyPattern.IsMatch(args.Name) && args.Name != Log4NetReplacement)
{
return Assembly.Load(Log4NetAssemblyPattern.Replace(args.Name, Log4NetReplacement));
}
//AutoMapper:
// ensure the assembly is indeed AutoMapper and that the PublicKeyToken is null before trying to Load again
// do NOT just replace this with 'return Assembly', as it will cause an infinite loop -> stackoverflow
@@ -43,7 +43,7 @@ namespace Umbraco.Core
return Assembly.Load(args.Name.Replace(", PublicKeyToken=null", ", PublicKeyToken=be96cd2c38ef1005"));
return null;
}
}
}
}
+422
View File
@@ -0,0 +1,422 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Web;
using System.Web.Caching;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Class that is exposed by the ApplicationContext for application wide caching purposes
/// </summary>
public class CacheHelper
{
public static CacheHelper NoCache { get; } = new CacheHelper(NullCacheProvider.Instance, NullCacheProvider.Instance, NullCacheProvider.Instance, new IsolatedRuntimeCache(_ => NullCacheProvider.Instance));
/// <summary>
/// Creates a cache helper with disabled caches
/// </summary>
/// <returns></returns>
/// <remarks>
/// Good for unit testing
/// </remarks>
public static CacheHelper CreateDisabledCacheHelper()
{
// do *not* return NoCache
// NoCache is a special instance that is detected by RepositoryBase and disables all cache policies
// CreateDisabledCacheHelper is used in tests to use no cache, *but* keep all cache policies
return new CacheHelper(NullCacheProvider.Instance, NullCacheProvider.Instance, NullCacheProvider.Instance, new IsolatedRuntimeCache(_ => NullCacheProvider.Instance));
}
/// <summary>
/// Initializes a new instance for use in the web
/// </summary>
public CacheHelper()
: this(
new HttpRuntimeCacheProvider(HttpRuntime.Cache),
new StaticCacheProvider(),
new HttpRequestCacheProvider(),
new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
/// <summary>
/// Initializes a new instance for use in the web
/// </summary>
/// <param name="cache"></param>
public CacheHelper(System.Web.Caching.Cache cache)
: this(
new HttpRuntimeCacheProvider(cache),
new StaticCacheProvider(),
new HttpRequestCacheProvider(),
new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
[Obsolete("Use the constructor the specifies all dependencies")]
[EditorBrowsable(EditorBrowsableState.Never)]
public CacheHelper(
IRuntimeCacheProvider httpCacheProvider,
ICacheProvider staticCacheProvider,
ICacheProvider requestCacheProvider)
: this(httpCacheProvider, staticCacheProvider, requestCacheProvider, new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
/// <summary>
/// Initializes a new instance based on the provided providers
/// </summary>
/// <param name="httpCacheProvider"></param>
/// <param name="staticCacheProvider"></param>
/// <param name="requestCacheProvider"></param>
/// <param name="isolatedCacheManager"></param>
public CacheHelper(
IRuntimeCacheProvider httpCacheProvider,
ICacheProvider staticCacheProvider,
ICacheProvider requestCacheProvider,
IsolatedRuntimeCache isolatedCacheManager)
{
if (httpCacheProvider == null) throw new ArgumentNullException("httpCacheProvider");
if (staticCacheProvider == null) throw new ArgumentNullException("staticCacheProvider");
if (requestCacheProvider == null) throw new ArgumentNullException("requestCacheProvider");
if (isolatedCacheManager == null) throw new ArgumentNullException("isolatedCacheManager");
RuntimeCache = httpCacheProvider;
StaticCache = staticCacheProvider;
RequestCache = requestCacheProvider;
IsolatedRuntimeCache = isolatedCacheManager;
}
/// <summary>
/// Returns the current Request cache
/// </summary>
public ICacheProvider RequestCache { get; internal set; }
/// <summary>
/// Returns the current Runtime cache
/// </summary>
public ICacheProvider StaticCache { get; internal set; }
/// <summary>
/// Returns the current Runtime cache
/// </summary>
public IRuntimeCacheProvider RuntimeCache { get; internal set; }
/// <summary>
/// Returns the current Isolated Runtime cache manager
/// </summary>
public IsolatedRuntimeCache IsolatedRuntimeCache { get; internal set; }
#region Legacy Runtime/Http Cache accessors
/// <summary>
/// Clears the item in umbraco's runtime cache
/// </summary>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearAllCache()
{
RuntimeCache.ClearAllCache();
IsolatedRuntimeCache.ClearAllCaches();
}
/// <summary>
/// Clears the item in umbraco's runtime cache with the given key
/// </summary>
/// <param name="key">Key</param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheItem(string key)
{
RuntimeCache.ClearCacheItem(key);
}
/// <summary>
/// Clears all objects in the System.Web.Cache with the System.Type name as the
/// input parameter. (using [object].GetType())
/// </summary>
/// <param name="typeName">The name of the System.Type which should be cleared from cache ex "System.Xml.XmlDocument"</param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
public void ClearCacheObjectTypes(string typeName)
{
RuntimeCache.ClearCacheObjectTypes(typeName);
}
/// <summary>
/// Clears all objects in the System.Web.Cache with the System.Type specified
/// </summary>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheObjectTypes<T>()
{
RuntimeCache.ClearCacheObjectTypes<T>();
}
/// <summary>
/// Clears all cache items that starts with the key passed.
/// </summary>
/// <param name="keyStartsWith">The start of the key</param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheByKeySearch(string keyStartsWith)
{
RuntimeCache.ClearCacheByKeySearch(keyStartsWith);
}
/// <summary>
/// Clears all cache items that have a key that matches the regular expression
/// </summary>
/// <param name="regexString"></param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheByKeyExpression(string regexString)
{
RuntimeCache.ClearCacheByKeyExpression(regexString);
}
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public IEnumerable<T> GetCacheItemsByKeySearch<T>(string keyStartsWith)
{
return RuntimeCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
/// <summary>
/// Returns a cache item by key, does not update the cache if it isn't there.
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey)
{
return RuntimeCache.GetCacheItem<TT>(cacheKey);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with all of the default parameters
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey, Func<TT> getCacheItem)
{
return RuntimeCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey,
TimeSpan timeout, Func<TT> getCacheItem)
{
return RuntimeCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="refreshAction"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey,
CacheItemRemovedCallback refreshAction, TimeSpan timeout,
Func<TT> getCacheItem)
{
return RuntimeCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, removedCallback: refreshAction);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority, CacheItemRemovedCallback refreshAction, TimeSpan timeout,
Func<TT> getCacheItem)
{
return RuntimeCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, false, priority, refreshAction);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, we no longer support the caching overloads with references to CacheDependency, use the overloads specifying a file collection instead")]
public TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority,
CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency,
TimeSpan timeout,
Func<TT> getCacheItem)
{
var cache = GetHttpRuntimeCacheProvider(RuntimeCache);
if (cache != null)
{
var result = cache.GetCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, refreshAction, cacheDependency);
return result == null ? default(TT) : result.TryConvertTo<TT>().Result;
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="cacheDependency"></param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, we no longer support the caching overloads with references to CacheDependency, use the overloads specifying a file collection instead")]
public TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority,
CacheDependency cacheDependency,
Func<TT> getCacheItem)
{
var cache = GetHttpRuntimeCacheProvider(RuntimeCache);
if (cache != null)
{
var result = cache.GetCacheItem(cacheKey, () => getCacheItem(), null, false, priority, null, cacheDependency);
return result == null ? default(TT) : result.TryConvertTo<TT>().Result;
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="getCacheItem"></param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
Func<T> getCacheItem)
{
RuntimeCache.InsertCacheItem<T>(cacheKey, getCacheItem, priority: priority);
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
TimeSpan timeout,
Func<T> getCacheItem)
{
RuntimeCache.InsertCacheItem<T>(cacheKey, getCacheItem, timeout, priority: priority);
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
[Obsolete("Do not use this method, we no longer support the caching overloads with references to CacheDependency, use the overloads specifying a file collection instead")]
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
CacheDependency cacheDependency,
TimeSpan timeout,
Func<T> getCacheItem)
{
var cache = GetHttpRuntimeCacheProvider(RuntimeCache);
if (cache != null)
{
cache.InsertCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, null, cacheDependency);
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
[Obsolete("Do not use this method, we no longer support the caching overloads with references to CacheDependency, use the overloads specifying a file collection instead")]
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency,
TimeSpan? timeout,
Func<T> getCacheItem)
{
var cache = GetHttpRuntimeCacheProvider(RuntimeCache);
if (cache != null)
{
cache.InsertCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, refreshAction, cacheDependency);
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
#endregion
private HttpRuntimeCacheProvider GetHttpRuntimeCacheProvider(IRuntimeCacheProvider runtimeCache)
{
HttpRuntimeCacheProvider cache;
var wrapper = RuntimeCache as IRuntimeCacheProviderWrapper;
if (wrapper != null)
{
cache = wrapper.InnerProvider as HttpRuntimeCacheProvider;
}
else
{
cache = RuntimeCache as HttpRuntimeCacheProvider;
}
return cache;
}
}
}
+4 -50
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.ComponentModel;
using Umbraco.Core.CodeAnnotations;
@@ -22,16 +22,11 @@ namespace Umbraco.Core.Cache
[UmbracoWillObsolete("This cache key is only used for the legacy 'library' caching, remove in v8")]
public const string MediaCacheKey = "UL_GetMedia";
public const string MacroXsltCacheKey = "macroXslt_";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string MacroCacheKey = "UmbracoMacroCache";
public const string MacroHtmlCacheKey = "macroHtml_";
public const string MacroControlCacheKey = "macroControl_";
public const string MacroHtmlDateAddedCacheKey = "macroHtml_DateAdded_";
public const string MacroControlDateAddedCacheKey = "macroControl_DateAdded_";
public const string MacroContentCacheKey = "macroContent_"; // for macro contents
[UmbracoWillObsolete("This cache key is only used for legacy 'library' member caching, remove in v8")]
public const string MemberLibraryCacheKey = "UL_GetMember";
@@ -42,56 +37,15 @@ namespace Umbraco.Core.Cache
[UmbracoWillObsolete("This cache key is only used for legacy template business logic caching, remove in v8")]
public const string TemplateFrontEndCacheKey = "template";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string TemplateBusinessLogicCacheKey = "UmbracoTemplateCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string UserContextCacheKey = "UmbracoUserContext";
public const string UserContextTimeoutCacheKey = "UmbracoUserContextTimeout";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string UserCacheKey = "UmbracoUser";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string UserGroupPermissionsCacheKey = "UmbracoUserGroupPermissions";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string ContentTypeCacheKey = "UmbracoContentType";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string ContentTypePropertiesCacheKey = "ContentType_PropertyTypes_Content:";
[Obsolete("No longer used and will be removed in v8")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string PropertyTypeCacheKey = "UmbracoPropertyTypeCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string LanguageCacheKey = "UmbracoLanguageCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string DomainCacheKey = "UmbracoDomainList";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string StylesheetCacheKey = "UmbracoStylesheet";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string StylesheetPropertyCacheKey = "UmbracoStylesheetProperty";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string DataTypeCacheKey = "UmbracoDataTypeDefinition";
public const string DataTypePreValuesCacheKey = "UmbracoPreVal";
public const string IdToKeyCacheKey = "UI2K__";
public const string KeyToIdCacheKey = "UK2I__";
}
}
}
@@ -67,4 +67,4 @@ namespace Umbraco.Core.Cache
return result.TryConvertTo<T>().Result;
}
}
}
}
+88 -46
View File
@@ -1,78 +1,120 @@
using System;
using Umbraco.Core.Events;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Sync;
using umbraco.interfaces;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A base class for cache refreshers to inherit from that ensures the correct events are raised
/// when cache refreshing occurs.
/// A base class for cache refreshers that handles events.
/// </summary>
/// <typeparam name="TInstanceType">The real cache refresher type, this is used for raising strongly typed events</typeparam>
/// <typeparam name="TInstanceType">The actual cache refresher type.</typeparam>
/// <remarks>The actual cache refresher type is used for strongly typed events.</remarks>
public abstract class CacheRefresherBase<TInstanceType> : ICacheRefresher
where TInstanceType : ICacheRefresher
where TInstanceType : class, ICacheRefresher
{
/// <summary>
/// An event that is raised when cache is updated on an individual server
/// Initializes a new instance of the <see cref="CacheRefresherBase{TInstanceType}"/>.
/// </summary>
/// <param name="cacheHelper">A cache helper.</param>
protected CacheRefresherBase(CacheHelper cacheHelper)
{
CacheHelper = cacheHelper;
}
/// <summary>
/// Triggers when the cache is updated on the server.
/// </summary>
/// <remarks>
/// This event will fire on each server configured for an Umbraco project whenever a cache refresher
/// is updated.
/// Triggers on each server configured for an Umbraco project whenever a cache refresher is updated.
/// </remarks>
public static event TypedEventHandler<TInstanceType, CacheRefresherEventArgs> CacheUpdated;
/// <summary>
/// Raises the event
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
protected static void OnCacheUpdated(TInstanceType sender, CacheRefresherEventArgs args)
{
if (CacheUpdated != null)
{
CacheUpdated(sender, args);
}
}
#region Define
/// <summary>
/// Returns the real instance of the object ('this') for use in strongly typed events
/// Gets the typed 'this' for events.
/// </summary>
protected abstract TInstanceType Instance { get; }
protected abstract TInstanceType This { get; }
public abstract Guid UniqueIdentifier { get; }
/// <summary>
/// Gets the unique identifier of the refresher.
/// </summary>
public abstract Guid RefresherUniqueId { get; }
/// <summary>
/// Gets the name of the refresher.
/// </summary>
public abstract string Name { get; }
#endregion
#region Refresher
/// <summary>
/// Refreshes all entities.
/// </summary>
public virtual void RefreshAll()
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(null, MessageType.RefreshAll));
}
public virtual void Refresh(int id)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(id, MessageType.RefreshById));
}
public virtual void Remove(int id)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(id, MessageType.RemoveById));
}
public virtual void Refresh(Guid id)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(id, MessageType.RefreshById));
OnCacheUpdated(This, new CacheRefresherEventArgs(null, MessageType.RefreshAll));
}
/// <summary>
/// Clears the cache for all repository entities of this type
/// Refreshes an entity.
/// </summary>
/// <typeparam name="TEntity"></typeparam>
internal void ClearAllIsolatedCacheByEntityType<TEntity>()
where TEntity : class, IAggregateRoot
/// <param name="id">The entity's identifier.</param>
public virtual void Refresh(int id)
{
ApplicationContext.Current.ApplicationCache.IsolatedRuntimeCache.ClearCache<TEntity>();
OnCacheUpdated(This, new CacheRefresherEventArgs(id, MessageType.RefreshById));
}
/// <summary>
/// Refreshes an entity.
/// </summary>
/// <param name="id">The entity's identifier.</param>
public virtual void Refresh(Guid id)
{
OnCacheUpdated(This, new CacheRefresherEventArgs(id, MessageType.RefreshById));
}
/// <summary>
/// Removes an entity.
/// </summary>
/// <param name="id">The entity's identifier.</param>
public virtual void Remove(int id)
{
OnCacheUpdated(This, new CacheRefresherEventArgs(id, MessageType.RemoveById));
}
#endregion
#region Protected
/// <summary>
/// Gets the cache helper.
/// </summary>
protected CacheHelper CacheHelper { get; }
/// <summary>
/// Clears the cache for all repository entities of a specified type.
/// </summary>
/// <typeparam name="TEntity">The type of the entities.</typeparam>
protected void ClearAllIsolatedCacheByEntityType<TEntity>()
where TEntity : class, IEntity
{
CacheHelper.IsolatedRuntimeCache.ClearCache<TEntity>();
}
/// <summary>
/// Raises the CacheUpdated event.
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="args">The event arguments.</param>
protected static void OnCacheUpdated(TInstanceType sender, CacheRefresherEventArgs args)
{
CacheUpdated?.Invoke(sender, args);
}
#endregion
}
}
}
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
public class CacheRefresherCollection : BuilderCollectionBase<ICacheRefresher>
{
public CacheRefresherCollection(IEnumerable<ICacheRefresher> items)
: base(items)
{ }
public ICacheRefresher this[Guid id]
=> this.FirstOrDefault(x => x.RefresherUniqueId == id);
}
}
@@ -0,0 +1,15 @@
using System.Collections.Generic;
using LightInject;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
public class CacheRefresherCollectionBuilder : LazyCollectionBuilderBase<CacheRefresherCollectionBuilder, CacheRefresherCollection, ICacheRefresher>
{
public CacheRefresherCollectionBuilder(IServiceContainer container)
: base(container)
{ }
protected override CacheRefresherCollectionBuilder This => this;
}
}
@@ -16,4 +16,4 @@ namespace Umbraco.Core.Cache
public object MessageObject { get; private set; }
public MessageType MessageType { get; private set; }
}
}
}
@@ -1,9 +1,9 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Caching;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Entities;
namespace Umbraco.Core.Cache
{
@@ -16,23 +16,26 @@ namespace Umbraco.Core.Cache
}
/// <summary>
/// A wrapper for any IRuntimeCacheProvider that ensures that all inserts and returns
/// A wrapper for any IRuntimeCacheProvider that ensures that all inserts and returns
/// are a deep cloned copy of the item when the item is IDeepCloneable and that tracks changes are
/// reset if the object is TracksChangesEntityBase
/// </summary>
internal class DeepCloneRuntimeCacheProvider : IRuntimeCacheProvider, IRuntimeCacheProviderWrapper
{
public IRuntimeCacheProvider InnerProvider { get; private set; }
public IRuntimeCacheProvider InnerProvider { get; }
public DeepCloneRuntimeCacheProvider(IRuntimeCacheProvider innerProvider)
{
if (innerProvider.GetType() == typeof(DeepCloneRuntimeCacheProvider))
throw new InvalidOperationException("A " + typeof(DeepCloneRuntimeCacheProvider) + " cannot wrap another instance of " + typeof(DeepCloneRuntimeCacheProvider));
var type = typeof (DeepCloneRuntimeCacheProvider);
if (innerProvider.GetType() == type)
throw new InvalidOperationException($"A {type} cannot wrap another instance of {type}.");
InnerProvider = innerProvider;
}
#region Clear - doesn't require any changes
public void ClearAllCache()
{
InnerProvider.ClearAllCache();
@@ -66,7 +69,8 @@ namespace Umbraco.Core.Cache
public void ClearCacheByKeyExpression(string regexString)
{
InnerProvider.ClearCacheByKeyExpression(regexString);
}
}
#endregion
public IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
@@ -80,7 +84,7 @@ namespace Umbraco.Core.Cache
return InnerProvider.GetCacheItemsByKeyExpression(regexString)
.Select(CheckCloneableAndTracksChanges);
}
public object GetCacheItem(string cacheKey)
{
var item = InnerProvider.GetCacheItem(cacheKey);
@@ -108,11 +112,11 @@ namespace Umbraco.Core.Cache
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
if (value == null) return null; // do not store null values (backward compat)
//Clone/reset to go into the cache
// clone / reset to go into the cache
return CheckCloneableAndTracksChanges(value);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
//Clone/reset to go out of the cache
// clone / reset to go into the cache
return CheckCloneableAndTracksChanges(cached);
}
@@ -124,8 +128,9 @@ namespace Umbraco.Core.Cache
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
if (value == null) return null; // do not store null values (backward compat)
// clone / reset to go into the cache
return CheckCloneableAndTracksChanges(value);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
}
private static object CheckCloneableAndTracksChanges(object input)
@@ -133,11 +138,10 @@ namespace Umbraco.Core.Cache
var cloneable = input as IDeepCloneable;
if (cloneable != null)
{
input = cloneable.DeepClone();
input = cloneable.DeepClone();
}
//on initial construction we don't want to have dirty properties tracked
// http://issues.umbraco.org/issue/U4-1946
// reset dirty initial properties (U4-1946)
var tracksChanges = input as IRememberBeingDirty;
if (tracksChanges != null)
{
@@ -148,4 +152,4 @@ namespace Umbraco.Core.Cache
return input;
}
}
}
}
@@ -1,7 +1,7 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Cache
@@ -18,32 +18,26 @@ namespace Umbraco.Core.Cache
/// <para>If options.GetAllCacheValidateCount then we check against the db when getting many entities.</para>
/// </remarks>
internal class DefaultRepositoryCachePolicy<TEntity, TId> : RepositoryCachePolicyBase<TEntity, TId>
where TEntity : class, IAggregateRoot
where TEntity : class, IEntity
{
private static readonly TEntity[] EmptyEntities = new TEntity[0]; // const
private readonly RepositoryCachePolicyOptions _options;
public DefaultRepositoryCachePolicy(IRuntimeCacheProvider cache, RepositoryCachePolicyOptions options)
: base(cache)
public DefaultRepositoryCachePolicy(IRuntimeCacheProvider cache, IScopeAccessor scopeAccessor, RepositoryCachePolicyOptions options)
: base(cache, scopeAccessor)
{
if (options == null) throw new ArgumentNullException("options");
_options = options;
}
public override IRepositoryCachePolicy<TEntity, TId> Scoped(IRuntimeCacheProvider runtimeCache, IScope scope)
{
return new ScopedRepositoryCachePolicy<TEntity, TId>(this, runtimeCache, scope);
_options = options ?? throw new ArgumentNullException(nameof(options));
}
protected string GetEntityCacheKey(object id)
{
if (id == null) throw new ArgumentNullException("id");
if (id == null) throw new ArgumentNullException(nameof(id));
return GetEntityTypeCacheKey() + id;
}
protected string GetEntityTypeCacheKey()
{
return string.Format("uRepo_{0}_", typeof(TEntity).Name);
return $"uRepo_{typeof (TEntity).Name}_";
}
protected virtual void InsertEntity(string cacheKey, TEntity entity)
@@ -74,7 +68,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void Create(TEntity entity, Action<TEntity> persistNew)
{
if (entity == null) throw new ArgumentNullException("entity");
if (entity == null) throw new ArgumentNullException(nameof(entity));
try
{
@@ -106,7 +100,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void Update(TEntity entity, Action<TEntity> persistUpdated)
{
if (entity == null) throw new ArgumentNullException("entity");
if (entity == null) throw new ArgumentNullException(nameof(entity));
try
{
@@ -138,7 +132,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void Delete(TEntity entity, Action<TEntity> persistDeleted)
{
if (entity == null) throw new ArgumentNullException("entity");
if (entity == null) throw new ArgumentNullException(nameof(entity));
try
{
@@ -244,7 +238,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void ClearAll()
{
Cache.ClearAllCache();
Cache.ClearCacheByKeySearch(GetEntityTypeCacheKey());
}
}
}
}
@@ -0,0 +1,147 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
internal class DictionaryCacheProvider : ICacheProvider
{
private readonly ConcurrentDictionary<string, Lazy<object>> _items
= new ConcurrentDictionary<string, Lazy<object>>();
// for tests
internal ConcurrentDictionary<string, Lazy<object>> Items => _items;
public void ClearAllCache()
{
_items.Clear();
}
public void ClearCacheItem(string key)
{
_items.TryRemove(key, out _);
}
public void ClearCacheObjectTypes(string typeName)
{
var type = TypeFinder.GetTypeByName(typeName);
if (type == null) return;
var isInterface = type.IsInterface;
foreach (var kvp in _items
.Where(x =>
{
// entry.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue(x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
return value == null || (isInterface ? (type.IsInstanceOfType(value)) : (value.GetType() == type));
}))
_items.TryRemove(kvp.Key, out _);
}
public void ClearCacheObjectTypes<T>()
{
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
foreach (var kvp in _items
.Where(x =>
{
// entry.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// compare on exact type, don't use "is"
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue(x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
return value == null || (isInterface ? (value is T) : (value.GetType() == typeOfT));
}))
_items.TryRemove(kvp.Key, out _);
}
public void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
{
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
foreach (var kvp in _items
.Where(x =>
{
// entry.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// compare on exact type, don't use "is"
// get non-created as NonCreatedValue & exceptions as null
var value = DictionaryCacheProviderBase.GetSafeLazyValue(x.Value, true);
if (value == null) return true;
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
return (isInterface ? (value is T) : (value.GetType() == typeOfT))
// run predicate on the 'public key' part only, ie without prefix
&& predicate(x.Key, (T)value);
}))
_items.TryRemove(kvp.Key, out _);
}
public void ClearCacheByKeySearch(string keyStartsWith)
{
foreach (var ikvp in _items
.Where(kvp => kvp.Key.InvariantStartsWith(keyStartsWith)))
_items.TryRemove(ikvp.Key, out _);
}
public void ClearCacheByKeyExpression(string regexString)
{
foreach (var ikvp in _items
.Where(kvp => Regex.IsMatch(kvp.Key, regexString)))
_items.TryRemove(ikvp.Key, out _);
}
public IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
return _items
.Where(kvp => kvp.Key.InvariantStartsWith(keyStartsWith))
.Select(kvp => DictionaryCacheProviderBase.GetSafeLazyValue(kvp.Value))
.Where(x => x != null);
}
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
return _items
.Where(kvp => Regex.IsMatch(kvp.Key, regexString))
.Select(kvp => DictionaryCacheProviderBase.GetSafeLazyValue(kvp.Value))
.Where(x => x != null);
}
public object GetCacheItem(string cacheKey)
{
_items.TryGetValue(cacheKey, out var result); // else null
return result == null ? null : DictionaryCacheProviderBase.GetSafeLazyValue(result); // return exceptions as null
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
var result = _items.GetOrAdd(cacheKey, k => DictionaryCacheProviderBase.GetSafeLazy(getCacheItem));
var value = result.Value; // will not throw (safe lazy)
if (!(value is DictionaryCacheProviderBase.ExceptionHolder eh))
return value;
// and... it's in the cache anyway - so contrary to other cache providers,
// which would trick with GetSafeLazyValue, we need to remove by ourselves,
// in order NOT to cache exceptions
_items.TryRemove(cacheKey, out result);
eh.Exception.Throw(); // throw once!
return null; // never reached
}
}
}
@@ -2,7 +2,9 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.ExceptionServices;
using System.Text.RegularExpressions;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
@@ -22,8 +24,13 @@ namespace Umbraco.Core.Cache
protected abstract object GetEntry(string key);
// read-write lock the underlying cache
protected abstract IDisposable ReadLock { get; }
protected abstract IDisposable WriteLock { get; }
//protected abstract IDisposable ReadLock { get; }
//protected abstract IDisposable WriteLock { get; }
protected abstract void EnterReadLock();
protected abstract void ExitReadLock();
protected abstract void EnterWriteLock();
protected abstract void ExitWriteLock();
protected string GetCacheKey(string key)
{
@@ -44,7 +51,7 @@ namespace Umbraco.Core.Cache
}
catch (Exception e)
{
return new ExceptionHolder(e);
return new ExceptionHolder(ExceptionDispatchInfo.Capture(e));
}
});
}
@@ -74,33 +81,43 @@ namespace Umbraco.Core.Cache
internal class ExceptionHolder
{
public ExceptionHolder(Exception e)
public ExceptionHolder(ExceptionDispatchInfo e)
{
Exception = e;
}
public Exception Exception { get; private set; }
public ExceptionDispatchInfo Exception { get; }
}
#region Clear
public virtual void ClearAllCache()
{
using (WriteLock)
try
{
EnterWriteLock();
foreach (var entry in GetDictionaryEntries()
.ToArray())
RemoveEntry((string) entry.Key);
}
finally
{
ExitWriteLock();
}
}
public virtual void ClearCacheItem(string key)
{
var cacheKey = GetCacheKey(key);
using (WriteLock)
try
{
EnterWriteLock();
RemoveEntry(cacheKey);
}
finally
{
ExitWriteLock();
}
}
public virtual void ClearCacheObjectTypes(string typeName)
@@ -108,15 +125,16 @@ namespace Umbraco.Core.Cache
var type = TypeFinder.GetTypeByName(typeName);
if (type == null) return;
var isInterface = type.IsInterface;
using (WriteLock)
try
{
EnterWriteLock();
foreach (var entry in GetDictionaryEntries()
.Where(x =>
{
// entry.Value is Lazy<object> and not null, its value may be null
// remove null values as well, does not hurt
// get non-created as NonCreatedValue & exceptions as null
var value = GetSafeLazyValue((Lazy<object>)x.Value, true);
var value = GetSafeLazyValue((Lazy<object>) x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
@@ -125,14 +143,19 @@ namespace Umbraco.Core.Cache
.ToArray())
RemoveEntry((string) entry.Key);
}
finally
{
ExitWriteLock();
}
}
public virtual void ClearCacheObjectTypes<T>()
{
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
using (WriteLock)
try
{
EnterWriteLock();
foreach (var entry in GetDictionaryEntries()
.Where(x =>
{
@@ -140,7 +163,7 @@ namespace Umbraco.Core.Cache
// remove null values as well, does not hurt
// compare on exact type, don't use "is"
// get non-created as NonCreatedValue & exceptions as null
var value = GetSafeLazyValue((Lazy<object>)x.Value, true);
var value = GetSafeLazyValue((Lazy<object>) x.Value, true);
// if T is an interface remove anything that implements that interface
// otherwise remove exact types (not inherited types)
@@ -149,6 +172,10 @@ namespace Umbraco.Core.Cache
.ToArray())
RemoveEntry((string) entry.Key);
}
finally
{
ExitWriteLock();
}
}
public virtual void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
@@ -156,8 +183,9 @@ namespace Umbraco.Core.Cache
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
var plen = CacheItemPrefix.Length + 1;
using (WriteLock)
try
{
EnterWriteLock();
foreach (var entry in GetDictionaryEntries()
.Where(x =>
{
@@ -165,7 +193,7 @@ namespace Umbraco.Core.Cache
// remove null values as well, does not hurt
// compare on exact type, don't use "is"
// get non-created as NonCreatedValue & exceptions as null
var value = GetSafeLazyValue((Lazy<object>)x.Value, true);
var value = GetSafeLazyValue((Lazy<object>) x.Value, true);
if (value == null) return true;
// if T is an interface remove anything that implements that interface
@@ -176,30 +204,44 @@ namespace Umbraco.Core.Cache
}))
RemoveEntry((string) entry.Key);
}
finally
{
ExitWriteLock();
}
}
public virtual void ClearCacheByKeySearch(string keyStartsWith)
{
var plen = CacheItemPrefix.Length + 1;
using (WriteLock)
try
{
EnterWriteLock();
foreach (var entry in GetDictionaryEntries()
.Where(x => ((string)x.Key).Substring(plen).InvariantStartsWith(keyStartsWith))
.ToArray())
RemoveEntry((string) entry.Key);
}
finally
{
ExitWriteLock();
}
}
public virtual void ClearCacheByKeyExpression(string regexString)
{
var plen = CacheItemPrefix.Length + 1;
using (WriteLock)
try
{
EnterWriteLock();
foreach (var entry in GetDictionaryEntries()
.Where(x => Regex.IsMatch(((string)x.Key).Substring(plen), regexString))
.ToArray())
RemoveEntry((string) entry.Key);
}
finally
{
ExitWriteLock();
}
}
#endregion
@@ -210,12 +252,18 @@ namespace Umbraco.Core.Cache
{
var plen = CacheItemPrefix.Length + 1;
IEnumerable<DictionaryEntry> entries;
using (ReadLock)
try
{
EnterReadLock();
entries = GetDictionaryEntries()
.Where(x => ((string)x.Key).Substring(plen).InvariantStartsWith(keyStartsWith))
.ToArray(); // evaluate while locked
}
finally
{
ExitReadLock();
}
return entries
.Select(x => GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null); // backward compat, don't store null values in the cache
@@ -226,12 +274,17 @@ namespace Umbraco.Core.Cache
const string prefix = CacheItemPrefix + "-";
var plen = prefix.Length;
IEnumerable<DictionaryEntry> entries;
using (ReadLock)
try
{
EnterReadLock();
entries = GetDictionaryEntries()
.Where(x => Regex.IsMatch(((string)x.Key).Substring(plen), regexString))
.ToArray(); // evaluate while locked
}
finally
{
ExitReadLock();
}
return entries
.Select(x => GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null); // backward compat, don't store null values in the cache
@@ -241,10 +294,15 @@ namespace Umbraco.Core.Cache
{
cacheKey = GetCacheKey(cacheKey);
Lazy<object> result;
using (ReadLock)
try
{
EnterReadLock();
result = GetEntry(cacheKey) as Lazy<object>; // null if key not found
}
finally
{
ExitReadLock();
}
return result == null ? null : GetSafeLazyValue(result); // return exceptions as null
}
@@ -252,4 +310,4 @@ namespace Umbraco.Core.Cache
#endregion
}
}
}
@@ -1,8 +1,8 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Collections;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Cache
@@ -19,28 +19,23 @@ namespace Umbraco.Core.Cache
/// keep as a whole in memory.</para>
/// </remarks>
internal class FullDataSetRepositoryCachePolicy<TEntity, TId> : RepositoryCachePolicyBase<TEntity, TId>
where TEntity : class, IAggregateRoot
where TEntity : class, IEntity
{
private readonly Func<TEntity, TId> _entityGetId;
private readonly bool _expires;
public FullDataSetRepositoryCachePolicy(IRuntimeCacheProvider cache, Func<TEntity, TId> entityGetId, bool expires)
: base(cache)
public FullDataSetRepositoryCachePolicy(IRuntimeCacheProvider cache, IScopeAccessor scopeAccessor, Func<TEntity, TId> entityGetId, bool expires)
: base(cache, scopeAccessor)
{
_entityGetId = entityGetId;
_expires = expires;
}
public override IRepositoryCachePolicy<TEntity, TId> Scoped(IRuntimeCacheProvider runtimeCache, IScope scope)
{
return new ScopedRepositoryCachePolicy<TEntity, TId>(this, runtimeCache, scope);
}
protected static readonly TId[] EmptyIds = new TId[0]; // const
protected string GetEntityTypeCacheKey()
{
return string.Format("uRepo_{0}_", typeof(TEntity).Name);
return $"uRepo_{typeof (TEntity).Name}_";
}
protected void InsertEntities(TEntity[] entities)
@@ -56,20 +51,22 @@ namespace Umbraco.Core.Cache
// set to ListCloneBehavior.CloneOnce ie it will clone *once* when inserting,
// and then will *not* clone when retrieving.
var key = GetEntityTypeCacheKey();
if (_expires)
{
Cache.InsertCacheItem(GetEntityTypeCacheKey(), () => new DeepCloneableList<TEntity>(entities), TimeSpan.FromMinutes(5), true);
Cache.InsertCacheItem(key, () => new DeepCloneableList<TEntity>(entities), TimeSpan.FromMinutes(5), true);
}
else
{
Cache.InsertCacheItem(GetEntityTypeCacheKey(), () => new DeepCloneableList<TEntity>(entities));
Cache.InsertCacheItem(key, () => new DeepCloneableList<TEntity>(entities));
}
}
/// <inheritdoc />
public override void Create(TEntity entity, Action<TEntity> persistNew)
{
if (entity == null) throw new ArgumentNullException("entity");
if (entity == null) throw new ArgumentNullException(nameof(entity));
try
{
@@ -84,7 +81,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void Update(TEntity entity, Action<TEntity> persistUpdated)
{
if (entity == null) throw new ArgumentNullException("entity");
if (entity == null) throw new ArgumentNullException(nameof(entity));
try
{
@@ -99,7 +96,7 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public override void Delete(TEntity entity, Action<TEntity> persistDeleted)
{
if (entity == null) throw new ArgumentNullException("entity");
if (entity == null) throw new ArgumentNullException(nameof(entity));
try
{
@@ -120,7 +117,7 @@ namespace Umbraco.Core.Cache
// see note in InsertEntities - what we get here is the original
// cached entity, not a clone, so we need to manually ensure it is deep-cloned.
return entity == null ? null : (TEntity) entity.DeepClone();
return (TEntity)entity?.DeepClone();
}
/// <inheritdoc />
@@ -128,11 +125,11 @@ namespace Umbraco.Core.Cache
{
// get all from the cache -- and only the cache, then look for the entity
var all = Cache.GetCacheItem<DeepCloneableList<TEntity>>(GetEntityTypeCacheKey());
var entity = all == null ? null : all.FirstOrDefault(x => _entityGetId(x).Equals(id));
var entity = all?.FirstOrDefault(x => _entityGetId(x).Equals(id));
// see note in InsertEntities - what we get here is the original
// cached entity, not a clone, so we need to manually ensure it is deep-cloned.
return entity == null ? null : (TEntity)entity.DeepClone();
return (TEntity) entity?.DeepClone();
}
/// <inheritdoc />
@@ -159,7 +156,7 @@ namespace Umbraco.Core.Cache
}
// does NOT clone anything, so be nice with the returned values
private IEnumerable<TEntity> GetAllCached(Func<TId[], IEnumerable<TEntity>> performGetAll)
internal IEnumerable<TEntity> GetAllCached(Func<TId[], IEnumerable<TEntity>> performGetAll)
{
// try the cache first
var all = Cache.GetCacheItem<DeepCloneableList<TEntity>>(GetEntityTypeCacheKey());
@@ -177,4 +174,4 @@ namespace Umbraco.Core.Cache
Cache.ClearCacheItem(GetEntityTypeCacheKey());
}
}
}
}
@@ -79,24 +79,26 @@ namespace Umbraco.Core.Cache
#region Lock
protected override IDisposable ReadLock
private bool _entered;
protected override void EnterReadLock() => EnterWriteLock();
protected override void EnterWriteLock()
{
// there's no difference between ReadLock and WriteLock here
get { return WriteLock; }
if (HasContextItems)
{
System.Threading.Monitor.Enter(ContextItems.SyncRoot, ref _entered);
}
}
protected override IDisposable WriteLock
{
// NOTE
// could think about just overriding base.Locker to return a different
// object but then we'd create a ReaderWriterLockSlim per request,
// which is less efficient than just using a basic monitor lock.
protected override void ExitReadLock() => ExitWriteLock();
get
protected override void ExitWriteLock()
{
if (_entered)
{
return HasContextItems
? (IDisposable) new MonitorLock(ContextItems.SyncRoot)
: new NoopLocker();
_entered = false;
System.Threading.Monitor.Exit(ContextItems.SyncRoot);
}
}
@@ -113,8 +115,9 @@ namespace Umbraco.Core.Cache
Lazy<object> result;
using (WriteLock)
try
{
EnterWriteLock();
result = ContextItems[cacheKey] as Lazy<object>; // null if key not found
// cannot create value within the lock, so if result.IsValueCreated is false, just
@@ -127,6 +130,10 @@ namespace Umbraco.Core.Cache
ContextItems[cacheKey] = result;
}
}
finally
{
ExitWriteLock();
}
// using GetSafeLazy and GetSafeLazyValue ensures that we don't cache
// exceptions (but try again and again) and silently eat them - however at
@@ -136,8 +143,7 @@ namespace Umbraco.Core.Cache
//return result.Value;
var value = result.Value; // will not throw (safe lazy)
var eh = value as ExceptionHolder;
if (eh != null) throw eh.Exception; // throw once!
if (value is ExceptionHolder eh) eh.Exception.Throw(); // throw once!
return value;
}
@@ -152,4 +158,4 @@ namespace Umbraco.Core.Cache
{ }
}
}
}
}
@@ -50,14 +50,26 @@ namespace Umbraco.Core.Cache
#region Lock
protected override IDisposable ReadLock
protected override void EnterReadLock()
{
get { return new ReadLock(_locker); }
_locker.EnterReadLock();
}
protected override IDisposable WriteLock
protected override void EnterWriteLock()
{
get { return new WriteLock(_locker); }
_locker.EnterWriteLock();;
}
protected override void ExitReadLock()
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
protected override void ExitWriteLock()
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
#endregion
@@ -98,7 +110,7 @@ namespace Umbraco.Core.Cache
// on the Lazy lock to ensure that getCacheItem runs once and everybody waits on it, while the global
// application lock has been released.
// NOTE
// NOTE
// The Lazy value creation may produce a null value.
// Must make sure (for backward compatibility) that we pretend they are not in the cache.
// So if we find an entry in the cache that already has its value created and is null,
@@ -118,10 +130,16 @@ namespace Umbraco.Core.Cache
// reads. We first try with a normal ReadLock for maximum concurrency and take the penalty of
// having to re-lock in case there's no value. Would need to benchmark to figure out whether
// it's worth it, though...
using (new ReadLock(_locker))
try
{
_locker.EnterReadLock();
result = _cache.Get(cacheKey) as Lazy<object>; // null if key not found
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
var value = result == null ? null : GetSafeLazyValue(result);
if (value != null) return value;
@@ -153,8 +171,7 @@ namespace Umbraco.Core.Cache
//return result.Value;
value = result.Value; // will not throw (safe lazy)
var eh = value as ExceptionHolder;
if (eh != null) throw new Exception("Exception while creating a value.", eh.Exception); // throw once!
if (value is ExceptionHolder eh) eh.Exception.Throw(); // throw once!
return value;
}
@@ -196,11 +213,17 @@ namespace Umbraco.Core.Cache
var absolute = isSliding ? System.Web.Caching.Cache.NoAbsoluteExpiration : (timeout == null ? System.Web.Caching.Cache.NoAbsoluteExpiration : DateTime.Now.Add(timeout.Value));
var sliding = isSliding == false ? System.Web.Caching.Cache.NoSlidingExpiration : (timeout ?? System.Web.Caching.Cache.NoSlidingExpiration);
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
//NOTE: 'Insert' on System.Web.Caching.Cache actually does an add or update!
_cache.Insert(cacheKey, result, dependency, absolute, sliding, priority, removedCallback);
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
public void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
@@ -215,4 +238,4 @@ namespace Umbraco.Core.Cache
#endregion
}
}
}
+1 -1
View File
@@ -55,7 +55,7 @@ namespace Umbraco.Core.Cache
IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith);
IEnumerable<object> GetCacheItemsByKeyExpression(string regexString);
/// <summary>
/// Returns an item with a given key
/// </summary>
+18 -3
View File
@@ -1,18 +1,33 @@
using umbraco.interfaces;
using System;
using Umbraco.Core.Composing;
namespace Umbraco.Core.Cache
{
/// <summary>
/// The IcacheRefresher Interface is used for loadbalancing.
///
/// </summary>
public interface ICacheRefresher : IDiscoverable
{
Guid RefresherUniqueId { get; }
string Name { get; }
void RefreshAll();
void Refresh(int id);
void Remove(int id);
void Refresh(Guid id);
}
/// <summary>
/// Strongly type cache refresher that is able to refresh cache of real instances of objects as well as IDs
/// </summary>
/// <typeparam name="T"></typeparam>
/// <remarks>
/// This is much better for performance when we're not running in a load balanced environment so we can refresh the cache
/// against a already resolved object instead of looking the object back up by id.
/// against a already resolved object instead of looking the object back up by id.
/// </remarks>
interface ICacheRefresher<T> : ICacheRefresher
{
void Refresh(T instance);
void Remove(T instance);
}
}
}
@@ -1,6 +1,4 @@
using umbraco.interfaces;
namespace Umbraco.Core.Cache
namespace Umbraco.Core.Cache
{
/// <summary>
/// A cache refresher that supports refreshing or removing cache based on a custom Json payload
@@ -10,7 +8,7 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Refreshes, clears, etc... any cache based on the information provided in the json
/// </summary>
/// <param name="jsonPayload"></param>
void Refresh(string jsonPayload);
/// <param name="json"></param>
void Refresh(string json);
}
}
}
@@ -1,16 +1,14 @@
using umbraco.interfaces;
namespace Umbraco.Core.Cache
namespace Umbraco.Core.Cache
{
/// <summary>
/// A cache refresher that supports refreshing cache based on a custom payload
/// </summary>
interface IPayloadCacheRefresher : IJsonCacheRefresher
interface IPayloadCacheRefresher<TPayload> : IJsonCacheRefresher
{
/// <summary>
/// Refreshes, clears, etc... any cache based on the information provided in the payload
/// </summary>
/// <param name="payload"></param>
void Refresh(object payload);
/// <param name="payloads"></param>
void Refresh(TPayload[] payloads);
}
}
@@ -1,33 +1,13 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Cache
{
internal interface IRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IAggregateRoot
where TEntity : class, IEntity
{
// note:
// at the moment each repository instance creates its corresponding cache policy instance
// we could reduce allocations by using static cache policy instances but then we would need
// to modify all methods here to pass the repository and cache eg:
//
// TEntity Get(TRepository repository, IRuntimeCacheProvider cache, TId id);
//
// it is not *that* complicated but then RepositoryBase needs to have a TRepository generic
// type parameter and it all becomes convoluted - keeping it simple for the time being.
/// <summary>
/// Creates a scoped version of this cache policy.
/// </summary>
/// <param name="runtimeCache">The global isolated runtime cache for this policy.</param>
/// <param name="scope">The scope.</param>
/// <remarks>When a policy is scoped, it means that it has been created with a scoped
/// isolated runtime cache, and now it needs to be wrapped into something that can apply
/// changes to the global isolated runtime cache.</remarks>
IRepositoryCachePolicy<TEntity, TId> Scoped(IRuntimeCacheProvider runtimeCache, IScope scope);
/// <summary>
/// Gets an entity from the cache, else from the repository.
/// </summary>
@@ -94,4 +74,4 @@ namespace Umbraco.Core.Cache
/// </summary>
void ClearAll();
}
}
}
@@ -14,8 +14,8 @@ namespace Umbraco.Core.Cache
public interface IRuntimeCacheProvider : ICacheProvider
{
object GetCacheItem(
string cacheKey,
Func<object> getCacheItem,
string cacheKey,
Func<object> getCacheItem,
TimeSpan? timeout,
bool isSliding = false,
CacheItemPriority priority = CacheItemPriority.Normal,
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Concurrent;
namespace Umbraco.Core.Cache
@@ -7,7 +7,7 @@ namespace Umbraco.Core.Cache
/// Used to get/create/manipulate isolated runtime cache
/// </summary>
/// <remarks>
/// This is useful for repository level caches to ensure that cache lookups by key are fast so
/// This is useful for repository level caches to ensure that cache lookups by key are fast so
/// that the repository doesn't need to search through all keys on a global scale.
/// </remarks>
public class IsolatedRuntimeCache
@@ -29,7 +29,7 @@ namespace Umbraco.Core.Cache
/// Returns an isolated runtime cache for a given type
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
/// <returns></returns>
public IRuntimeCacheProvider GetOrCreateCache<T>()
{
return _isolatedCache.GetOrAdd(typeof(T), type => CacheFactory(type));
@@ -38,7 +38,7 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Returns an isolated runtime cache for a given type
/// </summary>
/// <returns></returns>
/// <returns></returns>
public IRuntimeCacheProvider GetOrCreateCache(Type type)
{
return _isolatedCache.GetOrAdd(type, t => CacheFactory(t));
@@ -88,4 +88,4 @@ namespace Umbraco.Core.Cache
}
}
}
}
}
@@ -1,19 +1,29 @@
using Umbraco.Core.Sync;
using umbraco.interfaces;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Provides a base class for "json" cache refreshers.
/// A base class for "json" cache refreshers.
/// </summary>
/// <typeparam name="TInstance">The actual cache refresher type.</typeparam>
/// <remarks>Ensures that the correct events are raised when cache refreshing occurs.</remarks>
public abstract class JsonCacheRefresherBase<TInstance> : CacheRefresherBase<TInstance>, IJsonCacheRefresher
where TInstance : ICacheRefresher
{
/// <typeparam name="TInstanceType">The actual cache refresher type.</typeparam>
/// <remarks>The actual cache refresher type is used for strongly typed events.</remarks>
public abstract class JsonCacheRefresherBase<TInstanceType> : CacheRefresherBase<TInstanceType>, IJsonCacheRefresher
where TInstanceType : class, ICacheRefresher
{
/// <summary>
/// Initializes a new instance of the <see cref="JsonCacheRefresherBase{TInstanceType}"/>.
/// </summary>
/// <param name="cacheHelper">A cache helper.</param>
protected JsonCacheRefresherBase(CacheHelper cacheHelper) : base(cacheHelper)
{ }
/// <summary>
/// Refreshes as specified by a json payload.
/// </summary>
/// <param name="json">The json payload.</param>
public virtual void Refresh(string json)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(json, MessageType.RefreshByJson));
{
OnCacheUpdated(This, new CacheRefresherEventArgs(json, MessageType.RefreshByJson));
}
}
}
}
@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Cache
{
internal class NoCacheRepositoryCachePolicy<TEntity, TId> : IRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IEntity
{
private NoCacheRepositoryCachePolicy() { }
public static NoCacheRepositoryCachePolicy<TEntity, TId> Instance { get; } = new NoCacheRepositoryCachePolicy<TEntity, TId>();
public IRepositoryCachePolicy<TEntity, TId> Scoped(IRuntimeCacheProvider runtimeCache, IScope scope)
{
throw new NotImplementedException();
}
public TEntity Get(TId id, Func<TId, TEntity> performGet, Func<TId[], IEnumerable<TEntity>> performGetAll)
{
return performGet(id);
}
public TEntity GetCached(TId id)
{
return null;
}
public bool Exists(TId id, Func<TId, bool> performExists, Func<TId[], IEnumerable<TEntity>> performGetAll)
{
return performExists(id);
}
public void Create(TEntity entity, Action<TEntity> persistNew)
{
persistNew(entity);
}
public void Update(TEntity entity, Action<TEntity> persistUpdated)
{
persistUpdated(entity);
}
public void Delete(TEntity entity, Action<TEntity> persistDeleted)
{
persistDeleted(entity);
}
public TEntity[] GetAll(TId[] ids, Func<TId[], IEnumerable<TEntity>> performGetAll)
{
return performGetAll(ids).ToArray();
}
public void ClearAll()
{ }
}
}
@@ -1,62 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Cache
{
internal class NoRepositoryCachePolicy<TEntity, TId> : IRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IAggregateRoot
{
private static readonly NoRepositoryCachePolicy<TEntity, TId> StaticInstance = new NoRepositoryCachePolicy<TEntity, TId>();
private NoRepositoryCachePolicy()
{ }
public static NoRepositoryCachePolicy<TEntity, TId> Instance { get { return StaticInstance; } }
public IRepositoryCachePolicy<TEntity, TId> Scoped(IRuntimeCacheProvider runtimeCache, IScope scope)
{
throw new NotImplementedException();
}
public TEntity Get(TId id, Func<TId, TEntity> performGet, Func<TId[], IEnumerable<TEntity>> performGetAll)
{
return performGet(id);
}
public TEntity GetCached(TId id)
{
return null;
}
public bool Exists(TId id, Func<TId, bool> performExists, Func<TId[], IEnumerable<TEntity>> performGetAll)
{
return performExists(id);
}
public void Create(TEntity entity, Action<TEntity> persistNew)
{
persistNew(entity);
}
public void Update(TEntity entity, Action<TEntity> persistUpdated)
{
persistUpdated(entity);
}
public void Delete(TEntity entity, Action<TEntity> persistDeleted)
{
persistDeleted(entity);
}
public TEntity[] GetAll(TId[] ids, Func<TId[], IEnumerable<TEntity>> performGetAll)
{
return performGetAll(ids).ToArray();
}
public void ClearAll()
{ }
}
}
+5 -1
View File
@@ -10,6 +10,10 @@ namespace Umbraco.Core.Cache
/// </summary>
public class NullCacheProvider : IRuntimeCacheProvider
{
private NullCacheProvider() { }
public static NullCacheProvider Instance { get; } = new NullCacheProvider();
public virtual void ClearAllCache()
{ }
@@ -59,4 +63,4 @@ namespace Umbraco.Core.Cache
public void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{ }
}
}
}
@@ -5,6 +5,7 @@ using System.Runtime.Caching;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web.Caching;
using Umbraco.Core.Composing;
using CacheItemPriority = System.Web.Caching.CacheItemPriority;
namespace Umbraco.Core.Cache
@@ -36,20 +37,32 @@ namespace Umbraco.Core.Cache
public virtual void ClearAllCache()
{
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
MemoryCache.DisposeIfDisposable();
MemoryCache = new MemoryCache("in-memory");
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
public virtual void ClearCacheItem(string key)
{
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
if (MemoryCache[key] == null) return;
MemoryCache.Remove(key);
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
public virtual void ClearCacheObjectTypes(string typeName)
@@ -57,8 +70,9 @@ namespace Umbraco.Core.Cache
var type = TypeFinder.GetTypeByName(typeName);
if (type == null) return;
var isInterface = type.IsInterface;
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
foreach (var key in MemoryCache
.Where(x =>
{
@@ -75,12 +89,18 @@ namespace Umbraco.Core.Cache
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
public virtual void ClearCacheObjectTypes<T>()
{
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
var typeOfT = typeof (T);
var isInterface = typeOfT.IsInterface;
foreach (var key in MemoryCache
@@ -100,12 +120,18 @@ namespace Umbraco.Core.Cache
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
public virtual void ClearCacheObjectTypes<T>(Func<string, T, bool> predicate)
{
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
var typeOfT = typeof(T);
var isInterface = typeOfT.IsInterface;
foreach (var key in MemoryCache
@@ -126,30 +152,47 @@ namespace Umbraco.Core.Cache
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
public virtual void ClearCacheByKeySearch(string keyStartsWith)
{
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
foreach (var key in MemoryCache
.Where(x => x.Key.InvariantStartsWith(keyStartsWith))
.Select(x => x.Key)
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
public virtual void ClearCacheByKeyExpression(string regexString)
{
using (new WriteLock(_locker))
try
{
_locker.EnterWriteLock();
foreach (var key in MemoryCache
.Where(x => Regex.IsMatch(x.Key, regexString))
.Select(x => x.Key)
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
}
finally
{
if (_locker.IsWriteLockHeld)
_locker.ExitWriteLock();
}
}
#endregion
@@ -159,12 +202,18 @@ namespace Umbraco.Core.Cache
public IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
KeyValuePair<string, object>[] entries;
using (new ReadLock(_locker))
try
{
_locker.EnterReadLock();
entries = MemoryCache
.Where(x => x.Key.InvariantStartsWith(keyStartsWith))
.ToArray(); // evaluate while locked
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return entries
.Select(x => DictionaryCacheProviderBase.GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null) // backward compat, don't store null values in the cache
@@ -174,12 +223,18 @@ namespace Umbraco.Core.Cache
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
KeyValuePair<string, object>[] entries;
using (new ReadLock(_locker))
try
{
_locker.EnterReadLock();
entries = MemoryCache
.Where(x => Regex.IsMatch(x.Key, regexString))
.ToArray(); // evaluate while locked
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return entries
.Select(x => DictionaryCacheProviderBase.GetSafeLazyValue((Lazy<object>)x.Value)) // return exceptions as null
.Where(x => x != null) // backward compat, don't store null values in the cache
@@ -189,10 +244,16 @@ namespace Umbraco.Core.Cache
public object GetCacheItem(string cacheKey)
{
Lazy<object> result;
using (new ReadLock(_locker))
try
{
_locker.EnterReadLock();
result = MemoryCache.Get(cacheKey) as Lazy<object>; // null if key not found
}
finally
{
if (_locker.IsReadLockHeld)
_locker.ExitReadLock();
}
return result == null ? null : DictionaryCacheProviderBase.GetSafeLazyValue(result); // return exceptions as null
}
@@ -224,8 +285,7 @@ namespace Umbraco.Core.Cache
//return result.Value;
var value = result.Value; // will not throw (safe lazy)
var eh = value as DictionaryCacheProviderBase.ExceptionHolder;
if (eh != null) throw eh.Exception; // throw once!
if (value is DictionaryCacheProviderBase.ExceptionHolder eh) eh.Exception.Throw(); // throw once!
return value;
}
@@ -296,4 +356,4 @@ namespace Umbraco.Core.Cache
return policy;
}
}
}
}
@@ -1,17 +1,39 @@
using Umbraco.Core.Sync;
using umbraco.interfaces;
using Newtonsoft.Json;
using Umbraco.Core.Sync;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Provides a base class for "payload" cache refreshers.
/// A base class for "payload" class refreshers.
/// </summary>
/// <typeparam name="TInstance">The actual cache refresher type.</typeparam>
/// <remarks>Ensures that the correct events are raised when cache refreshing occurs.</remarks>
public abstract class PayloadCacheRefresherBase<TInstance> : JsonCacheRefresherBase<TInstance>, IPayloadCacheRefresher
where TInstance : ICacheRefresher
/// <typeparam name="TInstanceType">The actual cache refresher type.</typeparam>
/// <typeparam name="TPayload">The payload type.</typeparam>
/// <remarks>The actual cache refresher type is used for strongly typed events.</remarks>
public abstract class PayloadCacheRefresherBase<TInstanceType, TPayload> : JsonCacheRefresherBase<TInstanceType>, IPayloadCacheRefresher<TPayload>
where TInstanceType : class, ICacheRefresher
{
protected abstract object Deserialize(string json);
/// <summary>
/// Initializes a new instance of the <see cref="PayloadCacheRefresherBase{TInstanceType, TPayload}"/>.
/// </summary>
/// <param name="cacheHelper">A cache helper.</param>
protected PayloadCacheRefresherBase(CacheHelper cacheHelper) : base(cacheHelper)
{ }
#region Json
/// <summary>
/// Deserializes a json payload into an object payload.
/// </summary>
/// <param name="json">The json payload.</param>
/// <returns>The deserialized object payload.</returns>
protected virtual TPayload[] Deserialize(string json)
{
return JsonConvert.DeserializeObject<TPayload[]>(json);
}
#endregion
#region Refresher
public override void Refresh(string json)
{
@@ -19,9 +41,15 @@ namespace Umbraco.Core.Cache
Refresh(payload);
}
public virtual void Refresh(object payload)
/// <summary>
/// Refreshes as specified by a payload.
/// </summary>
/// <param name="payloads">The payload.</param>
public virtual void Refresh(TPayload[] payloads)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(payload, MessageType.RefreshByPayload));
OnCacheUpdated(This, new CacheRefresherEventArgs(payloads, MessageType.RefreshByPayload));
}
#endregion
}
}
@@ -1,6 +1,6 @@
using System;
using System;
using System.Collections.Generic;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Cache
@@ -11,17 +11,35 @@ namespace Umbraco.Core.Cache
/// <typeparam name="TEntity">The type of the entity.</typeparam>
/// <typeparam name="TId">The type of the identifier.</typeparam>
internal abstract class RepositoryCachePolicyBase<TEntity, TId> : IRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IAggregateRoot
where TEntity : class, IEntity
{
protected RepositoryCachePolicyBase(IRuntimeCacheProvider cache)
private readonly IRuntimeCacheProvider _globalCache;
private readonly IScopeAccessor _scopeAccessor;
protected RepositoryCachePolicyBase(IRuntimeCacheProvider globalCache, IScopeAccessor scopeAccessor)
{
if (cache == null) throw new ArgumentNullException("cache");
Cache = cache;
_globalCache = globalCache ?? throw new ArgumentNullException(nameof(globalCache));
_scopeAccessor = scopeAccessor ?? throw new ArgumentNullException(nameof(scopeAccessor));
}
public abstract IRepositoryCachePolicy<TEntity, TId> Scoped(IRuntimeCacheProvider runtimeCache, IScope scope);
protected IRuntimeCacheProvider Cache { get; private set; }
protected IRuntimeCacheProvider Cache
{
get
{
var ambientScope = _scopeAccessor.AmbientScope;
switch (ambientScope.RepositoryCacheMode)
{
case RepositoryCacheMode.Default:
return _globalCache;
case RepositoryCacheMode.Scoped:
return ambientScope.IsolatedRuntimeCache.GetOrCreateCache<TEntity>();
case RepositoryCacheMode.None:
return NullCacheProvider.Instance;
default:
throw new NotSupportedException($"Repository cache mode {ambientScope.RepositoryCacheMode} is not supported.");
}
}
}
/// <inheritdoc />
public abstract TEntity Get(TId id, Func<TId, TEntity> performGet, Func<TId[], IEnumerable<TEntity>> performGetAll);
@@ -46,6 +64,5 @@ namespace Umbraco.Core.Cache
/// <inheritdoc />
public abstract void ClearAll();
}
}
}
@@ -1,4 +1,4 @@
using System;
using System;
namespace Umbraco.Core.Cache
{
@@ -30,22 +30,22 @@ namespace Umbraco.Core.Cache
/// <summary>
/// Callback required to get count for GetAllCacheValidateCount
/// </summary>
public Func<int> PerformCount { get; private set; }
public Func<int> PerformCount { get; set; }
/// <summary>
/// True/false as to validate the total item count when all items are returned from cache, the default is true but this
/// means that a db lookup will occur - though that lookup will probably be significantly less expensive than the normal
/// GetAll method.
/// means that a db lookup will occur - though that lookup will probably be significantly less expensive than the normal
/// GetAll method.
/// </summary>
/// <remarks>
/// setting this to return false will improve performance of GetAll cache with no params but should only be used
/// for specific circumstances
/// </remarks>
public bool GetAllCacheValidateCount { get; private set; }
public bool GetAllCacheValidateCount { get; set; }
/// <summary>
/// True if the GetAll method will cache that there are zero results so that the db is not hit when there are no results found
/// </summary>
public bool GetAllCacheAllowZeroCount { get; set; }
}
}
}

Some files were not shown because too many files have changed in this diff Show More