Merge lp:~tealeg/landscape-client/sanitise-hostname into lp:~landscape/landscape-client/trunk

Proposed by Geoff Teale
Status: Merged
Approved by: Chad Smith
Approved revision: 547
Merged at revision: 546
Proposed branch: lp:~tealeg/landscape-client/sanitise-hostname
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 503 lines (+258/-12) (has conflicts)
9 files modified
landscape/ui/view/configuration.py (+77/-2)
landscape/ui/view/tests/test_configuration.py (+56/-0)
landscape/ui/view/ui/landscape-client-settings.glade (+1/-1)
man/landscape-client.1 (+1/-1)
man/landscape-config.1 (+1/-1)
man/landscape-message.1 (+1/-1)
po/fr.po (+83/-6)
po/landscape-client.pot (+36/-0)
setup.cfg (+2/-0)
Text conflict in po/fr.po
Text conflict in po/landscape-client.pot
To merge this branch: bzr merge lp:~tealeg/landscape-client/sanitise-hostname
Reviewer Review Type Date Requested Status
Chad Smith Approve
Mike Milner (community) Approve
Review via email: mp+99053@code.launchpad.net

Description of the change

Fixes #954507.

Adds a Gtk.InfoBar and in-entry icon that are both displayed when a validation check fails.
Also adds a validation check.

To post a comment you must log in.
Revision history for this message
Mike Milner (milner) wrote :

Looks good! +1

[1]
68 def register_response(self, widget):
69 - self.response(Gtk.ResponseType.OK)
70 + if self.validity_check():
71 + self.response(Gtk.ResponseType.OK)
72 + else:
73 + return False

This function only returns explicitly if the dialog is not valid. You can probably drop the else clause entirely.

[2]
142 + def test_sanitise_host_name(self):
143 + """
144 + Test UI level host_name sanitation.
145 + """

A nitpick here, but test docstrings shouldn't start with "Test that.." or "Check if..." Just state what the test is verifying. Something like """C{dialog.sanitise_host_name} removes leading and trailing spaces from hostnames."""

review: Approve
Revision history for this message
Chad Smith (chad.smith) wrote :

+1!

[1] Probably can boil down this regex a bit more:

14 +HOSTNAME_REGEXP = re.compile(
15 + "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)"
16 + "*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$")

So I think the regex could be:

"^(([a-zA-Z][a-zA-Z0-9\-]*)?[a-zA-Z0-9][\.]?)*"
"(([A-Za-z][A-Za-z0-9\-]*)?[A-Za-z0-9])$"

[2] I get merge conflicts in the translation files that you'll probably resolve on commit.
patching file po/fr.po
Hunk #1 FAILED at 8.
Hunk #2 FAILED at 56.
Hunk #3 FAILED at 124.
Hunk #4 succeeded at 150 (offset 1 line).
3 out of 4 hunks FAILED -- saving rejects to file po/fr.po.rej
patching file po/landscape-client.pot
Hunk #1 FAILED at 8.
Hunk #2 FAILED at 55.
2 out of 2 hunks FAILED -- saving rejects to file po/landscape-client.pot.rej
patching file setup.cfg

Too bad underscore is part of \w, would have made things look a lot simpler.

review: Approve
Revision history for this message
Geoff Teale (tealeg) wrote :

> Looks good! +1
>
> [1]
> 68 def register_response(self, widget):
> 69 - self.response(Gtk.ResponseType.OK)
> 70 + if self.validity_check():
> 71 + self.response(Gtk.ResponseType.OK)
> 72 + else:
> 73 + return False
>
> This function only returns explicitly if the dialog is not valid. You can
> probably drop the else clause entirely.

Good call. Done.

>
>
> [2]
> 142 + def test_sanitise_host_name(self):
> 143 + """
> 144 + Test UI level host_name sanitation.
> 145 + """
>
> A nitpick here, but test docstrings shouldn't start with "Test that.." or
> "Check if..." Just state what the test is verifying. Something like
> """C{dialog.sanitise_host_name} removes leading and trailing spaces from
> hostnames."""

Fair enough, I was struggling to think of a decent like there. Done.

Revision history for this message
Geoff Teale (tealeg) wrote :

> +1!
>
> [1] Probably can boil down this regex a bit more:
>
> 14 +HOSTNAME_REGEXP = re.compile(
> 15 + "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)"
> 16 + "*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$")
>
>
> So I think the regex could be:
>
> "^(([a-zA-Z][a-zA-Z0-9\-]*)?[a-zA-Z0-9][\.]?)*"
> "(([A-Za-z][A-Za-z0-9\-]*)?[A-Za-z0-9])$"

Looks good! Done.

>
> [2] I get merge conflicts in the translation files that you'll probably
> resolve on commit.
> patching file po/fr.po
> Hunk #1 FAILED at 8.
> Hunk #2 FAILED at 56.
> Hunk #3 FAILED at 124.
> Hunk #4 succeeded at 150 (offset 1 line).
> 3 out of 4 hunks FAILED -- saving rejects to file po/fr.po.rej
> patching file po/landscape-client.pot
> Hunk #1 FAILED at 8.
> Hunk #2 FAILED at 55.
> 2 out of 2 hunks FAILED -- saving rejects to file po/landscape-client.pot.rej
> patching file setup.cfg
>
>
>
> Too bad underscore is part of \w, would have made things look a lot simpler.

OK. I'll make sure this is right when I merge.

Thanks!

548. By Geoff Teale

Remove unused boolean return (from milner's review).

549. By Geoff Teale

Better docstring for test (from milner's review).

550. By Geoff Teale

lint

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'landscape/ui/view/configuration.py'
2--- landscape/ui/view/configuration.py 2012-03-23 10:49:43 +0000
3+++ landscape/ui/view/configuration.py 2012-03-28 08:35:22 +0000
4@@ -1,3 +1,4 @@
5+import re
6 import os
7
8 from gettext import gettext as _
9@@ -7,6 +8,10 @@
10 from landscape.ui.constants import (
11 CANONICAL_MANAGED, LOCAL_MANAGED, NOT_MANAGED)
12
13+# Note, I think this may not be fully compliant with the changes in RFC 1123
14+HOSTNAME_REGEXP = re.compile("^(([a-zA-Z][a-zA-Z0-9\-]*)?[a-zA-Z0-9][\.]?)*"
15+ "(([A-Za-z][A-Za-z0-9\-]*)?[A-Za-z0-9])$")
16+
17
18 class ClientSettingsDialog(Gtk.Dialog):
19 """
20@@ -30,6 +35,32 @@
21 # One extra revert to reset after loading data
22 self.controller.revert()
23
24+ def sanitise_host_name(self, host_name):
25+ """
26+ Do some minimal input sanitation.
27+ """
28+ return host_name.strip()
29+
30+ def is_valid_host_name(self, host_name):
31+ return HOSTNAME_REGEXP.match(host_name) is not None
32+
33+ def validity_check(self):
34+ if self.use_type_combobox.get_active() < 2:
35+ return True
36+ else:
37+ host_name = self.sanitise_host_name(
38+ self.local_landscape_host_entry.get_text())
39+ if self.is_valid_host_name(host_name):
40+ self.local_landscape_host_entry.set_text(host_name)
41+ return True
42+ else:
43+ self.info_message.set_text(self.INVALID_HOSTNAME_MESSAGE)
44+ self.local_landscape_host_entry.set_icon_from_stock(
45+ Gtk.EntryIconPosition.PRIMARY,
46+ Gtk.STOCK_DIALOG_WARNING)
47+ self._info_bar_container.show()
48+ return False
49+
50 @property
51 def NO_SERVICE_TEXT(self):
52 return _("None")
53@@ -50,6 +81,10 @@
54 def DISABLE_BUTTON_TEXT(self):
55 return _("Disable")
56
57+ @property
58+ def INVALID_HOSTNAME_MESSAGE(self):
59+ return _("Invalid host name.")
60+
61 def _set_use_type_combobox_from_controller(self):
62 """
63 Load the persisted L{management_type} from the controller and set the
64@@ -140,7 +175,8 @@
65 self.response(Gtk.ResponseType.CANCEL)
66
67 def register_response(self, widget):
68- self.response(Gtk.ResponseType.OK)
69+ if self.validity_check():
70+ self.response(Gtk.ResponseType.OK)
71
72 def set_button_text(self, management_type):
73 [alignment] = self.register_button.get_children()
74@@ -165,6 +201,41 @@
75 self.register_button.show()
76 self.register_button.connect("clicked", self.register_response)
77
78+ def dismiss_infobar(self, widget):
79+ self._info_bar_container.hide()
80+ self.local_landscape_host_entry.set_icon_from_stock(
81+ Gtk.EntryIconPosition.PRIMARY, None)
82+
83+ def setup_info_bar(self):
84+ labels_size_group = self._builder.get_object("labels-sizegroup")
85+ entries_size_group = self._builder.get_object("entries-sizegroup")
86+ labels_size_group.set_ignore_hidden(False)
87+ entries_size_group.set_ignore_hidden(False)
88+ self._info_bar_container = Gtk.HBox()
89+ self._info_bar_container.set_spacing(12)
90+ info_bar = Gtk.InfoBar()
91+ entries_size_group.add_widget(info_bar)
92+ info_bar.show()
93+ empty_label = Gtk.Label()
94+ labels_size_group.add_widget(empty_label)
95+ empty_label.show()
96+ self._info_bar_container.pack_start(empty_label, expand=False,
97+ fill=False, padding=0)
98+ self._info_bar_container.pack_start(info_bar, expand=False, fill=False,
99+ padding=0)
100+ content_area = info_bar.get_content_area()
101+ hbox = Gtk.HBox()
102+ self.info_message = Gtk.Label()
103+ self.info_message.set_alignment(0, 0.5)
104+ self.info_message.show()
105+ hbox.pack_start(self.info_message, expand=True, fill=True, padding=6)
106+ ok_button = Gtk.Button("Dismiss")
107+ ok_button.connect("clicked", self.dismiss_infobar)
108+ ok_button.show()
109+ hbox.pack_start(ok_button, expand=True, fill=True, padding=0)
110+ hbox.show()
111+ content_area.pack_start(hbox, expand=True, fill=True, padding=0)
112+
113 def setup_ui(self):
114 self._builder = Gtk.Builder()
115 self._builder.set_translation_domain("landscape-client")
116@@ -174,9 +245,13 @@
117 content_area = self.get_content_area()
118 content_area.set_spacing(12)
119 self.set_border_width(12)
120+ self.setup_info_bar()
121 self._vbox = self._builder.get_object("toplevel-vbox")
122 self._vbox.unparent()
123- content_area.pack_start(self._vbox, expand=True, fill=True, padding=12)
124+ content_area.pack_start(self._vbox, expand=True, fill=True,
125+ padding=12)
126+ self._vbox.pack_start(self._info_bar_container, expand=False,
127+ fill=False, padding=0)
128 self.liststore = self.make_liststore()
129 self.link_use_type_combobox(self.liststore)
130 self.link_hosted_service_widgets()
131
132=== modified file 'landscape/ui/view/tests/test_configuration.py'
133--- landscape/ui/view/tests/test_configuration.py 2012-03-16 14:57:32 +0000
134+++ landscape/ui/view/tests/test_configuration.py 2012-03-28 08:35:22 +0000
135@@ -210,6 +210,62 @@
136 self.assertEqual("foo", dialog.hosted_account_name_entry.get_text())
137 self.assertEqual("bar", dialog.hosted_password_entry.get_text())
138
139+ def test_sanitise_host_name(self):
140+ """
141+ Test that L{ClientSettingsDialog.sanitise_host_name} removes both
142+ leading and trailing white space from a host name.
143+ """
144+ dialog = ClientSettingsDialog(self.controller)
145+ self.assertEquals("foo.bar", dialog.sanitise_host_name(" foo.bar"))
146+ self.assertEquals("foo.bar", dialog.sanitise_host_name("foo.bar "))
147+ self.assertEquals("foo.bar", dialog.sanitise_host_name(" foo.bar "))
148+
149+ def test_is_valid_host_name(self):
150+ """
151+ Test that L{is_valid_host_name} checks host names correctly.
152+ """
153+ dialog = ClientSettingsDialog(self.controller)
154+ self.assertTrue(dialog.is_valid_host_name("foo.bar"))
155+ self.assertFalse(dialog.is_valid_host_name("foo bar"))
156+ self.assertFalse(dialog.is_valid_host_name("f\xc3.bar"))
157+
158+ def test_validity_check(self):
159+ """
160+ Test that the L{validity_check} returns True for valid input and False
161+ for invalid input.
162+ """
163+ dialog = ClientSettingsDialog(self.controller)
164+ self.run_gtk_eventloop()
165+
166+ # Checking disable should always return True
167+ dialog.use_type_combobox.set_active(0)
168+ self.run_gtk_eventloop()
169+ self.assertTrue(dialog.validity_check())
170+
171+ # Check for hosted - currently returns True always
172+ dialog.use_type_combobox.set_active(1)
173+ self.run_gtk_eventloop()
174+ self.assertTrue(dialog.validity_check())
175+
176+ # Checks for local
177+ dialog.use_type_combobox.set_active(2)
178+ self.run_gtk_eventloop()
179+ dialog.local_landscape_host_entry.set_text("foo.bar")
180+ self.run_gtk_eventloop()
181+ self.assertTrue(dialog.validity_check())
182+ dialog.local_landscape_host_entry.set_text(" foo.bar")
183+ self.run_gtk_eventloop()
184+ self.assertTrue(dialog.validity_check())
185+ dialog.local_landscape_host_entry.set_text("foo.bar ")
186+ self.run_gtk_eventloop()
187+ self.assertTrue(dialog.validity_check())
188+ dialog.local_landscape_host_entry.set_text("foo bar")
189+ self.run_gtk_eventloop()
190+ self.assertFalse(dialog.validity_check())
191+ dialog.local_landscape_host_entry.set_text(u"f\xc3.bar")
192+ self.run_gtk_eventloop()
193+ self.assertFalse(dialog.validity_check())
194+
195 if not got_gobject_introspection:
196 skip = gobject_skip_message
197
198
199=== modified file 'landscape/ui/view/ui/landscape-client-settings.glade'
200--- landscape/ui/view/ui/landscape-client-settings.glade 2012-03-14 17:03:14 +0000
201+++ landscape/ui/view/ui/landscape-client-settings.glade 2012-03-28 08:35:22 +0000
202@@ -466,7 +466,7 @@
203 </object>
204 </child>
205 </object>
206- <object class="GtkSizeGroup" id="entries-sizgroup">
207+ <object class="GtkSizeGroup" id="entries-sizegroup">
208 <widgets>
209 <widget name="hosted-account-name-entry"/>
210 <widget name="hosted-password-entry"/>
211
212=== modified file 'man/landscape-client.1'
213--- man/landscape-client.1 2012-03-05 14:11:42 +0000
214+++ man/landscape-client.1 2012-03-28 08:35:22 +0000
215@@ -1,5 +1,5 @@
216 .\"Text automatically generated by txt2man
217-.TH landscape-client "18 January 2010" "" ""
218+.TH landscape-client 1 "27 March 2012" "" ""
219 .SH NAME
220 \fBlandscape-client \fP- Landscape system client
221 \fB
222
223=== modified file 'man/landscape-config.1'
224--- man/landscape-config.1 2012-03-05 14:11:42 +0000
225+++ man/landscape-config.1 2012-03-28 08:35:22 +0000
226@@ -1,5 +1,5 @@
227 .\"Text automatically generated by txt2man
228-.TH landscape-config "18 January 2010" "" ""
229+.TH landscape-config 1 "27 March 2012" "" ""
230 .SH NAME
231 \fBlandscape-config \fP- configure the Landscape management client
232 \fB
233
234=== modified file 'man/landscape-message.1'
235--- man/landscape-message.1 2012-03-05 14:11:42 +0000
236+++ man/landscape-message.1 2012-03-28 08:35:22 +0000
237@@ -1,5 +1,5 @@
238 .\"Text automatically generated by txt2man
239-.TH landscape-message "18 January 2010" "" ""
240+.TH landscape-message 1 "27 March 2012" "" ""
241 .SH NAME
242 \fBlandscape-message \fP- Send a message to the landscape web interface
243 \fB
244
245=== modified file 'po/fr.po'
246--- po/fr.po 2012-03-27 13:46:13 +0000
247+++ po/fr.po 2012-03-28 08:35:22 +0000
248@@ -8,8 +8,13 @@
249 msgstr ""
250 "Project-Id-Version: PACKAGE VERSION\n"
251 "Report-Msgid-Bugs-To: \n"
252+<<<<<<< TREE
253 "POT-Creation-Date: 2012-03-27 15:42+0200\n"
254 "PO-Revision-Date: 2012-03-27 15:45+0100\n"
255+=======
256+"POT-Creation-Date: 2012-03-28 10:04+0200\n"
257+"PO-Revision-Date: 2012-03-23 11:25+0100\n"
258+>>>>>>> MERGE-SOURCE
259 "Last-Translator: Thomas Hervé <thomas.herve@canonical.com>\n"
260 "Language-Team: français <>\n"
261 "Language: \n"
262@@ -56,34 +61,77 @@
263 msgid "Attempting to disable landscape client."
264 msgstr "Tentative de désactivation du client Landscape."
265
266+<<<<<<< TREE
267 #: ../landscape/ui/view/configuration.py:22
268 #: ../applications/landscape-client-settings.desktop.in.h:1
269 msgid "Management Service"
270 msgstr "Service de gestion"
271
272 #: ../landscape/ui/view/configuration.py:35
273+=======
274+#: ../landscape/ui/view/configuration.py:28
275+#: ../applications/landscape-client-settings.desktop.in.h:1
276+msgid "Management Service"
277+msgstr "Service de gestion"
278+
279+#: ../landscape/ui/view/configuration.py:67
280+>>>>>>> MERGE-SOURCE
281 msgid "None"
282 msgstr "Aucun"
283
284+<<<<<<< TREE
285 #: ../landscape/ui/view/configuration.py:39
286+=======
287+#: ../landscape/ui/view/configuration.py:71
288+>>>>>>> MERGE-SOURCE
289 msgid "Landscape - hosted by Canonical"
290 msgstr "Landscape - hébergé par Canonical"
291
292+<<<<<<< TREE
293 #: ../landscape/ui/view/configuration.py:43
294+=======
295+#: ../landscape/ui/view/configuration.py:75
296+>>>>>>> MERGE-SOURCE
297 msgid "Landscape - dedicated server"
298 msgstr "Landscape - serveur dédié"
299
300+<<<<<<< TREE
301 #: ../landscape/ui/view/configuration.py:47
302+=======
303+#: ../landscape/ui/view/configuration.py:79
304+>>>>>>> MERGE-SOURCE
305 msgid "Register"
306 msgstr "S'enregistrer"
307
308+<<<<<<< TREE
309 #: ../landscape/ui/view/configuration.py:51
310+=======
311+#: ../landscape/ui/view/configuration.py:83
312+>>>>>>> MERGE-SOURCE
313 msgid "Disable"
314 msgstr "Désactiver"
315
316+<<<<<<< TREE
317+=======
318+#: ../landscape/ui/view/configuration.py:87
319+msgid "Invalid host name."
320+msgstr "Nom d'hôte invalide."
321+
322+>>>>>>> MERGE-SOURCE
323 #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:1
324+<<<<<<< TREE
325 msgid "Landscape is a remote administration service from Canonical. If you allow it, a Landcape server can monitor this computer's performance and send administration commands."
326 msgstr "Landscape est un service de gestion à distance de Canonical. Si vous l'autorisez, un serveur Landscape peut surveiller les performance de cette machine et envoyer des commandes administratives."
327+=======
328+msgid ""
329+"Landscape is a remote administration service from Canonical. If you allow "
330+"it, a Landcape server can monitor this computer's performance and send "
331+"administration commands."
332+msgstr ""
333+"Landscape est un service de gestion à distance de Canonical. Si vous "
334+"l'autorisez, un serveur Landscape peut surveiller les performance de cette "
335+"machine et envoyer des commandes administratives."
336+>>>>>>> MERGE-SOURCE
337
338 #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:2
339 #: ../scripts/landscape-client-ui-install:52
340@@ -115,8 +163,18 @@
341 msgstr "Nom d'hôte du serveur Landscape:"
342
343 #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:9
344+<<<<<<< TREE
345 msgid "If you click \"Disable\" the Landscape client on this machine will be disabled. You can reenable it later by revisiting this dialog."
346 msgstr "Si vous cliquez sur \"Désactiver\" le client Landscape sera désactivé sur cette machine. Vous pouvez le réactiver plus tard en rouvrant cette fenêtre de dialogue."
347+=======
348+msgid ""
349+"If you click \"Disable\" the Landscape client on this machine will be "
350+"disabled. You can reenable it later by revisiting this dialog."
351+msgstr ""
352+"Si vous cliquez sur \"Désactiver\" le client Landscape sera désactivé sur "
353+"cette machine. Vous pouvez le réactiver plus tard en rouvrant cette fenêtre "
354+"de dialogue."
355+>>>>>>> MERGE-SOURCE
356
357 #: ../applications/landscape-client-settings.desktop.in.h:2
358 msgid "Management Service Preferences"
359@@ -124,24 +182,44 @@
360
361 #: ../polkit-1/com.canonical.LandscapeClientSettings.policy.in.h:1
362 msgid "Allow the user to read and write Landscape Client settings."
363-msgstr "Autorise l'utilisateur à lire et écrire la configuration du client Landscape."
364+msgstr ""
365+"Autorise l'utilisateur à lire et écrire la configuration du client Landscape."
366
367 #: ../polkit-1/com.canonical.LandscapeClientSettings.policy.in.h:2
368-msgid "System policy prevents you from reading and writing Landscape Client Settings."
369-msgstr "Politique système vous empêchant de lire et d'écrire la configuration du client Landscape."
370+msgid ""
371+"System policy prevents you from reading and writing Landscape Client "
372+"Settings."
373+msgstr ""
374+"Politique système vous empêchant de lire et d'écrire la configuration du "
375+"client Landscape."
376
377 #: ../scripts/landscape-client-ui-install:55
378 msgid "Landscape client"
379 msgstr "Client Landscape"
380
381 #: ../scripts/landscape-client-ui-install:56
382+<<<<<<< TREE
383 #, fuzzy
384 msgid "Landscape is an easy-to-use commercial systems management and monitoring service offered by Canonical that helps administrators manage multiple machines efficiently."
385 msgstr "Landscape est un système de gestion et de surveillance proposé en tant que service par Canonical, qui aide les administrateurs à gérer plusieurs machine efficacement."
386+=======
387+msgid ""
388+"Landscape is an easy to use systems management and monitoring service "
389+"offered by Canonical that helps administrators manage multiple machines "
390+"efficiently."
391+msgstr ""
392+"Landscape est un système de gestion et de surveillance proposé en tant que "
393+"service par Canonical, qui aide les administrateurs à gérer plusieurs "
394+"machine efficacement."
395+>>>>>>> MERGE-SOURCE
396
397 #: ../scripts/landscape-client-ui-install:59
398-msgid "You need to install Landscape client to be able to configure it. Do you want to install it now?"
399-msgstr "Il faut installer le client Landscape pour le configurer. Voulez-vous l'installer maintenant?"
400+msgid ""
401+"You need to install Landscape client to be able to configure it. Do you want "
402+"to install it now?"
403+msgstr ""
404+"Il faut installer le client Landscape pour le configurer. Voulez-vous "
405+"l'installer maintenant?"
406
407 #: ../scripts/landscape-client-ui-install:61
408 msgid "Install Landscape client?"
409@@ -150,4 +228,3 @@
410 #: ../scripts/landscape-client-ui-install:62
411 msgid "Install"
412 msgstr "Installer"
413-
414
415=== modified file 'po/landscape-client.pot'
416--- po/landscape-client.pot 2012-03-27 13:46:13 +0000
417+++ po/landscape-client.pot 2012-03-28 08:35:22 +0000
418@@ -8,7 +8,11 @@
419 msgstr ""
420 "Project-Id-Version: PACKAGE VERSION\n"
421 "Report-Msgid-Bugs-To: \n"
422+<<<<<<< TREE
423 "POT-Creation-Date: 2012-03-27 15:42+0200\n"
424+=======
425+"POT-Creation-Date: 2012-03-28 10:04+0200\n"
426+>>>>>>> MERGE-SOURCE
427 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
428 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
429 "Language-Team: LANGUAGE <LL@li.org>\n"
430@@ -55,31 +59,63 @@
431 msgid "Attempting to disable landscape client."
432 msgstr ""
433
434+<<<<<<< TREE
435 #: ../landscape/ui/view/configuration.py:22
436 #: ../applications/landscape-client-settings.desktop.in.h:1
437 msgid "Management Service"
438 msgstr ""
439
440 #: ../landscape/ui/view/configuration.py:35
441+=======
442+#: ../landscape/ui/view/configuration.py:28
443+#: ../applications/landscape-client-settings.desktop.in.h:1
444+msgid "Management Service"
445+msgstr ""
446+
447+#: ../landscape/ui/view/configuration.py:67
448+>>>>>>> MERGE-SOURCE
449 msgid "None"
450 msgstr ""
451
452+<<<<<<< TREE
453 #: ../landscape/ui/view/configuration.py:39
454+=======
455+#: ../landscape/ui/view/configuration.py:71
456+>>>>>>> MERGE-SOURCE
457 msgid "Landscape - hosted by Canonical"
458 msgstr ""
459
460+<<<<<<< TREE
461 #: ../landscape/ui/view/configuration.py:43
462+=======
463+#: ../landscape/ui/view/configuration.py:75
464+>>>>>>> MERGE-SOURCE
465 msgid "Landscape - dedicated server"
466 msgstr ""
467
468+<<<<<<< TREE
469 #: ../landscape/ui/view/configuration.py:47
470+=======
471+#: ../landscape/ui/view/configuration.py:79
472+>>>>>>> MERGE-SOURCE
473 msgid "Register"
474 msgstr ""
475
476+<<<<<<< TREE
477 #: ../landscape/ui/view/configuration.py:51
478+=======
479+#: ../landscape/ui/view/configuration.py:83
480+>>>>>>> MERGE-SOURCE
481 msgid "Disable"
482 msgstr ""
483
484+<<<<<<< TREE
485+=======
486+#: ../landscape/ui/view/configuration.py:87
487+msgid "Invalid host name."
488+msgstr ""
489+
490+>>>>>>> MERGE-SOURCE
491 #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:1
492 msgid ""
493 "Landscape is a remote administration service from Canonical. If you allow "
494
495=== modified file 'setup.cfg'
496--- setup.cfg 2012-03-23 10:04:18 +0000
497+++ setup.cfg 2012-03-28 08:35:22 +0000
498@@ -5,3 +5,5 @@
499 domain=landscape-client
500 xml_files=[("share/polkit-1/actions/", ["polkit-1/com.canonical.LandscapeClientSettings.policy.in"])]
501 desktop_files=[("share/applications", ["applications/landscape-client-settings.desktop.in"])]
502+merge_po=True
503+

Subscribers

People subscribed via source and target branches

to all changes: