]> git.e2factory.org Git - e2factory.git/commitdiff
move build mode and settings into the build process
authorTobias Ulmer <tu@emlix.com>
Thu, 2 Nov 2017 19:25:37 +0000 (20:25 +0100)
committerTobias Ulmer <tu@emlix.com>
Mon, 10 Dec 2018 17:00:11 +0000 (18:00 +0100)
Signed-off-by: Tobias Ulmer <tu@emlix.com>
local/e2-build.lua
local/e2-playground.lua
local/e2build.lua
local/e2tool.lua
local/result.lua
plugins/collect_project.lua

index d686de9cf177b3355ab109b6ca0d8312f75fd8ac..348f319a9cd5f012a74d297c6b0270ca422b2508 100644 (file)
@@ -226,49 +226,54 @@ local function e2_build(arg)
     -- first, standard build mode and settings for all
     for _,resultname in ipairs(ordered_results) do
         local res = result.results[resultname]
-        res:build_mode(build_mode)
-        res:build_settings(e2build.build_settings_class:new())
+        local bp = res:build_process(res:build_process_new())
+        bp:build_mode(build_mode)
+        bp:build_settings(bp:build_settings_new("build"))
     end
 
     -- selected results
     e2lib.logf(4, "selected_results=%s", table.concat(selected_results, " "))
     for _,resultname in ipairs(selected_results) do
         local res = result.results[resultname]
-        res:build_settings():selected(true)
-        res:build_settings():force_rebuild(force_rebuild)
-        res:build_settings():keep_chroot(keep_chroot)
-        res:build_settings():prep_playground(playground)
+        local bp = res:build_process()
+        bp:build_settings():selected(true)
+        bp:build_settings():force_rebuild(force_rebuild)
+        bp:build_settings():keep_chroot(keep_chroot)
+        bp:build_settings():prep_playground(playground)
     end
 
     -- specific build modi
     e2lib.logf(4, "tag_mode_results=%s", table.concat(tag_mode_results, " "))
     for _,resultname in ipairs(tag_mode_results) do
         local res = result.results[resultname]
-        res:build_settings():selected(true)
-        res:build_settings():force_rebuild(force_rebuild)
-        res:build_settings():keep_chroot(keep_chroot)
-        res:build_settings():prep_playground(playground)
-        res:build_mode(policy.default_build_mode("tag"))
+        local bp = res:build_process()
+        bp:build_settings():selected(true)
+        bp:build_settings():force_rebuild(force_rebuild)
+        bp:build_settings():keep_chroot(keep_chroot)
+        bp:build_settings():prep_playground(playground)
+        bp:build_mode(policy.default_build_mode("tag"))
     end
 
     e2lib.logf(4, "branch_mode_results=%s", table.concat(branch_mode_results, " "))
     for _,resultname in ipairs(branch_mode_results) do
         local res = result.results[resultname]
-        res:build_settings():selected(true)
-        res:build_settings():force_rebuild(force_rebuild)
-        res:build_settings():keep_chroot(keep_chroot)
-        res:build_settings():prep_playground(playground)
-        res:build_mode(policy.default_build_mode("branch"))
+        local bp = res:build_process()
+        bp:build_settings():selected(true)
+        bp:build_settings():force_rebuild(force_rebuild)
+        bp:build_settings():keep_chroot(keep_chroot)
+        bp:build_settings():prep_playground(playground)
+        bp:build_mode(policy.default_build_mode("branch"))
     end
 
     e2lib.logf(4, "wc_mode_results=%s", table.concat(wc_mode_results, " "))
     for _,resultname in ipairs(wc_mode_results) do
         local res = result.results[resultname]
-        res:build_settings():selected(true)
-        res:build_settings():force_rebuild(force_rebuild)
-        res:build_settings():keep_chroot(keep_chroot)
-        res:build_settings():prep_playground(playground)
-        res:build_mode(policy.default_build_mode("working-copy"))
+        local bp = res:build_process()
+        bp:build_settings():selected(true)
+        bp:build_settings():force_rebuild(force_rebuild)
+        bp:build_settings():keep_chroot(keep_chroot)
+        bp:build_settings():prep_playground(playground)
+        bp:build_mode(policy.default_build_mode("working-copy"))
     end
 
     rc, re = e2tool.print_selection(ordered_results)
index 91b850a2c9e47087012e2e1b8ee45bf8f9f04555..c142fb97a7da457923fdf00d2d16fdc4d1a1bc11 100644 (file)
@@ -70,12 +70,23 @@ local function e2_playground(arg)
         error(err.new("unknown result: %s", arguments[1]))
     end
 
-    -- apply the standard build mode to all results
-    for _,res in pairs(result.results) do
-        res:build_mode(build_mode)
+    local ordered_results, re = e2tool.dlist_recursive({arguments[1]})
+    if not ordered_results then
+        error(re)
+    end
+
+    -- set up build process and mode for all involved results
+    for _,resultname in ipairs(ordered_results) do
+        local res2 = result.results[resultname]
+        res2:build_process(res2:build_process_new())
+        res2:build_process():build_mode(build_mode)
     end
 
-    local bc
+    -- set up build setting for selected result
+    local bp, bs, bc
+    bp = res:build_process()
+    bs = bp:build_settings(bp:build_settings_new("playground"))
+
     bc, re = res:build_config()
     if not bc then
         error(re)
@@ -89,8 +100,6 @@ local function e2_playground(arg)
         e2lib.finish(0)
     end
 
-    local settings = e2build.playground_settings_class:new()
-
     -- interactive mode, use bash profile
     local out = {}
     table.insert(out, string.format("export TERM='%s'\n",
@@ -107,15 +116,15 @@ local function e2_playground(arg)
         table.insert(out, string.format("source %s/script/%s\n",
             bc.Tc, bc.buildrc_noinit_file))
     end
-    settings:profile(table.concat(out))
+    bs:profile(table.concat(out))
 
     local command
     if opts.command then
-        settings:command(
+        bs:command(
             string.format("/bin/bash --rcfile '%s' -c '%s'", bc.profile,
             opts.command))
     else
-        settings:command(string.format("/bin/bash --rcfile '%s'", bc.profile))
+        bs:command(string.format("/bin/bash --rcfile '%s'", bc.profile))
     end
 
     e2lib.logf(2, "entering playground for %s", res:get_name())
@@ -124,8 +133,7 @@ local function e2_playground(arg)
         e2lib.log(2, "type `runinit' to run the init files")
     end
 
-    res:build_settings(settings)
-    rc, re = res:build_process():build(res, "playground")
+    rc, re = bp:build(res, "playground")
     if not rc then
         error(e:cat(re))
     end
index 392bb0ccd3330fdd2b9d4318cc7562e1e72183f3..1e60dc4817302656bc0cb33cba2103605bb4f09f 100644 (file)
@@ -190,6 +190,52 @@ function e2build.build_process_class:add_step_after(process_mode, after, name, f
     table.insert(self._modes[process_mode], pos + 1, { name = name, func = func })
 end
 
+--- Create new build settings instance for the desired process mode.
+-- @param process_mode A process mode like "build" or "playground".
+-- @return Build settings instance
+-- @error Throws assertion/error on invalid process_mode.
+function e2build.build_process_class:build_settings_new(process_mode)
+    assertIsStringN(process_mode)
+
+    if process_mode == "build" then
+        return e2build.build_settings_class:new()
+    elseif process_mode == "playground" then
+        return e2build.playground_settings_class:new()
+    end
+
+    error("build_process_class:build_settings_new(): unknown process_mode")
+end
+
+--- Get/set the build process settings.
+-- @param bs Build settings instance to set (optional).
+-- @return Build settings instance.
+-- @error Throws assertion if unset and on invalid input.
+function e2build.build_process_class:build_settings(bs)
+    if bs then
+        assertIsTable(bs)
+        self._build_settings = bs
+    else
+        assertIsTable(self._build_settings)
+    end
+
+    return self._build_settings
+end
+
+-- Get/set the build mode.
+-- @param bm Build mode table to set (optional)
+-- @return Build mode table.
+-- @error Throws assertion if unset and on invalid input.
+function e2build.build_process_class:build_mode(bm)
+    if bm then
+        assertIsTable(bm)
+        self._build_mode = bm
+    else
+        assertIsTable(self._build_mode)
+    end
+
+    return self._build_mode
+end
+
 --- Iterator returns the next step in the chosen build process mode
 -- @param process_mode Build process mode
 -- @return Iterator function
@@ -228,7 +274,7 @@ function e2build.build_process_class:_enter_playground(res, return_flags)
     e = err.new("entering playground")
 
     rc, re = eio.file_write(e2lib.join(bc.c, bc.profile),
-        res:build_settings():profile())
+        self:build_settings():profile())
     if not rc then
         error(e:cat(re))
     end
@@ -247,7 +293,7 @@ function e2build.build_process_class:_enter_playground(res, return_flags)
 
     table.insert(cmd, "/bin/sh")
     table.insert(cmd, "-c")
-    table.insert(cmd, res:build_settings():command())
+    table.insert(cmd, self:build_settings():command())
 
     e2tool.set_umask()
     rc, re = e2lib.callcmd(cmd, {})
@@ -283,15 +329,15 @@ function e2build.build_process_class:_result_available(res, return_flags)
 
     sbid = string.format("%s...", string.sub(buildid, 1, 8))
 
-    if res:build_settings():prep_playground() then
+    if self:build_settings():prep_playground() then
         return_flags.message = e2lib.align(columns,
             0, string.format("building %-20s", res:get_name()),
             columns, string.format("[%s] [playground]", sbid))
         return_flags.stop = false
         return true
     end
-    if res:build_mode().source_set() == "working-copy" or
-        res:build_settings():force_rebuild() then
+    if self:build_mode().source_set() == "working-copy" or
+        self:build_settings():force_rebuild() then
         return_flags.message = e2lib.align(columns,
             0, string.format("building %-20s", res:get_name()),
             columns, string.format("[%s]", sbid))
@@ -300,7 +346,7 @@ function e2build.build_process_class:_result_available(res, return_flags)
     end
 
     local server, location =
-        res:build_mode().storage(
+        self:build_mode().storage(
             e2project:project_location(), project.release_id())
     local result_location = e2lib.join(location, res:get_name(),
         buildid, "result.tar")
@@ -603,7 +649,7 @@ end
 function e2build.build_process_class:helper_unpack_result(res, dep, destdir)
     local rc, re, e
     local buildid, server, location, resulttarpath, tmpdir
-    local path, resdir, dt, filesdir, e2project
+    local path, resdir, dt, filesdir, e2project, dep_bp
 
     e = err.new("unpacking result failed: %s", dep:get_name())
 
@@ -614,8 +660,9 @@ function e2build.build_process_class:helper_unpack_result(res, dep, destdir)
         return false, e:cat(re)
     end
 
+    dep_bp = dep:build_process()
     server, location =
-        dep:build_mode().storage(e2project:project_location(), project.release_id())
+        dep_bp:build_mode().storage(e2project:project_location(), project.release_id())
 
     e2lib.logf(3, "searching for dependency %s in %s:%s",
         dep:get_name(), server, location)
@@ -702,7 +749,7 @@ function e2build.build_process_class:_install_sources(res, return_flags)
 
     bc = res:build_config()
     destdir = e2lib.join(bc.T, "build")
-    source_set = res:build_mode().source_set()
+    source_set = self:build_mode().source_set()
 
     for sourcename in res:sources_list():iter() do
         e = err.new("installing source failed: %s", sourcename)
@@ -742,7 +789,7 @@ end
 ---
 function e2build.build_process_class:_build_playground(res, return_flags)
 
-    if res:build_settings():prep_playground()  then
+    if self:build_settings():prep_playground()  then
         return_flags.message = string.format("playground done for: %-20s", res:get_name())
         return_flags.stop = true
         return true
@@ -838,7 +885,7 @@ function e2build.build_process_class:helper_deploy(res, tmpdir)
     --   -> releases:<project>/<archive>/<release_id>/<result>/files/*
     --]]
     local e2project = e2tool.e2project()
-    if not res:build_mode().deploy then
+    if not self:build_mode().deploy then
         e2lib.log(4, "deployment disabled for this build mode")
         return true
     end
@@ -860,7 +907,7 @@ function e2build.build_process_class:helper_deploy(res, tmpdir)
         table.insert(files, e2lib.join("files", f))
     end
     table.insert(files, "checksums")
-    local server, location = res:build_mode().deploy_storage(
+    local server, location = self:build_mode().deploy_storage(
         e2project:project_location(), project.release_id())
 
     -- do not re-deploy if this release was already done earlier
@@ -1013,7 +1060,7 @@ function e2build.build_process_class:_store_result(res, return_flags)
         return false, e:cat(re)
     end
 
-    local server, location = res:build_mode().storage(
+    local server, location = self:build_mode().storage(
         e2project:project_location(), project.release_id())
 
     local buildid, re = res:buildid()
@@ -1048,7 +1095,7 @@ function e2build.build_process_class:_linklast(res, return_flags)
     e = err.new("creating link to last results")
     e2project = e2tool.e2project()
     -- calculate the path to the result
-    server, location = res:build_mode().storage(
+    server, location = self:build_mode().storage(
         e2project:project_location(), project.release_id())
 
     -- compute the "last" link/directory
@@ -1111,7 +1158,7 @@ end
 function e2build.build_process_class:_chroot_cleanup(res, return_flags)
     local rc, re
     -- do not remove chroot if the user requests to keep it
-    if not res:build_settings():keep_chroot() then
+    if not self:build_settings():keep_chroot() then
         rc, re = self:helper_chroot_remove(res)
         if not rc then
             return false, re
index 5ab2d2083723319a990df47a15adb7a7d6a8e4ec..527597ec284d84c67c112bfb4f41b81b90a5d494 100644 (file)
@@ -1361,7 +1361,8 @@ function e2tool.print_selection(resultvec)
             return false, e:append("no such result: %s", resultname)
         end
 
-        local settings = res:build_settings()
+        local bp = res:build_process()
+        local settings = bp:build_settings()
 
         local s = settings:selected() and "[ selected ]" or "[dependency]"
         local f = settings:force_rebuild() and "[force rebuild]" or ""
index d0822110a5d056e35b91c23d4d7f5ec165e07df1..3f8af3c9a9367f1276fe983949c61a2006748150 100644 (file)
@@ -157,8 +157,15 @@ function result.basic_result:merged_env()
         self._type, self._name))
 end
 
---- Get the build process to be used for this class
-function result.basic_result:build_process()
+--- Return new build process for this result
+function result.basic_result:build_process_new()
+    error(err.new("called build_process_new() of result base class, type %s name %s",
+        self._type, self._name))
+end
+
+--- Get/set the build process to be used for this class
+-- @param bp Build process to set (optional).
+function result.basic_result:build_process(bp)
     error(err.new("called build_process() of result base class, type %s name %s",
         self._type, self._name))
 end
@@ -202,8 +209,7 @@ function result.result_class:initialize(rawres)
     self._sources_list = sl.sl:new()
     self._chroot_list = sl.sl:new()
     self._env = environment.new()
-    self._build_mode = false
-    self._build_settings = false
+    self._build_process = false
 
     local e = err.new("in result %s:", self._name)
     local rc, re
@@ -409,30 +415,6 @@ function result.result_class:build_config()
     return strict.readonly(bc)
 end
 
----
-function result.result_class:build_mode(bm)
-    if bm then
-        assertIsTable(bm)
-        self._build_mode = bm
-    else
-        assertIsTable(self._build_mode)
-    end
-
-    return self._build_mode
-end
-
----
-function result.result_class:build_settings(bs)
-    if bs then
-        assertIsTable(bs)
-        self._build_settings = bs
-    else
-        assertIsTable(self._build_settings)
-    end
-
-    return self._build_settings
-end
-
 ---
 function result.result_class:merged_env()
     local e = environment.new()
@@ -459,8 +441,9 @@ end
 -- @return BuildID or false on error.
 -- @return Error object on failure.
 function result.result_class:buildid()
-    local e, rc, re, hc, id, build_mode
-    build_mode = self:build_mode()
+    local e, rc, re, hc, id, bp, build_mode
+    bp = self:build_process()
+    build_mode = bp:build_mode()
 
     if self._buildid then
         return build_mode.buildid(self._buildid)
@@ -537,12 +520,20 @@ function result.result_class:buildid()
 end
 
 ---
-function result.result_class:build_process()
-    assertIsTable(self._build_mode)
-    assertIsTable(self._build_settings)
+function result.result_class:build_process_new()
     return e2build.build_process_class:new()
 end
 
+---
+function result.result_class:build_process(bp)
+    if bp ~= nil then
+        self._build_process = bp
+    end
+
+    assertIsTable(self._build_process)
+    return self._build_process
+end
+
 ---
 function result.result_class:attribute_table(flagt)
     assert(flagt == nil or type(flagt) == "table")
index aa51e77eb7d511a4a793a8837cdd14f2101759ee..1c4ad4d043e67a662e6fc4445f8861b0b5b8a4ed 100644 (file)
@@ -318,7 +318,8 @@ local function _build_collect_project(self, res, return_flags)
     for sourcename in cp_sources:iter() do
         e2lib.logf(3, "source: %s", sourcename)
         local destdir = e2lib.join(bc.T, "project", e2tool.sourcedir(sourcename))
-        local source_set = res:build_mode().source_set()
+        local bp = res:build_process()
+        local source_set = bp:build_mode().source_set()
         local src = source.sources[sourcename]
         local source_to_result_fn = _source_to_result_functions[src:get_type()]
 
@@ -497,16 +498,8 @@ function collect_project_class:build_config()
     return self._stdresult:build_config()
 end
 
-function collect_project_class:build_mode(bm)
-    return self._stdresult:build_mode(bm)
-end
-
-function collect_project_class:build_settings(bs)
-    return self._stdresult:build_settings(bs)
-end
-
-function collect_project_class:build_process()
-    local bp = self._stdresult:build_process()
+function collect_project_class:build_process_new()
+    local bp = self._stdresult:build_process_new()
 
     bp:add_step_before("build", "fix_permissions", "build_collect_project",
         _build_collect_project)
@@ -514,6 +507,10 @@ function collect_project_class:build_process()
     return bp
 end
 
+function collect_project_class:build_process(bp)
+    return self._stdresult:build_process(bp)
+end
+
 function collect_project_class:chroot_list()
     return self._stdresult:chroot_list()
 end