Merge lp:~mandel/ubuntuone-windows-installer/add_create_update_build into lp:ubuntuone-windows-installer/beta

Proposed by Manuel de la Peña
Status: Merged
Approved by: Rick McBride
Approved revision: 54
Merged at revision: 68
Proposed branch: lp:~mandel/ubuntuone-windows-installer/add_create_update_build
Merge into: lp:ubuntuone-windows-installer/beta
Diff against target: 929 lines (+467/-60)
20 files modified
README.txt (+12/-0)
main.build (+33/-1)
src/Canonical.UbuntuOne.Client.Views/Update/DownloadingView.xaml.cs (+28/-0)
src/Canonical.UbuntuOne.Client.Views/Update/UpdatingView.xaml.cs (+32/-1)
src/Canonical.UbuntuOne.Common.Tests/Canonical.UbuntuOne.Common.Tests.csproj (+4/-0)
src/Canonical.UbuntuOne.Common.Tests/TestDispatcher.cs (+69/-0)
src/Canonical.UbuntuOne.Common.Tests/Update/DownloadingPresenterFixture.cs (+13/-1)
src/Canonical.UbuntuOne.Common/Canonical.UbuntuOne.Common.csproj (+2/-0)
src/Canonical.UbuntuOne.Common/Threading/IDispatcher.cs (+48/-0)
src/Canonical.UbuntuOne.Common/Threading/WpfDispatcher.cs (+89/-0)
src/Canonical.UbuntuOne.Common/Update/DotUpdaterWrapper.cs (+47/-4)
src/Canonical.UbuntuOne.Common/Update/DownloadingPresenter.cs (+27/-11)
src/Canonical.UbuntuOne.Common/Update/IDownloadingView.cs (+9/-1)
src/Canonical.UbuntuOne.Common/Update/IUpdatingPresenter.cs (+1/-1)
src/Canonical.UbuntuOne.Common/Update/IUpdatingView.cs (+27/-17)
src/Canonical.UbuntuOne.Common/Update/Updater.cs (+2/-2)
src/Canonical.UbuntuOne.Common/objects.xml (+1/-1)
src/UbuntuOneClient/objects.xml (+1/-1)
utils/rss_templates.py (+6/-6)
utils/upload_new_update.py (+16/-13)
To merge this branch: bzr merge lp:~mandel/ubuntuone-windows-installer/add_create_update_build
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Vincenzo Di Somma (community) Approve
Review via email: mp+33534@code.launchpad.net

Description of the change

Changes required to make the selfupda as expected, specially ensuring that the async calls can modify objects that have been created in a diff branch.

To post a comment you must log in.
Revision history for this message
Vincenzo Di Somma (vds) wrote :

Looks good, build and tests are passing.

review: Approve
Revision history for this message
John Lenton (chipaca) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'README.txt'
--- README.txt 2010-07-19 10:19:22 +0000
+++ README.txt 2010-08-24 15:18:39 +0000
@@ -39,6 +39,18 @@
39 2.6 bootstrapper39 2.6 bootstrapper
40 40
41 Crates a boot strapper that will allow to install a bundle with UbuntuOne that includes Tomboy and Gtk sharp if needed.41 Crates a boot strapper that will allow to install a bundle with UbuntuOne that includes Tomboy and Gtk sharp if needed.
42
43 2.7 create_update
44
45 Creates the msi that will be used to update the application, updates the rss used to notify updates an uploads the data to the server.
46
47 Bare in mind that to be able to execute create_update you have to have the rights to update the data in canonicals S3. In order to do that
48 you have to set the following enviroment valirables in your windows machine:
49
50 AWS_ACCESS_KEY_ID: The account Id
51 AWS_SECRET_ACCESS_KEY: The secret required to use the account.
52
53 In order to run the script you will need to have boto () to be able to use S3.
4254
43In order to execute the build script execute at the root of the project55In order to execute the build script execute at the root of the project
4456
4557
=== added file 'lib/DotUpdater/DotUpdater.pdb'
46Binary files lib/DotUpdater/DotUpdater.pdb 1970-01-01 00:00:00 +0000 and lib/DotUpdater/DotUpdater.pdb 2010-08-24 15:18:39 +0000 differ58Binary files lib/DotUpdater/DotUpdater.pdb 1970-01-01 00:00:00 +0000 and lib/DotUpdater/DotUpdater.pdb 2010-08-24 15:18:39 +0000 differ
=== modified file 'main.build'
--- main.build 2010-08-18 09:39:49 +0000
+++ main.build 2010-08-24 15:18:39 +0000
@@ -4,11 +4,19 @@
4 <property name="enviroment" value="debug" />4 <property name="enviroment" value="debug" />
5 <!-- property that allows to pass where to place the build results -->5 <!-- property that allows to pass where to place the build results -->
6 <property name="build_results" value="install/build_results" />6 <property name="build_results" value="install/build_results" />
7 <!-- property thas allows to pass the location used to build the api docs. -->
7 <property name="docs_api" value="docs/api" />8 <property name="docs_api" value="docs/api" />
9 <!-- property that allows to point to the location in which sandcastle was installed -->
8 <property name="sandcastle_path" value="C:\Program Files\Sandcastle" />10 <property name="sandcastle_path" value="C:\Program Files\Sandcastle" />
11 <!-- property that allows to point to the location in which the html workshop was installer -->
9 <property name="html_help_compiler_path" value="C:\Program Files\HTML Help Workshop" />12 <property name="html_help_compiler_path" value="C:\Program Files\HTML Help Workshop" />
10 <!-- property that allows to pass the number for the current build. -->13 <!-- property that allows to pass the number for the current build. -->
11 <property name="build" value="0" />14 <property name="build" value="0" />
15 <!-- property that allows to point to the location in which python was installer -->
16 <property name="python_path" value="C:\Python26" />
17 <!-- property that allows to pass the location to be used to update the package. -->
18 <property name="upload_path" value="http://s3.amazonaws.com/u1wintest/UbuntuOne.msi" />
19
12 <target name="clean" 20 <target name="clean"
13 description="Removes all the different results of the last comilation if they exist">21 description="Removes all the different results of the last comilation if they exist">
14 <!-- delete all the different results from the previous build -->22 <!-- delete all the different results from the previous build -->
@@ -206,7 +214,7 @@
206 214
207 <target name="installer"215 <target name="installer"
208 description="Compiles the solution and create a merge installer that allows to install the solution and other related apps."216 description="Compiles the solution and create a merge installer that allows to install the solution and other related apps."
209 depends="build">217 depends="tests">
210 218
211 <mkdir dir="${build_results}" />219 <mkdir dir="${build_results}" />
212 220
@@ -279,6 +287,30 @@
279 commandline="/Output:setup.exe /Template:dotNetInstaller.exe /Configuration:InstallerProject.xml /Embed+" />287 commandline="/Output:setup.exe /Template:dotNetInstaller.exe /Configuration:InstallerProject.xml /Embed+" />
280 </target>288 </target>
281 289
290 <target name="create_update"
291 description="Creates the msi that will be used to update the application, updates the rss used to notify updates an uploads the data to the server."
292 depends="installer">
293
294 <echo message="Creating update for version ${buildnumber.major}.${buildnumber.minor}.${buildnumber.build}.${buildnumber.revision}"/>
295
296 <!-- call the utils script that was created using python to allows the update and rss generation -->
297
298 <echo message='Executing: python upload_new_update.py ../install/UbuntuOne.msi ${buildnumber.major}.${buildnumber.minor}.${buildnumber.build}.${buildnumber.revision} "${upload_path}"'/>
299
300 <!-- copy the installer, otherwhise the script has issues when uploading, windows is funny -->
301 <copy file="install/UbuntuOne.msi"
302 tofile="utils/UbuntuOne.msi" />
303
304 <exec basedir="${python_path}"
305 managed="false"
306 workingdir="utils"
307 program="python.exe"
308 commandline='upload_new_update.py UbuntuOne.msi ${buildnumber.major}.${buildnumber.minor}.${buildnumber.build}.${buildnumber.revision} "${upload_path}"' />
309
310 <!-- delete the copied file -->
311 <delete file="utils/UbuntuOne.msi" />
312
313 </target>
282 <target name="documentation"314 <target name="documentation"
283 description="Generates the documentation using the xml documents."315 description="Generates the documentation using the xml documents."
284 depends="build">316 depends="build">
285317
=== modified file 'src/Canonical.UbuntuOne.Client.Views/Update/DownloadingView.xaml.cs'
--- src/Canonical.UbuntuOne.Client.Views/Update/DownloadingView.xaml.cs 2010-08-05 08:15:00 +0000
+++ src/Canonical.UbuntuOne.Client.Views/Update/DownloadingView.xaml.cs 2010-08-24 15:18:39 +0000
@@ -16,6 +16,7 @@
16// 16//
17// Authors: Manuel de la Peña <manuel.delapena@canonical.com>17// Authors: Manuel de la Peña <manuel.delapena@canonical.com>
18using System;18using System;
19using Canonical.UbuntuOne.Common.Threading;
19using Canonical.UbuntuOne.Common.Update;20using Canonical.UbuntuOne.Common.Update;
20using StaticResources = Canonical.UbuntuOne.Client.Views.Resources.Resources;21using StaticResources = Canonical.UbuntuOne.Client.Views.Resources.Resources;
21namespace Canonical.UbuntuOne.Client.Views.Update22namespace Canonical.UbuntuOne.Client.Views.Update
@@ -25,6 +26,13 @@
25 /// </summary>26 /// </summary>
26 public partial class DownloadingView : IDownloadingView27 public partial class DownloadingView : IDownloadingView
27 {28 {
29 #region Variables
30
31 private IDispatcher _dispatcher;
32 private readonly object _dispatcherLock = new object();
33
34 #endregion
35
28 /// <summary>36 /// <summary>
29 /// Initializes a new instance of the DownloadingView class.37 /// Initializes a new instance of the DownloadingView class.
30 /// </summary>38 /// </summary>
@@ -35,6 +43,26 @@
35 }43 }
3644
37 /// <summary>45 /// <summary>
46 /// Gets the dispatcher that can be used to call actions on the object from a
47 /// different thread.
48 /// </summary>
49 public IDispatcher ViewDispatcher
50 {
51 get
52 {
53 if(_dispatcher == null)
54 {
55 lock (_dispatcherLock)
56 {
57 _dispatcher = new WpfDispatcher(Dispatcher);
58 }
59 }
60 return _dispatcher;
61 }
62 set { _dispatcher = value; }
63 }
64
65 /// <summary>
38 /// Gets and sets if the close button is enabled.66 /// Gets and sets if the close button is enabled.
39 /// </summary>67 /// </summary>
40 public bool CloseButtonIsEnabled68 public bool CloseButtonIsEnabled
4169
=== modified file 'src/Canonical.UbuntuOne.Client.Views/Update/UpdatingView.xaml.cs'
--- src/Canonical.UbuntuOne.Client.Views/Update/UpdatingView.xaml.cs 2010-08-05 08:15:00 +0000
+++ src/Canonical.UbuntuOne.Client.Views/Update/UpdatingView.xaml.cs 2010-08-24 15:18:39 +0000
@@ -16,6 +16,7 @@
16// 16//
17// Authors: Manuel de la Peña <manuel.delapena@canonical.com>17// Authors: Manuel de la Peña <manuel.delapena@canonical.com>
18using System;18using System;
19using Canonical.UbuntuOne.Common.Threading;
19using Canonical.UbuntuOne.Common.Update;20using Canonical.UbuntuOne.Common.Update;
2021
21namespace Canonical.UbuntuOne.Client.Views.Update22namespace Canonical.UbuntuOne.Client.Views.Update
@@ -25,6 +26,36 @@
25 /// </summary>26 /// </summary>
26 public partial class UpdatingView : IUpdatingView27 public partial class UpdatingView : IUpdatingView
27 {28 {
29 #region Variables
30
31 private IDispatcher _dispatcher;
32 private readonly object _dispatcherLock = new object();
33
34 #endregion
35
36 #region DI Properties
37
38 /// <summary>
39 /// Gets and sets a dispatcher that can be used by the view in a multithreaded env.
40 /// </summary>
41 public IDispatcher ViewDispatcher
42 {
43 get
44 {
45 if(_dispatcher == null)
46 {
47 lock (_dispatcherLock)
48 {
49 _dispatcher = new WpfDispatcher(Dispatcher);
50 }
51 }
52 return _dispatcher;
53 }
54 set { _dispatcher = value; }
55 }
56
57 #endregion
58
28 /// <summary>59 /// <summary>
29 /// Initializes a new instance of the UpdatingView class.60 /// Initializes a new instance of the UpdatingView class.
30 /// </summary>61 /// </summary>
@@ -51,7 +82,7 @@
51 /// </summary>82 /// </summary>
52 public string UpdatingText83 public string UpdatingText
53 {84 {
54 get { return (String) MessageLabel.Content; }85 get { return (String)MessageLabel.Content; }
55 set { MessageLabel.Content = value; }86 set { MessageLabel.Content = value; }
56 }87 }
57 }88 }
5889
=== modified file 'src/Canonical.UbuntuOne.Common.Tests/Canonical.UbuntuOne.Common.Tests.csproj'
--- src/Canonical.UbuntuOne.Common.Tests/Canonical.UbuntuOne.Common.Tests.csproj 2010-08-05 08:15:00 +0000
+++ src/Canonical.UbuntuOne.Common.Tests/Canonical.UbuntuOne.Common.Tests.csproj 2010-08-24 15:18:39 +0000
@@ -44,6 +44,7 @@
44 <Compile Include="ProcessManagementExceptionFixture.cs" />44 <Compile Include="ProcessManagementExceptionFixture.cs" />
45 <Compile Include="Properties\AssemblyInfo.cs" />45 <Compile Include="Properties\AssemblyInfo.cs" />
46 <Compile Include="SyncDaemonExceptionFixture.cs" />46 <Compile Include="SyncDaemonExceptionFixture.cs" />
47 <Compile Include="TestDispatcher.cs" />
47 <Compile Include="Update\DownloadingPresenterFixture.cs" />48 <Compile Include="Update\DownloadingPresenterFixture.cs" />
48 <Compile Include="Update\SelfUpdateExceptionFixture.cs" />49 <Compile Include="Update\SelfUpdateExceptionFixture.cs" />
49 <Compile Include="Update\UpdaterFixture.cs" />50 <Compile Include="Update\UpdaterFixture.cs" />
@@ -82,6 +83,9 @@
82 <HintPath>..\..\lib\Spring.Net\Spring.Core.dll</HintPath>83 <HintPath>..\..\lib\Spring.Net\Spring.Core.dll</HintPath>
83 </Reference>84 </Reference>
84 <Reference Include="System" />85 <Reference Include="System" />
86 <Reference Include="System.Core">
87 <RequiredTargetFramework>3.5</RequiredTargetFramework>
88 </Reference>
85 <Reference Include="System.Data" />89 <Reference Include="System.Data" />
86 <Reference Include="System.Xml" />90 <Reference Include="System.Xml" />
87 </ItemGroup>91 </ItemGroup>
8892
=== added file 'src/Canonical.UbuntuOne.Common.Tests/TestDispatcher.cs'
--- src/Canonical.UbuntuOne.Common.Tests/TestDispatcher.cs 1970-01-01 00:00:00 +0000
+++ src/Canonical.UbuntuOne.Common.Tests/TestDispatcher.cs 2010-08-24 15:18:39 +0000
@@ -0,0 +1,69 @@
1/*
2 * Copyright 2010 Canonical Ltd.
3 *
4 * This file is part of UbuntuOne on Windows.
5 *
6 * UbuntuOne on Windows is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License version
8 * as published by the Free Software Foundation.
9 *
10 * Ubuntu One on Windows is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>
19 */
20using System;
21using Canonical.UbuntuOne.Common.Threading;
22
23namespace Canonical.UbuntuOne.Common.Tests
24{
25 /// <summary>
26 /// Dummy implementation of the IDispatcher that is used for test puposes.
27 /// </summary>
28 internal class TestDispatcher : IDispatcher
29 {
30 #region Implementation of IDispatcher
31
32 /// <summary>
33 /// Dispatches the specified action to the thread.
34 /// </summary>
35 /// <param name="actionToInvoke">The action to invoke.</param>
36 public void Dispatch(Action actionToInvoke)
37 {
38 actionToInvoke();
39 }
40
41 #endregion
42
43 #region Implementation of IDispatcher
44
45 /// <summary>
46 /// Dispatches the specified action to the thread.
47 /// </summary>
48 /// <param name="actionToInvoke">The action to invoke.</param>
49 public TResult Dispatch<TResult>(Func<TResult> actionToInvoke)
50 {
51 return actionToInvoke();
52 }
53
54 #endregion
55
56 #region Implementation of IDispatcher
57
58 /// <summary>
59 /// Checks whether the thread invoking the method .
60 /// </summary>
61 /// <returns></returns>
62 public bool DispatchRequired()
63 {
64 return false;
65 }
66
67 #endregion
68 }
69}
070
=== modified file 'src/Canonical.UbuntuOne.Common.Tests/Update/DownloadingPresenterFixture.cs'
--- src/Canonical.UbuntuOne.Common.Tests/Update/DownloadingPresenterFixture.cs 2010-07-29 16:38:26 +0000
+++ src/Canonical.UbuntuOne.Common.Tests/Update/DownloadingPresenterFixture.cs 2010-08-24 15:18:39 +0000
@@ -1,4 +1,4 @@
1/**1/*
2 * Copyright 2010 Canonical Ltd.2 * Copyright 2010 Canonical Ltd.
3 * 3 *
4 * This file is part of UbuntuOne on Windows.4 * This file is part of UbuntuOne on Windows.
@@ -18,6 +18,7 @@
18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>
19 */19 */
20using System;20using System;
21using Canonical.UbuntuOne.Common.Threading;
21using Canonical.UbuntuOne.Common.Update;22using Canonical.UbuntuOne.Common.Update;
22using Microsoft.ApplicationBlocks.Updater;23using Microsoft.ApplicationBlocks.Updater;
23using NUnit.Framework;24using NUnit.Framework;
@@ -31,6 +32,7 @@
3132
32 private MockRepository _mocks;33 private MockRepository _mocks;
33 private IDownloadingView _view;34 private IDownloadingView _view;
35 private IDispatcher _dispatcher;
34 private DownloadingPresenter _presenter;36 private DownloadingPresenter _presenter;
3537
36 #endregion38 #endregion
@@ -42,6 +44,7 @@
42 {44 {
43 _mocks = new MockRepository();45 _mocks = new MockRepository();
44 _view = _mocks.DynamicMock<IDownloadingView>();46 _view = _mocks.DynamicMock<IDownloadingView>();
47 _dispatcher = new TestDispatcher();
45 _presenter = new DownloadingPresenter48 _presenter = new DownloadingPresenter
46 {49 {
47 View = _view50 View = _view
@@ -78,6 +81,9 @@
78 {81 {
79 SetupResult.For(_view.IsShown)82 SetupResult.For(_view.IsShown)
80 .Return(true);83 .Return(true);
84 SetupResult.For(_view.ViewDispatcher)
85 .Return(_dispatcher);
86
81 _view.DownloadingMessage = UpdateResources.DownloadInProgress;87 _view.DownloadingMessage = UpdateResources.DownloadInProgress;
82 _view.Progress = (progress * DownloadingPresenter.MaximumValue) / total;88 _view.Progress = (progress * DownloadingPresenter.MaximumValue) / total;
83 }89 }
@@ -98,6 +104,8 @@
98 .Return(false);104 .Return(false);
99 Expect.Call(() => _view.Show())105 Expect.Call(() => _view.Show())
100 .Repeat.Once();106 .Repeat.Once();
107 SetupResult.For(_view.ViewDispatcher)
108 .Return(_dispatcher);
101 _view.DownloadingMessage = UpdateResources.DownloadInProgress;109 _view.DownloadingMessage = UpdateResources.DownloadInProgress;
102 _view.Progress = (progress * DownloadingPresenter.MaximumValue) / total;110 _view.Progress = (progress * DownloadingPresenter.MaximumValue) / total;
103 }111 }
@@ -112,6 +120,8 @@
112 {120 {
113 using (_mocks.Record())121 using (_mocks.Record())
114 {122 {
123 SetupResult.For(_view.ViewDispatcher)
124 .Return(_dispatcher);
115 _view.DownloadingMessage = UpdateResources.DownloadError;125 _view.DownloadingMessage = UpdateResources.DownloadError;
116 _view.CloseButtonIsEnabled = true;126 _view.CloseButtonIsEnabled = true;
117 _view.Progress = DownloadingPresenter.MinimumValue;127 _view.Progress = DownloadingPresenter.MinimumValue;
@@ -127,6 +137,8 @@
127 {137 {
128 using (_mocks.Record())138 using (_mocks.Record())
129 {139 {
140 SetupResult.For(_view.ViewDispatcher)
141 .Return(_dispatcher);
130 _view.DownloadingMessage = UpdateResources.DownloadCompleted;142 _view.DownloadingMessage = UpdateResources.DownloadCompleted;
131 _view.Progress = DownloadingPresenter.MaximumValue;143 _view.Progress = DownloadingPresenter.MaximumValue;
132 _view.Close();144 _view.Close();
133145
=== modified file 'src/Canonical.UbuntuOne.Common/Canonical.UbuntuOne.Common.csproj'
--- src/Canonical.UbuntuOne.Common/Canonical.UbuntuOne.Common.csproj 2010-08-16 12:46:11 +0000
+++ src/Canonical.UbuntuOne.Common/Canonical.UbuntuOne.Common.csproj 2010-08-24 15:18:39 +0000
@@ -59,6 +59,8 @@
59 <Compile Include="Container\UnsatisfiedDependencyException.cs" />59 <Compile Include="Container\UnsatisfiedDependencyException.cs" />
60 <Compile Include="IAuthentication.cs" />60 <Compile Include="IAuthentication.cs" />
61 <Compile Include="OperationContracts\IEventNotifier.cs" />61 <Compile Include="OperationContracts\IEventNotifier.cs" />
62 <Compile Include="Threading\IDispatcher.cs" />
63 <Compile Include="Threading\WpfDispatcher.cs" />
62 <Compile Include="Utils\ApplicationWrapper.cs" />64 <Compile Include="Utils\ApplicationWrapper.cs" />
63 <Compile Include="Utils\Explorer.cs" />65 <Compile Include="Utils\Explorer.cs" />
64 <Compile Include="Utils\ExplorerException.cs" />66 <Compile Include="Utils\ExplorerException.cs" />
6567
=== added directory 'src/Canonical.UbuntuOne.Common/Threading'
=== added file 'src/Canonical.UbuntuOne.Common/Threading/IDispatcher.cs'
--- src/Canonical.UbuntuOne.Common/Threading/IDispatcher.cs 1970-01-01 00:00:00 +0000
+++ src/Canonical.UbuntuOne.Common/Threading/IDispatcher.cs 2010-08-24 15:18:39 +0000
@@ -0,0 +1,48 @@
1/*
2 * Copyright 2010 Canonical Ltd.
3 *
4 * This file is part of UbuntuOne on Windows.
5 *
6 * UbuntuOne on Windows is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License version
8 * as published by the Free Software Foundation.
9 *
10 * Ubuntu One on Windows is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>
19 */
20using System;
21
22namespace Canonical.UbuntuOne.Common.Threading
23{
24 /// <summary>
25 /// Provides a wrapper around the process of dispatching actions onto
26 /// different threads, primarily for unit testing.
27 /// </summary>
28 public interface IDispatcher
29 {
30 /// <summary>
31 /// Dispatches the specified action to the thread.
32 /// </summary>
33 /// <param name="actionToInvoke">The action to invoke.</param>
34 void Dispatch(Action actionToInvoke);
35
36 /// <summary>
37 /// Dispatches the specified action to the thread.
38 /// </summary>
39 /// <param name="actionToInvoke">The action to invoke.</param>
40 TResult Dispatch<TResult>(Func<TResult> actionToInvoke);
41
42 /// <summary>
43 /// Checks whether the thread invoking the method .
44 /// </summary>
45 /// <returns></returns>
46 bool DispatchRequired();
47 }
48}
049
=== added file 'src/Canonical.UbuntuOne.Common/Threading/WpfDispatcher.cs'
--- src/Canonical.UbuntuOne.Common/Threading/WpfDispatcher.cs 1970-01-01 00:00:00 +0000
+++ src/Canonical.UbuntuOne.Common/Threading/WpfDispatcher.cs 2010-08-24 15:18:39 +0000
@@ -0,0 +1,89 @@
1/*
2 * Copyright 2010 Canonical Ltd.
3 *
4 * This file is part of UbuntuOne on Windows.
5 *
6 * UbuntuOne on Windows is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License version
8 * as published by the Free Software Foundation.
9 *
10 * Ubuntu One on Windows is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>
19 */
20
21using System;
22using System.Windows.Threading;
23
24namespace Canonical.UbuntuOne.Common.Threading
25{
26 /// <summary>
27 /// This dispatcher is used at runtime by both Windows Forms and WPF. The WPF Dispatcher
28 /// class works within Windows Forms, so this appears to be safe.
29 /// </summary>
30 public class WpfDispatcher : IDispatcher
31 {
32 private readonly Dispatcher _dispatcher;
33
34 /// <summary>
35 /// Initializes a new instance of the <see cref="WpfDispatcher"/> class.
36 /// </summary>
37 public WpfDispatcher()
38 : this(Dispatcher.CurrentDispatcher) { }
39
40 /// <summary>
41 /// Initializes a new instance of the <see cref="WpfDispatcher"/> class.
42 /// </summary>
43 /// <param name="dispatcher">The dispatcher.</param>
44 public WpfDispatcher(Dispatcher dispatcher)
45 {
46 _dispatcher = dispatcher;
47 }
48
49 /// <summary>
50 /// Dispatches the specified action to the thread.
51 /// </summary>
52 /// <param name="actionToInvoke">The action to invoke.</param>
53 public void Dispatch(Action actionToInvoke)
54 {
55 if (!DispatchRequired())
56 {
57 actionToInvoke();
58 }
59 else
60 {
61 _dispatcher.Invoke(DispatcherPriority.Normal, actionToInvoke);
62 }
63 }
64
65 /// <summary>
66 /// Dispatches the specified action to the thread.
67 /// </summary>
68 /// <typeparam name="TResult"></typeparam>
69 /// <param name="actionToInvoke">The action to invoke.</param>
70 /// <returns></returns>
71 public TResult Dispatch<TResult>(Func<TResult> actionToInvoke)
72 {
73 if (_dispatcher.CheckAccess())
74 {
75 return actionToInvoke();
76 }
77 return (TResult)_dispatcher.Invoke(DispatcherPriority.Normal, actionToInvoke);
78 }
79
80 /// <summary>
81 /// Checks whether the thread invoking the method.
82 /// </summary>
83 /// <returns></returns>
84 public bool DispatchRequired()
85 {
86 return !_dispatcher.CheckAccess();
87 }
88 }
89}
090
=== modified file 'src/Canonical.UbuntuOne.Common/Update/DotUpdaterWrapper.cs'
--- src/Canonical.UbuntuOne.Common/Update/DotUpdaterWrapper.cs 2010-07-21 10:07:22 +0000
+++ src/Canonical.UbuntuOne.Common/Update/DotUpdaterWrapper.cs 2010-08-24 15:18:39 +0000
@@ -1,4 +1,4 @@
1/**1/*
2 * Copyright 2010 Canonical Ltd.2 * Copyright 2010 Canonical Ltd.
3 * 3 *
4 * This file is part of UbuntuOne on Windows.4 * This file is part of UbuntuOne on Windows.
@@ -39,12 +39,55 @@
3939
40 #endregion40 #endregion
4141
42 #region Helpers
43
44 /// <summary>
45 /// Helper used to propagate the event from the wrapped object.
46 /// </summary>
47 /// <param name="sender">The sender of the event.</param>
48 /// <param name="args">The aruments about the completed task.</param>
49 private void DownloadCompletedHandler(object sender, TaskEventArgs args)
50 {
51 if(OnDownloadCompleted != null)
52 {
53 OnDownloadCompleted(sender, args);
54 }
55 }
56
57 /// <summary>
58 /// Helper used to propagate the event from the wrapped object.
59 /// </summary>
60 /// <param name="sender">The sender of the event.</param>
61 /// <param name="args">The arguments with the completed information.</param>
62 private void DownloadProgressHandler(object sender, DownloadTaskProgressEventArgs args)
63 {
64 if(OnDownloadProgress != null)
65 {
66 OnDownloadProgress(sender, args);
67 }
68 }
69
70 /// <summary>
71 /// Helper used to propagate the event from the wrapped object.
72 /// </summary>
73 /// <param name="sender">The sender of the event.</param>
74 /// <param name="args">The arguments with the error information.</param>
75 private void DownloadErrorHandler(object sender, DownloadTaskErrorEventArgs args)
76 {
77 if(OnDownloadError != null)
78 {
79 OnDownloadError(sender, args);
80 }
81 }
82
83 #endregion
84
42 public DotUpdaterWrapper(Logger logger, string rss)85 public DotUpdaterWrapper(Logger logger, string rss)
43 {86 {
44 _updater = new DotUpdater.Updater(logger, rss);87 _updater = new DotUpdater.Updater(logger, rss);
45 OnDownloadCompleted = _updater.OnDownloadCompleted;88 _updater.OnDownloadCompleted += DownloadCompletedHandler;
46 OnDownloadProgress = _updater.OnDownloadProgress;89 _updater.OnDownloadProgress += DownloadProgressHandler;
47 OnDownloadError = _updater.OnDownloadError;90 _updater.OnDownloadError += DownloadErrorHandler;
48 }91 }
4992
50 public UpdaterTask CheckForUpdates()93 public UpdaterTask CheckForUpdates()
5194
=== modified file 'src/Canonical.UbuntuOne.Common/Update/DownloadingPresenter.cs'
--- src/Canonical.UbuntuOne.Common/Update/DownloadingPresenter.cs 2010-08-05 08:01:59 +0000
+++ src/Canonical.UbuntuOne.Common/Update/DownloadingPresenter.cs 2010-08-24 15:18:39 +0000
@@ -1,4 +1,4 @@
1/**1/*
2 * Copyright 2010 Canonical Ltd.2 * Copyright 2010 Canonical Ltd.
3 * 3 *
4 * This file is part of UbuntuOne on Windows.4 * This file is part of UbuntuOne on Windows.
@@ -75,10 +75,18 @@
75 /// <param name="args">The arguments that provide information regarding the changes in the download.</param>75 /// <param name="args">The arguments that provide information regarding the changes in the download.</param>
76 public void DownloadProgressHandler(object sender, DownloadTaskProgressEventArgs args)76 public void DownloadProgressHandler(object sender, DownloadTaskProgressEventArgs args)
77 {77 {
78 if(!View.IsShown)78 if (!View.IsShown)
79 View.Show();79 {
80 View.DownloadingMessage = UpdateResources.DownloadInProgress;80 // dispatch to the correct thread to show the view
81 View.Progress = (args.BytesTransferred * MaximumValue) / args.BytesTotal;81 View.ViewDispatcher.Dispatch(() => View.Show());
82 }
83 // dispatch to the correct thread to set the data
84 View.ViewDispatcher.Dispatch(
85 () =>
86 {
87 View.DownloadingMessage = UpdateResources.DownloadInProgress;
88 View.Progress = (args.BytesTransferred * MaximumValue) / args.BytesTotal;
89 });
82 }90 }
8391
84 /// <summary>92 /// <summary>
@@ -88,9 +96,13 @@
88 /// <param name="args">The arguments that provide information regarding the error.</param>96 /// <param name="args">The arguments that provide information regarding the error.</param>
89 public void DownloadErrorHandler(object sender, DownloadTaskErrorEventArgs args)97 public void DownloadErrorHandler(object sender, DownloadTaskErrorEventArgs args)
90 {98 {
91 View.DownloadingMessage = UpdateResources.DownloadError;99 View.ViewDispatcher.Dispatch(
92 View.Progress = MinimumValue;100 () =>
93 View.CloseButtonIsEnabled = true;101 {
102 View.DownloadingMessage = UpdateResources.DownloadError;
103 View.Progress = MinimumValue;
104 View.CloseButtonIsEnabled = true;
105 });
94 }106 }
95107
96 /// <summary>108 /// <summary>
@@ -100,11 +112,15 @@
100 /// <param name="e">The arguments that provide more information about the comleted task.</param>112 /// <param name="e">The arguments that provide more information about the comleted task.</param>
101 public void DownloadUpdateCompleted(object sender, TaskEventArgs e)113 public void DownloadUpdateCompleted(object sender, TaskEventArgs e)
102 {114 {
103 View.DownloadingMessage = UpdateResources.DownloadCompleted; 115 View.ViewDispatcher.Dispatch(
104 View.Progress = MaximumValue;116 () =>
117 {
118 View.DownloadingMessage = UpdateResources.DownloadCompleted;
119 View.Progress = MaximumValue;
120 });
105 // let the user know121 // let the user know
106 Thread.Sleep(100);122 Thread.Sleep(100);
107 View.Close();123 View.ViewDispatcher.Dispatch(() => View.Close());
108 }124 }
109 }125 }
110}126}
111127
=== modified file 'src/Canonical.UbuntuOne.Common/Update/IDownloadingView.cs'
--- src/Canonical.UbuntuOne.Common/Update/IDownloadingView.cs 2010-07-29 16:33:39 +0000
+++ src/Canonical.UbuntuOne.Common/Update/IDownloadingView.cs 2010-08-24 15:18:39 +0000
@@ -1,4 +1,4 @@
1/**1/*
2 * Copyright 2010 Canonical Ltd.2 * Copyright 2010 Canonical Ltd.
3 * 3 *
4 * This file is part of UbuntuOne on Windows.4 * This file is part of UbuntuOne on Windows.
@@ -17,6 +17,8 @@
17 * 17 *
18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>
19 */19 */
20using Canonical.UbuntuOne.Common.Threading;
21
20namespace Canonical.UbuntuOne.Common.Update22namespace Canonical.UbuntuOne.Common.Update
21{23{
22 /// <summary>24 /// <summary>
@@ -25,6 +27,12 @@
25 public interface IDownloadingView27 public interface IDownloadingView
26 {28 {
27 /// <summary>29 /// <summary>
30 /// Gets the dispatcher that can be used to call actions on the object from a
31 /// different thread.
32 /// </summary>
33 IDispatcher ViewDispatcher { get; }
34
35 /// <summary>
28 /// Gets and sets if the close button is enabled.36 /// Gets and sets if the close button is enabled.
29 /// </summary>37 /// </summary>
30 bool CloseButtonIsEnabled { get; set; }38 bool CloseButtonIsEnabled { get; set; }
3139
=== modified file 'src/Canonical.UbuntuOne.Common/Update/IUpdatingPresenter.cs'
--- src/Canonical.UbuntuOne.Common/Update/IUpdatingPresenter.cs 2010-08-05 07:13:28 +0000
+++ src/Canonical.UbuntuOne.Common/Update/IUpdatingPresenter.cs 2010-08-24 15:18:39 +0000
@@ -1,4 +1,4 @@
1/**1/*
2 * Copyright 2010 Canonical Ltd.2 * Copyright 2010 Canonical Ltd.
3 * 3 *
4 * This file is part of UbuntuOne on Windows.4 * This file is part of UbuntuOne on Windows.
55
=== modified file 'src/Canonical.UbuntuOne.Common/Update/IUpdatingView.cs'
--- src/Canonical.UbuntuOne.Common/Update/IUpdatingView.cs 2010-08-05 08:15:00 +0000
+++ src/Canonical.UbuntuOne.Common/Update/IUpdatingView.cs 2010-08-24 15:18:39 +0000
@@ -1,20 +1,24 @@
1// Copyright 2010 Canonical Ltd.1/*
2// 2 * Copyright 2010 Canonical Ltd.
3// This file is part of UbuntuOne on Windows.3 *
4// 4 * This file is part of UbuntuOne on Windows.
5// UbuntuOne on Windows is free software: you can redistribute it and/or modify 5 *
6// it under the terms of the GNU Lesser General Public License version 6 * UbuntuOne on Windows is free software: you can redistribute it and/or modify
7// as published by the Free Software Foundation. 7 * it under the terms of the GNU Lesser General Public License version
8// 8 * as published by the Free Software Foundation.
9// Ubuntu One on Windows is distributed in the hope that it will be useful,9 *
10// but WITHOUT ANY WARRANTY; without even the implied warranty of10 * Ubuntu One on Windows is distributed in the hope that it will be useful,
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12// GNU Lesser General Public License for more details. 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13//13 * GNU Lesser General Public License for more details.
14// You should have received a copy of the GNU Lesser General Public License 14 *
15// along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>.15 * You should have received a copy of the GNU Lesser General Public License
16// 16 * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>.
17// Authors: Manuel de la Peña <manuel.delapena@canonical.com>17 *
18 * Authors: Manuel de la Peña <manuel.delapena@canonical.com>
19 */
20
21using Canonical.UbuntuOne.Common.Threading;
1822
19namespace Canonical.UbuntuOne.Common.Update23namespace Canonical.UbuntuOne.Common.Update
20{24{
@@ -25,6 +29,12 @@
25 public interface IUpdatingView29 public interface IUpdatingView
26 {30 {
27 /// <summary>31 /// <summary>
32 /// Gets the dispatcher that can be used to call actions on the object from a
33 /// different thread.
34 /// </summary>
35 IDispatcher ViewDispatcher { get; }
36
37 /// <summary>
28 /// Gets and sets if the view is visible38 /// Gets and sets if the view is visible
29 /// </summary>39 /// </summary>
30 bool IsShown { get; }40 bool IsShown { get; }
3141
=== modified file 'src/Canonical.UbuntuOne.Common/Update/Updater.cs'
--- src/Canonical.UbuntuOne.Common/Update/Updater.cs 2010-08-05 07:13:28 +0000
+++ src/Canonical.UbuntuOne.Common/Update/Updater.cs 2010-08-24 15:18:39 +0000
@@ -154,7 +154,7 @@
154 private void DownloadErrorHandler(object sender, DownloadTaskErrorEventArgs args)154 private void DownloadErrorHandler(object sender, DownloadTaskErrorEventArgs args)
155 {155 {
156 Logger.Error(args.Exception.Message);156 Logger.Error(args.Exception.Message);
157 throw new SelfUpdateException(UpdateResources.DownloadError, args.Exception);157 //throw new SelfUpdateException(UpdateResources.DownloadError, args.Exception);
158 }158 }
159159
160 /// <summary>160 /// <summary>
@@ -240,7 +240,6 @@
240 try240 try
241 {241 {
242 _downloadingUpdate = true;242 _downloadingUpdate = true;
243 DotUpdater.BeginDownload(_task);
244 // provide the handler for the progress of the download as well as the 243 // provide the handler for the progress of the download as well as the
245 // error and finish244 // error and finish
246 DotUpdater.OnDownloadProgress += DownloadingPresenter.DownloadProgressHandler;245 DotUpdater.OnDownloadProgress += DownloadingPresenter.DownloadProgressHandler;
@@ -252,6 +251,7 @@
252 // one for the updater that will handle the error.251 // one for the updater that will handle the error.
253 DotUpdater.OnDownloadError += DownloadingPresenter.DownloadErrorHandler;252 DotUpdater.OnDownloadError += DownloadingPresenter.DownloadErrorHandler;
254 DotUpdater.OnDownloadError += DownloadErrorHandler;253 DotUpdater.OnDownloadError += DownloadErrorHandler;
254 DotUpdater.BeginDownload(_task);
255 }255 }
256 catch (UpdaterException e)256 catch (UpdaterException e)
257 {257 {
258258
=== modified file 'src/Canonical.UbuntuOne.Common/objects.xml'
--- src/Canonical.UbuntuOne.Common/objects.xml 2010-08-02 14:31:39 +0000
+++ src/Canonical.UbuntuOne.Common/objects.xml 2010-08-24 15:18:39 +0000
@@ -29,7 +29,7 @@
29 type="Canonical.UbuntuOne.Common.Update.Updater, Canonical.UbuntuOne.Common"29 type="Canonical.UbuntuOne.Common.Update.Updater, Canonical.UbuntuOne.Common"
30 autowire="autodetect">30 autowire="autodetect">
31 <property name="RSSFeed"31 <property name="RSSFeed"
32 value="http://path/to/rss.feed"/> <!-- Provide a way to set this through config ????-->32 value="http://s3.amazonaws.com/u1wintest/rss"/> <!-- Provide a way to set this through config ????-->
33 </object>33 </object>
3434
35 <!-- ######################################################################################## -->35 <!-- ######################################################################################## -->
3636
=== modified file 'src/UbuntuOneClient/objects.xml'
--- src/UbuntuOneClient/objects.xml 2010-07-30 16:32:54 +0000
+++ src/UbuntuOneClient/objects.xml 2010-08-24 15:18:39 +0000
@@ -5,7 +5,7 @@
5 type="Canonical.UbuntuOne.Common.Update.Updater, Canonical.UbuntuOne.Common" 5 type="Canonical.UbuntuOne.Common.Update.Updater, Canonical.UbuntuOne.Common"
6 autowire="autodetect">6 autowire="autodetect">
7 <property name="RSSFeed"7 <property name="RSSFeed"
8 value="http://path/to/rss.feed"/>8 value="http://s3.amazonaws.com/u1wintest/rss"/>
9 </object>9 </object>
1010
11 <object id="Application"11 <object id="Application"
1212
=== modified file 'utils/rss_templates.py'
--- utils/rss_templates.py 2010-07-29 12:20:01 +0000
+++ utils/rss_templates.py 2010-08-24 15:18:39 +0000
@@ -7,8 +7,8 @@
7 - version7 - version
8 - enclosure url8 - enclosure url
9 - enclosure lenght9 - enclosure lenght
10 - sha10 - md5
11 11 - uuid
12"""12"""
1313
14from string import Template14from string import Template
@@ -21,16 +21,16 @@
21 <generator>WiX Toolset's ClickThrough for Isolated Applications</generator>21 <generator>WiX Toolset's ClickThrough for Isolated Applications</generator>
22 <lastBuildDate>$lastBuildDate</lastBuildDate>22 <lastBuildDate>$lastBuildDate</lastBuildDate>
23 <ttl>1440</ttl>23 <ttl>1440</ttl>
24 <as:application type="application/vnd.ms-msi">7bb74cea-a4a3-4904-9706-8f4dc764b368</as:application>24 <as:application type="application/vnd.ms-msi">bd2e11b5-5e83-45e4-88cd-4f7c414d71c7</as:application>
25 <item>25 <item>
26 <guid isPermaLink="false">urn:msi:7bb74cea-a4a3-4904-9706-8f4dc764b368/$version</guid>26 <guid isPermaLink="false">urn:msi:bd2e11b5-5e83-45e4-88cd-4f7c414d71c7/$version</guid>
27 <pubDate>$pubDate</pubDate>27 <pubDate>$pubDate</pubDate>
28 <title>Ubuntu One Windows Client</title>28 <title>Ubuntu One Windows Client</title>
29 <description>Ubuntu One Windows Client</description>29 <description>Ubuntu One Windows Client</description>
30 <as:application type="application/vnd.ms-msi">58cdea62-96b2-482b-b046-d884583c8ccd</as:application>30 <as:application type="application/vnd.ms-msi">$uuid</as:application>
31 <as:version>$version</as:version>31 <as:version>$version</as:version>
32 <enclosure url="$url" length="$lenght" type="application/octet-stream" />32 <enclosure url="$url" length="$lenght" type="application/octet-stream" />
33 <as:digest algorithm="sha256">$sha</as:digest>33 <as:digest algorithm="md5">$md5</as:digest>
34 </item>34 </item>
35 </channel>35 </channel>
36</rss>36</rss>
3737
=== modified file 'utils/upload_new_update.py'
--- utils/upload_new_update.py 2010-07-29 12:20:01 +0000
+++ utils/upload_new_update.py 2010-08-24 15:18:39 +0000
@@ -3,10 +3,12 @@
33
4"""This utilities release an Ubuntu One windows update."""4"""This utilities release an Ubuntu One windows update."""
55
6import base64
7import hashlib
6import os8import os
9import sys
7import time10import time
8import hashlib11from uuid import uuid1
9import sys
1012
11import boto13import boto
12from boto.s3.key import Key14from boto.s3.key import Key
@@ -20,18 +22,16 @@
20RSS_FILE_NAME = 'rss'22RSS_FILE_NAME = 'rss'
2123
2224
23def upload_package(bucket, filename):25def upload_package(bucket, filename, rss_params):
24 """Upload the package"""26 """Upload the package"""
25 try:
26 print 'Removing %s...' % filename
27 bucket.delete_key(filename)
28 except S3ResponseError:
29 print 'No previous upload.'
30 print 'Uploading %s...' % filename
31 k = Key(bucket)27 k = Key(bucket)
32 k.key = filename28 path = filename.split('\\')
29 name = path[len(path) -1]
30 keyname = rss_params['version'] + '/' + name
31 k.key = keyname
32 print 'Uploading %s...' % name
33 k.set_contents_from_filename(filename)33 k.set_contents_from_filename(filename)
34 bucket.set_acl('public-read', filename)34 bucket.set_acl('public-read', keyname)
35 print "Uploaded!"35 print "Uploaded!"
3636
3737
@@ -40,8 +40,10 @@
40 now = time.strftime('%d %b %Y %H:%M:%S %Z')40 now = time.strftime('%d %b %Y %H:%M:%S %Z')
41 rss_params['lastBuildDate'] = rss_params['pubDate'] = now41 rss_params['lastBuildDate'] = rss_params['pubDate'] = now
42 fd = open(filename,'r')42 fd = open(filename,'r')
43 rss_params['sha'] = hashlib.sha1(fd.read()).hexdigest()43 md5_hash = hashlib.md5(fd.read()).digest()
44 rss_params['md5'] = base64.urlsafe_b64encode(md5_hash)
44 rss_params['lenght'] = os.path.getsize(filename)45 rss_params['lenght'] = os.path.getsize(filename)
46 rss_params['url'] = rss_params['url']
45 try:47 try:
46 print 'Removing rss...'48 print 'Removing rss...'
47 bucket.delete_key(RSS_FILE_NAME)49 bucket.delete_key(RSS_FILE_NAME)
@@ -64,7 +66,7 @@
64 conn = boto.connect_s3()66 conn = boto.connect_s3()
65 print 'Connected!'67 print 'Connected!'
66 bucket = conn.get_bucket(BUCKET)68 bucket = conn.get_bucket(BUCKET)
67 upload_package(bucket, filename)69 upload_package(bucket, filename, rss_params)
68 upload_rss(bucket, filename, rss_params)70 upload_rss(bucket, filename, rss_params)
6971
7072
@@ -80,4 +82,5 @@
80 rss_params = {}82 rss_params = {}
81 rss_params['version'] = argv[2]83 rss_params['version'] = argv[2]
82 rss_params['url'] = argv[3]84 rss_params['url'] = argv[3]
85 rss_params['uuid'] = str(uuid1())
83 sys.exit(main(filename=argv[1], rss_params=rss_params))86 sys.exit(main(filename=argv[1], rss_params=rss_params))

Subscribers

People subscribed via source and target branches

to all changes: