Merge lp:~mandel/ubuntuone-windows-installer/auto-update-python-only into lp:ubuntuone-windows-installer

Proposed by Manuel de la Peña
Status: Merged
Approved by: Roberto Alsina
Approved revision: 77
Merged at revision: 73
Proposed branch: lp:~mandel/ubuntuone-windows-installer/auto-update-python-only
Merge into: lp:ubuntuone-windows-installer
Diff against target: 415 lines (+241/-7)
7 files modified
ubuntuone_installer/gui/qt/gui.py (+11/-0)
ubuntuone_installer/gui/qt/main/tests/test_windows.py (+19/-2)
ubuntuone_installer/gui/qt/main/windows.py (+29/-5)
ubuntuone_installer/gui/qt/tests/test_gui.py (+49/-0)
ubuntuone_installer/gui/qt/utils/__init__.py (+4/-0)
ubuntuone_installer/gui/qt/utils/tests/test_windows.py (+85/-0)
ubuntuone_installer/gui/qt/utils/windows.py (+44/-0)
To merge this branch: bzr merge lp:~mandel/ubuntuone-windows-installer/auto-update-python-only
Reviewer Review Type Date Requested Status
Roberto Alsina (community) Approve
Diego Sarmentero (community) Approve
Review via email: mp+76047@code.launchpad.net

Commit message

Partial fix for lp: 845662

Provides the code that perform a call to the auto-update process that will check for updates and will perform them if the user agrees to do so.

Description of the change

Provides the code that perform a call to the auto-update process that will check for updates and will perform them if the user agrees to do so.

To post a comment you must log in.
72. By Manuel de la Peña

Remove named parameter comming from a smart-ass diff.

Revision history for this message
Diego Sarmentero (diegosarmentero) wrote :
Download full text (6.4 KiB)

...
ubuntuone_installer.gui.qt.main.tests.test_windows
  CredsFailureMainTestCase
    test_failure ... [OK]
    test_no_creds ... Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 1020, in
_inlineCallbacks
    result = g.send(result)
  File "X:\ubuntuone-windows-installer-mandel\ubuntuone_installer\gui\qt\main\wi
ndows.py", line 85, in check_credentials
    success_cb(creds, gui, installer, logger)
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 1141, in
unwindGenerator
    return _inlineCallbacks(None, f(*args, **kwargs), Deferred())
  File "X:\ubuntuone-windows-installer-mandel\ubuntuone_installer\gui\qt\main\wi
ndows.py", line 50, in success_cb
    logger.debug('Got back from sso.')
exceptions.AttributeError: 'FakeLogger' object has no attribute 'debug'
[ERROR]
    test_with_creds ... Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 1020, in
_inlineCallbacks
    result = g.send(result)
  File "X:\ubuntuone-windows-installer-mandel\ubuntuone_installer\gui\qt\main\wi
ndows.py", line 85, in check_credentials
    success_cb(creds, gui, installer, logger)
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 1141, in
unwindGenerator
    return _inlineCallbacks(None, f(*args, **kwargs), Deferred())
  File "X:\ubuntuone-windows-installer-mandel\ubuntuone_installer\gui\qt\main\wi
ndows.py", line 50, in success_cb
    logger.debug('Got back from sso.')
exceptions.AttributeError: 'FakeLogger' object has no attribute 'debug'
[ERROR]
    test_with_installed_flag ... Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 1020, in
_inlineCallbacks
    result = g.send(result)
  File "X:\ubuntuone-windows-installer-mandel\ubuntuone_installer\gui\qt\main\te
sts\test_windows.py", line 150, in test_with_installed_flag
    gui, True), {}))
twisted.trial.unittest.FailTest: not equal:
a = (('Something not false',
  <module 'ubuntuone_installer.gui.qt.gui' from 'X:\ubuntuone-windows-installer-
mandel\ubuntuone_installer\gui\qt\gui.pyc'>,
  True,
  <ubuntuone_installer.gui.qt.main.tests.test_windows.FakeLogger object at 0x086
9D3B0>),
 {})
b = (('Something not false',
  <module 'ubuntuone_installer.gui.qt.gui' from 'X:\ubuntuone-windows-installer-
mandel\ubuntuone_installer\gui\qt\gui.pyc'>,
  True),
 {})

[FAIL]
    test_without_installed_flag ... Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 1020, in
_inlineCallbacks
    result = g.send(result)
  File "X:\ubuntuone-windows-installer-mandel\ubuntuone_installer\gui\qt\main\te
sts\test_windows.py", line 139, in test_without_installed_flag
    gui, False), {}))
twisted.trial.unittest.FailTest: not equal:
a = (('Something not false',
  <module 'ubuntuone_installer.gui.qt.gui' from 'X:\ubuntuone-windows-installer-
mandel\ubuntuone_installer\gui\qt\gui.pyc'>,
  False,
  <ubuntuone_installer.gui.qt.main.tests.test_windows.FakeLogger object at 0x086
9D9B0>),
 {})
b = (('Something not false',
  <module 'ubunt...

Read more...

review: Needs Fixing
73. By Manuel de la Peña

Fixed the tests so that they take into account the new update method.

Revision history for this message
Diego Sarmentero (diegosarmentero) wrote :

+1

review: Approve
Revision history for this message
Roberto Alsina (ralsina) wrote :

C:\Users\ROBERTO\canonical\fix_809873\scripts>"c:\Program Files (x86)\ubuntuone\dist\ubuntuone-installer-qt.exe"
Traceback (most recent call last):
  File "ubuntuone-installer-qt", line 51, in <module>
  File "ubuntuone_installer\gui\qt\main\windows.pyc", line 118, in main
  File "twisted\internet\defer.pyc", line 1141, in unwindGenerator
TypeError: check_credentials() takes at most 4 arguments (5 given)

review: Needs Fixing
74. By Manuel de la Peña

Pass the correct number of parameters.

Revision history for this message
Roberto Alsina (ralsina) wrote :

2011-09-20 09:51:56,575 - ubuntuone.installer.qt.gui - INFO - Updates are present.
Unhandled error in Deferred:
Traceback (most recent call last):
  File "twisted\internet\defer.pyc", line 388, in errback

  File "twisted\internet\defer.pyc", line 455, in _startRunCallbacks

  File "twisted\internet\defer.pyc", line 542, in _runCallbacks

  File "twisted\internet\defer.pyc", line 1076, in gotResult

--- <exception caught here> ---
  File "twisted\internet\defer.pyc", line 1018, in _inlineCallbacks

  File "twisted\python\failure.pyc", line 349, in throwExceptionIntoGenerator

  File "ubuntuone_installer\gui\qt\main\windows.pyc", line 85, in check_credentials

  File "twisted\internet\defer.pyc", line 1018, in _inlineCallbacks

  File "twisted\python\failure.pyc", line 349, in throwExceptionIntoGenerator

  File "ubuntuone_installer\gui\qt\main\windows.pyc", line 56, in success_cb

  File "twisted\internet\defer.pyc", line 1020, in _inlineCallbacks

  File "ubuntuone_installer\gui\qt\main\windows.pyc", line 97, in check_updates

  File "ubuntuone_installer\gui\qt\gui.pyc", line 96, in user_wants_to_update

exceptions.NameError: global name 'UPDATE_TITLE' is not defined

75. By Manuel de la Peña

Added missing var.

Revision history for this message
Roberto Alsina (ralsina) wrote :

Unhandled error in Deferred:
Traceback (most recent call last):
  File "twisted\internet\defer.pyc", line 388, in errback

  File "twisted\internet\defer.pyc", line 455, in _startRunCallbacks

  File "twisted\internet\defer.pyc", line 542, in _runCallbacks

  File "twisted\internet\defer.pyc", line 1076, in gotResult

--- <exception caught here> ---
  File "twisted\internet\defer.pyc", line 1018, in _inlineCallbacks

  File "twisted\python\failure.pyc", line 349, in throwExceptionIntoGenerator

  File "ubuntuone_installer\gui\qt\main\windows.pyc", line 85, in check_credentials

  File "twisted\internet\defer.pyc", line 1020, in _inlineCallbacks

  File "ubuntuone_installer\gui\qt\main\windows.pyc", line 58, in success_cb

  File "ubuntuone_installer\gui\qt\main\windows.pyc", line 38, in stop

  File "twisted\internet\base.pyc", line 570, in stop

twisted.internet.error.ReactorNotRunning: Can't stop reactor that isn't running.

76. By Manuel de la Peña

Merged with trunk.

77. By Manuel de la Peña

Removed the stop_fn since there is not need because the installer takes care of the situation in which the files are used.

Revision history for this message
Roberto Alsina (ralsina) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ubuntuone_installer/gui/qt/gui.py'
2--- ubuntuone_installer/gui/qt/gui.py 2011-09-19 15:41:40 +0000
3+++ ubuntuone_installer/gui/qt/gui.py 2011-09-22 19:45:30 +0000
4@@ -84,12 +84,23 @@
5 CREDENTIALS_ERROR = _('Application will close.\n\n%r')
6 SKIP_TOUR = _("Skip tour, go to Dashboard")
7 START_SETUP = _("Start setup")
8+UPDATE_TITLE = _("Updates are available")
9+UPDATE_SOFTWARE = _("There is a new version available. Do you want perform an upgrade?")
10 # Invalid name logger
11 # pylint: disable=C0103
12 logger = setup_logging('qt.gui')
13 # pylint: enable=C0103
14
15
16+def user_wants_to_update():
17+ """Ask the user if he really wants to update the software."""
18+ result = QtGui.QMessageBox.question(None, UPDATE_TITLE, UPDATE_SOFTWARE,
19+ QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
20+ if result == QtGui.QMessageBox.Yes:
21+ return True
22+ return False
23+
24+
25 class LicensePage(SSOWizardPage):
26 """Wizard Page that displays the license info and links to the GPL."""
27
28
29=== modified file 'ubuntuone_installer/gui/qt/main/tests/test_windows.py'
30--- ubuntuone_installer/gui/qt/main/tests/test_windows.py 2011-09-19 23:00:32 +0000
31+++ ubuntuone_installer/gui/qt/main/tests/test_windows.py 2011-09-22 19:45:30 +0000
32@@ -59,22 +59,37 @@
33 """Fake Logger."""
34
35 error_args = None
36+ debug_args = None
37+ info_args = None
38
39 def error(self, *args, **kwargs):
40 """Save the error."""
41 self.error_args = (args, kwargs)
42
43+ def debug(self, *args, **kwargs):
44+ """Save the debug."""
45+ self.debug_args = (args, kwargs)
46+
47+ def info(self, *args, **kwargs):
48+ """Save the info."""
49+ self.info_args = (args, kwargs)
50+
51
52 class CredsFailureMainTestCase(TestCase):
53
54 """Test the qt main window."""
55
56 stopped = False
57+ updates_checked = False
58
59 def stop(self):
60 """A fake stop."""
61 self.stopped = True
62
63+ def check_updates(self, gui, logger):
64+ """A fake check updates."""
65+ self.updates_checked = True
66+
67 @defer.inlineCallbacks
68 def test_failure(self):
69 """Credential errors should display a critical message."""
70@@ -116,6 +131,7 @@
71 logger = FakeLogger()
72 self.patch(utils, 'start_control_panel', self._set_called)
73 self.patch(windows, 'stop', self.stop)
74+ self.patch(windows, 'check_updates', self.check_updates)
75 self.stopped = False
76 yield windows.check_credentials(
77 FakeCredentialsManagementTool,
78@@ -126,6 +142,7 @@
79 self.assertEqual(self._called, ((), {'with_icon': False}))
80 # Should stop the app
81 self.assertTrue(self.stopped)
82+ self.assertTrue(self.updates_checked)
83
84 @defer.inlineCallbacks
85 def test_without_installed_flag(self):
86@@ -136,7 +153,7 @@
87 FakeCredentialsManagementTool,
88 gui, logger)
89 self.assertEqual(self._called, (('Something not false',
90- gui, False), {}))
91+ gui, False, logger), {}))
92
93 @defer.inlineCallbacks
94 def test_with_installed_flag(self):
95@@ -147,4 +164,4 @@
96 FakeCredentialsManagementTool,
97 gui, logger, installer=True)
98 self.assertEqual(self._called, (('Something not false',
99- gui, True), {}))
100+ gui, True, logger), {}))
101
102=== modified file 'ubuntuone_installer/gui/qt/main/windows.py'
103--- ubuntuone_installer/gui/qt/main/windows.py 2011-09-19 23:00:32 +0000
104+++ ubuntuone_installer/gui/qt/main/windows.py 2011-09-22 19:45:30 +0000
105@@ -29,6 +29,7 @@
106 # pylint: disable=W0611
107 from ubuntuone_installer.gui.qt.ui import images_rc
108 # pylint: enable=W0611
109+from ubuntuone_installer.gui.qt import utils
110
111
112 def stop(*args):
113@@ -43,14 +44,20 @@
114 'Error while getting the credentials: %r', exc)
115 stop()
116
117-
118-def success_cb(creds, gui, installing):
119+@defer.inlineCallbacks
120+def success_cb(creds, gui, installing, logger):
121 """Handle credentials success."""
122+ logger.debug('Got back from sso.')
123 if creds: # Have credentials already
124- from ubuntuone_installer.gui.qt import utils
125+ logger.debug('Already got credentials.')
126+ logger.info('Starting control panel.')
127 utils.start_control_panel(with_icon=False)
128+ logger.info('Checking updates.')
129+ yield check_updates(gui, logger)
130+ logger.info('Stopping.')
131 stop()
132 else: # No credentials
133+ logger.debug('Did got connections.')
134 window = gui.MainWindow(close_callback=stop, installing=installing)
135 # Set Application Style Sheet
136 app = QtGui.QApplication.instance()
137@@ -65,7 +72,8 @@
138
139
140 @defer.inlineCallbacks
141-def check_credentials(credentials_tool, gui, logger, installer=False):
142+def check_credentials(credentials_tool, gui, logger,
143+ installer=False):
144 """Check credentials and either start u1cp or show the wizard."""
145 credtool = credentials_tool()
146 # pylint: disable=W0703
147@@ -74,7 +82,23 @@
148 except Exception, exc:
149 error_cb(exc, logger)
150 else:
151- success_cb(creds, gui, installer)
152+ yield success_cb(creds, gui, installer, logger)
153+
154+@defer.inlineCallbacks
155+def check_updates(gui, logger):
156+ """Check for updates."""
157+ logger.info('Checking for updates.')
158+ # the idea is simple, check if there are updates, ask user if we perform
159+ # the update and continue.
160+ are_updates_present = yield utils.are_updates_present(logger)
161+ logger.debug('Updates present: %r', are_updates_present)
162+ if are_updates_present:
163+ logger.info('Updates are present.')
164+ if gui.user_wants_to_update():
165+ logger.info('Performing auto-update in diff process.')
166+ utils.perform_update()
167+ else:
168+ logger.info('No updates are present.')
169
170
171 def main(installing=False):
172
173=== modified file 'ubuntuone_installer/gui/qt/tests/test_gui.py'
174--- ubuntuone_installer/gui/qt/tests/test_gui.py 2011-09-21 18:24:39 +0000
175+++ ubuntuone_installer/gui/qt/tests/test_gui.py 2011-09-22 19:45:30 +0000
176@@ -22,6 +22,7 @@
177 from PyQt4 import QtGui, QtCore
178 from ubuntuone.controlpanel.gui import qt
179 from ubuntuone.platform.credentials import APP_NAME
180+from twisted.internet import defer
181
182 from ubuntuone_installer.gui import NEXT
183 from ubuntuone_installer.gui.qt import gui, forgotten, utils
184@@ -662,3 +663,51 @@
185 [QtGui.QWizard.Stretch,
186 QtGui.QWizard.FinishButton,
187 QtGui.QWizard.NextButton])
188+
189+class UpgradeQuestion(BaseTestCase):
190+ """Test the dialog that ask the user if he wants to upgrade."""
191+
192+ @defer.inlineCallbacks
193+ def setUp(self):
194+ """Set the tests."""
195+ yield super(UpgradeQuestion, self).setUp()
196+ self.answer = 0
197+ self.parent = None
198+ self.title = None
199+ self.text = None
200+ self.yes_button = None
201+ self.no_button = None
202+
203+ def fake_question(parent, title, text, yes_button,
204+ no_button):
205+ """Fake asking a question."""
206+ self.parent = parent
207+ self.title = title
208+ self.text = text
209+ self.yes_button = yes_button
210+ self.no_button = no_button
211+ return self.answer
212+
213+ self.patch(gui.QtGui.QMessageBox, 'question', fake_question)
214+
215+ def user_wants_to_update_true(self):
216+ """Test the question."""
217+ self.answer = gui.QtGui.QMessageBox.Yes
218+ self.assertTrue(gui.user_wants_to_update(), 'User wants to update.')
219+ # lets assert the parameters
220+ self.assertTrue(None, self.parent)
221+ self.assertTrue(self.title, gui.UPDATE_TITLE)
222+ self.assertTrue(self.text, gui.UPDATE_SOFTWARE)
223+ self.assertTrue(self.yes_button, gui.QtGui.QMessageBox.Yes)
224+ self.assertTrue(self.no_button, gui.QtGui.QMessageBox.No)
225+
226+ def user_wants_to_update_false(self):
227+ """Test the question."""
228+ self.answer = gui.QtGui.QMessageBox.No
229+ self.assertFalse(gui.user_wants_to_update(), 'User DOES NOT want to update.')
230+ # lets assert the parameters
231+ self.assertTrue(None, self.parent)
232+ self.assertTrue(self.title, gui.UPDATE_TITLE)
233+ self.assertTrue(self.text, gui.UPDATE_SOFTWARE)
234+ self.assertTrue(self.yes_button, gui.QtGui.QMessageBox.Yes)
235+ self.assertTrue(self.no_button, gui.QtGui.QMessageBox.No)
236
237=== modified file 'ubuntuone_installer/gui/qt/utils/__init__.py'
238--- ubuntuone_installer/gui/qt/utils/__init__.py 2011-09-01 13:52:35 +0000
239+++ ubuntuone_installer/gui/qt/utils/__init__.py 2011-09-22 19:45:30 +0000
240@@ -28,9 +28,13 @@
241 start_control_panel = windows.start_control_panel
242 add_syncdaemon_to_autostart = windows.add_syncdaemon_to_autostart
243 default_folders = windows.default_folders
244+ are_updates_present = windows.are_updates_present
245+ perform_update = windows.perform_update
246 else:
247 from ubuntuone_installer.gui.qt.utils import linux
248 uninstall_application = linux.uninstall_application
249 start_control_panel = linux.start_control_panel
250 add_syncdaemon_to_autostart = linux.add_syncdaemon_to_autostart
251 default_folders = linux.default_folders
252+ are_updates_present = lambda *args, **kwargs: False
253+ perform_update = lambda *args, **kwargs: None
254
255=== modified file 'ubuntuone_installer/gui/qt/utils/tests/test_windows.py'
256--- ubuntuone_installer/gui/qt/utils/tests/test_windows.py 2011-09-19 23:01:24 +0000
257+++ ubuntuone_installer/gui/qt/utils/tests/test_windows.py 2011-09-22 19:45:30 +0000
258@@ -27,6 +27,8 @@
259 import win32api
260 # pylint: enable=F0401
261
262+from twisted.internet import defer
263+
264 from ubuntuone_installer.gui.qt import utils
265 from ubuntuone_installer.gui.qt.tests import BaseTestCase
266
267@@ -229,3 +231,86 @@
268 pictures = buf.value
269 expected = [docs, music, pictures]
270 self.assertEqual(sorted(folders), sorted(expected))
271+
272+
273+class FakeLogger(object):
274+ """A Fake logging object."""
275+
276+ def __init__(self):
277+ """Create a new instance."""
278+ self.called_methods = []
279+
280+ def info(self, message, *args, **kwargs):
281+ """Set an info log message."""
282+ self.called_methods.append(('info', message, args, kwargs))
283+
284+ def debug(self, message, *args, **kwargs):
285+ """Set a debug log message."""
286+ self.called_methods.append(('debug', message, args, kwargs))
287+
288+
289+class AutoupdaterTestCase(BaseTestCase):
290+ """Test the code that is used for the auto update process."""
291+
292+ @defer.inlineCallbacks
293+ def setUp(self):
294+ """Prepare for the diff tests."""
295+ yield super(AutoupdaterTestCase, self).setUp()
296+ self.auto_update_path = r'path\to\exe'
297+ self.return_from_call = 0
298+ self.command = None
299+ self.args = []
300+
301+ def fake_execute_process(command, args=None, path=None):
302+ """Fake async process execution."""
303+ self.command = command
304+ self.args = args
305+ return self.return_from_call
306+
307+ self.fake_logger = FakeLogger()
308+ self.patch(utils.windows, 'getProcessValue', fake_execute_process)
309+ self.patch(utils.windows, '_get_update_path',
310+ lambda:self.auto_update_path)
311+
312+
313+ @defer.inlineCallbacks
314+ def test_are_updates_present_true(self):
315+ """Test when updates are present."""
316+ # the idea is simple, set the value to be returned from
317+ # the fake call, assert that we get true and also that
318+ # we did use the correct parameters.
319+ self.return_from_call = 0
320+ are_present = yield utils.are_updates_present(self.fake_logger)
321+ self.assertTrue(are_present, 'Updates should be present.')
322+ # lets assert that we did use the correct args
323+ expected_args = ('--mode', 'unattended')
324+ self.assertEqual(expected_args, self.args)
325+ self.assertEqual(self.command, self.auto_update_path)
326+
327+
328+ @defer.inlineCallbacks
329+ def test_are_updates_present_false(self):
330+ """Test when updates are not present."""
331+ # similar to test_are_updates_present_true but with diff retcode
332+ self.return_from_call = 40
333+ are_present = yield utils.are_updates_present(self.fake_logger)
334+ self.assertFalse(are_present, 'Updates should NOT be present.')
335+ # lets assert that we did use the correct args
336+ expected_args = ('--mode', 'unattended')
337+ self.assertEqual(expected_args, self.args)
338+ self.assertEqual(self.command, self.auto_update_path)
339+
340+ def test_perform_update(self):
341+ """Test the method that perfroms the update."""
342+ self.patch(utils.windows.win32api, 'ShellExecute', self._set_called)
343+ utils.perform_update()
344+ self.assertIn(self.auto_update_path, self._called[0][2])
345+ self.assertEqual('runas', self._called[0][1])
346+ self.assertEqual('--unattendedmodeui none', self._called[0][3])
347+ self.assertEqual('', self._called[0][4])
348+ self.assertEqual(0, self._called[0][5])
349+
350+ def test_get_auto_update_path(self):
351+ """Test the method used to get the autoupdate."""
352+
353+
354
355=== modified file 'ubuntuone_installer/gui/qt/utils/windows.py'
356--- ubuntuone_installer/gui/qt/utils/windows.py 2011-09-19 23:00:32 +0000
357+++ ubuntuone_installer/gui/qt/utils/windows.py 2011-09-22 19:45:30 +0000
358@@ -30,6 +30,9 @@
359 import _winreg
360 # pylint: enable=F0401
361
362+from twisted.internet import defer
363+from twisted.internet.utils import getProcessValue
364+
365 AUTORUN_KEY = r"Software\Microsoft\Windows\CurrentVersion\Run"
366
367
368@@ -47,6 +50,47 @@
369 '--mode win32', '', 0)
370
371
372+def _get_update_path():
373+ """Return the path in which the autoupdate command is found."""
374+ if hasattr(sys, "frozen"):
375+ exec_path = os.path.abspath(sys.executable)
376+ else:
377+ exec_path = os.path.dirname(__file__)
378+ folder = os.path.dirname(exec_path)
379+ update_path = os.path.join(folder, "autoupdate-windows.exe")
380+ if os.path.exists(update_path):
381+ return update_path
382+ return None
383+
384+
385+@defer.inlineCallbacks
386+def are_updates_present(logger):
387+ """Return if there are updates for Ubuntu One."""
388+ update_path = _get_update_path()
389+ logger.debug('Update path %s', update_path)
390+ if update_path is not None:
391+ # If there is an update present we will get 0 and other number
392+ # otherwise
393+ retcode = yield getProcessValue(update_path, args=('--mode',
394+ 'unattended'), path=os.path.dirname(update_path))
395+ logger.debug('Return code %s', retcode)
396+ if retcode == 0:
397+ logger.debug('Returning True')
398+ defer.returnValue(True)
399+ logger.debug('Returning False')
400+ defer.returnValue(False)
401+
402+
403+def perform_update():
404+ """Spawn the autoupdate process and call the stop funtion."""
405+ update_path = _get_update_path()
406+ if update_path is not None:
407+ # lets call the updater with the commands that are required,
408+ win32api.ShellExecute(None, 'runas',
409+ update_path,
410+ '--unattendedmodeui none', '', 0)
411+
412+
413 def start_control_panel(with_icon=True):
414 """Start the control panel."""
415 # If we are in windows and "frozen", assume it's in

Subscribers

People subscribed via source and target branches