├── .gitignore ├── ArtWork ├── Converted │ ├── AppIcon.png │ └── AppIcon32x32.png └── Original │ └── AppIcon.svg ├── AssemblyInfoGlobal.cs ├── CHANGELOG.md ├── GithubHistory ├── HISTORY.md ├── HISTORY.md.js └── node_modules │ ├── async │ ├── .travis.yml │ ├── LICENSE │ ├── README.md │ ├── component.json │ ├── lib │ │ └── async.js │ └── package.json │ ├── github │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── api │ │ ├── v2.0.0 │ │ │ └── routes.json │ │ └── v3.0.0 │ │ │ ├── authorization.js │ │ │ ├── authorizationTest.js │ │ │ ├── events.js │ │ │ ├── eventsTest.js │ │ │ ├── gists.js │ │ │ ├── gistsTest.js │ │ │ ├── gitdata.js │ │ │ ├── gitdataTest.js │ │ │ ├── gitignore.js │ │ │ ├── gitignoreTest.js │ │ │ ├── index.js │ │ │ ├── issues.js │ │ │ ├── issuesTest.js │ │ │ ├── markdown.js │ │ │ ├── markdownTest.js │ │ │ ├── misc.js │ │ │ ├── miscTest.js │ │ │ ├── orgs.js │ │ │ ├── orgsTest.js │ │ │ ├── pullRequests.js │ │ │ ├── pullRequestsTest.js │ │ │ ├── releases.js │ │ │ ├── releasesTest.js │ │ │ ├── repos.js │ │ │ ├── reposTest.js │ │ │ ├── routes.json │ │ │ ├── search.js │ │ │ ├── searchTest.js │ │ │ ├── statuses.js │ │ │ ├── statusesTest.js │ │ │ ├── user.js │ │ │ └── userTest.js │ ├── error.js │ ├── generate.js │ ├── index.js │ ├── package.json │ ├── seed.yml │ ├── templates │ │ ├── after_request.js.tpl │ │ ├── handler.js.tpl │ │ ├── index.js.tpl │ │ ├── section.js.tpl │ │ ├── test_handler.js.tpl │ │ └── test_section.js.tpl │ ├── test │ │ ├── client_test.js │ │ ├── example.js │ │ ├── oauth.js │ │ └── oauth_server.js │ └── util.js │ └── underscore │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── underscore-min.js │ └── underscore.js ├── License.rtf ├── MSMQCommander.sln ├── MSMQCommander ├── App.xaml ├── App.xaml.cs ├── AppBootstrapper.cs ├── Contex │ ├── CurrentSelectedQueueContext.cs │ └── QueueConnectionContext.cs ├── Dialogs │ └── DialogService.cs ├── Events │ ├── AutoRefreshEvent.cs │ ├── MessageDeletedEvent.cs │ ├── MessageSelectedEvent.cs │ ├── QueueClosedEvent.cs │ ├── QueueConnectionChangedEvent.cs │ ├── QueueDeletedEvent.cs │ ├── QueueMessageCountChangedEvent.cs │ ├── QueueSelectedEvent.cs │ └── RefreshQueuesEvent.cs ├── IShell.cs ├── Images │ └── AppIcon.ico ├── MSMQCommander.csproj ├── MSMQCommander_TemporaryKey.pfx ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── ShellView.xaml ├── ShellViewModel.cs ├── Utils │ ├── ConsoleLogger.cs │ ├── MessageQueueExtensions.cs │ ├── VersionInformation.cs │ └── ViewContentsFormattingExtensions.cs ├── ViewModels │ ├── DetailsView │ │ ├── DetailsViewModel.cs │ │ ├── MessageDetailsViewModel.cs │ │ ├── MessageGridRowViewModel.cs │ │ └── MessagesGridViewModel.cs │ ├── Dialogs │ │ ├── ConfigureConnectionViewModel.cs │ │ ├── CreateNewMessageViewModel.cs │ │ ├── CreateNewQueueViewModel.cs │ │ ├── ExportAllMessagesToQueueViewModel.cs │ │ └── ImportMessageBodyViewModel.cs │ └── TreeView │ │ ├── ComputerTreeNodeViewModel.cs │ │ ├── JournalQueueTreeNodeViewModel.cs │ │ ├── QueueTreeNodeViewModel.cs │ │ ├── QueueTypeTreeNodeViewModel.cs │ │ └── TreeViewModel.cs ├── Views │ ├── DetailsView.xaml │ ├── DetailsView.xaml.cs │ ├── Dialogs │ │ ├── ConfigureConnectionView.xaml │ │ ├── ConfigureConnectionView.xaml.cs │ │ ├── CreateNewMessageView.xaml │ │ ├── CreateNewMessageView.xaml.cs │ │ ├── CreateNewQueueView.xaml │ │ ├── CreateNewQueueView.xaml.cs │ │ ├── ExportAllMessagesToQueueView.xaml │ │ ├── ExportAllMessagesToQueueView.xaml.cs │ │ ├── ImportMessageBodyView.xaml │ │ └── ImportMessageBodyView.xaml.cs │ ├── MessageDetailsView.xaml │ ├── MessageDetailsView.xaml.cs │ ├── MessagesGridView.xaml │ ├── MessagesGridView.xaml.cs │ ├── TreeView.xaml │ └── TreeView.xaml.cs └── packages.config ├── MSMQCommanderSetup └── MSMQCommanderSetup.vdproj ├── MSMQWixInstaller ├── CreateMsi.cmd ├── CreateWxsFromProject.cmd ├── MSMQCommander.wixobj ├── MSMQCommander.wixpdb ├── MSMQCommander.wxs └── WixUIExtension.dll ├── MsmqLib.Tests ├── ArrangeActAssertTestBase.cs ├── MessageObjectTestClasses │ └── TestClass1.cs ├── MsmqLib.Tests.csproj ├── Properties │ └── AssemblyInfo.cs ├── QueueServiceTests │ ├── CreateMessageTests.cs │ ├── DeleteMessageTests.cs │ ├── GetJournalQueueTests.cs │ ├── GetMessageCountTests.cs │ ├── GetMessageInfosTests.cs │ └── QueueStatusQueryServiceTests.cs ├── QueueTestHelper.cs └── packages.config ├── MsmqLib ├── Guard.cs ├── Mapping │ └── MessageMapping.cs ├── MessageExtensions.cs ├── MessageInfo.cs ├── MessageQueueTransactionWrapper.cs ├── MsmqLib.csproj ├── Properties │ └── AssemblyInfo.cs ├── QueuePathHelper.cs └── QueueService.cs ├── Packages.dgml ├── README.md ├── TODO.md ├── lib ├── AvalonDock.Themes.dll └── AvalonDock.dll └── packages ├── Autofac.2.6.3.862 ├── Autofac.2.6.3.862.nupkg └── lib │ ├── NET35 │ ├── Autofac.Configuration.dll │ ├── Autofac.dll │ └── Autofac.xml │ ├── NET40 │ ├── Autofac.Configuration.dll │ ├── Autofac.dll │ └── Autofac.xml │ ├── SL3-WP │ ├── Autofac.dll │ └── Autofac.xml │ ├── SL4-WindowsPhone │ ├── Autofac.dll │ └── Autofac.xml │ ├── SL4-WindowsPhone71 │ ├── Autofac.dll │ └── Autofac.xml │ └── SL4 │ ├── Autofac.dll │ └── Autofac.xml ├── Caliburn.Micro.1.3.1 ├── Caliburn.Micro.1.3.1.nupkg ├── lib │ ├── WinRT45 │ │ ├── Caliburn.Micro.Extensions.dll │ │ ├── Caliburn.Micro.Extensions.pdb │ │ ├── Caliburn.Micro.Extensions.xml │ │ ├── Caliburn.Micro.dll │ │ ├── Caliburn.Micro.pdb │ │ └── Caliburn.Micro.xml │ ├── net40 │ │ ├── Caliburn.Micro.dll │ │ ├── Caliburn.Micro.pdb │ │ ├── Caliburn.Micro.xml │ │ ├── System.Windows.Interactivity.dll │ │ └── System.Windows.Interactivity.xml │ ├── sl4-windowsphone71 │ │ ├── Caliburn.Micro.Extensions.dll │ │ ├── Caliburn.Micro.Extensions.pdb │ │ ├── Caliburn.Micro.Extensions.xml │ │ ├── Caliburn.Micro.dll │ │ ├── Caliburn.Micro.pdb │ │ ├── Caliburn.Micro.xml │ │ ├── System.Windows.Interactivity.dll │ │ ├── System.Windows.Interactivity.xml │ │ ├── de │ │ │ └── System.Windows.Interactivity.resources.dll │ │ ├── en │ │ │ └── System.Windows.Interactivity.resources.dll │ │ ├── es │ │ │ └── System.Windows.Interactivity.resources.dll │ │ ├── fr │ │ │ └── System.Windows.Interactivity.resources.dll │ │ ├── it │ │ │ └── System.Windows.Interactivity.resources.dll │ │ ├── ja │ │ │ └── System.Windows.Interactivity.resources.dll │ │ ├── ko │ │ │ └── System.Windows.Interactivity.resources.dll │ │ ├── zh-Hans │ │ │ └── System.Windows.Interactivity.resources.dll │ │ └── zh-Hant │ │ │ └── System.Windows.Interactivity.resources.dll │ ├── sl4 │ │ ├── Caliburn.Micro.dll │ │ ├── Caliburn.Micro.pdb │ │ ├── Caliburn.Micro.xml │ │ ├── System.Windows.Controls.dll │ │ ├── System.Windows.Controls.xml │ │ ├── System.Windows.Interactivity.dll │ │ ├── System.Windows.Interactivity.xml │ │ ├── ar │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── bg │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── ca │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── cs │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── da │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── de │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── el │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── es │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── et │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── eu │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── fi │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── fr │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── he │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── hr │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── hu │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── id │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── it │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── ja │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── ko │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── lt │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── lv │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── ms │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── nl │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── no │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── pl │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── pt-BR │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── pt │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── ro │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── ru │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── sk │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── sl │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── sr-Cyrl-CS │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── sr-Latn-CS │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── sv │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── th │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── tr │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── uk │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── vi │ │ │ └── System.Windows.Controls.resources.dll │ │ ├── zh-Hans │ │ │ └── System.Windows.Controls.resources.dll │ │ └── zh-Hant │ │ │ └── System.Windows.Controls.resources.dll │ └── sl5 │ │ ├── Caliburn.Micro.dll │ │ ├── Caliburn.Micro.pdb │ │ ├── Caliburn.Micro.xml │ │ ├── System.Windows.Controls.dll │ │ ├── System.Windows.Controls.xml │ │ ├── System.Windows.Interactivity.dll │ │ ├── System.Windows.Interactivity.xml │ │ ├── ar │ │ └── System.Windows.Controls.resources.dll │ │ ├── bg │ │ └── System.Windows.Controls.resources.dll │ │ ├── ca │ │ └── System.Windows.Controls.resources.dll │ │ ├── cs │ │ └── System.Windows.Controls.resources.dll │ │ ├── da │ │ └── System.Windows.Controls.resources.dll │ │ ├── de │ │ └── System.Windows.Controls.resources.dll │ │ ├── el │ │ └── System.Windows.Controls.resources.dll │ │ ├── es │ │ └── System.Windows.Controls.resources.dll │ │ ├── et │ │ └── System.Windows.Controls.resources.dll │ │ ├── eu │ │ └── System.Windows.Controls.resources.dll │ │ ├── fi │ │ └── System.Windows.Controls.resources.dll │ │ ├── fr │ │ └── System.Windows.Controls.resources.dll │ │ ├── he │ │ └── System.Windows.Controls.resources.dll │ │ ├── hr │ │ └── System.Windows.Controls.resources.dll │ │ ├── hu │ │ └── System.Windows.Controls.resources.dll │ │ ├── id │ │ └── System.Windows.Controls.resources.dll │ │ ├── it │ │ └── System.Windows.Controls.resources.dll │ │ ├── ja │ │ └── System.Windows.Controls.resources.dll │ │ ├── ko │ │ └── System.Windows.Controls.resources.dll │ │ ├── lt │ │ └── System.Windows.Controls.resources.dll │ │ ├── lv │ │ └── System.Windows.Controls.resources.dll │ │ ├── ms │ │ └── System.Windows.Controls.resources.dll │ │ ├── nl │ │ └── System.Windows.Controls.resources.dll │ │ ├── no │ │ └── System.Windows.Controls.resources.dll │ │ ├── pl │ │ └── System.Windows.Controls.resources.dll │ │ ├── pt-BR │ │ └── System.Windows.Controls.resources.dll │ │ ├── pt │ │ └── System.Windows.Controls.resources.dll │ │ ├── ro │ │ └── System.Windows.Controls.resources.dll │ │ ├── ru │ │ └── System.Windows.Controls.resources.dll │ │ ├── sk │ │ └── System.Windows.Controls.resources.dll │ │ ├── sl │ │ └── System.Windows.Controls.resources.dll │ │ ├── sr-Cyrl-CS │ │ └── System.Windows.Controls.resources.dll │ │ ├── sr-Latn-CS │ │ └── System.Windows.Controls.resources.dll │ │ ├── sv │ │ └── System.Windows.Controls.resources.dll │ │ ├── th │ │ └── System.Windows.Controls.resources.dll │ │ ├── tr │ │ └── System.Windows.Controls.resources.dll │ │ ├── uk │ │ └── System.Windows.Controls.resources.dll │ │ ├── vi │ │ └── System.Windows.Controls.resources.dll │ │ ├── zh-Hans │ │ └── System.Windows.Controls.resources.dll │ │ └── zh-Hant │ │ └── System.Windows.Controls.resources.dll └── tools │ ├── install.ps1 │ ├── net40 │ ├── AppBootstrapper.cs │ ├── IShell.cs │ ├── ShellView.xaml │ └── ShellViewModel.cs │ ├── sl4-windowsphone71 │ ├── AppBootstrapper.cs │ └── MainPageViewModel.cs │ ├── sl4 │ ├── AppBootstrapper.cs │ ├── IShell.cs │ ├── ShellView.xaml │ └── ShellViewModel.cs │ └── sl5 │ ├── AppBootstrapper.cs │ ├── IShell.cs │ ├── ShellView.xaml │ └── ShellViewModel.cs ├── NUnit.2.6.2 ├── NUnit.2.6.2.nupkg ├── lib │ ├── nunit.framework.dll │ └── nunit.framework.xml └── license.txt └── repositories.config /.gitignore: -------------------------------------------------------------------------------- 1 | obj 2 | bin 3 | _ReSharper.* 4 | *.csproj.user 5 | *.ReSharper.user 6 | *.resharper 7 | *.DotSettings.user 8 | *.suo 9 | *.cache 10 | *~ 11 | *.swp 12 | *.msi 13 | /Build 14 | NDependOut 15 | TestResult 16 | *.exe -------------------------------------------------------------------------------- /ArtWork/Converted/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sverrehundeide/MSMQCommander/42a58dada3408c5598cae65547d2e7020f16e929/ArtWork/Converted/AppIcon.png -------------------------------------------------------------------------------- /ArtWork/Converted/AppIcon32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sverrehundeide/MSMQCommander/42a58dada3408c5598cae65547d2e7020f16e929/ArtWork/Converted/AppIcon32x32.png -------------------------------------------------------------------------------- /AssemblyInfoGlobal.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | 6 | // General Information about an assembly is controlled through the following 7 | // set of attributes. Change these attribute values to modify the information 8 | // associated with an assembly. 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Sverre Hundeide")] 11 | [assembly: AssemblyProduct("MSMQCommander")] 12 | [assembly: AssemblyCopyright("Copyright © Sverre Hundeide 2011")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | //In order to begin building localizable applications, set 22 | //CultureYouAreCodingWith in your .csproj file 23 | //inside a . For example, if you are using US english 24 | //in your source files, set the to en-US. Then uncomment 25 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 26 | //the line below to match the UICulture setting in the project file. 27 | 28 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 29 | 30 | // Version information for an assembly consists of the following four values: 31 | // 32 | // Major Version 33 | // Minor Version 34 | // Build Number 35 | // Revision 36 | // 37 | // You can specify all the values or you can default the Build and Revision Numbers 38 | // by using the '*' as shown below: 39 | // [assembly: AssemblyVersion("1.0.*")] 40 | [assembly: AssemblyVersion("0.6.*")] 41 | [assembly: AssemblyFileVersion("0.6.*")] 42 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Changelog 2 | ========= 3 | 4 | For next release 5 | ---------------- 6 | 7 | 8 | 2012-11-03: Version 0.5 (Alpha release) 9 | --------------------------------------- 10 | * Support for creating new queues 11 | * Support for deleting queues 12 | * FIX: Handle situations where the user does not have access to a queue (queue name was set to empty value and exception was thrown) 13 | 14 | 2012-04-01: Version 0.4 (Alpha release) 15 | --------------------------------------- 16 | * Support for transactional queues 17 | * Use Delete key in grid view to delete one or more selected message(s) 18 | * Added accelerator keys for buttons and set default focused text box in dialogs 19 | * Made gridview panel resizable 20 | * Added button for auto refresh of messages in open queues and of message count and queue names in tree view 21 | * Switched to WIX installer (old installer no longer works in Visual Studio 11) 22 | * Changed installer to support upgrade of previously installed version 23 | 24 | 2011-12-18: Version 0.3 (Alpha release) 25 | --------------------------------------- 26 | * Insert new message to queue (body serialized as text/xml only) 27 | * Copying message to file 28 | * Importing message from file 29 | * Connect to remote queues 30 | * Context menu option for delete messages in grid view 31 | 32 | 2011-10-09: Version 0.2 (Alpha release) 33 | --------------------------------------- 34 | * View journal queue as child nodes in queue tree view 35 | * View Number of messages in queueu behind queue name in tree view 36 | * Switch journaling on/off 37 | * Purge messages in queue 38 | 39 | 2011-09-25: Version 0.1 (Alpha release) 40 | --------------------------------------- 41 | * View private queues on local computer 42 | * View messages in queues 43 | * View properties for a selected message 44 | * View message body (only text deserialization is supported for now) -------------------------------------------------------------------------------- /GithubHistory/HISTORY.md: -------------------------------------------------------------------------------- 1 | 2 | ### v0.6 3 | 4 | [#14](https://github.com/sverrehundeide/MSMQCommander/issues/14) Fix exception while deleting message from transactional queue [Bug] 5 | [#13](https://github.com/sverrehundeide/MSMQCommander/issues/13) Show extension data for message in the message details view [Feature] 6 | [#12](https://github.com/sverrehundeide/MSMQCommander/issues/12) Move messages from one queue to another [Feature] 7 | [#9](https://github.com/sverrehundeide/MSMQCommander/issues/9) Exception when purging journal queue [Bug] 8 | [#1](https://github.com/sverrehundeide/MSMQCommander/issues/1) Show extension data for message in the message details view [Feature] 9 | -------------------------------------------------------------------------------- /GithubHistory/HISTORY.md.js: -------------------------------------------------------------------------------- 1 | /** 2 | Build HISTORY.md from your GitHub Tags and Milestones. 3 | Note: Tag and Milestone name/title MUST MATCH! 4 | 5 | **/ 6 | 7 | var 8 | GitHubApi = require('github'), 9 | async = require('async'), 10 | fs = require('fs'), 11 | _ = require('underscore'); 12 | 13 | var github = new GitHubApi({ 14 | // required 15 | version: '3.0.0', 16 | // optional 17 | timeout: 5000 18 | }); 19 | 20 | var REPO = 'MSMQCommander'; 21 | var USER = 'sverrehundeide'; 22 | 23 | /* 24 | --optional 25 | github.authenticate({ 26 | type: 'oauth', 27 | token: 'yourtoken' 28 | }); 29 | */ 30 | 31 | var MDContent = ''; 32 | var calls = []; 33 | github.repos.getTags({user: USER, repo: REPO}, function (err, tags) { 34 | if (err) 35 | throw err; 36 | 37 | github.issues.getAllMilestones({user: USER, repo: REPO, state: 'closed'}, function (err, milestones) { 38 | if (err) 39 | throw err; 40 | tags.forEach(function (tag) { 41 | var milestone = _.find(milestones, function (m) { 42 | return m.title === tag.name; 43 | }); 44 | if (milestone) { 45 | var call = function (callback) { 46 | github.issues.repoIssues({user: USER, repo: REPO, state: 'closed', milestone: milestone.number}, function (err, issues) { 47 | if (err) 48 | throw err; 49 | if (issues.length == 0) 50 | return callback(null); 51 | 52 | MDContent += '\r\n### ' + issues[0].milestone.title + '\r\n\r\n'; 53 | issues = _.sortBy(issues, function (issue) { 54 | return issue.closed_at; 55 | }); 56 | issues.reverse(); 57 | issues.forEach(function (issue) { 58 | var labels = ''; 59 | if (issue.html_url.indexOf('/pull/') === -1) { 60 | if (issue.labels.length > 0) { 61 | issue.labels.forEach(function (lbl) { 62 | labels += lbl.name + ', '; 63 | }); 64 | } 65 | if (labels) { 66 | labels = labels.substring(0, labels.length - 2); 67 | MDContent += '[#' + issue.number + '](' + issue.html_url + ') ' + issue.title + ' [' + labels + '] \r\n'; 68 | } 69 | else 70 | MDContent += '[#' + issue.number + '](' + issue.html_url + ') ' + issue.title + ' \r\n'; 71 | } 72 | }); 73 | return callback(null); 74 | }); 75 | }; 76 | calls.push(call); 77 | } 78 | }); 79 | async.series(calls, function (err) { 80 | console.log(MDContent); 81 | fs.writeFileSync('./HISTORY.md', MDContent); 82 | }); 83 | }); 84 | }); 85 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/async/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.10" 4 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/async/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010-2014 Caolan McMahon 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/async/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "async", 3 | "repo": "caolan/async", 4 | "description": "Higher-order functions and common patterns for asynchronous code", 5 | "version": "0.1.23", 6 | "keywords": [], 7 | "dependencies": {}, 8 | "development": {}, 9 | "main": "lib/async.js", 10 | "scripts": [ "lib/async.js" ] 11 | } 12 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/async/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "async", 3 | "description": "Higher-order functions and common patterns for asynchronous code", 4 | "main": "./lib/async", 5 | "author": { 6 | "name": "Caolan McMahon" 7 | }, 8 | "version": "0.9.0", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/caolan/async.git" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/caolan/async/issues" 15 | }, 16 | "licenses": [ 17 | { 18 | "type": "MIT", 19 | "url": "https://github.com/caolan/async/raw/master/LICENSE" 20 | } 21 | ], 22 | "devDependencies": { 23 | "nodeunit": ">0.0.0", 24 | "uglify-js": "1.2.x", 25 | "nodelint": ">0.0.0" 26 | }, 27 | "jam": { 28 | "main": "lib/async.js", 29 | "include": [ 30 | "lib/async.js", 31 | "README.md", 32 | "LICENSE" 33 | ] 34 | }, 35 | "scripts": { 36 | "test": "nodeunit test/test-async.js" 37 | }, 38 | "homepage": "https://github.com/caolan/async", 39 | "_id": "async@0.9.0", 40 | "dist": { 41 | "shasum": "ac3613b1da9bed1b47510bb4651b8931e47146c7", 42 | "tarball": "http://registry.npmjs.org/async/-/async-0.9.0.tgz" 43 | }, 44 | "_from": "async@", 45 | "_npmVersion": "1.4.3", 46 | "_npmUser": { 47 | "name": "caolan", 48 | "email": "caolan.mcmahon@gmail.com" 49 | }, 50 | "maintainers": [ 51 | { 52 | "name": "caolan", 53 | "email": "caolan@caolanmcmahon.com" 54 | } 55 | ], 56 | "directories": {}, 57 | "_shasum": "ac3613b1da9bed1b47510bb4651b8931e47146c7", 58 | "_resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz", 59 | "readme": "ERROR: No README data found!" 60 | } 61 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/.npmignore: -------------------------------------------------------------------------------- 1 | .settings.xml 2 | .settings 3 | .c9revisions 4 | doc/ 5 | node_modules/ 6 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2012 Cloud9 IDE, Inc. (Mike de Boer) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v2.0.0/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/gitignore.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mixin gitignore 3 | * 4 | * Copyright 2012 Cloud9 IDE, Inc. 5 | * 6 | * This product includes software developed by 7 | * Cloud9 IDE, Inc (http://c9.io). 8 | * 9 | * Author: Mike de Boer 10 | **/ 11 | 12 | "use strict"; 13 | 14 | var error = require("./../../error"); 15 | var Util = require("./../../util"); 16 | 17 | var gitignore = module.exports = { 18 | gitignore: {} 19 | }; 20 | 21 | (function() { 22 | /** section: github 23 | * gitignore#templates(msg, callback) -> null 24 | * - msg (Object): Object that contains the parameters and their values to be sent to the server. 25 | * - callback (Function): function to call when the request is finished with an error as first argument and result data as second argument. 26 | * 27 | * ##### Params on the `msg` object: 28 | * 29 | * - headers (Object): Optional. Key/ value pair of request headers to pass along with the HTTP request. Valid headers are: 'If-Modified-Since', 'If-None-Match', 'Cookie', 'User-Agent', 'Accept', 'X-GitHub-OTP'. 30 | * No other params, simply pass an empty Object literal `{}` 31 | **/ 32 | this.templates = function(msg, block, callback) { 33 | var self = this; 34 | this.client.httpSend(msg, block, function(err, res) { 35 | if (err) 36 | return self.sendError(err, null, msg, callback); 37 | 38 | var ret; 39 | try { 40 | ret = res.data && JSON.parse(res.data); 41 | } 42 | catch (ex) { 43 | if (callback) 44 | callback(new error.InternalServerError(ex.message), res); 45 | return; 46 | } 47 | 48 | if (!ret) 49 | ret = {}; 50 | if (!ret.meta) 51 | ret.meta = {}; 52 | ["x-ratelimit-limit", "x-ratelimit-remaining", "x-ratelimit-reset", "x-oauth-scopes", "link", "location", "last-modified", "etag", "status"].forEach(function(header) { 53 | if (res.headers[header]) 54 | ret.meta[header] = res.headers[header]; 55 | }); 56 | 57 | if (callback) 58 | callback(null, ret); 59 | }); 60 | }; 61 | 62 | /** section: github 63 | * gitignore#template(msg, callback) -> null 64 | * - msg (Object): Object that contains the parameters and their values to be sent to the server. 65 | * - callback (Function): function to call when the request is finished with an error as first argument and result data as second argument. 66 | * 67 | * ##### Params on the `msg` object: 68 | * 69 | * - headers (Object): Optional. Key/ value pair of request headers to pass along with the HTTP request. Valid headers are: 'If-Modified-Since', 'If-None-Match', 'Cookie', 'User-Agent', 'Accept', 'X-GitHub-OTP'. 70 | * - name (String): Required. The name of the .gitignore template to get 71 | **/ 72 | this.template = function(msg, block, callback) { 73 | var self = this; 74 | this.client.httpSend(msg, block, function(err, res) { 75 | if (err) 76 | return self.sendError(err, null, msg, callback); 77 | 78 | var ret; 79 | try { 80 | ret = res.data && JSON.parse(res.data); 81 | } 82 | catch (ex) { 83 | if (callback) 84 | callback(new error.InternalServerError(ex.message), res); 85 | return; 86 | } 87 | 88 | if (!ret) 89 | ret = {}; 90 | if (!ret.meta) 91 | ret.meta = {}; 92 | ["x-ratelimit-limit", "x-ratelimit-remaining", "x-ratelimit-reset", "x-oauth-scopes", "link", "location", "last-modified", "etag", "status"].forEach(function(header) { 93 | if (res.headers[header]) 94 | ret.meta[header] = res.headers[header]; 95 | }); 96 | 97 | if (callback) 98 | callback(null, ret); 99 | }); 100 | }; 101 | 102 | }).call(gitignore.gitignore); 103 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/gitignoreTest.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Cloud9 IDE, Inc. 3 | * 4 | * This product includes software developed by 5 | * Cloud9 IDE, Inc (http://c9.io). 6 | * 7 | * Author: Mike de Boer 8 | */ 9 | 10 | "use strict"; 11 | 12 | var Assert = require("assert"); 13 | var Client = require("./../../index"); 14 | 15 | describe("[gitignore]", function() { 16 | var client; 17 | 18 | beforeEach(function() { 19 | client = new Client({ 20 | version: "3.0.0" 21 | }); 22 | }); 23 | 24 | it("should successfully execute GET /gitignore/templates (templates)", function(next) { 25 | client.gitignore.templates( 26 | {}, 27 | function(err, res) { 28 | Assert.equal(err, null); 29 | // other assertions go here 30 | Assert.ifError(err); 31 | Assert(Array.isArray(res)); 32 | Assert(res.length > 10); 33 | next(); 34 | } 35 | ); 36 | }); 37 | 38 | it("should successfully execute GET /gitignore/templates/:name (template)", function(next) { 39 | client.gitignore.template( 40 | { 41 | name: "C" 42 | }, 43 | function(err, res) { 44 | Assert.equal(err, null); 45 | // other assertions go here 46 | Assert.ifError(err); 47 | Assert('name' in res); 48 | Assert('source' in res); 49 | Assert(typeof res.source === 'string'); 50 | next(); 51 | } 52 | ); 53 | }); 54 | }); 55 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * class Github 3 | * 4 | * A Node.JS module, which provides an object oriented wrapper for the GitHub v3 API. 5 | * 6 | * Copyright 2012 Cloud9 IDE, Inc. 7 | * 8 | * This product includes software developed by 9 | * Cloud9 IDE, Inc (http://c9.io). 10 | * 11 | * Author: Mike de Boer 12 | **/ 13 | 14 | "use strict"; 15 | 16 | var Fs = require("fs"); 17 | var Util = require("./../../util"); 18 | var error = require("./../../error"); 19 | 20 | var GithubHandler = module.exports = function(client) { 21 | this.client = client; 22 | this.routes = JSON.parse(Fs.readFileSync(__dirname + "/routes.json", "utf8")); 23 | }; 24 | 25 | var proto = { 26 | sendError: function(err, block, msg, callback) { 27 | if (this.client.debug) 28 | Util.log(err, block, msg.user, "error"); 29 | if (typeof err == "string") 30 | err = new error.InternalServerError(err); 31 | if (callback) 32 | callback(err); 33 | } 34 | }; 35 | 36 | ["gists", "gitdata", "issues", "authorization", "orgs", "statuses", "pullRequests", "repos", "user", "events", "releases", "search", "markdown", "gitignore", "misc"].forEach(function(api) { 37 | Util.extend(proto, require("./" + api)); 38 | }); 39 | 40 | GithubHandler.prototype = proto; 41 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/markdown.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mixin markdown 3 | * 4 | * Copyright 2012 Cloud9 IDE, Inc. 5 | * 6 | * This product includes software developed by 7 | * Cloud9 IDE, Inc (http://c9.io). 8 | * 9 | * Author: Mike de Boer 10 | **/ 11 | 12 | "use strict"; 13 | 14 | var error = require("./../../error"); 15 | var Util = require("./../../util"); 16 | 17 | var markdown = module.exports = { 18 | markdown: {} 19 | }; 20 | 21 | (function() { 22 | /** section: github 23 | * markdown#render(msg, callback) -> null 24 | * - msg (Object): Object that contains the parameters and their values to be sent to the server. 25 | * - callback (Function): function to call when the request is finished with an error as first argument and result data as second argument. 26 | * 27 | * ##### Params on the `msg` object: 28 | * 29 | * - headers (Object): Optional. Key/ value pair of request headers to pass along with the HTTP request. Valid headers are: 'If-Modified-Since', 'If-None-Match', 'Cookie', 'User-Agent', 'Accept', 'X-GitHub-OTP'. 30 | * - text (String): Required. The Markdown text to render 31 | * - mode (String): Optional. The rendering mode, `markdown` to render a document as plain Markdown, just like README files are rendered. `gfm` to render a document as user-content, e.g. like user comments or issues are rendered. In GFM mode, hard line breaks are always taken into account, and issue and user mentions are linked accordingly. Validation rule: ` ^(markdown|gfm)$ `. 32 | * - context (String): Optional. The repository context, only taken into account when rendering as `gfm` 33 | **/ 34 | this.render = function(msg, block, callback) { 35 | var self = this; 36 | this.client.httpSend(msg, block, function(err, res) { 37 | if (err) 38 | return self.sendError(err, null, msg, callback); 39 | 40 | var ret; 41 | try { 42 | ret = res.data && JSON.parse(res.data); 43 | } 44 | catch (ex) { 45 | if (callback) 46 | callback(new error.InternalServerError(ex.message), res); 47 | return; 48 | } 49 | 50 | if (!ret) 51 | ret = {}; 52 | if (!ret.meta) 53 | ret.meta = {}; 54 | ["x-ratelimit-limit", "x-ratelimit-remaining", "x-ratelimit-reset", "x-oauth-scopes", "link", "location", "last-modified", "etag", "status"].forEach(function(header) { 55 | if (res.headers[header]) 56 | ret.meta[header] = res.headers[header]; 57 | }); 58 | 59 | if (callback) 60 | callback(null, ret); 61 | }); 62 | }; 63 | 64 | }).call(markdown.markdown); 65 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/markdownTest.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Cloud9 IDE, Inc. 3 | * 4 | * This product includes software developed by 5 | * Cloud9 IDE, Inc (http://c9.io). 6 | * 7 | * Author: Mike de Boer 8 | */ 9 | 10 | "use strict"; 11 | 12 | var Assert = require("assert"); 13 | var Client = require("./../../index"); 14 | 15 | describe("[markdown]", function() { 16 | var client; 17 | var token = "c286e38330e15246a640c2cf32a45ea45d93b2ba"; 18 | 19 | beforeEach(function() { 20 | client = new Client({ 21 | version: "3.0.0" 22 | }); 23 | /*client.authenticate({ 24 | type: "oauth", 25 | token: token 26 | });*/ 27 | }); 28 | 29 | it("should successfully execute POST /markdown (render)", function(next) { 30 | client.markdown.render( 31 | { 32 | text: "Hello world github/linguist#1 **cool**, and #1!", 33 | mode: "gfm", 34 | context: "github/gollem" 35 | }, 36 | function(err, res) { 37 | Assert.equal(err, null); 38 | console.log(res); 39 | next(); 40 | } 41 | ); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/miscTest.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Cloud9 IDE, Inc. 3 | * 4 | * This product includes software developed by 5 | * Cloud9 IDE, Inc (http://c9.io). 6 | * 7 | * Author: Mike de Boer 8 | */ 9 | 10 | "use strict"; 11 | 12 | var Assert = require("assert"); 13 | var Client = require("./../../index"); 14 | 15 | describe("[misc]", function() { 16 | var client; 17 | 18 | beforeEach(function() { 19 | client = new Client({ 20 | version: "3.0.0" 21 | }); 22 | }); 23 | 24 | it("should successfully execute GET /emojis (emojis)", function(next) { 25 | client.misc.emojis( 26 | {}, 27 | function(err, res) { 28 | Assert.equal(err, null); 29 | // other assertions go here 30 | Assert.ifError(err); 31 | // A common emoji on github 32 | Assert('shipit' in res); 33 | next(); 34 | } 35 | ); 36 | }); 37 | 38 | it("should successfully execute GET /meta (meta)", function(next) { 39 | client.misc.meta( 40 | {}, 41 | function(err, res) { 42 | Assert.equal(err, null); 43 | // other assertions go here 44 | Assert('hooks' in res); 45 | Assert('git' in res); 46 | next(); 47 | } 48 | ); 49 | }); 50 | 51 | it("should successfully execute GET /rate_limit (rateLimit)", function(next) { 52 | client.misc.rateLimit( 53 | {}, 54 | function(err, res) { 55 | Assert.equal(err, null); 56 | Assert('resources' in res); 57 | Assert('core' in res.resources); 58 | Assert(typeof res.resources.core.limit === 'number'); 59 | Assert(typeof res.resources.core.remaining === 'number'); 60 | Assert(typeof res.resources.core.reset === 'number'); 61 | Assert('search' in res.resources); 62 | Assert(typeof res.resources.search.limit === 'number'); 63 | Assert(typeof res.resources.search.remaining === 'number'); 64 | Assert(typeof res.resources.search.reset === 'number'); 65 | next(); 66 | } 67 | ); 68 | }); 69 | }); 70 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/searchTest.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Cloud9 IDE, Inc. 3 | * 4 | * This product includes software developed by 5 | * Cloud9 IDE, Inc (http://c9.io). 6 | * 7 | * Author: Mike de Boer 8 | */ 9 | 10 | "use strict"; 11 | 12 | var Assert = require("assert"); 13 | var Client = require("./../../index"); 14 | 15 | describe("[search]", function() { 16 | var client; 17 | var token = "c286e38330e15246a640c2cf32a45ea45d93b2ba"; 18 | 19 | beforeEach(function() { 20 | client = new Client({ 21 | version: "3.0.0" 22 | }); 23 | /*client.authenticate({ 24 | type: "oauth", 25 | token: token 26 | });*/ 27 | }); 28 | 29 | it("should successfully execute GET /search/issues/:q (issues)", function(next) { 30 | client.search.issues( 31 | { 32 | q: ['macaroni', 'repo:mikedeboertest/node_chat', 'state:open'].join('+') 33 | }, 34 | function(err, res) { 35 | Assert.equal(err, null); 36 | Assert.equal(res.items.length, 1); 37 | var issue = res.items[0]; 38 | Assert.equal(issue.title, "My First Issue"); 39 | Assert.equal(issue.state, "open"); 40 | 41 | next(); 42 | } 43 | ); 44 | }); 45 | 46 | it("should successfully execute GET /search/repositories/:q (repos)", function(next) { 47 | client.search.repos( 48 | { 49 | q: ['pasta', 'language:JavaScript'].join('+') 50 | }, 51 | function(err, res) { 52 | Assert.equal(err, null); 53 | Assert.ok(res.items.length > 0); 54 | Assert.equal(res.items[0].language, "JavaScript"); 55 | 56 | next(); 57 | } 58 | ); 59 | }); 60 | 61 | it("should successfully execute GET /search/users/:q (users)", function(next) { 62 | client.search.users( 63 | { 64 | q: "mikedeboer" 65 | }, 66 | function(err, res) { 67 | Assert.equal(err, null); 68 | Assert.equal(res.items.length, 2); 69 | var user = res.items[0]; 70 | Assert.equal(user.login, "mikedeboer"); 71 | 72 | client.search.users( 73 | { 74 | q: "location:Jyväskylä" 75 | }, 76 | function(err, res) { 77 | Assert.equal(err, null); 78 | //XXX: this is likely to change often. I added this for 79 | // issue #159. 80 | Assert.equal(res.items.length, 30); 81 | var user = res.items[0]; 82 | Assert.equal(user.login, "bebraw"); 83 | 84 | next(); 85 | } 86 | ); 87 | } 88 | ); 89 | }); 90 | 91 | /*it("should successfully execute GET /search/user/email/:email (email)", function(next) { 92 | client.search.email( 93 | { 94 | email: "String" 95 | }, 96 | function(err, res) { 97 | Assert.equal(err, null); 98 | // other assertions go here 99 | next(); 100 | } 101 | ); 102 | });*/ 103 | }); 104 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/api/v3.0.0/statusesTest.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Cloud9 IDE, Inc. 3 | * 4 | * This product includes software developed by 5 | * Cloud9 IDE, Inc (http://c9.io). 6 | * 7 | * Author: Mike de Boer 8 | */ 9 | 10 | "use strict"; 11 | 12 | var Assert = require("assert"); 13 | var Client = require("./../../index"); 14 | 15 | describe("[statuses]", function() { 16 | var client; 17 | var token = "c286e38330e15246a640c2cf32a45ea45d93b2ba"; 18 | 19 | beforeEach(function() { 20 | client = new Client({ 21 | version: "3.0.0" 22 | }); 23 | client.authenticate({ 24 | type: "oauth", 25 | token: token 26 | }); 27 | }); 28 | 29 | it("should successfully execute GET /repos/:user/:repo/statuses/:sha (get)", function(next) { 30 | client.statuses.get( 31 | { 32 | user: "mikedeboer", 33 | repo: "node-github", 34 | sha: "30d607d8fd8002427b61273f25d442c233cbf631" 35 | }, 36 | function(err, res) { 37 | Assert.equal(err, null); 38 | // other assertions go here 39 | next(); 40 | } 41 | ); 42 | }); 43 | 44 | it("should successfully execute POST /repos/:user/:repo/statuses/:sha (create)", function(next) { 45 | client.statuses.create( 46 | { 47 | user: "String", 48 | repo: "String", 49 | sha: "String", 50 | state: "String", 51 | target_url: "String", 52 | description: "String" 53 | }, 54 | function(err, res) { 55 | Assert.equal(err, null); 56 | // other assertions go here 57 | next(); 58 | } 59 | ); 60 | }); 61 | }); 62 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/error.js: -------------------------------------------------------------------------------- 1 | /** section: github 2 | * class HttpError 3 | * 4 | * Copyright 2012 Cloud9 IDE, Inc. 5 | * 6 | * This product includes software developed by 7 | * Cloud9 IDE, Inc (http://c9.io). 8 | * 9 | * Author: Mike de Boer 10 | **/ 11 | 12 | var Util = require("util"); 13 | 14 | exports.HttpError = function(message, code) { 15 | Error.call(this, message); 16 | //Error.captureStackTrace(this, arguments.callee); 17 | this.message = message; 18 | this.code = code; 19 | }; 20 | Util.inherits(exports.HttpError, Error); 21 | 22 | (function() { 23 | /** 24 | * HttpError#toString() -> String 25 | * 26 | * Returns the stringified version of the error (i.e. the message). 27 | **/ 28 | this.toString = function() { 29 | return this.message; 30 | }; 31 | 32 | /** 33 | * HttpError#toJSON() -> Object 34 | * 35 | * Returns a JSON object representation of the error. 36 | **/ 37 | this.toJSON = function() { 38 | return { 39 | code: this.code, 40 | status: this.defaultMessage, 41 | message: this.message 42 | }; 43 | }; 44 | 45 | }).call(exports.HttpError.prototype); 46 | 47 | 48 | var statusCodes = { 49 | 400: "Bad Request", 50 | 401: "Unauthorized", 51 | 402: "Payment Required", 52 | 403: "Forbidden", 53 | 404: "Not Found", 54 | 405: "Method Not Allowed", 55 | 406: "Not Acceptable", 56 | 407: "Proxy Authentication Required", 57 | 408: "Request Timeout", 58 | 409: "Conflict", 59 | 410: "Gone", 60 | 411: "Length Required", 61 | 412: "Precondition Failed", 62 | 413: "Request Entity Too Large", 63 | 414: "Request-URI Too Long", 64 | 415: "Unsupported Media Type", 65 | 416: "Requested Range Not Satisfiable", 66 | 417: "Expectation Failed", 67 | 420: "Enhance Your Calm", 68 | 422: "Unprocessable Entity", 69 | 423: "Locked", 70 | 424: "Failed Dependency", 71 | 425: "Unordered Collection", 72 | 426: "Upgrade Required", 73 | 428: "Precondition Required", 74 | 429: "Too Many Requests", 75 | 431: "Request Header Fields Too Large", 76 | 444: "No Response", 77 | 449: "Retry With", 78 | 499: "Client Closed Request", 79 | 500: "Internal Server Error", 80 | 501: "Not Implemented", 81 | 502: "Bad Gateway", 82 | 503: "Service Unavailable", 83 | 504: "Gateway Timeout", 84 | 505: "HTTP Version Not Supported", 85 | 506: "Variant Also Negotiates", 86 | 507: "Insufficient Storage", 87 | 508: "Loop Detected", 88 | 509: "Bandwidth Limit Exceeded", 89 | 510: "Not Extended", 90 | 511: "Network Authentication Required" 91 | }; 92 | 93 | for (var status in statusCodes) { 94 | var defaultMsg = statusCodes[status]; 95 | 96 | var error = (function(defaultMsg, status) { 97 | return function(msg) { 98 | this.defaultMessage = defaultMsg; 99 | exports.HttpError.call(this, msg || status + ": " + defaultMsg, status); 100 | 101 | if (status >= 500) 102 | Error.captureStackTrace(this, arguments.callee); 103 | }; 104 | })(defaultMsg, status); 105 | 106 | Util.inherits(error, exports.HttpError); 107 | 108 | var className = toCamelCase(defaultMsg); 109 | exports[className] = error; 110 | exports[status] = error; 111 | } 112 | 113 | function toCamelCase(str) { 114 | return str.toLowerCase().replace(/(?:(^.)|(\s+.))/g, function(match) { 115 | return match.charAt(match.length-1).toUpperCase(); 116 | }); 117 | } -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github", 3 | "version": "0.2.2", 4 | "description": "NodeJS wrapper for the GitHub API", 5 | "author": { 6 | "name": "Mike de Boer", 7 | "email": "info@mikedeboer.nl" 8 | }, 9 | "contributors": [ 10 | { 11 | "name": "Mike de Boer", 12 | "email": "info@mikedeboer.nl" 13 | }, 14 | { 15 | "name": "Fabian Jakobs", 16 | "email": "fabian@c9.io" 17 | } 18 | ], 19 | "homepage": "http://github.com/mikedeboer/node-github", 20 | "repository": { 21 | "type": "git", 22 | "url": "http://github.com/mikedeboer/node-github.git" 23 | }, 24 | "engine": { 25 | "node": ">=0.4.0" 26 | }, 27 | "devDependencies": { 28 | "oauth": "~0.9.7", 29 | "optimist": "~0.6.0", 30 | "mocha": "~1.13.0" 31 | }, 32 | "main": ".", 33 | "scripts": { 34 | "test": "node ./test/all.js" 35 | }, 36 | "licenses": [ 37 | { 38 | "type": "The MIT License", 39 | "url": "http://www.opensource.org/licenses/mit-license.php" 40 | } 41 | ], 42 | "gitHead": "5480e5c13c88a8c64b3f1bf16830ea30358c3352", 43 | "bugs": { 44 | "url": "https://github.com/mikedeboer/node-github/issues" 45 | }, 46 | "_id": "github@0.2.2", 47 | "_shasum": "6b76cbba0364e07bd49e538adba814659e23b42a", 48 | "_from": "github@", 49 | "_npmVersion": "1.4.21", 50 | "_npmUser": { 51 | "name": "mikedeboer", 52 | "email": "info@mikedeboer.nl" 53 | }, 54 | "maintainers": [ 55 | { 56 | "name": "mikedeboer", 57 | "email": "info@mikedeboer.nl" 58 | } 59 | ], 60 | "dist": { 61 | "shasum": "6b76cbba0364e07bd49e538adba814659e23b42a", 62 | "tarball": "http://registry.npmjs.org/github/-/github-0.2.2.tgz" 63 | }, 64 | "directories": {}, 65 | "_resolved": "https://registry.npmjs.org/github/-/github-0.2.2.tgz" 66 | } 67 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/seed.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: node-github 3 | description: NodeJS wrapper for the GitHub API 4 | tags: git github web 5 | version: 0.2.2 6 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/templates/after_request.js.tpl: -------------------------------------------------------------------------------- 1 | 2 | if (!ret) 3 | ret = {}; 4 | if (!ret.meta) 5 | ret.meta = {}; 6 | [<%headers%>].forEach(function(header) { 7 | if (res.headers[header]) 8 | ret.meta[header] = res.headers[header]; 9 | }); 10 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/templates/handler.js.tpl: -------------------------------------------------------------------------------- 1 | <%comment%> 2 | this.<%funcName%> = function(msg, block, callback) { 3 | var self = this; 4 | this.client.httpSend(msg, block, function(err, res) { 5 | if (err) 6 | return self.sendError(err, null, msg, callback); 7 | 8 | var ret; 9 | try { 10 | ret = res.data && JSON.parse(res.data); 11 | } 12 | catch (ex) { 13 | if (callback) 14 | callback(new error.InternalServerError(ex.message), res); 15 | return; 16 | } 17 | <%afterRequest%> 18 | if (callback) 19 | callback(null, ret); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/templates/index.js.tpl: -------------------------------------------------------------------------------- 1 | /** 2 | * class <%name%> 3 | * 4 | * <%description%> 5 | * 6 | * Copyright 2012 Cloud9 IDE, Inc. 7 | * 8 | * This product includes software developed by 9 | * Cloud9 IDE, Inc (http://c9.io). 10 | * 11 | * Author: Mike de Boer 12 | **/ 13 | 14 | "use strict"; 15 | 16 | var Fs = require("fs"); 17 | var Util = require("./../../util"); 18 | var error = require("./../../error"); 19 | 20 | var GithubHandler = module.exports = function(client) { 21 | this.client = client; 22 | this.routes = JSON.parse(Fs.readFileSync(__dirname + "/routes.json", "utf8")); 23 | }; 24 | 25 | var proto = { 26 | sendError: function(err, block, msg, callback) { 27 | if (this.client.debug) 28 | Util.log(err, block, msg.user, "error"); 29 | if (typeof err == "string") 30 | err = new error.InternalServerError(err); 31 | if (callback) 32 | callback(err); 33 | } 34 | }; 35 | 36 | [<%scripts%>].forEach(function(api) { 37 | Util.extend(proto, require("./" + api)); 38 | }); 39 | 40 | GithubHandler.prototype = proto; 41 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/templates/section.js.tpl: -------------------------------------------------------------------------------- 1 | /** 2 | * mixin <%sectionName%> 3 | * 4 | * Copyright 2012 Cloud9 IDE, Inc. 5 | * 6 | * This product includes software developed by 7 | * Cloud9 IDE, Inc (http://c9.io). 8 | * 9 | * Author: Mike de Boer 10 | **/ 11 | 12 | "use strict"; 13 | 14 | var error = require("./../../error"); 15 | var Util = require("./../../util"); 16 | 17 | var <%sectionName%> = module.exports = { 18 | <%sectionName%>: {} 19 | }; 20 | 21 | (function() { 22 | <%sectionBody%> 23 | }).call(<%sectionName%>.<%sectionName%>); 24 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/templates/test_handler.js.tpl: -------------------------------------------------------------------------------- 1 | it("should successfully execute <%name%>", function(next) { 2 | client.<%funcName%>( 3 | <%params%>, 4 | function(err, res) { 5 | Assert.equal(err, null); 6 | // other assertions go here 7 | next(); 8 | } 9 | ); 10 | }); -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/templates/test_section.js.tpl: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Cloud9 IDE, Inc. 3 | * 4 | * This product includes software developed by 5 | * Cloud9 IDE, Inc (http://c9.io). 6 | * 7 | * Author: Mike de Boer 8 | */ 9 | 10 | "use strict"; 11 | 12 | var Assert = require("assert"); 13 | var Client = require("./../../index"); 14 | 15 | describe("[<%sectionName%>]", function() { 16 | var client; 17 | var token = "c286e38330e15246a640c2cf32a45ea45d93b2ba"; 18 | 19 | beforeEach(function() { 20 | client = new Client({ 21 | version: "<%version%>" 22 | }); 23 | client.authenticate({ 24 | type: "oauth", 25 | token: token 26 | }); 27 | }); 28 | 29 | <%testBody%> 30 | }); 31 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/test/client_test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Cloud9 IDE, Inc. 3 | * 4 | * This product includes software developed by 5 | * Cloud9 IDE, Inc (http://c9.io). 6 | * 7 | * Author: Mike de Boer 8 | */ 9 | 10 | "use strict"; 11 | 12 | var Assert = require("assert"); 13 | var Client = require("./../index"); 14 | 15 | describe("[client]", function() { 16 | var client; 17 | var token = "e5a4a27487c26e571892846366de023349321a73"; 18 | 19 | beforeEach(function() { 20 | client = new Client({ 21 | version: "3.0.0" 22 | }); 23 | /*client.authenticate({ 24 | type: "oauth", 25 | token: token 26 | });*/ 27 | }); 28 | 29 | it("should successfully execute GET /authorizations (getAll)", function(next) { 30 | // `aseemk` has two pages of followers right now. 31 | client.user.getFollowers( 32 | { 33 | user: "aseemk" 34 | }, 35 | function(err, res) { 36 | Assert.equal(err, null); 37 | 38 | Assert.ok(!!client.hasNextPage(res)); 39 | Assert.ok(!!client.hasLastPage(res)); 40 | Assert.ok(!client.hasPreviousPage(res)); 41 | 42 | client.getNextPage(res, function(err, res) { 43 | Assert.equal(err, null); 44 | 45 | Assert.ok(!!client.hasPreviousPage(res)); 46 | Assert.ok(!!client.hasFirstPage(res)); 47 | Assert.ok(!client.hasNextPage(res)); 48 | Assert.ok(!client.hasLastPage(res)); 49 | 50 | client.getPreviousPage(res.meta.link, function(err, res) { 51 | Assert.equal(err, null); 52 | 53 | Assert.ok(!!client.hasNextPage(res)); 54 | Assert.ok(!!client.hasLastPage(res)); 55 | Assert.ok(!client.hasPreviousPage(res)); 56 | next(); 57 | }); 58 | }); 59 | } 60 | ); 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/test/example.js: -------------------------------------------------------------------------------- 1 | /** section: github, internal 2 | * Example 3 | * 4 | * Github API usage example. 5 | * 6 | * Copyright 2012 Cloud9 IDE, Inc. 7 | * 8 | * This product includes software developed by 9 | * Cloud9 IDE, Inc (http://c9.io). 10 | * 11 | * Author: Mike de Boer 12 | **/ 13 | 14 | "use strict"; 15 | 16 | var Client = require("./../index"); 17 | 18 | var github = new Client({ 19 | debug: true, 20 | version: "3.0.0" 21 | }); 22 | 23 | github.authenticate({ 24 | type: "basic", 25 | username: "mikedeboer", 26 | password: "mysecretpass" 27 | }); 28 | 29 | github.user.get({}, function(err, res) { 30 | console.log("GOT ERR?", err); 31 | console.log("GOT RES?", res); 32 | 33 | github.repos.getAll({}, function(err, res) { 34 | console.log("GOT ERR?", err); 35 | console.log("GOT RES?", res); 36 | }); 37 | }); 38 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/test/oauth.js: -------------------------------------------------------------------------------- 1 | /** section: github, internal 2 | * OAuth 3 | * 4 | * OAuth usage example. 5 | * 6 | * Copyright 2012 Cloud9 IDE, Inc. 7 | * 8 | * This product includes software developed by 9 | * Cloud9 IDE, Inc (http://c9.io). 10 | * 11 | * Author: Mike de Boer 12 | **/ 13 | 14 | var http = require("http"); 15 | var Url = require("url"); 16 | var querystring = require("querystring"); 17 | 18 | var Client = require("../index"); 19 | var OAuth2 = require("oauth").OAuth2; 20 | 21 | var github = new Client({ 22 | version: "3.0.0" 23 | }); 24 | 25 | var clientId = "e8c434a1c92e9de7ff8d"; 26 | var secret = "1d0fcbb060e1dd86a0aa3d12265419c9bb19a333"; 27 | var oauth = new OAuth2(clientId, secret, "https://github.com/", "login/oauth/authorize", "login/oauth/access_token"); 28 | 29 | // for demo purposes use one global access token 30 | // in production this has to be stored in a user session 31 | var accessToken = ""; 32 | 33 | http.createServer(function(req, res) { 34 | var url = Url.parse(req.url); 35 | var path = url.pathname; 36 | var query = querystring.parse(url.query); 37 | 38 | if (path == "/" || path.match(/^\/user\/?$/)) { 39 | // redirect to github if there is no access token 40 | if (!accessToken) { 41 | res.writeHead(303, { 42 | Location: oauth.getAuthorizeUrl({ 43 | redirect_uri: 'http://localhost:7878/github-callback', 44 | scope: "user,repo,gist" 45 | }) 46 | }); 47 | res.end(); 48 | return; 49 | } 50 | 51 | // use github API 52 | github.user.get({}, function(err, user) { 53 | if (err) { 54 | res.writeHead(err.code); 55 | res.end(err + ""); 56 | return; 57 | } 58 | res.writeHead(200); 59 | res.end(JSON.stringify(user)); 60 | }); 61 | return; 62 | } 63 | // URL called by github after authenticating 64 | else if (path.match(/^\/github-callback\/?$/)) { 65 | // upgrade the code to an access token 66 | oauth.getOAuthAccessToken(query.code, {}, function (err, access_token, refresh_token) { 67 | if (err) { 68 | console.log(err); 69 | res.writeHead(500); 70 | res.end(err + ""); 71 | return; 72 | } 73 | 74 | accessToken = access_token; 75 | 76 | // authenticate github API 77 | github.authenticate({ 78 | type: "oauth", 79 | token: accessToken 80 | }); 81 | 82 | //redirect back 83 | res.writeHead(303, { 84 | Location: "/" 85 | }); 86 | res.end(); 87 | }); 88 | return; 89 | } 90 | 91 | res.writeHead(404); 92 | res.end("404 - Not found"); 93 | }).listen(7878); 94 | 95 | console.log("listening at http://localhost:7878"); 96 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/github/test/oauth_server.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var GitHubApi = require("./../index"); 4 | 5 | var github = new GitHubApi({ 6 | version: "3.0.0" 7 | }); 8 | 9 | /* 10 | !!!UNCOMMENT THE FOLLOWING TO MAKE THIS SCRIPT WORK, BUT CHANGE THE CREDENTIALS TO YOUR OWN!!! 11 | github.authenticate({ 12 | type: "basic", 13 | username: "mikedeboertest", 14 | password: "test1324" 15 | }); 16 | */ 17 | 18 | github.authorization.getAll({}, function(err, res) { 19 | if (err) 20 | throw err; 21 | 22 | var ids = res.map(function(app) { return app.id; }); 23 | 24 | function next(id) { 25 | github.authorization["delete"]({ 26 | id: id 27 | }, function(err, res) { 28 | if (err) 29 | throw err; 30 | if (ids.length) 31 | next(ids.shift()); 32 | else 33 | allRemoved(); 34 | }); 35 | } 36 | 37 | next(ids.shift()); 38 | 39 | function allRemoved() { 40 | github.authorization.create({ 41 | scopes: ["user", "public_repo", "repo", "repo:status", "delete_repo", "gist"], 42 | note: "Authorization created to create unit tests", 43 | note_url: "https://github.com/ajaxorg/node-github" 44 | }, function(err, res) { 45 | if (err) 46 | throw err; 47 | 48 | // you can use the token within server-side apps. 49 | // use it by doing: 50 | // github.authenticate({ 51 | // type: "oauth", 52 | // token: e5a4a27487c26e571892846366de023349321a73 53 | // }); 54 | console.log("TOKEN:", res.token); 55 | console.log(res); 56 | }); 57 | } 58 | 59 | }); -------------------------------------------------------------------------------- /GithubHistory/node_modules/underscore/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative 2 | Reporters & Editors 3 | 4 | Permission is hereby granted, free of charge, to any person 5 | obtaining a copy of this software and associated documentation 6 | files (the "Software"), to deal in the Software without 7 | restriction, including without limitation the rights to use, 8 | copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | OTHER DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/underscore/README.md: -------------------------------------------------------------------------------- 1 | __ 2 | /\ \ __ 3 | __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ 4 | /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ 5 | \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ 6 | \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ 7 | \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ 8 | \ \____/ 9 | \/___/ 10 | 11 | Underscore.js is a utility-belt library for JavaScript that provides 12 | support for the usual functional suspects (each, map, reduce, filter...) 13 | without extending any core JavaScript objects. 14 | 15 | For Docs, License, Tests, and pre-packed downloads, see: 16 | http://underscorejs.org 17 | 18 | Underscore is an open-sourced component of DocumentCloud: 19 | https://github.com/documentcloud 20 | 21 | Many thanks to our contributors: 22 | https://github.com/jashkenas/underscore/contributors 23 | -------------------------------------------------------------------------------- /GithubHistory/node_modules/underscore/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "underscore", 3 | "description": "JavaScript's functional programming helper library.", 4 | "homepage": "http://underscorejs.org", 5 | "keywords": [ 6 | "util", 7 | "functional", 8 | "server", 9 | "client", 10 | "browser" 11 | ], 12 | "author": { 13 | "name": "Jeremy Ashkenas", 14 | "email": "jeremy@documentcloud.org" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git://github.com/jashkenas/underscore.git" 19 | }, 20 | "main": "underscore.js", 21 | "version": "1.7.0", 22 | "devDependencies": { 23 | "docco": "0.6.x", 24 | "phantomjs": "1.9.7-1", 25 | "uglify-js": "2.4.x", 26 | "eslint": "0.6.x" 27 | }, 28 | "scripts": { 29 | "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true && eslint underscore.js test/*.js test/vendor/runner.js", 30 | "build": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/ .*/\" -m --source-map underscore-min.map -o underscore-min.js", 31 | "doc": "docco underscore.js" 32 | }, 33 | "licenses": [ 34 | { 35 | "type": "MIT", 36 | "url": "https://raw.github.com/jashkenas/underscore/master/LICENSE" 37 | } 38 | ], 39 | "files": [ 40 | "underscore.js", 41 | "underscore-min.js", 42 | "LICENSE" 43 | ], 44 | "gitHead": "da996e665deb0b69b257e80e3e257c04fde4191c", 45 | "bugs": { 46 | "url": "https://github.com/jashkenas/underscore/issues" 47 | }, 48 | "_id": "underscore@1.7.0", 49 | "_shasum": "6bbaf0877500d36be34ecaa584e0db9fef035209", 50 | "_from": "underscore@", 51 | "_npmVersion": "1.4.24", 52 | "_npmUser": { 53 | "name": "jashkenas", 54 | "email": "jashkenas@gmail.com" 55 | }, 56 | "maintainers": [ 57 | { 58 | "name": "jashkenas", 59 | "email": "jashkenas@gmail.com" 60 | } 61 | ], 62 | "dist": { 63 | "shasum": "6bbaf0877500d36be34ecaa584e0db9fef035209", 64 | "tarball": "http://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" 65 | }, 66 | "directories": {}, 67 | "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" 68 | } 69 | -------------------------------------------------------------------------------- /License.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1044{\fonttbl{\f0\fnil\fcharset0 Calibri;}} 2 | {\*\generator Riched20 6.2.8250}\viewkind4\uc1 3 | \pard\sa200\sl276\slmult1\f0\fs22\lang20 Microsoft Reciprocal License (MS-RL)\par 4 | [OSI Approved License]\par 5 | This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\par 6 | 1. Definitions\par 7 | The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.\par 8 | A "contribution" is the original software, or any additions or changes to the software.\par 9 | A "contributor" is any person that distributes its contribution under this license.\par 10 | "Licensed patents" are a contributor's patent claims that read directly on its contribution.\par 11 | 2. Grant of Rights\par 12 | (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\par 13 | (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\par 14 | 3. Conditions and Limitations\par 15 | (A) Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients the source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the software under any terms you choose.\par 16 | (B) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\par 17 | (C) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\par 18 | (D) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\par 19 | (E) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\par 20 | (F) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\par 21 | } 22 | -------------------------------------------------------------------------------- /MSMQCommander/App.xaml: -------------------------------------------------------------------------------- 1 |  5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /MSMQCommander/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Windows; 7 | 8 | namespace MSMQCommander 9 | { 10 | /// 11 | /// Interaction logic for App.xaml 12 | /// 13 | public partial class App : Application 14 | { 15 | public App() 16 | { 17 | InitializeComponent(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MSMQCommander/AppBootstrapper.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Windows; 3 | using Autofac; 4 | using MSMQCommander.Contex; 5 | using MSMQCommander.Dialogs; 6 | using MsmqLib; 7 | 8 | namespace MSMQCommander 9 | { 10 | using System; 11 | using System.Collections.Generic; 12 | using System.Linq; 13 | using Caliburn.Micro; 14 | 15 | public class AppBootstrapper : Bootstrapper 16 | { 17 | private Autofac.IContainer _container; 18 | 19 | protected override void Configure() 20 | { 21 | var builder = new ContainerBuilder(); 22 | 23 | builder.RegisterAssemblyTypes(AssemblySource.Instance.ToArray()) 24 | .Where(type => type.Name.EndsWith("ViewModel")) 25 | .Where(type => type.GetInterface(typeof (INotifyPropertyChanged).Name) != null) 26 | .AsSelf() 27 | .InstancePerDependency(); 28 | 29 | builder.RegisterAssemblyTypes(AssemblySource.Instance.ToArray()) 30 | .Where(type => type.Name.EndsWith("View")) 31 | .AsSelf() 32 | .InstancePerDependency(); 33 | 34 | builder.RegisterType().As(); 35 | 36 | builder.Register(c => new WindowManager()) 37 | .InstancePerLifetimeScope(); 38 | 39 | builder.Register(c => new EventAggregator()) 40 | .InstancePerLifetimeScope(); 41 | 42 | builder.RegisterType() 43 | .AsSelf() 44 | .InstancePerLifetimeScope(); 45 | 46 | builder.RegisterType().As(); 47 | builder.RegisterType().As(); 48 | 49 | builder.RegisterType() 50 | .AsSelf() 51 | .InstancePerLifetimeScope(); 52 | 53 | _container = builder.Build(); 54 | } 55 | 56 | protected override object GetInstance(Type serviceType, string key) 57 | { 58 | if (string.IsNullOrWhiteSpace(key)) 59 | { 60 | if (_container.IsRegistered(serviceType)) 61 | return _container.Resolve(serviceType); 62 | } 63 | else 64 | { 65 | var type = Type.GetType(key); 66 | if (_container.IsRegistered(type)) 67 | return _container.Resolve(type); 68 | } 69 | throw new Exception(string.Format("Could not locate any instances for type {0}.", serviceType)); 70 | } 71 | 72 | protected override IEnumerable GetAllInstances(Type serviceType) 73 | { 74 | var instances = _container.Resolve(typeof (IEnumerable<>).MakeGenericType(serviceType)) as IEnumerable; 75 | return instances; 76 | } 77 | 78 | protected override void BuildUp(object instance) 79 | { 80 | _container.InjectProperties(instance); 81 | } 82 | 83 | protected override void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 84 | { 85 | //TODO: Logging + new view for showing exceptions 86 | MessageBox.Show(e.Exception.ToString(), "Exception in MSMQ Commander", MessageBoxButton.OK, MessageBoxImage.Error); 87 | e.Handled = true; 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /MSMQCommander/Contex/CurrentSelectedQueueContext.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | 3 | namespace MSMQCommander.Contex 4 | { 5 | public class CurrentSelectedQueueContext 6 | { 7 | public MessageQueue CurrentSelectedMessageQueue { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /MSMQCommander/Contex/QueueConnectionContext.cs: -------------------------------------------------------------------------------- 1 | using Caliburn.Micro; 2 | using MSMQCommander.Events; 3 | 4 | namespace MSMQCommander.Contex 5 | { 6 | public class QueueConnectionContext 7 | { 8 | private readonly IEventAggregator _eventAggregator; 9 | public string ComputerName { get; private set; } 10 | 11 | private const string DefaultComputerName = "."; 12 | 13 | public QueueConnectionContext(IEventAggregator eventAggregator) 14 | { 15 | _eventAggregator = eventAggregator; 16 | ComputerName = DefaultComputerName; 17 | } 18 | 19 | public void UpdateComputerName(string newComputerName) 20 | { 21 | ComputerName = newComputerName; 22 | _eventAggregator.Publish(new QueueConnectionChangedEvent(ComputerName)); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /MSMQCommander/Events/AutoRefreshEvent.cs: -------------------------------------------------------------------------------- 1 | namespace MSMQCommander.Events 2 | { 3 | public class AutoRefreshEvent 4 | { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /MSMQCommander/Events/MessageDeletedEvent.cs: -------------------------------------------------------------------------------- 1 | namespace MSMQCommander.Events 2 | { 3 | public class MessageDeletedEvent 4 | { 5 | public string MessageId { get; private set; } 6 | 7 | public MessageDeletedEvent(string messageId) 8 | { 9 | MessageId = messageId; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /MSMQCommander/Events/MessageSelectedEvent.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | 3 | namespace MSMQCommander.Events 4 | { 5 | public class MessageSelectedEvent 6 | { 7 | public MessageQueue MessageQueue { get; private set; } 8 | public string MessageId { get; private set; } 9 | 10 | public MessageSelectedEvent(MessageQueue messageQueue, string messageId) 11 | { 12 | MessageQueue = messageQueue; 13 | MessageId = messageId; 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /MSMQCommander/Events/QueueClosedEvent.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | 3 | namespace MSMQCommander.Events 4 | { 5 | public class QueueClosedEvent 6 | { 7 | public MessageQueue MessageQueue { get; private set; } 8 | 9 | public QueueClosedEvent(MessageQueue messageQueue) 10 | { 11 | MessageQueue = messageQueue; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /MSMQCommander/Events/QueueConnectionChangedEvent.cs: -------------------------------------------------------------------------------- 1 | namespace MSMQCommander.Events 2 | { 3 | public class QueueConnectionChangedEvent 4 | { 5 | public string NewMachineName { get; private set; } 6 | 7 | public QueueConnectionChangedEvent(string newMachineName) 8 | { 9 | NewMachineName = newMachineName; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /MSMQCommander/Events/QueueDeletedEvent.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | 3 | namespace MSMQCommander.Events 4 | { 5 | public class QueueDeletedEvent 6 | { 7 | public MessageQueue MessageQueue { get; private set; } 8 | 9 | public QueueDeletedEvent(MessageQueue messageQueue) 10 | { 11 | MessageQueue = messageQueue; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /MSMQCommander/Events/QueueMessageCountChangedEvent.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | 3 | namespace MSMQCommander.Events 4 | { 5 | public class QueueMessageCountChangedEvent 6 | { 7 | public MessageQueue MessageQueue { get; set; } 8 | 9 | public QueueMessageCountChangedEvent(MessageQueue messageQueue) 10 | { 11 | MessageQueue = messageQueue; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MSMQCommander/Events/QueueSelectedEvent.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | 3 | namespace MSMQCommander.Events 4 | { 5 | public class QueueSelectedEvent 6 | { 7 | public MessageQueue MessageQueue { get; private set; } 8 | 9 | public QueueSelectedEvent(MessageQueue messageQueue) 10 | { 11 | MessageQueue = messageQueue; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /MSMQCommander/Events/RefreshQueuesEvent.cs: -------------------------------------------------------------------------------- 1 | namespace MSMQCommander.Events 2 | { 3 | public class RefreshQueuesEvent 4 | { 5 | } 6 | } -------------------------------------------------------------------------------- /MSMQCommander/IShell.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sverrehundeide/MSMQCommander/42a58dada3408c5598cae65547d2e7020f16e929/MSMQCommander/IShell.cs -------------------------------------------------------------------------------- /MSMQCommander/Images/AppIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sverrehundeide/MSMQCommander/42a58dada3408c5598cae65547d2e7020f16e929/MSMQCommander/Images/AppIcon.ico -------------------------------------------------------------------------------- /MSMQCommander/MSMQCommander_TemporaryKey.pfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sverrehundeide/MSMQCommander/42a58dada3408c5598cae65547d2e7020f16e929/MSMQCommander/MSMQCommander_TemporaryKey.pfx -------------------------------------------------------------------------------- /MSMQCommander/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MSMQCommander/MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Windows; 6 | using System.Windows.Controls; 7 | using System.Windows.Data; 8 | using System.Windows.Documents; 9 | using System.Windows.Input; 10 | using System.Windows.Media; 11 | using System.Windows.Media.Imaging; 12 | using System.Windows.Navigation; 13 | using System.Windows.Shapes; 14 | 15 | namespace MSMQCommander 16 | { 17 | /// 18 | /// Interaction logic for MainWindow.xaml 19 | /// 20 | public partial class MainWindow : Window 21 | { 22 | public MainWindow() 23 | { 24 | InitializeComponent(); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /MSMQCommander/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Windows; 6 | 7 | // General Information about an assembly is controlled through the following 8 | // set of attributes. Change these attribute values to modify the information 9 | // associated with an assembly. 10 | [assembly: AssemblyTitle("MSMQCommander")] 11 | [assembly: AssemblyDescription("")] 12 | 13 | //In order to begin building localizable applications, set 14 | //CultureYouAreCodingWith in your .csproj file 15 | //inside a . For example, if you are using US english 16 | //in your source files, set the to en-US. Then uncomment 17 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 18 | //the line below to match the UICulture setting in the project file. 19 | 20 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 21 | 22 | 23 | [assembly: ThemeInfo( 24 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 25 | //(used if a resource is not found in the page, 26 | // or application resource dictionaries) 27 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 28 | //(used if a resource is not found in the page, 29 | // app, or any theme specific resource dictionaries) 30 | )] 31 | 32 | -------------------------------------------------------------------------------- /MSMQCommander/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.225 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace MSMQCommander.Properties 12 | { 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// Returns the cached ResourceManager instance used by this class. 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MSMQCommander.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// Overrides the current thread's CurrentUICulture property for all 56 | /// resource lookups using this strongly typed resource class. 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /MSMQCommander/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.225 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace MSMQCommander.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /MSMQCommander/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /MSMQCommander/ShellView.xaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sverrehundeide/MSMQCommander/42a58dada3408c5598cae65547d2e7020f16e929/MSMQCommander/ShellView.xaml -------------------------------------------------------------------------------- /MSMQCommander/ShellViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.ObjectModel; 3 | using System.Messaging; 4 | using System.Threading; 5 | using Caliburn.Micro; 6 | using MSMQCommander.Contex; 7 | using MSMQCommander.Dialogs; 8 | using MSMQCommander.Events; 9 | using MSMQCommander.Utils; 10 | using MSMQCommander.Views; 11 | using System.Linq; 12 | 13 | namespace MSMQCommander 14 | { 15 | public class ShellViewModel : 16 | PropertyChangedBase, 17 | IShell, 18 | IHandle, 19 | IHandle 20 | { 21 | private readonly IEventAggregator _eventAggregator; 22 | private readonly CurrentSelectedQueueContext _currentSelectedQueueContext; 23 | private readonly IDialogService _dialogService; 24 | private readonly ObservableCollection _detailsViews = new ObservableCollection(); 25 | private bool _autoRefreshEnabled; 26 | private Timer _autoRefreshTimer; 27 | 28 | public ShellViewModel(IEventAggregator eventAggregator, CurrentSelectedQueueContext currentSelectedQueueContext, IDialogService dialogService) 29 | { 30 | _eventAggregator = eventAggregator; 31 | _currentSelectedQueueContext = currentSelectedQueueContext; 32 | _dialogService = dialogService; 33 | _eventAggregator.Subscribe(this); 34 | } 35 | 36 | public ObservableCollection DetailsViews 37 | { 38 | get { return _detailsViews; } 39 | } 40 | 41 | public void Handle(QueueSelectedEvent queueSelectedEvent) 42 | { 43 | _currentSelectedQueueContext.CurrentSelectedMessageQueue = queueSelectedEvent.MessageQueue; 44 | var existingViewForQueue = GetExistingViewForQueue(queueSelectedEvent.MessageQueue); 45 | if (existingViewForQueue != null) 46 | { 47 | existingViewForQueue.Activate(); 48 | } 49 | else 50 | { 51 | var newDetailsView = new DetailsView(); 52 | newDetailsView.CloseAction = OnViewClosed; 53 | DetailsViews.Add(newDetailsView); 54 | NotifyOfPropertyChange(() => DetailsViews); 55 | newDetailsView.Activate(); 56 | } 57 | } 58 | 59 | private void OnViewClosed(DetailsView view) 60 | { 61 | DetailsViews.Remove(view); 62 | } 63 | 64 | private DetailsView GetExistingViewForQueue(MessageQueue queue) 65 | { 66 | var existingViewForQueue = DetailsViews.SingleOrDefault(d => d.Equals(queue)); 67 | return existingViewForQueue; 68 | } 69 | 70 | public void RefreshQueues() 71 | { 72 | _eventAggregator.Publish(new RefreshQueuesEvent()); 73 | } 74 | 75 | public void ToggleAutoRefresh() 76 | { 77 | _autoRefreshEnabled = !_autoRefreshEnabled; 78 | 79 | if (_autoRefreshTimer != null) 80 | { 81 | _autoRefreshTimer.Dispose(); 82 | _autoRefreshTimer = null; 83 | } 84 | if (_autoRefreshEnabled) 85 | { 86 | _autoRefreshTimer = new Timer(ToggleAutoRefreshCallBackHandler, null, new TimeSpan(), new TimeSpan(0,0,0,3)); 87 | } 88 | } 89 | 90 | private void ToggleAutoRefreshCallBackHandler(object state) 91 | { 92 | _eventAggregator.Publish(new AutoRefreshEvent()); 93 | } 94 | 95 | public void ConnectToComputer() 96 | { 97 | _dialogService.ConnectToComputer(); 98 | } 99 | 100 | public void Handle(QueueClosedEvent queueClosedEvent) 101 | { 102 | var existingViewForQueue = GetExistingViewForQueue(queueClosedEvent.MessageQueue); 103 | if (existingViewForQueue == null) 104 | return; 105 | existingViewForQueue.Close(); 106 | DetailsViews.Remove(existingViewForQueue); 107 | } 108 | 109 | public string Title 110 | { 111 | get 112 | { 113 | return string.Format("MSMQ Commander (version {0}, {1})", 114 | VersionInformation.GetMajorAndMinorVersion(), 115 | VersionInformation.GetBuildDate().ToShortDateString()); 116 | } 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /MSMQCommander/Utils/ConsoleLogger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Caliburn.Micro; 3 | 4 | namespace MSMQCommander.Utils 5 | { 6 | public class ConsoleLogger : ILog 7 | { 8 | public void Info(string format, params object[] args) 9 | { 10 | Console.WriteLine(string.Format(format, args)); 11 | } 12 | 13 | public void Warn(string format, params object[] args) 14 | { 15 | Console.WriteLine(string.Format(format, args)); 16 | } 17 | 18 | public void Error(Exception exception) 19 | { 20 | Console.WriteLine(exception.ToString()); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /MSMQCommander/Utils/MessageQueueExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | 3 | namespace MSMQCommander.Utils 4 | { 5 | public static class MessageQueueExtensions 6 | { 7 | public static string GetQueueNameExcludingQueueType(this MessageQueue queue) 8 | { 9 | const string backSlash = @"\"; 10 | var indexOfLastSlash = queue.FormatName.LastIndexOf(backSlash, System.StringComparison.Ordinal); 11 | return queue.FormatName.Substring(indexOfLastSlash + backSlash.Length); 12 | } 13 | public static string GetQueueNameIncludingQueueType(this MessageQueue queue) 14 | { 15 | var path = queue.Path; 16 | if (path.ToLower().Contains(";journal")) 17 | { 18 | const string queueType = @"private$\"; 19 | var indexOfQueueTypeString = path.IndexOf(queueType); 20 | var name = path.Substring(indexOfQueueTypeString + queueType.Length); 21 | return name; 22 | } 23 | return queue.QueueName.Replace(@"private$\", ""); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /MSMQCommander/Utils/VersionInformation.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | 4 | namespace MSMQCommander.Utils 5 | { 6 | public class VersionInformation 7 | { 8 | public static string GetMajorAndMinorVersion() 9 | { 10 | var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version; 11 | return string.Format("{0}.{1}", assemblyVersion.Major, assemblyVersion.Minor); 12 | } 13 | 14 | public static DateTime GetBuildDate() 15 | { 16 | // From http://stackoverflow.com/questions/1600962/displaying-the-build-date 17 | var assemblyVersion = Assembly.GetEntryAssembly().GetName().Version; 18 | var buildDateTime = new DateTime(2000, 1, 1).Add(new TimeSpan( 19 | TimeSpan.TicksPerDay * assemblyVersion.Build + // days since 1 January 2000 20 | TimeSpan.TicksPerSecond * 2 * assemblyVersion.Revision)); // seconds since midnight, (multiply by 2 to get original) 21 | return buildDateTime; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /MSMQCommander/Utils/ViewContentsFormattingExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace MSMQCommander.Utils 2 | { 3 | public static class ViewContentsFormattingExtensions 4 | { 5 | public static string ToYesNo(this bool value) 6 | { 7 | return value ? "Yes" :"No"; 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/DetailsView/DetailsViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | using Caliburn.Micro; 3 | using MSMQCommander.Contex; 4 | using MSMQCommander.Utils; 5 | 6 | namespace MSMQCommander.ViewModels 7 | { 8 | public class DetailsViewModel : PropertyChangedBase 9 | { 10 | private readonly MessageQueue _messageQueue; 11 | 12 | public DetailsViewModel(CurrentSelectedQueueContext currentSelectedQueueContext) 13 | { 14 | _messageQueue = currentSelectedQueueContext.CurrentSelectedMessageQueue; 15 | } 16 | 17 | public string Title 18 | { 19 | get 20 | { 21 | if (_messageQueue == null) 22 | return string.Empty; 23 | return _messageQueue.GetQueueNameIncludingQueueType(); 24 | } 25 | } 26 | 27 | public bool Equals(MessageQueue queue) 28 | { 29 | return queue.Path == _messageQueue.Path; 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/DetailsView/MessageGridRowViewModel.cs: -------------------------------------------------------------------------------- 1 | using MsmqLib; 2 | 3 | namespace MSMQCommander.ViewModels 4 | { 5 | public class MessageGridRowViewModel 6 | { 7 | public string Label { get; private set; } 8 | public string SentTime { get; private set; } 9 | public string Id { get; private set; } 10 | 11 | public MessageGridRowViewModel(MessageInfo message) 12 | { 13 | Id = message.Id; 14 | Label = message.Label; 15 | SentTime = message.SentTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/Dialogs/ConfigureConnectionViewModel.cs: -------------------------------------------------------------------------------- 1 | using Caliburn.Micro; 2 | using MSMQCommander.Contex; 3 | using MSMQCommander.Dialogs; 4 | using MsmqLib; 5 | 6 | namespace MSMQCommander.ViewModels.Dialogs 7 | { 8 | public class ConfigureConnectionViewModel : Screen 9 | { 10 | private readonly QueueConnectionContext _queueConnectionContext; 11 | private readonly IQueueService _queueService; 12 | private readonly IDialogService _dialogService; 13 | private string _computerName; 14 | public string ComputerName 15 | { 16 | get { return _computerName; } 17 | set 18 | { 19 | _computerName = value; 20 | NotifyOfPropertyChange(() => CanOk); 21 | } 22 | } 23 | 24 | public ConfigureConnectionViewModel(QueueConnectionContext queueConnectionContext, IQueueService queueService, IDialogService dialogService) 25 | { 26 | _queueConnectionContext = queueConnectionContext; 27 | _queueService = queueService; 28 | _dialogService = dialogService; 29 | ComputerName = _queueConnectionContext.ComputerName; 30 | } 31 | 32 | public string Title 33 | { 34 | get { return "Enter host name or IP address for connection"; } 35 | } 36 | 37 | public bool CanOk 38 | { 39 | get {return !string.IsNullOrWhiteSpace(ComputerName);} 40 | } 41 | 42 | public void Ok() 43 | { 44 | string errorMessage; 45 | if(false == _queueService.TryConnect(ComputerName, out errorMessage)) 46 | { 47 | _dialogService.ShowError("Failed to connect to '{0}': {1}", ComputerName, errorMessage); 48 | return; 49 | } 50 | 51 | TryClose(true); 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/Dialogs/CreateNewMessageViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | using System.Windows.Documents; 3 | using Caliburn.Micro; 4 | using MSMQCommander.Dialogs; 5 | using MSMQCommander.Views.Dialogs; 6 | using MsmqLib; 7 | 8 | namespace MSMQCommander.ViewModels.Dialogs 9 | { 10 | public class CreateNewMessageViewModel : Screen 11 | { 12 | private readonly IQueueService _queueService; 13 | private readonly IDialogService _dialogService; 14 | private MessageQueue _messageQueue; 15 | private CreateNewMessageView _view; 16 | 17 | public CreateNewMessageViewModel(IQueueService queueService, IDialogService dialogService) 18 | { 19 | _queueService = queueService; 20 | _dialogService = dialogService; 21 | } 22 | 23 | public void Initialize(MessageQueue messageQueue) 24 | { 25 | _messageQueue = messageQueue; 26 | } 27 | 28 | public string Title 29 | { 30 | get { return "Create new message"; } 31 | } 32 | 33 | public string QueueName 34 | { 35 | get 36 | { 37 | if (_messageQueue == null) 38 | return string.Empty; 39 | 40 | return _messageQueue.FormatName; 41 | } 42 | } 43 | 44 | protected override void OnViewAttached(object view, object context) 45 | { 46 | base.OnViewAttached(view, context); 47 | _view = (CreateNewMessageView) view; 48 | } 49 | 50 | public void Save() 51 | { 52 | var messageText = GetMessageText(); 53 | string errorMessage; 54 | if (false == _queueService.CreateMessage(_messageQueue, messageText, out errorMessage)) 55 | { 56 | _dialogService.ShowError("Failed to create message: {0}", errorMessage); 57 | } 58 | TryClose(true); 59 | } 60 | 61 | private string GetMessageText() 62 | { 63 | var textSelection = new TextRange(_view.MessageTextBox.Document.ContentStart, 64 | _view.MessageTextBox.Document.ContentEnd); 65 | var messageText = textSelection.Text; 66 | return messageText; 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/Dialogs/CreateNewQueueViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Caliburn.Micro; 3 | using MSMQCommander.Contex; 4 | using MSMQCommander.Dialogs; 5 | using MsmqLib; 6 | 7 | namespace MSMQCommander.ViewModels.Dialogs 8 | { 9 | public class CreateNewQueueViewModel : Screen 10 | { 11 | private readonly IQueueService _queueService; 12 | private readonly QueueConnectionContext _queueConnectionContext; 13 | private readonly IDialogService _dialogService; 14 | 15 | public CreateNewQueueViewModel(IQueueService queueService, QueueConnectionContext queueConnectionContext, IDialogService dialogService) 16 | { 17 | _queueService = queueService; 18 | _queueConnectionContext = queueConnectionContext; 19 | _dialogService = dialogService; 20 | } 21 | 22 | public string Title 23 | { 24 | get { return "Create new queue"; } 25 | } 26 | 27 | private string _queueName; 28 | public string QueueName 29 | { 30 | get { return _queueName; } 31 | set 32 | { 33 | _queueName = value; 34 | NotifyOfPropertyChange(() => CanCreateQueue); 35 | } 36 | } 37 | 38 | public bool IsTransactional { get; set; } 39 | 40 | public bool CanCreateQueue 41 | { 42 | get { return !string.IsNullOrWhiteSpace(QueueName); } 43 | } 44 | 45 | public void CreateQueue() 46 | { 47 | string errorMessage; 48 | var queuePath = QueuePathHelper.CreateQueuePathForPrivateQueue(_queueConnectionContext.ComputerName, 49 | QueueName, IsTransactional); 50 | if (null == _queueService.CreateQueue(queuePath, IsTransactional, out errorMessage)) 51 | { 52 | _dialogService.ShowError("Failed to creat the queue '{0}': {1}", _queueName, errorMessage); 53 | } 54 | TryClose(true); 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/Dialogs/ImportMessageBodyViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | using Caliburn.Micro; 3 | using MSMQCommander.Dialogs; 4 | using Microsoft.Win32; 5 | using MsmqLib; 6 | 7 | namespace MSMQCommander.ViewModels.Dialogs 8 | { 9 | public class ImportMessageBodyViewModel : Screen 10 | { 11 | private readonly IQueueService _queueService; 12 | private readonly IDialogService _dialogService; 13 | private MessageQueue _messageQueue; 14 | private string _fileToImport; 15 | 16 | public ImportMessageBodyViewModel(IQueueService queueService, IDialogService dialogService) 17 | { 18 | _queueService = queueService; 19 | _dialogService = dialogService; 20 | UseDeadLetterQueue = true; 21 | } 22 | 23 | public string Title 24 | { 25 | get { return "Import message body"; } 26 | } 27 | 28 | public void Initialize(MessageQueue messageQueue) 29 | { 30 | _messageQueue = messageQueue; 31 | } 32 | 33 | public bool UseDeadLetterQueue { get; set; } 34 | 35 | public string QueueName 36 | { 37 | get 38 | { 39 | if (_messageQueue == null) 40 | return string.Empty; 41 | 42 | return _messageQueue.FormatName; 43 | } 44 | } 45 | 46 | public string FileToImport 47 | { 48 | get { return _fileToImport; } 49 | set 50 | { 51 | _fileToImport = value; 52 | NotifyOfPropertyChange(() => FileToImport); 53 | NotifyOfPropertyChange(() => CanImport); 54 | } 55 | } 56 | 57 | public bool CanImport 58 | { 59 | get { return !string.IsNullOrWhiteSpace(FileToImport); } 60 | } 61 | 62 | public void Import() 63 | { 64 | string errorMessage; 65 | if (false == _queueService.ImportMessageBody(_messageQueue, FileToImport, out errorMessage, UseDeadLetterQueue)) 66 | { 67 | _dialogService.ShowError("Failed to create message: {0}", errorMessage); 68 | } 69 | TryClose(true); 70 | } 71 | 72 | public void SelectFileToImport() 73 | { 74 | var openFileDialog = new OpenFileDialog(); 75 | if(true == openFileDialog.ShowDialog()) 76 | { 77 | FileToImport = openFileDialog.FileName; 78 | } 79 | } 80 | 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/TreeView/ComputerTreeNodeViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | using Caliburn.Micro; 3 | using MSMQCommander.Contex; 4 | using MSMQCommander.Events; 5 | 6 | namespace MSMQCommander.ViewModels 7 | { 8 | public class ComputerTreeNodeViewModel : 9 | PropertyChangedBase, 10 | IHandle 11 | { 12 | private readonly IEventAggregator _eventAggregator; 13 | private readonly QueueConnectionContext _queueConnectionContext; 14 | 15 | public ComputerTreeNodeViewModel(IEventAggregator eventAggregator, QueueConnectionContext queueConnectionContext, QueueTypeTreeNodeViewModel queueTypeTreeNodeViewModel) 16 | { 17 | _eventAggregator = eventAggregator; 18 | _queueConnectionContext = queueConnectionContext; 19 | IsSelected = true; 20 | IsExpanded = true; 21 | 22 | Children = new BindableCollection 23 | { 24 | queueTypeTreeNodeViewModel, 25 | }; 26 | 27 | _eventAggregator.Subscribe(this); 28 | } 29 | 30 | public BindableCollection Children { get; private set; } 31 | 32 | public void Handle(QueueConnectionChangedEvent message) 33 | { 34 | NotifyOfPropertyChange(() => Name); 35 | } 36 | 37 | public string Name 38 | { 39 | get 40 | { 41 | if (_queueConnectionContext.ComputerName == ".") 42 | return "localhost"; 43 | 44 | return _queueConnectionContext.ComputerName; 45 | } 46 | } 47 | 48 | public bool IsSelected { get; set; } 49 | 50 | public bool IsExpanded { get; set; } 51 | 52 | public Visibility ContextMenuVisibility 53 | { 54 | get { return Visibility.Collapsed; } 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/TreeView/JournalQueueTreeNodeViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Messaging; 2 | using System.Windows; 3 | using Caliburn.Micro; 4 | using MSMQCommander.Events; 5 | using MsmqLib; 6 | 7 | namespace MSMQCommander.ViewModels 8 | { 9 | using MSMQCommander.Dialogs; 10 | 11 | public class JournalQueueTreeNodeViewModel : 12 | PropertyChangedBase, 13 | IHandle 14 | { 15 | private readonly IEventAggregator _eventAggregator; 16 | private readonly MessageQueue _journalQueue; 17 | private readonly IQueueService _queueService; 18 | private bool _isSelected; 19 | private readonly IDialogService _dialogService; 20 | 21 | public JournalQueueTreeNodeViewModel(IEventAggregator eventAggregator, MessageQueue journalQueue, IQueueService queueService, IDialogService dialogService) 22 | { 23 | _eventAggregator = eventAggregator; 24 | _journalQueue = journalQueue; 25 | _queueService = queueService; 26 | _dialogService = dialogService; 27 | _eventAggregator.Subscribe(this); 28 | } 29 | 30 | public string Name 31 | { 32 | get { return "Journal"; } 33 | } 34 | 35 | public string MessageCount 36 | { 37 | get { return string.Format(" ({0})", _queueService.GetMessageCount(_journalQueue)); } 38 | } 39 | 40 | public Visibility IsJournalingTogglingContextMenuVisible 41 | { 42 | get { return Visibility.Collapsed; } 43 | } 44 | 45 | public Visibility IsPurgeMessagesContextMenuVisible 46 | { 47 | get { return Visibility.Visible; } 48 | } 49 | 50 | public Visibility IsCreateNewQueueContextMenuVisible 51 | { 52 | get { return Visibility.Collapsed; } 53 | } 54 | 55 | public Visibility IsDeleteQueueContextMenuVisible 56 | { 57 | get { return Visibility.Collapsed; } 58 | } 59 | 60 | public bool IsSelected 61 | { 62 | get { return _isSelected; } 63 | set 64 | { 65 | if (value != _isSelected) 66 | { 67 | _isSelected = value; 68 | NotifyOfPropertyChange(() => IsSelected); 69 | if (_isSelected) 70 | { 71 | _eventAggregator.Publish(new QueueSelectedEvent(_journalQueue)); 72 | } 73 | } 74 | } 75 | } 76 | 77 | public void PurgeMessages() { 78 | var question = string.Format("Delete all messages in the queue {0}?", Name); 79 | if (MessageBoxResult.Yes == _dialogService.AskQuestion(question, "Delete messages", MessageBoxButton.YesNo)) { 80 | _queueService.PurgeMessages(_journalQueue); 81 | _eventAggregator.Publish(new RefreshQueuesEvent()); 82 | } 83 | } 84 | 85 | public void ExportAllMessages() 86 | { 87 | if (_dialogService.ExportAllMessagesToQueue(_journalQueue.Path)) { 88 | _eventAggregator.Publish(new RefreshQueuesEvent()); 89 | } 90 | } 91 | 92 | public void Handle(RefreshQueuesEvent message) 93 | { 94 | Refresh(); 95 | } 96 | } 97 | } -------------------------------------------------------------------------------- /MSMQCommander/ViewModels/TreeView/TreeViewModel.cs: -------------------------------------------------------------------------------- 1 | using Caliburn.Micro; 2 | 3 | namespace MSMQCommander.ViewModels 4 | { 5 | public class TreeViewModel : Screen 6 | { 7 | public BindableCollection Computers { get; private set; } 8 | 9 | public TreeViewModel(ComputerTreeNodeViewModel computerTreeNodeViewModel) 10 | { 11 | Computers = new BindableCollection { computerTreeNodeViewModel }; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /MSMQCommander/Views/DetailsView.xaml: -------------------------------------------------------------------------------- 1 |  15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /MSMQCommander/Views/DetailsView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Messaging; 3 | using MSMQCommander.ViewModels; 4 | 5 | namespace MSMQCommander.Views 6 | { 7 | public partial class DetailsView 8 | { 9 | public DetailsView() 10 | { 11 | InitializeComponent(); 12 | CloseAction = null; 13 | } 14 | 15 | public bool Equals(MessageQueue queue) 16 | { 17 | return ((DetailsViewModel) DataContext).Equals(queue); 18 | } 19 | 20 | public Action CloseAction { get; set; } 21 | 22 | public override bool Close() 23 | { 24 | if (CloseAction == null) 25 | throw new InvalidOperationException("CloseAction must be set"); 26 | 27 | CloseAction(this); 28 | return true; 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /MSMQCommander/Views/Dialogs/ConfigureConnectionView.xaml: -------------------------------------------------------------------------------- 1 |  6 | 7 |