Script 'mail_helper' called by ro
Hello packager,
This is just FYI. Your package was checked in in distribution "sle12"
by autobuild-member: ro.
Here comes the log...
---------------------------%<------------------------------
Hi,
here is the log from ci_new_pac /mounts/work_src_done/SLE12/yast2-bootloader -> sle12
Changes:
--------
--- /work/SRC/SUSE:SLE-12:GA/yast2-bootloader/yast2-bootloader.changes 2014-02-12 15:18:53.000000000 +0100
+++ /mounts/work_src_done/SLE12/yast2-bootloader/yast2-bootloader.changes 2014-02-27 12:02:23.000000000 +0100
@@ -1,0 +2,8 @@
+Thu Feb 27 08:32:24 UTC 2014 - jreidinger(a)suse.com
+
+- Add support for password in GRUB2 (FATE#315404)
+- restructure details dialog in GRUB2 to have better UX
+- fix crash of GRUB2 module
+- 3.1.6
+
+-------------------------------------------------------------------
calling whatdependson for sle12-i586
Packages directly triggered for rebuild:
- yast2-bootloader
- yast2-kdump
- yast2-product-creator
- yast2-reipl
- yast2-vm
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/SUSE:SLE-12:GA/yast2-bootloader (Old)
and /mounts/work_src_done/SLE12/yast2-bootloader (BS:build ID:33564 MAIL:yast-commit@opensuse.org) (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "yast2-bootloader", Maintainer is "yast-commit(a)opensuse.org"
Old:
----
yast2-bootloader-3.1.5.tar.bz2
New:
----
yast2-bootloader-3.1.6.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ yast2-bootloader.spec ++++++
--- /var/tmp/diff_new_pack.hdIoCg/_old 2014-02-28 11:21:45.000000000 +0100
+++ /var/tmp/diff_new_pack.hdIoCg/_new 2014-02-28 11:21:45.000000000 +0100
@@ -17,7 +17,7 @@
Name: yast2-bootloader
-Version: 3.1.5
+Version: 3.1.6
Release: 0
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -26,11 +26,13 @@
Group: System/YaST
License: GPL-2.0+
BuildRequires: yast2-devtools >= 3.1.10
+BuildRequires: yast2 >= 3.1.0
BuildRequires: update-desktop-files
+BuildRequires: rubygem-rspec
PreReq: /bin/sed %fillup_prereq
# Installation::*version variables
# Wizard::SetDialogTitleAndIcon
-Requires: yast2 >= 2.21.22
+Requires: yast2 >= 3.1.0
Requires: yast2-packager >= 2.17.24
Requires: yast2-pkg-bindings >= 2.17.25
Requires: perl-Bootloader-YAML
@@ -74,6 +76,9 @@
%build
%yast_build
+%check
+make check VERBOSE=1
+
%install
%yast_install
@@ -110,6 +115,7 @@
%dir %{yast_schemadir}/autoyast
%dir %{yast_schemadir}/autoyast/rnc
%{yast_schemadir}/autoyast/rnc/bootloader.rnc
+%{yast_libdir}/bootloader
%dir %{yast_docdir}
%doc %{yast_docdir}/COPYING
++++++ yast2-bootloader-3.1.5.tar.bz2 -> yast2-bootloader-3.1.6.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/SUBDIRS new/yast2-bootloader-3.1.6/SUBDIRS
--- old/yast2-bootloader-3.1.5/SUBDIRS 2014-02-12 13:15:20.000000000 +0100
+++ new/yast2-bootloader-3.1.6/SUBDIRS 2014-02-27 16:19:29.000000000 +0100
@@ -1 +1 @@
-SUBDIRS = src scripts doc
+SUBDIRS = src scripts doc test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/package/yast2-bootloader.changes new/yast2-bootloader-3.1.6/package/yast2-bootloader.changes
--- old/yast2-bootloader-3.1.5/package/yast2-bootloader.changes 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/package/yast2-bootloader.changes 2014-02-27 16:19:30.000000000 +0100
@@ -1,4 +1,12 @@
-------------------------------------------------------------------
+Thu Feb 27 08:32:24 UTC 2014 - jreidinger(a)suse.com
+
+- Add support for password in GRUB2 (FATE#315404)
+- restructure details dialog in GRUB2 to have better UX
+- fix crash of GRUB2 module
+- 3.1.6
+
+-------------------------------------------------------------------
Wed Feb 12 10:18:39 UTC 2014 - jreidinger(a)suse.com
- rephrase bootloader proposal on summary screen (BNC#853058)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/package/yast2-bootloader.spec new/yast2-bootloader-3.1.6/package/yast2-bootloader.spec
--- old/yast2-bootloader-3.1.5/package/yast2-bootloader.spec 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/package/yast2-bootloader.spec 2014-02-27 16:19:30.000000000 +0100
@@ -17,7 +17,7 @@
Name: yast2-bootloader
-Version: 3.1.5
+Version: 3.1.6
Release: 0
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -26,11 +26,13 @@
Group: System/YaST
License: GPL-2.0+
BuildRequires: yast2-devtools >= 3.1.10
+BuildRequires: yast2 >= 3.1.0
BuildRequires: update-desktop-files
+BuildRequires: rubygem-rspec
PreReq: /bin/sed %fillup_prereq
# Installation::*version variables
# Wizard::SetDialogTitleAndIcon
-Requires: yast2 >= 2.21.22
+Requires: yast2 >= 3.1.0
Requires: yast2-packager >= 2.17.24
Requires: yast2-pkg-bindings >= 2.17.25
Requires: perl-Bootloader-YAML
@@ -74,6 +76,9 @@
%build
%yast_build
+%check
+make check VERBOSE=1
+
%install
%yast_install
@@ -110,6 +115,7 @@
%dir %{yast_schemadir}/autoyast
%dir %{yast_schemadir}/autoyast/rnc
%{yast_schemadir}/autoyast/rnc/bootloader.rnc
+%{yast_libdir}/bootloader
%dir %{yast_docdir}
%doc %{yast_docdir}/COPYING
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/Makefile.am new/yast2-bootloader-3.1.6/src/Makefile.am
--- old/yast2-bootloader-3.1.5/src/Makefile.am 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/Makefile.am 2014-02-27 16:19:30.000000000 +0100
@@ -74,6 +74,11 @@
include/bootloader/ppc/dialogs.rb \
include/bootloader/ppc/helps.rb
+ylibdir = "${yast2dir}/lib/bootloader"
+ylib_DATA = \
+ lib/bootloader/grub2base.rb \
+ lib/bootloader/grub2pwd.rb
+
scrconf_DATA = \
scrconf/cfg_bootloader.scr \
scrconf/cfg_bootsplash.scr \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/include/bootloader/grub/options.rb new/yast2-bootloader-3.1.6/src/include/bootloader/grub/options.rb
--- old/yast2-bootloader-3.1.5/src/include/bootloader/grub/options.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/include/bootloader/grub/options.rb 2014-02-27 16:19:30.000000000 +0100
@@ -247,6 +247,24 @@
false
end
+ def passwd_content
+ HBox(
+ CheckBoxFrame(
+ Id(:use_pas),
+ _("Prot&ect Boot Loader with Password"),
+ true,
+ HBox(
+ HSpacing(2),
+ # text entry
+ Password(Id(:pw1), Opt(:hstretch), _("&Password")),
+ # text entry
+ HSpacing(2),
+ Password(Id(:pw2), Opt(:hstretch), _("Re&type Password")),
+ HStretch()
+ )
+ )
+ )
+ end
# Build a map describing a widget
@@ -255,22 +273,7 @@
{
"widget" => :custom,
# frame
- "custom_widget" => HBox(
- CheckBoxFrame(
- Id(:use_pas),
- _("Prot&ect Boot Loader with Password"),
- true,
- HBox(
- HSpacing(2),
- # text entry
- Password(Id(:pw1), Opt(:hstretch), _("&Password")),
- # text entry
- HSpacing(2),
- Password(Id(:pw2), Opt(:hstretch), _("Re&type Password")),
- HStretch()
- )
- )
- ),
+ "custom_widget" => passwd_content,
"init" => fun_ref(
method(:InitPasswdWidget),
"void (string)"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/include/bootloader/grub2/dialogs.rb new/yast2-bootloader-3.1.6/src/include/bootloader/grub2/dialogs.rb
--- old/yast2-bootloader-3.1.5/src/include/bootloader/grub2/dialogs.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/include/bootloader/grub2/dialogs.rb 2014-02-27 16:19:30.000000000 +0100
@@ -25,6 +25,7 @@
Yast.import "Label"
Yast.import "Wizard"
Yast.import "CWM"
+ Yast.import "CWMTab"
Yast.import "BootCommon"
Yast.import "Stage"
@@ -37,60 +38,84 @@
@_grub2_efi_widgets = nil
end
+ def boot_code_tab
+ lt = BootCommon.getLoaderType(false)
+
+ {
+ "id" => "boot_code_tab",
+ "header" => _("Boot Code Options"),
+ # if name is not included, that it is not displayed
+ "widget_names" => lt == "grub2-efi" ? ["distributor"] :
+ ["distributor", "activate", "generic_mbr"],
+ "contents" => VBox(
+ VSpacing(1),
+ MarginBox(1, 0.5, "distributor"),
+ MarginBox(1, 0.5, Left("activate")),
+ MarginBox(1, 0.5, Left("generic_mbr")),
+ VStretch()
+ )
+ }
+ end
+
+ def kernel_tab
+ {
+ "id" => "kernel_tab",
+ "header" => _("Kernel Parameters"),
+ "widget_names" => ["vgamode", "append", "append_failsafe", "console"],
+ "contents" => VBox(
+ VSpacing(1),
+ MarginBox(1, 0.5, "vgamode"),
+ MarginBox(1, 0.5, "append"),
+ MarginBox(1, 0.5, "append_failsafe"),
+ MarginBox(1, 0.5, "console"),
+ VStretch()
+ )
+ }
+ end
+
+ def bootloader_tab
+ {
+ "id" => "bootloader_tab",
+ "header" => _("Bootloader Options"),
+ "widget_names" => ["default", "timeout", "password", "os_prober", "hiddenmenu"],
+ "contents" => VBox(
+ VSpacing(2),
+ HBox(
+ HSpacing(1),
+ "timeout",
+ HSpacing(1),
+ Left(VBox( "os_prober", "hiddenmenu")),
+ HSpacing(1)
+ ),
+ MarginBox(1, 1, "default"),
+ MarginBox(1, 1, "password"),
+ VStretch()
+ )
+ }
+ end
+
# Run dialog for loader installation details for Grub2
# @return [Symbol] for wizard sequencer
def Grub2LoaderDetailsDialog
Builtins.y2milestone("Running Grub2 loader details dialog")
- contents = HBox(
- HSpacing(2),
- VBox(
- VStretch(),
- HBox(HSquash("distributor"), "hiddenmenu", "os_prober", HStretch()),
- HBox("activate", "generic_mbr", HStretch()),
- HBox(HSquash("timeout"), "vgamode", HStretch()),
- Left("append"),
- Left("append_failsafe"),
- Left("default"),
- Left("console"),
- Left("gfxterm"),
- VStretch()
- ),
- HSpacing(2)
- )
+ widgets = Grub2Options()
- lt = BootCommon.getLoaderType(false)
- widget_names = lt == "grub2-efi" ?
- [
- "distributor",
- "hiddenmenu",
- "os_prober",
- "timeout",
- "append",
- "append_failsafe",
- "console",
- "default",
- "vgamode"
- ] :
- [
- "distributor",
- "activate",
- "generic_mbr",
- "hiddenmenu",
- "os_prober",
- "timeout",
- "append",
- "append_failsafe",
- "console",
- "default",
- "vgamode"
- ]
+ tabs = [ bootloader_tab, kernel_tab, boot_code_tab]
+
+ tab_widget = CWMTab.CreateWidget({
+ "tab_order" => tabs.map{ |t| t["id"] },
+ "tabs" => Hash[tabs.map{|tab| [tab["id"], tab]}],
+ "initial_tab" => tabs.first["id"],
+ "widget_descr" => widgets
+ })
+ widgets["tab"] = tab_widget
caption = _("Boot Loader Options")
CWM.ShowAndRun(
{
- "widget_descr" => Grub2Options(),
- "widget_names" => widget_names,
- "contents" => contents,
+ "widget_descr" => widgets,
+ "widget_names" => ["tab"],
+ "contents" => VBox("tab"),
"caption" => caption,
"back_button" => Label.BackButton,
"abort_button" => Label.CancelButton,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/include/bootloader/grub2/options.rb new/yast2-bootloader-3.1.6/src/include/bootloader/grub2/options.rb
--- old/yast2-bootloader-3.1.5/src/include/bootloader/grub2/options.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/include/bootloader/grub2/options.rb 2014-02-27 16:19:30.000000000 +0100
@@ -18,6 +18,9 @@
#
# $Id: BootGRUB.ycp 63508 2011-03-04 12:53:27Z jreidinger $
#
+
+require "bootloader/grub2pwd"
+
module Yast
module BootloaderGrub2OptionsInclude
def initialize_bootloader_grub2_options(include_target)
@@ -225,6 +228,95 @@
nil
end
+ def ConsoleContent
+ VBox(
+ CheckBoxFrame(
+ Id(:gfxterm_frame),
+ _("Use &graphical console"),
+ true,
+ HBox(
+ HSpacing(2),
+ ComboBox(
+ Id(:gfxmode),
+ Opt(:editable, :hstretch),
+ _("&Console resolution"),
+ [""]
+ ),
+ HBox(
+ Left(
+ InputField(
+ Id(:gfxtheme),
+ Opt(:hstretch),
+ _("&Console theme")
+ )
+ ),
+ VBox(
+ Left(Label("")),
+ Left(
+ PushButton(
+ Id(:browsegfx),
+ Opt(:notify),
+ Label.BrowseButton
+ )
+ )
+ )
+ ),
+ HStretch()
+ )
+ ),
+ CheckBoxFrame(
+ Id(:console_frame),
+ _("Use &serial console"),
+ true,
+ HBox(
+ HSpacing(2),
+ InputField(
+ Id(:console_args),
+ Opt(:hstretch),
+ _("&Console arguments")
+ ),
+ HStretch()
+ )
+ )
+ )
+ end
+
+ MASKED_PASSWORD = "**********"
+
+ def grub2_pwd_store(key, event)
+ usepass = UI.QueryWidget(Id(:use_pas), :Value)
+ if !usepass
+ # we are in proper module that can store password
+ self.password = nil
+ return
+ end
+
+ value = UI.QueryWidget(Id(:pw1), :Value)
+ # special value as we do not know password, so it mean user do not change it
+ if value == MASKED_PASSWORD
+ self.password = ""
+ else
+ self.password = value
+ end
+ end
+
+ def grub2_pwd_init(widget)
+ passwd = GRUB2Pwd.new.used?
+ if passwd
+ UI.ChangeWidget(Id(:use_pas), :Value, true)
+ UI.ChangeWidget(Id(:pw1), :Enabled, true)
+ UI.ChangeWidget(Id(:pw1), :Value, MASKED_PASSWORD)
+ UI.ChangeWidget(Id(:pw2), :Enabled, true)
+ UI.ChangeWidget(Id(:pw2), :Value, MASKED_PASSWORD)
+ else
+ UI.ChangeWidget(Id(:use_pas), :Value, false)
+ UI.ChangeWidget(Id(:pw1), :Enabled, false)
+ UI.ChangeWidget(Id(:pw1), :Value, "")
+ UI.ChangeWidget(Id(:pw2), :Enabled, false)
+ UI.ChangeWidget(Id(:pw2), :Value, "")
+ end
+ end
+
def Grub2Options
grub2_specific = {
"distributor" => CommonInputFieldWidget(
@@ -273,56 +365,7 @@
},
"console" => {
"widget" => :custom,
- "custom_widget" => VBox(
- CheckBoxFrame(
- Id(:gfxterm_frame),
- _("Use &graphical console"),
- true,
- HBox(
- HSpacing(2),
- ComboBox(
- Id(:gfxmode),
- Opt(:editable, :hstretch),
- _("&Console resolution"),
- [""]
- ),
- HBox(
- Left(
- InputField(
- Id(:gfxtheme),
- Opt(:hstretch),
- _("&Console theme")
- )
- ),
- VBox(
- Left(Label("")),
- Left(
- PushButton(
- Id(:browsegfx),
- Opt(:notify),
- Label.BrowseButton
- )
- )
- )
- ),
- HStretch()
- )
- ),
- CheckBoxFrame(
- Id(:console_frame),
- _("Use &serial console"),
- true,
- HBox(
- HSpacing(2),
- InputField(
- Id(:console_args),
- Opt(:hstretch),
- _("&Console arguments")
- ),
- HStretch()
- )
- )
- ),
+ "custom_widget" => ConsoleContent(),
"init" => fun_ref(method(:ConsoleInit), "void (string)"),
"store" => fun_ref(
method(:ConsoleStore),
@@ -334,6 +377,28 @@
),
"handle_events" => [:browsegfx],
"help" => Ops.get(@grub_help_messages, "serial", "")
+ },
+ "password" => {
+ "widget" => :custom,
+ "custom_widget" => passwd_content,
+ "init" => fun_ref(
+ method(:grub2_pwd_init),
+ "void (string)"
+ ),
+ "handle" => fun_ref(
+ method(:HandlePasswdWidget),
+ "symbol (string, map)"
+ ),
+ "store" => fun_ref(
+ method(:grub2_pwd_store),
+ "void (string, map)"
+ ),
+ "validate_type" => :function,
+ "validate_function" => fun_ref(
+ method(:ValidatePasswdWidget),
+ "boolean (string, map)"
+ ),
+ "help" => @grub_help_messages["password"] || ""
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/include/bootloader/routines/popups.rb new/yast2-bootloader-3.1.6/src/include/bootloader/routines/popups.rb
--- old/yast2-bootloader-3.1.5/src/include/bootloader/routines/popups.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/include/bootloader/routines/popups.rb 2014-02-27 16:19:30.000000000 +0100
@@ -151,8 +151,10 @@
# @param [String] reason text stating why the location should be re-proposed
# @return [Boolean] yes if shall be reset
def askLocationResetPopup(reason)
- # yes-no popup
Popup.YesNo(
+ # Confirmation box with yes-no popup. %1 is reason why we need to set
+ # default location. It is translated on caller side and it is complete
+ # sentence.
Builtins.sformat(_("%1Set default boot loader location?\n"), reason)
)
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/include/bootloader/routines/section_helps.rb new/yast2-bootloader-3.1.6/src/include/bootloader/routines/section_helps.rb
--- old/yast2-bootloader-3.1.5/src/include/bootloader/routines/section_helps.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/include/bootloader/routines/section_helps.rb 2014-02-27 16:19:30.000000000 +0100
@@ -63,7 +63,7 @@
"type_menu" => _("<p><b>Menu Section</b></p>"),
"menu_root" => _("<p><b>Partition of Menu File</b></p>"),
"configfile" => _(
- "<p><b>Menu Description File<b> specifies path on root device from which is loaded menu file.</p>"
+ "<p><b>Menu Description File</b> specifies path on root device from which is loaded menu file.</p>"
),
"remap" => _(
"<p><b>Map Section to the First Disk from Device Map</b> Windows usually need to be on the first disk.</p>"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/lib/bootloader/grub2base.rb new/yast2-bootloader-3.1.6/src/lib/bootloader/grub2base.rb
--- old/yast2-bootloader-3.1.5/src/lib/bootloader/grub2base.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/lib/bootloader/grub2base.rb 2014-02-27 16:19:30.000000000 +0100
@@ -0,0 +1,150 @@
+# encoding: utf-8
+require "yast"
+require "bootloader/grub2pwd"
+
+module Yast
+ class GRUB2Base < Module
+ def main
+ Yast.import "UI"
+
+ textdomain "bootloader"
+
+ Yast.import "BootArch"
+ Yast.import "BootCommon"
+ Yast.import "BootStorage"
+ Yast.import "Kernel"
+ Yast.import "Mode"
+ Yast.import "Stage"
+ Yast.import "Storage"
+ Yast.import "StorageDevices"
+ Yast.import "Pkg"
+ Yast.import "HTML"
+ Yast.import "Initrd"
+ Yast.import "Product"
+
+ # includes
+ # for simplified widgets than other
+ Yast.include self, "bootloader/grub2/dialogs.rb"
+
+ # password can have three states
+ # 1. nil -> remove password
+ # 2. "" -> do not change it
+ # 3. "something" -> set password to this value
+ @password = ""
+ end
+
+ # general functions
+
+ # Propose global options of bootloader
+ def StandardGlobals
+ {
+ "timeout" => "8",
+ "default" => "0",
+ "vgamode" => "",
+ "gfxmode" => "auto",
+ "terminal" => "gfxterm",
+ "os_prober" => "true"
+ }
+ end
+
+ # Update read settings to new version of configuration files
+ def Update
+ Read(true, true)
+
+ #we don't handle sections, grub2 section create them for us
+ #BootCommon::UpdateSections ();
+ BootCommon.UpdateGlobals
+
+ nil
+ end
+
+ # Reset bootloader settings
+ # @param [Boolean] init boolean true to repropose also device map
+ def Reset(init)
+ return if Mode.autoinst
+ BootCommon.Reset(init)
+
+ nil
+ end
+
+ def Dialogs
+ Builtins.y2milestone("Called GRUB2 Dialogs")
+ {
+ "installation" => fun_ref(
+ method(:Grub2InstallDetailsDialog),
+ "symbol ()"
+ ),
+ "loader" => fun_ref(
+ method(:Grub2LoaderDetailsDialog),
+ "symbol ()"
+ )
+ }
+ end
+
+ def Propose
+ if BootCommon.was_proposed
+ # workaround autoyast config is Imported thus was_proposed always set
+ if Mode.autoinst
+ Builtins.y2milestone(
+ "autoinst mode we ignore meaningless was_proposed as it always set"
+ )
+ else
+ Builtins.y2milestone(
+ "calling Propose with was_proposed set is really bogus, clear it to force a re-propose"
+ )
+ return
+ end
+ end
+
+
+ BootCommon.globals ||= Hash.new
+ BootCommon.globals.merge! StandardGlobals()
+
+ swap_parts = BootCommon.getSwapPartitions
+ largest_swap_part = swap_parts.max_by{|part, size| size}.first || ""
+
+ resume = BootArch.ResumeAvailable ? largest_swap_part : ""
+ # try to use label or udev id for device name... FATE #302219
+ if resume != "" && resume != nil
+ resume = BootStorage.Dev2MountByDev(resume)
+ end
+
+ BootCommon.globals["append"] = BootArch.DefaultKernelParams(resume)
+ BootCommon.globals["append_failsafe"] = BootArch.FailsafeKernelParams
+ BootCommon.globals["distributor"] = Product.name
+ BootCommon.kernelCmdLine = Kernel.GetCmdLine
+
+ Builtins.y2milestone("Proposed globals: %1", BootCommon.globals)
+
+ nil
+ end
+
+ # overwrite Save to allow generation of modification scripts
+ def Save(clean, init, flush)
+ case @password
+ when nil
+ GRUB2Pwd.new.disable
+ when ""
+ #do nothing
+ else
+ GRUB2Pwd.new.enable @password
+ end
+
+ BootCommon.Save(clean, init, flush)
+ end
+
+ # Initializer of GRUB bootloader
+ def Initializer
+ Builtins.y2milestone("Called GRUB2 initializer")
+ BootCommon.current_bootloader_attribs = {
+ "propose" => false,
+ "read" => false,
+ "scratch" => false,
+ "restore_mbr" => false,
+ "bootloader_on_disk" => false
+ }
+
+ nil
+ end
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/lib/bootloader/grub2pwd.rb new/yast2-bootloader-3.1.6/src/lib/bootloader/grub2pwd.rb
--- old/yast2-bootloader-3.1.5/src/lib/bootloader/grub2pwd.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/lib/bootloader/grub2pwd.rb 2014-02-27 16:19:30.000000000 +0100
@@ -0,0 +1,59 @@
+require "yast"
+
+class GRUB2Pwd
+ YAST_BASH_PATH = Yast::Path.new(".target.bash_output")
+ PWD_ENCRYPTION_FILE = "/etc/grub.d/42_password"
+
+ def used?
+ Yast.import "FileUtils"
+
+ Yast::FileUtils.Exists PWD_ENCRYPTION_FILE
+ end
+
+ def enable(password)
+ enc_passwd = encrypt(password)
+
+ file_content = "#! /bin/sh\n" +
+ "exec tail -n +3 $0\n" +
+ "# File created by YaST and next password change in YaST will overwrite it\n" +
+ "set superusers=\"root\"\n" +
+ "password_pbkdf2 root #{enc_passwd}\n" +
+ "export superusers"
+
+ Yast::SCR.Write(
+ Yast::Path.new(".target.string"),
+ [PWD_ENCRYPTION_FILE, 0755],
+ file_content
+ )
+ end
+
+ def disable
+ return unless used?
+
+ Yast::SCR.Execute(YAST_BASH_PATH, "rm '#{PWD_ENCRYPTION_FILE}'")
+ end
+
+private
+
+ def encrypt(password)
+ result = Yast::SCR.Execute(YAST_BASH_PATH,
+ "echo -e \"#{password}\\n#{password}\" | grub2-mkpasswd-pbkdf2"
+ )
+
+ if result["exit"] != 0
+ raise "Failed to create encrypted password for grub2. Command output: #{result["stderr"]}"
+ end
+
+ pwd_line = result["stdout"].split("\n").grep(/password is/).first
+ if !pwd_line
+ raise "INTERNAL ERROR: output do not contain encrypted password. Output: #{result["stdout"]}"
+ end
+
+ ret = pwd_line[/^.*password is\s*(\S+)/,1]
+ if !ret
+ raise "INTERNAL ERROR: output do not contain encrypted password. Output: #{result["stdout"]}"
+ end
+
+ return ret
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/modules/BootCommon.rb new/yast2-bootloader-3.1.6/src/modules/BootCommon.rb
--- old/yast2-bootloader-3.1.5/src/modules/BootCommon.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/modules/BootCommon.rb 2014-02-27 16:19:30.000000000 +0100
@@ -996,10 +996,6 @@
Builtins.y2milestone(
"It is XEN domU and the bootloader should be installed"
)
- # bnc #766283 - opensuse 12.2 pv guests can not start after installation
- # due to lack of grub2 support in the host
- # fallback to use grub until grub2 really works on it
- @loader_type = "grub" if @loader_type == "grub2"
end
if (Arch.i386 || Arch.x86_64) && Linuxrc.InstallInf("EFI") == "1"
# use grub2-efi as default bootloader for x86_64/i386 EFI
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/modules/BootGRUB2.rb new/yast2-bootloader-3.1.6/src/modules/BootGRUB2.rb
--- old/yast2-bootloader-3.1.5/src/modules/BootGRUB2.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/modules/BootGRUB2.rb 2014-02-27 16:19:30.000000000 +0100
@@ -19,49 +19,21 @@
# $Id: BootGRUB.ycp 63508 2011-03-04 12:53:27Z jreidinger $
#
require "yast"
+require "bootloader/grub2base"
module Yast
- class BootGRUB2Class < Module
+ class BootGRUB2Class < GRUB2Base
def main
- Yast.import "UI"
-
- textdomain "bootloader"
-
- Yast.import "BootArch"
- Yast.import "BootCommon"
- Yast.import "BootStorage"
- Yast.import "Kernel"
- Yast.import "Mode"
- Yast.import "Stage"
- Yast.import "Storage"
- Yast.import "StorageDevices"
- Yast.import "Pkg"
- Yast.import "HTML"
- Yast.import "Initrd"
- Yast.import "Product"
+ super
# includes
# for shared some routines with grub
Yast.include self, "bootloader/grub2/misc.rb"
- # for simplified widgets than other
- Yast.include self, "bootloader/grub2/dialogs.rb"
BootGRUB2()
end
# general functions
- # Propose global options of bootloader
- def StandardGlobals
- {
- "timeout" => "8",
- "default" => "0",
- "vgamode" => "",
- "gfxmode" => "auto",
- "terminal" => "gfxterm",
- "os_prober" => "true"
- }
- end
-
# Read settings from disk
# @param [Boolean] reread boolean true to force reread settings from system
# @param [Boolean] avoid_reading_device_map do not read new device map from file, use
@@ -109,16 +81,6 @@
ret
end
- # Update read settings to new version of configuration files
- def Update
- Read(true, true)
-
- #we don't handle sections, grub2 section create them for us
- #BootCommon::UpdateSections ();
- BootCommon.UpdateGlobals
-
- nil
- end
# Write bootloader settings to disk
# @return [Boolean] true on success
def Write
@@ -141,87 +103,9 @@
ret
end
- # Reset bootloader settings
- # @param [Boolean] init boolean true to repropose also device map
- def Reset(init)
- return if Mode.autoinst
- BootCommon.Reset(init)
-
- nil
- end
-
- # Propose bootloader settings
-
def Propose
- if BootCommon.was_proposed
- # workaround autoyast config is Imported thus was_proposed always set
- if Mode.autoinst
- Builtins.y2milestone(
- "autoinst mode we ignore meaningless was_proposed as it always set"
- )
- else
- Builtins.y2milestone(
- "calling Propose with was_proposed set is really bogus, clear it to force a re-propose"
- )
- return
- end
- end
-
- if BootCommon.globals == nil || Builtins.size(BootCommon.globals) == 0
- BootCommon.globals = StandardGlobals()
- else
- BootCommon.globals = Convert.convert(
- Builtins.union(BootCommon.globals, StandardGlobals()),
- :from => "map",
- :to => "map <string, string>"
- )
- end
-
- grub_LocationProposal
-
- swap_sizes = BootCommon.getSwapPartitions
- swap_parts = Builtins.maplist(swap_sizes) { |name, size| name }
- swap_parts = Builtins.sort(swap_parts) do |a, b|
- Ops.greater_than(Ops.get(swap_sizes, a, 0), Ops.get(swap_sizes, b, 0))
- end
-
- largest_swap_part = Ops.get(swap_parts, 0, "")
-
- resume = BootArch.ResumeAvailable ? largest_swap_part : ""
- # try to use label or udev id for device name... FATE #302219
- if resume != "" && resume != nil
- resume = BootStorage.Dev2MountByDev(resume)
- end
- Ops.set(
- BootCommon.globals,
- "append",
- BootArch.DefaultKernelParams(resume)
- )
- Ops.set(
- BootCommon.globals,
- "append_failsafe",
- BootArch.FailsafeKernelParams
- )
- Ops.set(
- BootCommon.globals,
- "distributor",
- Ops.add(Ops.add(Product.short_name, " "), Product.version)
- )
- BootCommon.kernelCmdLine = Kernel.GetCmdLine
-
- Builtins.y2milestone("Proposed globals: %1", BootCommon.globals)
-
- # Let grub2 scripts detects correct root= for us. :)
- # BootCommon::globals["root"] = BootStorage::Dev2MountByDev(BootStorage::RootPartitionDevice);
-
- # We don't set vga= if Grub2 gfxterm enabled, because the modesettings
- # will be delivered to kernel by Grub2's gfxpayload set to "keep"
- #if (BootArch::VgaAvailable () && Kernel::GetVgaType () != "")
- #{
- # BootCommon::globals["vgamode"] = Kernel::GetVgaType ();
- #}
-
- nil
+ super
+ grub_LocationProposal if !BootCommon.was_proposed || !Mode.autoinst
end
# FATE#303643 Enable one-click changes in bootloader proposal
@@ -358,6 +242,7 @@
"read" => fun_ref(method(:Read), "boolean (boolean, boolean)"),
"reset" => fun_ref(method(:Reset), "void (boolean)"),
"propose" => fun_ref(method(:Propose), "void ()"),
+ "save" => fun_ref(method(:Save), "boolean (boolean, boolean, boolean)"),
"summary" => fun_ref(method(:Summary), "list <string> ()"),
"update" => fun_ref(method(:Update), "void ()"),
"widgets" => fun_ref(
@@ -369,20 +254,6 @@
}
end
- # Initializer of GRUB bootloader
- def Initializer
- Builtins.y2milestone("Called GRUB2 initializer")
- BootCommon.current_bootloader_attribs = {
- "propose" => false,
- "read" => false,
- "scratch" => false,
- "restore_mbr" => false,
- "bootloader_on_disk" => false
- }
-
- nil
- end
-
# Constructor
def BootGRUB2
Ops.set(
@@ -407,6 +278,7 @@
publish :variable => :grub_descriptions, :type => "map <string, string>"
publish :variable => :grub2_help_messages, :type => "map <string, string>"
publish :variable => :grub2_descriptions, :type => "map <string, string>"
+ publish :variable => :password, :type => "string"
publish :function => :askLocationResetPopup, :type => "boolean (string)"
publish :function => :grub2Widgets, :type => "map <string, map <string, any>> ()"
publish :function => :grub2efiWidgets, :type => "map <string, map <string, any>> ()"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/src/modules/BootGRUB2EFI.rb new/yast2-bootloader-3.1.6/src/modules/BootGRUB2EFI.rb
--- old/yast2-bootloader-3.1.5/src/modules/BootGRUB2EFI.rb 2014-02-12 13:15:21.000000000 +0100
+++ new/yast2-bootloader-3.1.6/src/modules/BootGRUB2EFI.rb 2014-02-27 16:19:30.000000000 +0100
@@ -19,49 +19,18 @@
# $Id: BootGRUB2EFI.ycp 63508 2011-03-04 12:53:27Z jreidinger $
#
require "yast"
+require "bootloader/grub2base"
module Yast
- class BootGRUB2EFIClass < Module
+ class BootGRUB2EFIClass < GRUB2Base
def main
- Yast.import "UI"
+ super
- textdomain "bootloader"
-
- Yast.import "BootArch"
- Yast.import "BootCommon"
- Yast.import "BootStorage"
- Yast.import "Kernel"
- Yast.import "Mode"
- Yast.import "Stage"
- Yast.import "Storage"
- Yast.import "StorageDevices"
- Yast.import "Pkg"
- Yast.import "HTML"
- Yast.import "Initrd"
- Yast.import "Product"
-
- # includes
- # for shared some routines with grub
- # include "bootloader/grub/misc.ycp";
- # for simplified widgets than other
- Yast.include self, "bootloader/grub2/dialogs.rb"
BootGRUB2EFI()
end
# general functions
- # Propose global options of bootloader
- def StandardGlobals
- {
- "timeout" => "8",
- "default" => "0",
- "vgamode" => "",
- "gfxmode" => "auto",
- "terminal" => "gfxterm",
- "os_prober" => "true"
- }
- end
-
# Read settings from disk
# @param [Boolean] reread boolean true to force reread settings from system
# @param [Boolean] avoid_reading_device_map do not read new device map from file, use
@@ -70,30 +39,7 @@
def Read(reread, avoid_reading_device_map)
BootCommon.InitializeLibrary(reread, "grub2-efi")
BootCommon.ReadFiles(avoid_reading_device_map) if reread
- # TODO: check if necessary for grub2efi
- # grub_DetectDisks ();
- ret = BootCommon.Read(false, avoid_reading_device_map)
-
- # TODO: check if necessary for grub2
- # refresh device map if not read
- # if (BootStorage::device_mapping == nil
- # || size (BootStorage::device_mapping) == 0)
- # {
- # BootStorage::ProposeDeviceMap ();
- # }
-
- ret
- end
-
- # Update read settings to new version of configuration files
- def Update
- Read(true, true)
-
- #we don't handle sections, grub2 section create them for us
- #BootCommon::UpdateSections ();
- BootCommon.UpdateGlobals
-
- nil
+ BootCommon.Read(false, avoid_reading_device_map)
end
# Write bootloader settings to disk
@@ -112,87 +58,6 @@
ret
end
- # Reset bootloader settings
- # @param [Boolean] init boolean true to repropose also device map
- def Reset(init)
- return if Mode.autoinst
- BootCommon.Reset(init)
-
- nil
- end
-
- # Propose bootloader settings
-
- def Propose
- if BootCommon.was_proposed
- # workaround autoyast config is Imported thus was_proposed always set
- if Mode.autoinst
- Builtins.y2milestone(
- "autoinst mode we ignore meaningless was_proposed as it always set"
- )
- else
- Builtins.y2milestone(
- "calling Propose with was_proposed set is really bogus, clear it to force a re-propose"
- )
- return
- end
- end
-
- if BootCommon.globals == nil || Builtins.size(BootCommon.globals) == 0
- BootCommon.globals = StandardGlobals()
- else
- BootCommon.globals = Convert.convert(
- Builtins.union(BootCommon.globals, StandardGlobals()),
- :from => "map",
- :to => "map <string, string>"
- )
- end
-
- swap_sizes = BootCommon.getSwapPartitions
- swap_parts = Builtins.maplist(swap_sizes) { |name, size| name }
- swap_parts = Builtins.sort(swap_parts) do |a, b|
- Ops.greater_than(Ops.get(swap_sizes, a, 0), Ops.get(swap_sizes, b, 0))
- end
-
- largest_swap_part = Ops.get(swap_parts, 0, "")
-
- resume = BootArch.ResumeAvailable ? largest_swap_part : ""
- # try to use label or udev id for device name... FATE #302219
- if resume != "" && resume != nil
- resume = BootStorage.Dev2MountByDev(resume)
- end
- Ops.set(
- BootCommon.globals,
- "append",
- BootArch.DefaultKernelParams(resume)
- )
- Ops.set(
- BootCommon.globals,
- "append_failsafe",
- BootArch.FailsafeKernelParams
- )
- Ops.set(
- BootCommon.globals,
- "distributor",
- Ops.add(Ops.add(Product.short_name, " "), Product.version)
- )
- BootCommon.kernelCmdLine = Kernel.GetCmdLine
-
- Builtins.y2milestone("Proposed globals: %1", BootCommon.globals)
-
- # Let grub2 scripts detects correct root= for us. :)
- # BootCommon::globals["root"] = BootStorage::Dev2MountByDev(BootStorage::RootPartitionDevice);
-
- # We don't set vga= if Grub2 gfxterm enabled, because the modesettings
- # will be delivered to kernel by Grub2's gfxpayload set to "keep"
- #if (BootArch::VgaAvailable () && Kernel::GetVgaType () != "")
- #{
- # BootCommon::globals["vgamode"] = Kernel::GetVgaType ();
- #}
-
- nil
- end
-
# Display bootloader summary
# @return a list of summary lines
@@ -214,11 +79,6 @@
deep_copy(result)
end
- def Dialogs
- Builtins.y2milestone("Called GRUB2 Dialogs")
- { "loader" => fun_ref(method(:Grub2LoaderDetailsDialog), "symbol ()") }
- end
-
# Return map of provided functions
# @return a map of functions (eg. $["write":BootGRUB2EFI::Write])
def GetFunctions
@@ -226,6 +86,7 @@
"read" => fun_ref(method(:Read), "boolean (boolean, boolean)"),
"reset" => fun_ref(method(:Reset), "void (boolean)"),
"propose" => fun_ref(method(:Propose), "void ()"),
+ "save" => fun_ref(method(:Save), "boolean (boolean, boolean, boolean)"),
"summary" => fun_ref(method(:Summary), "list <string> ()"),
"update" => fun_ref(method(:Update), "void ()"),
"widgets" => fun_ref(
@@ -238,20 +99,6 @@
end
- # Initializer of GRUB2EFI bootloader
- def Initializer
- Builtins.y2milestone("Called GRUB2EFI initializer")
- BootCommon.current_bootloader_attribs = {
- "propose" => false,
- "read" => false,
- "scratch" => false,
- "restore_mbr" => false,
- "bootloader_on_disk" => false
- }
-
- nil
- end
-
# Constructor
def BootGRUB2EFI
Ops.set(
@@ -273,6 +120,7 @@
publish :variable => :grub_descriptions, :type => "map <string, string>"
publish :variable => :grub2_help_messages, :type => "map <string, string>"
publish :variable => :grub2_descriptions, :type => "map <string, string>"
+ publish :variable => :password, :type => "string"
publish :function => :askLocationResetPopup, :type => "boolean (string)"
publish :function => :grub2Widgets, :type => "map <string, map <string, any>> ()"
publish :function => :grub2efiWidgets, :type => "map <string, map <string, any>> ()"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/test/Makefile.am new/yast2-bootloader-3.1.6/test/Makefile.am
--- old/yast2-bootloader-3.1.5/test/Makefile.am 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-bootloader-3.1.6/test/Makefile.am 2014-02-27 16:19:30.000000000 +0100
@@ -0,0 +1,7 @@
+TESTS = \
+ grub2pwd_test.rb
+
+TEST_EXTENSIONS = .rb
+RB_LOG_COMPILER = rspec --format doc
+VERBOSE = 1
+EXTRA_DIST = $(TESTS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/test/grub2pwd_test.rb new/yast2-bootloader-3.1.6/test/grub2pwd_test.rb
--- old/yast2-bootloader-3.1.5/test/grub2pwd_test.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-bootloader-3.1.6/test/grub2pwd_test.rb 2014-02-27 16:19:30.000000000 +0100
@@ -0,0 +1,107 @@
+#! /usr/bin/env rspec --format doc
+
+require_relative "./test_helper"
+
+require "bootloader/grub2pwd"
+
+describe GRUB2Pwd do
+ subject { GRUB2Pwd.new }
+
+ def mock_file_presence(exists)
+ Yast.import "FileUtils"
+ expect(Yast::FileUtils).to receive(:Exists).with("/etc/grub.d/42_password").
+ and_return(exists)
+ end
+
+ describe "#used?" do
+ it "return true if exists file #{GRUB2Pwd::PWD_ENCRYPTION_FILE}" do
+ mock_file_presence(true)
+ expect(subject.used?).to be_true
+ end
+ end
+
+ describe "#disable" do
+ it "removes file #{GRUB2Pwd::PWD_ENCRYPTION_FILE} when exists" do
+ mock_file_presence(true)
+
+ expect(Yast::SCR).to receive(:Execute).with(kind_of(Yast::Path),"rm '#{GRUB2Pwd::PWD_ENCRYPTION_FILE}'")
+
+ subject.disable
+ end
+
+ it "do nothing if file #{GRUB2Pwd::PWD_ENCRYPTION_FILE} does not exist" do
+ mock_file_presence(false)
+
+ expect(Yast::SCR).to receive(:Execute).never
+
+ subject.disable
+ end
+ end
+
+ describe "#enabled" do
+ it "write encrypted password to #{GRUB2Pwd::PWD_ENCRYPTION_FILE} with executable permissions" do
+ passwd = "grub.pbkdf2.sha512.10000.774E325959D6D7BCFB7384A0245674D83D0D540A89C02FEA81E35489F8DE7ADFD93988190AD9857A0FFF363825DDF97C8F4E658D8CC49FC4A22C053B08AB3EFE.6FB19FF26FD03D85C40A33D8BA7C04E72EDE3DD5D7080C177553A4FED370F71C579AF0B15B3B93ECECEA355469A4B6D0560BFB53ED35DDA0B80F5363BFBD54E4"
+ success_stdout = <<EOF
+ Enter password:
+
+ Reenter password:
+ PBKDF2 hash of your password is #{passwd}
+EOF
+
+ expect(Yast::SCR).to receive(:Execute).
+ with(kind_of(Yast::Path), /grub2-mkpasswd/).
+ and_return(
+ "exit" => 0,
+ "stderr" => "",
+ "stdout" => success_stdout
+ )
+ expect(Yast::SCR).to receive(:Write).with(
+ kind_of(Yast::Path),
+ [GRUB2Pwd::PWD_ENCRYPTION_FILE, 0755],
+ /#{passwd}/
+ )
+
+ subject.enable("really strong password")
+ end
+
+ it "raise exception if grub2-mkpasswd-pbkdf failed" do
+ expect(Yast::SCR).to receive(:Execute).
+ with(kind_of(Yast::Path),/grub2-mkpasswd/).
+ and_return(
+ "exit" => 1,
+ "stderr" => "bad error",
+ "stdout" => ""
+ )
+ expect(Yast::SCR).to receive(:Write).never
+
+ expect{subject.enable("really strong password")}.to raise_error(RuntimeError, /bad error/)
+ end
+
+ it "raise exception if grub2-mkpasswd-pbkdf do not provide password" do
+ expect(Yast::SCR).to receive(:Execute).
+ with(kind_of(Yast::Path),/grub2-mkpasswd/).
+ and_return(
+ "exit" => 0,
+ "stderr" => "",
+ "stdout" => "bad output"
+ )
+ expect(Yast::SCR).to receive(:Write).never
+
+ expect{subject.enable("really strong password")}.to raise_error(RuntimeError, /bad output/)
+ end
+
+
+ it "raise exception if grub2-mkpasswd-pbkdf create password line but without password" do
+ expect(Yast::SCR).to receive(:Execute).
+ with(kind_of(Yast::Path),/grub2-mkpasswd/).
+ and_return(
+ "exit" => 0,
+ "stderr" => "",
+ "stdout" => "password is"
+ )
+ expect(Yast::SCR).to receive(:Write).never
+
+ expect{subject.enable("really strong password")}.to raise_error(RuntimeError, /password is/)
+ end
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-bootloader-3.1.5/test/test_helper.rb new/yast2-bootloader-3.1.6/test/test_helper.rb
--- old/yast2-bootloader-3.1.5/test/test_helper.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-bootloader-3.1.6/test/test_helper.rb 2014-02-27 16:19:30.000000000 +0100
@@ -0,0 +1,8 @@
+ENV["Y2DIR"] = File.expand_path("../../src", __FILE__)
+
+if ENV["COVERAGE"]
+ require "simplecov"
+ SimpleCov.start
+end
+
+require "yast"
continue with "q"...
Checked in at Fri Feb 28 11:22:29 CET 2014 by ro
Remember to have fun...
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org