rev |
line source |
bsw@1219
|
1 function lf4rcs.update_references(repository, path, unit_id)
|
bsw@1219
|
2 local function log(message)
|
bsw@1219
|
3 print(lf4rcs.log_prefix .. message)
|
bsw@1219
|
4 end
|
bsw@1219
|
5 if not config.lf4rcs[repository]
|
bsw@1219
|
6 or not config.lf4rcs[repository].get_remote_user
|
bsw@1219
|
7 or not config.lf4rcs[repository].get_branches
|
bsw@1219
|
8 then
|
bsw@1219
|
9 log("Unsupported repository type")
|
bsw@1219
|
10 os.exit(1)
|
bsw@1219
|
11 end
|
bsw@1219
|
12 log("inspecting changesets")
|
bsw@1219
|
13 local remote_user = config.lf4rcs[repository].get_remote_user()
|
bsw@1219
|
14 local function abort(message)
|
bsw@1219
|
15 log("TEST FAILED: " .. message)
|
bsw@1219
|
16 log("ABORTING and ROLLBACK due to failed test.")
|
bsw@1219
|
17 db:query("ROLLBACK")
|
bsw@1219
|
18 os.exit(1)
|
bsw@1219
|
19 end
|
bsw@1219
|
20 db:query("BEGIN")
|
bsw@1219
|
21 local member = Member:new_selector()
|
bsw@1219
|
22 :add_where{ "login = ?", remote_user }
|
bsw@1219
|
23 :optional_object_mode()
|
bsw@1219
|
24 :exec()
|
bsw@1219
|
25 if not member then
|
bsw@1219
|
26 abort(
|
bsw@1219
|
27 "internal error, member '"
|
bsw@1219
|
28 .. remote_user .. "' not found in database"
|
bsw@1219
|
29 )
|
bsw@1219
|
30 end
|
bsw@1219
|
31 local function exec(...)
|
bsw@1219
|
32 local command, output, err_message, exit_code = lf4rcs.exec(...)
|
bsw@1219
|
33 if not output then
|
bsw@1219
|
34 log("Could not execute: " .. command)
|
bsw@1219
|
35 abort(err_message)
|
bsw@1219
|
36 end
|
bsw@1219
|
37 if exit_code ~= 0 then
|
bsw@1219
|
38 log("Could not execute: " .. command)
|
bsw@1219
|
39 abort("Exit code: " .. tostring(exit_code))
|
bsw@1219
|
40 end
|
bsw@1219
|
41 return output
|
bsw@1219
|
42 end
|
bsw@1219
|
43 if config.lf4rcs[repository].extra_checks then
|
bsw@1219
|
44 local success, err_message = config.lf4rcs[repository].extra_checks(path, exec)
|
bsw@1219
|
45 if not success then
|
bsw@1219
|
46 abort(err_message)
|
bsw@1219
|
47 end
|
bsw@1219
|
48 end
|
bsw@1219
|
49 local branches, err = config.lf4rcs[repository].get_branches(path, exec)
|
bsw@1219
|
50 if not branches then abort(err) end
|
bsw@1219
|
51 for branch, head_node_ids in pairs(branches) do
|
bsw@1219
|
52 log('checking branch ' .. branch)
|
bsw@1219
|
53 if branch ~= config.lf4rcs[repository].working_branch_name then
|
bsw@1219
|
54 local initiative_id = string.match(branch, "^i([0-9]+)$")
|
bsw@1219
|
55 if not initiative_id
|
bsw@1219
|
56 or initiative_id ~= tostring(tonumber(initiative_id))
|
bsw@1219
|
57 then
|
bsw@1219
|
58 abort("this branch name is not allowed")
|
bsw@1219
|
59 end
|
bsw@1219
|
60 initiative_id = tonumber(initiative_id)
|
bsw@1219
|
61 if #head_node_ids > 1 then
|
bsw@1219
|
62 abort("number of heads found for branch is greater than 1: " .. #head_node_ids)
|
bsw@1219
|
63 end
|
bsw@1219
|
64 local initiative = Initiative:by_id(initiative_id)
|
bsw@1219
|
65 if not initiative then
|
bsw@1219
|
66 abort("initiative i" .. initiative_id .. " not found" )
|
bsw@1219
|
67 end
|
bsw@1219
|
68 if initiative.issue.area.unit_id ~= tonumber(unit_id) then
|
bsw@1219
|
69 abort("initiative belongs to another unit (unit ID " .. initiative.issue.area.unit_id .. ")")
|
bsw@1219
|
70 end
|
bsw@1219
|
71 if initiative.issue.state ~= "admission" and initiative.issue.state ~= "discussion" then
|
bsw@1235
|
72 if initiative.issue.state == "verification" then
|
bsw@1238
|
73 if config.lf4rcs.push_grace_period then
|
bsw@1239
|
74 local in_push_grace_period = (Initiative:new_selector()
|
bsw@1235
|
75 :reset_fields()
|
bsw@1242
|
76 :add_field({ "now() - initiative.created <= ?", config.lf4rcs.push_grace_period }, "in_push_grace_period")
|
bsw@1235
|
77 :add_where{ "id = ?", initiative.id }
|
bsw@1235
|
78 :single_object_mode()
|
bsw@1235
|
79 :exec()).in_push_grace_period
|
bsw@1241
|
80 if not in_push_grace_period then
|
bsw@1235
|
81 abort("issue is already frozen and the push grace period is expired")
|
bsw@1235
|
82 end
|
bsw@1235
|
83 else
|
bsw@1235
|
84 abort("issue is already frozen")
|
bsw@1235
|
85 end
|
bsw@1235
|
86 else
|
bsw@1235
|
87 abort("issue is already closed (" .. initiative.issue.state .. ")")
|
bsw@1235
|
88 end
|
bsw@1219
|
89 end
|
bsw@1219
|
90 if initiative.revoked then
|
bsw@1219
|
91 abort("initiative has been revoked")
|
bsw@1219
|
92 end
|
bsw@1219
|
93 local initiator = Initiator:by_pk(initiative.id, member.id)
|
bsw@1219
|
94 if not initiator then
|
bsw@1219
|
95 abort("member is not initiator of initiative i" .. initiative_id)
|
bsw@1219
|
96 end
|
bsw@1219
|
97 if not initiator.accepted then
|
bsw@1219
|
98 abort(
|
bsw@1219
|
99 "member has not accepted invitation to become initiator of initiative i"
|
bsw@1219
|
100 .. initiative_id
|
bsw@1219
|
101 )
|
bsw@1219
|
102 end
|
bsw@1219
|
103 local node_id = head_node_ids[1] or false
|
bsw@1219
|
104 if node_id then
|
bsw@1219
|
105 log("adding node " .. node_id .. " to initiative i" .. initiative_id)
|
bsw@1219
|
106 else
|
bsw@1219
|
107 log("removing node reference from initiative i" .. initiative_id)
|
bsw@1219
|
108 end
|
bsw@1219
|
109 Draft:update_content(member.id, initiative_id, nil, nil, node_id)
|
bsw@1219
|
110 end
|
bsw@1219
|
111 end
|
bsw@1219
|
112 log("changes cleared. continue committing.")
|
bsw@1219
|
113 db:query("COMMIT")
|
bsw@1219
|
114 os.exit(0)
|
bsw@1219
|
115 end
|
bsw@1219
|
116
|