File Compare.txt changed (mode: 100644) (index 4216a64..d4c2057) | |||
1 | Gitlab RocketGit GitHub Gitorious unfuddle.com | ||
1 | Gitlab RocketGit GitHub Gitorious unfuddle.com gitolite | ||
2 | 2 | ||
3 | License ? GPLv3 Prop. ? ? ? | ||
3 | 4 | ||
4 | 5 | [Features] | [Features] |
5 | Easy instalation No Yes Yes No! | ||
6 | SELinux friendly ? Yes ? ? | ||
7 | Disto friendly No Yes No No | ||
8 | Bug tracker Yes Yes Yes ? | ||
6 | Easy instalation No Yes Yes No! ? Yes | ||
7 | SELinux friendly ? Yes ? ? ? ? | ||
8 | Distro friendly No Yes No No | ||
9 | Bug tracker Yes Yes Yes No | ||
9 | 10 | CLI commands (SSH) ? Yes ? ? | CLI commands (SSH) ? Yes ? ? |
10 | 11 | API ? ? Yes ? | API ? ? Yes ? |
11 | 12 |
File TODO changed (mode: 100644) (index fad2d2b..7356512) | |||
1 | 1 | == BEFORE FIRST RELEASE! == | == BEFORE FIRST RELEASE! == |
2 | [ ] Add some hints. | ||
3 | [ ] Hints for ssh are not indented! | ||
4 | [ ] Allow user to specify if is on windows/linux/etc. to be able to give | ||
5 | tailored hints. | ||
2 | [ ] rg_bug_search should be rg_bug_get/load and rg_bug_search to search using | ||
3 | labels/start/end/etc. | ||
4 | [ ] bug_update does not update labels! | ||
5 | [ ] Integrate remote_add.html. | ||
6 | [ ] If you are not logged in, do not show the save option! | ||
7 | [ ] ml.php in /root/PHP | ||
8 | [ ] Should we expire the reset password token? Why? Somebody can request another | ||
9 | one! | ||
10 | [ ] All internal error should show a special page? | ||
6 | 11 | [ ] | [ ] |
7 | 12 | ||
8 | 13 | ||
9 | 14 | == Medium == | == Medium == |
15 | [ ] Bug rights: add note, anonymous add note, add label. | ||
16 | [ ] Allow user to specify if is on windows/linux/etc. to be able to give | ||
17 | specific hints. Hm. THe user may have multiple OSs. | ||
18 | [ ] The selected menu is not colored different. | ||
10 | 19 | [ ] http://rg.embedromix.ro:8000/user/catab/a13/admin/rights?edit_uid=19 | [ ] http://rg.embedromix.ro:8000/user/catab/a13/admin/rights?edit_uid=19 |
11 | 20 | should give an error! | should give an error! |
12 | 21 | [ ] Pay attention to: https://github.com/sitaramc/gitolite/wiki: | [ ] Pay attention to: https://github.com/sitaramc/gitolite/wiki: |
File admin/init.php changed (mode: 100644) (index a43093f..5d7aade) | |||
... | ... | $_u['disk_quota_mb'] = 0; | |
38 | 38 | $_u['rights'] = rg_rights_all("user"); | $_u['rights'] = rg_rights_all("user"); |
39 | 39 | $_u['session_time'] = 3600; | $_u['session_time'] = 3600; |
40 | 40 | $_u['confirm_token'] = ""; | $_u['confirm_token'] = ""; |
41 | while (1) { | ||
41 | do { | ||
42 | 42 | $username0 = readline("User [" . $_u['username'] . "]: "); | $username0 = readline("User [" . $_u['username'] . "]: "); |
43 | 43 | if (!empty($username0)) | if (!empty($username0)) |
44 | 44 | $_u['username'] = $username0; | $_u['username'] = $username0; |
... | ... | while (1) { | |
46 | 46 | if (!empty($email0)) | if (!empty($email0)) |
47 | 47 | $_u['email'] = $email0; | $_u['email'] = $email0; |
48 | 48 | ||
49 | while (1) { | ||
49 | do { | ||
50 | 50 | $_u['pass'] = readline("Password: "); | $_u['pass'] = readline("Password: "); |
51 | 51 | $_u['pass2'] = readline("Password (confirmation): "); | $_u['pass2'] = readline("Password (confirmation): "); |
52 | 52 | if (strcmp($_u['pass'], $_u['pass2']) != 0) { | if (strcmp($_u['pass'], $_u['pass2']) != 0) { |
53 | 53 | echo "Passwords mismatch!\n"; | echo "Passwords mismatch!\n"; |
54 | 54 | continue; | continue; |
55 | 55 | } | } |
56 | break; | ||
57 | } | ||
56 | } while(0); | ||
58 | 57 | ||
59 | 58 | $r = rg_user_info($db, $_u['uid'], $_u['username'], "" /* email */); | $r = rg_user_info($db, $_u['uid'], $_u['username'], "" /* email */); |
60 | 59 | if ($r['ok'] != 1) { | if ($r['ok'] != 1) { |
... | ... | while (1) { | |
73 | 72 | echo "Cannot create user (" . rg_user_error() . ")!\n"; | echo "Cannot create user (" . rg_user_error() . ")!\n"; |
74 | 73 | continue; | continue; |
75 | 74 | } | } |
76 | break; | ||
77 | } | ||
75 | } while (0); | ||
78 | 76 | ||
79 | 77 | ||
80 | 78 | // Store the timestamp of the first install | // Store the timestamp of the first install |
File inc/admin/users/add.php changed (mode: 100644) (index 848a9d6..38b35c0) | |||
... | ... | if ($doit == 1) { | |
20 | 20 | $rights = @rg_rights_a2s($_REQUEST['rights']); | $rights = @rg_rights_a2s($_REQUEST['rights']); |
21 | 21 | $session_time = rg_var_uint("session_time"); | $session_time = rg_var_uint("session_time"); |
22 | 22 | ||
23 | while (1) { | ||
23 | do { | ||
24 | 24 | if (rg_user_ok($xuser) !== TRUE) { | if (rg_user_ok($xuser) !== TRUE) { |
25 | 25 | $errmsg[] = "invalid user name (" . rg_user_error() . ")"; | $errmsg[] = "invalid user name (" . rg_user_error() . ")"; |
26 | 26 | break; | break; |
... | ... | if ($doit == 1) { | |
61 | 61 | // TODO: Send a confirmation e-mail with the password | // TODO: Send a confirmation e-mail with the password |
62 | 62 | ||
63 | 63 | $_user_add .= "OK!<br />"; | $_user_add .= "OK!<br />"; |
64 | break; | ||
65 | } | ||
64 | } while (0); | ||
66 | 65 | } else { | } else { |
67 | 66 | $xuser = ""; | $xuser = ""; |
68 | 67 | $realname = ""; | $realname = ""; |
File inc/admin/users/edit.php changed (mode: 100644) (index bf9d8bd..f2b3e99) | |||
... | ... | if ($doit == 1) { | |
23 | 23 | $rights = @rg_rights_a2s($_REQUEST['rights']); | $rights = @rg_rights_a2s($_REQUEST['rights']); |
24 | 24 | $session_time = rg_var_uint("session_time"); | $session_time = rg_var_uint("session_time"); |
25 | 25 | ||
26 | while (1) { | ||
26 | do { | ||
27 | 27 | $_ui = rg_user_info($db, 0, $xuser, ""); | $_ui = rg_user_info($db, 0, $xuser, ""); |
28 | 28 | if ($_ui['ok'] == 0) { | if ($_ui['ok'] == 0) { |
29 | 29 | $errmsg[] = "internal error"; | $errmsg[] = "internal error"; |
... | ... | if ($doit == 1) { | |
53 | 53 | ||
54 | 54 | $_user_edit .= "OK!<br />"; | $_user_edit .= "OK!<br />"; |
55 | 55 | $show_form = 0; | $show_form = 0; |
56 | break; | ||
57 | } | ||
56 | } while (0); | ||
58 | 57 | } else { | } else { |
59 | 58 | // TODO: Check if user has the right to edit this info! | // TODO: Check if user has the right to edit this info! |
60 | 59 | ||
61 | 60 | $_ui = rg_user_info($db, $uid, "", ""); | $_ui = rg_user_info($db, $uid, "", ""); |
62 | 61 | if ($_ui['ok'] == 0) { | if ($_ui['ok'] == 0) { |
63 | $_user_edit .= "internal error!"; | ||
62 | $_user_edit .= "internal error"; | ||
64 | 63 | $show_form = 0; | $show_form = 0; |
65 | 64 | } else if ($_ui['exists'] == 0) { | } else if ($_ui['exists'] == 0) { |
66 | $_user_edit .= "user does not exist<br />"; | ||
65 | $_user_edit .= "user does not exist"; | ||
67 | 66 | $show_form = 0; | $show_form = 0; |
68 | 67 | } else { | } else { |
69 | 68 | $xuser = $_ui['username']; | $xuser = $_ui['username']; |
File inc/bug.inc.php changed (mode: 100644) (index 8d31d49..8ea95d3) | |||
... | ... | function rg_bug_error() | |
20 | 20 | return $rg_bug_error; | return $rg_bug_error; |
21 | 21 | } | } |
22 | 22 | ||
23 | /* States for a bug */ | ||
24 | $rg_bug_states = array( | ||
25 | "0" => "Any", | ||
26 | "1" => "Open", | ||
27 | "2" => "Closed" | ||
28 | ); | ||
29 | |||
23 | 30 | /* | /* |
24 | * We want the bug number to be consecutive per project. | ||
31 | * Return the state of a bug, as string | ||
32 | */ | ||
33 | function rg_bug_state($v) | ||
34 | { | ||
35 | global $rg_bug_states; | ||
36 | |||
37 | if (!isset($rg_bug_states[$v])) | ||
38 | return "?"; | ||
39 | |||
40 | return $rg_bug_states[$v]; | ||
41 | } | ||
42 | |||
43 | /* | ||
44 | * Returns a select for state | ||
45 | */ | ||
46 | function rg_bug_state_select($value) | ||
47 | { | ||
48 | global $rg_bug_states; | ||
49 | |||
50 | $ret = ""; | ||
51 | $ret .= "<select name=\"state\">\n"; | ||
52 | foreach ($rg_bug_states as $key => $name) { | ||
53 | $add = ""; | ||
54 | if (strcmp($value, $key) == 0) | ||
55 | $add = " selected"; | ||
56 | $ret .= "\t<option value=\"" . $key . "\"" . $add . ">" | ||
57 | . $name . "</option>\n"; | ||
58 | } | ||
59 | $ret .= "</select>\n"; | ||
60 | |||
61 | return $ret; | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * We want the bug number to be consecutive per repo. | ||
25 | 66 | * This is why we use a separate table (bugs_max) to track last id. | * This is why we use a separate table (bugs_max) to track last id. |
26 | 67 | * This function must be inside a transaction. | * This function must be inside a transaction. |
27 | 68 | */ | */ |
28 | 69 | function rg_bug_next_id($db, $repo_id) | function rg_bug_next_id($db, $repo_id) |
29 | 70 | { | { |
30 | 71 | rg_prof_start("bug_next_id"); | rg_prof_start("bug_next_id"); |
72 | rg_log("bug_next_id: repo_id=$repo_id"); | ||
31 | 73 | ||
32 | 74 | $next_bug_id = FALSE; | $next_bug_id = FALSE; |
33 | 75 | do { | do { |
... | ... | function rg_bug_next_id($db, $repo_id) | |
50 | 92 | if ($rows == 1) | if ($rows == 1) |
51 | 93 | break; | break; |
52 | 94 | ||
53 | /* This means this is the first bug */ | ||
95 | /* If we are here, it means that we have no entry in bugs_max. */ | ||
96 | $res = rg_sql_begin($db); | ||
97 | if ($res === FALSE) { | ||
98 | rg_bug_set_error("cannot start txn (" . rg_sql_error() . ")"); | ||
99 | break; | ||
100 | } | ||
101 | |||
54 | 102 | $sql = "LOCK TABLE bugs_max IN ACCESS EXCLUSIVE MODE"; | $sql = "LOCK TABLE bugs_max IN ACCESS EXCLUSIVE MODE"; |
55 | 103 | $res = rg_sql_query($db, $sql); | $res = rg_sql_query($db, $sql); |
56 | 104 | if ($res === FALSE) { | if ($res === FALSE) { |
57 | 105 | rg_bug_set_error("cannot lock max table (" . rg_sql_error() . ")"); | rg_bug_set_error("cannot lock max table (" . rg_sql_error() . ")"); |
58 | 106 | break; | break; |
59 | 107 | } | } |
108 | rg_sql_free_result($res); | ||
60 | 109 | ||
61 | 110 | /* | /* |
62 | 111 | * Here, another client may just did the insert and commited | * Here, another client may just did the insert and commited |
... | ... | function rg_bug_next_id($db, $repo_id) | |
72 | 121 | $rows = rg_sql_num_rows($res); | $rows = rg_sql_num_rows($res); |
73 | 122 | rg_sql_free_result($res); | rg_sql_free_result($res); |
74 | 123 | ||
75 | if ($rows == 1) { | ||
76 | /* | ||
77 | * The other client was faster than us. Just try to update | ||
78 | */ | ||
79 | continue; | ||
124 | if ($rows == 0) { | ||
125 | // We were faster, just insert. | ||
126 | $sql = "INSERT INTO bugs_max (repo_id, last_bug_id)" | ||
127 | . " VALUES ($repo_id, 1)"; | ||
128 | $res = rg_sql_query($db, $sql); | ||
129 | if ($res === FALSE) { | ||
130 | rg_bug_set_error("cannot insert into max table (" . rg_sql_error() . ")"); | ||
131 | break; | ||
132 | } | ||
133 | rg_sql_free_result($res); | ||
134 | $next_bug_id = 1; | ||
80 | 135 | } | } |
81 | 136 | ||
82 | // We was faster, just insert. | ||
83 | $sql = "INSERT INTO bugs_max (repo_id, last_bug_id)" | ||
84 | . " VALUES ($repo_id, 1)"; | ||
85 | $res = rg_sql_query($db, $sql); | ||
137 | // commit (will also unlock) | ||
138 | $res = rg_sql_commit($db); | ||
86 | 139 | if ($res === FALSE) { | if ($res === FALSE) { |
87 | rg_bug_set_error("cannot insert into max table (" . rg_sql_error() . ")"); | ||
140 | rg_bug_set_error("cannot commit (" . rg_sql_error() . ")"); | ||
88 | 141 | break; | break; |
89 | 142 | } | } |
90 | rg_sql_free_result($res); | ||
91 | $next_bug_id = 1; | ||
92 | } while (0); | ||
143 | |||
144 | /* | ||
145 | * The other client was faster than us. Just repeat | ||
146 | * the whole operation. | ||
147 | */ | ||
148 | } while ($next_bug_id === FALSE); | ||
93 | 149 | ||
94 | 150 | rg_log("\tDEBUG: next_bug_id=" . $next_bug_id); | rg_log("\tDEBUG: next_bug_id=" . $next_bug_id); |
95 | 151 | ||
96 | 152 | rg_prof_end("bug_next_id"); | rg_prof_end("bug_next_id"); |
97 | |||
98 | 153 | return $next_bug_id; | return $next_bug_id; |
99 | 154 | } | } |
100 | 155 | ||
... | ... | function rg_bug_cosmetic($db, &$row) | |
124 | 179 | if ($_ui['exists'] == 1) | if ($_ui['exists'] == 1) |
125 | 180 | $row['assigned_to'] = $_ui['username']; | $row['assigned_to'] = $_ui['username']; |
126 | 181 | } | } |
182 | |||
183 | $row['state'] = rg_bug_state($row['state']); | ||
127 | 184 | } | } |
128 | 185 | ||
129 | 186 | /* | /* |
... | ... | function rg_bug_info($db, $repo_id, $bug_id) | |
135 | 192 | global $rg_bug_info_cache; | global $rg_bug_info_cache; |
136 | 193 | ||
137 | 194 | rg_prof_start("bug_info"); | rg_prof_start("bug_info"); |
195 | rg_log("rg_bug_info: repo_id=$repo_id bug_id=$bug_id"); | ||
138 | 196 | ||
139 | $key = $repo_id . "-" . $bug_id; | ||
140 | if (isset($rg_bug_info_cache[$key])) | ||
141 | return $rg_bug_info_cache[$key]; | ||
142 | |||
143 | rg_log("bug_info: repo_id=$repo_id bug_id=$bug_id"); | ||
144 | |||
145 | $ret['ok'] = 0; | ||
146 | $ret['exists'] = 0; | ||
147 | |||
148 | $rg_bug_info_cache[$key] = $ret; | ||
197 | $ret = FALSE; | ||
198 | do { | ||
199 | $key = $repo_id . "-" . $bug_id; | ||
200 | if (isset($rg_bug_info_cache[$key])) { | ||
201 | $ret = $rg_bug_info_cache[$key]; | ||
202 | break; | ||
203 | } | ||
149 | 204 | ||
150 | $sql = "SELECT * FROM bugs" | ||
151 | . " WHERE repo_id = " . $repo_id | ||
152 | . " AND bug_id = " . $bug_id; | ||
153 | $res = rg_sql_query($db, $sql); | ||
154 | if ($res === FALSE) { | ||
155 | rg_bug_set_error("cannot query (" . rg_sql_error() . ")"); | ||
156 | return $ret; | ||
157 | } | ||
158 | $ret['ok'] = 1; | ||
159 | $row = rg_sql_fetch_array($res); | ||
160 | rg_sql_free_result($res); | ||
161 | if (!isset($row['bug_id'])) { | ||
162 | rg_log("\tBug not found!"); | ||
163 | return $ret; | ||
164 | } | ||
205 | $sql = "SELECT * FROM bugs" | ||
206 | . " WHERE repo_id = " . $repo_id | ||
207 | . " AND bug_id = " . $bug_id; | ||
208 | $res = rg_sql_query($db, $sql); | ||
209 | if ($res === FALSE) { | ||
210 | rg_bug_set_error("cannot list bugs (" . rg_sql_error() . ")"); | ||
211 | break; | ||
212 | } | ||
213 | $ret = array(); | ||
214 | $rows = rg_sql_num_rows($res); | ||
215 | if ($rows == 1) | ||
216 | $ret = rg_sql_fetch_array($res); | ||
217 | rg_sql_free_result($res); | ||
165 | 218 | ||
166 | $row['exists'] = 1; | ||
167 | $row['ok'] = 1; | ||
219 | $ret['exists'] = $rows; | ||
220 | if ($ret['exists'] == 0) | ||
221 | break; | ||
168 | 222 | ||
169 | rg_bug_cosmetic($db, $row); | ||
223 | rg_bug_cosmetic($db, $ret); | ||
170 | 224 | ||
171 | $rg_bug_info_cache[$key] = $row; | ||
225 | $rg_bug_info_cache[$key] = $ret; | ||
226 | } while (0); | ||
172 | 227 | ||
173 | 228 | rg_prof_end("bug_info"); | rg_prof_end("bug_info"); |
174 | |||
175 | return $row; | ||
229 | return $ret; | ||
176 | 230 | } | } |
177 | 231 | ||
178 | 232 | /* | /* |
... | ... | function rg_bug_info($db, $repo_id, $bug_id) | |
181 | 235 | function rg_bug_add($db, $repo_id, $uid, $data) | function rg_bug_add($db, $repo_id, $uid, $data) |
182 | 236 | { | { |
183 | 237 | rg_prof_start("bug_add"); | rg_prof_start("bug_add"); |
184 | |||
185 | 238 | rg_log("bug_add: repo_id=$repo_id uid=$uid" | rg_log("bug_add: repo_id=$repo_id uid=$uid" |
186 | 239 | . " data: " . rg_array2string($data)); | . " data: " . rg_array2string($data)); |
187 | 240 | ||
... | ... | function rg_bug_add($db, $repo_id, $uid, $data) | |
190 | 243 | $e_data = $data; | $e_data = $data; |
191 | 244 | $e_data['title'] = rg_sql_escape($db, $data['title']); | $e_data['title'] = rg_sql_escape($db, $data['title']); |
192 | 245 | $e_data['body'] = rg_sql_escape($db, $data['body']); | $e_data['body'] = rg_sql_escape($db, $data['body']); |
246 | $e_data['state'] = sprintf("%u", $data['state']); | ||
193 | 247 | $e_data['labels'] = rg_sql_escape($db, $data['labels']); | $e_data['labels'] = rg_sql_escape($db, $data['labels']); |
194 | 248 | ||
195 | 249 | $itime = time(); | $itime = time(); |
... | ... | function rg_bug_add($db, $repo_id, $uid, $data) | |
212 | 266 | break; | break; |
213 | 267 | ||
214 | 268 | $sql = "INSERT INTO bugs (bug_id, itime, utime, repo_id, uid" | $sql = "INSERT INTO bugs (bug_id, itime, utime, repo_id, uid" |
215 | . ", ip, title, body, assigned_uid, deleted)" | ||
269 | . ", ip, title, body, state, assigned_uid, deleted)" | ||
216 | 270 | . " VALUES ($bug_id, $itime, 0, $repo_id, $uid" | . " VALUES ($bug_id, $itime, 0, $repo_id, $uid" |
217 | 271 | . ", '$ip', '" . $e_data['title'] . "'" | . ", '$ip', '" . $e_data['title'] . "'" |
218 | 272 | . ", '" . $e_data['body'] . "'" | . ", '" . $e_data['body'] . "'" |
273 | . ", " . $e_data['state'] | ||
219 | 274 | . ", " . $e_data['assigned_uid'] | . ", " . $e_data['assigned_uid'] |
220 | 275 | . ", 0)"; | . ", 0)"; |
221 | 276 | $res = rg_sql_query($db, $sql); | $res = rg_sql_query($db, $sql); |
... | ... | function rg_bug_add($db, $repo_id, $uid, $data) | |
238 | 293 | rg_sql_rollback($db); | rg_sql_rollback($db); |
239 | 294 | ||
240 | 295 | rg_prof_end("bug_add"); | rg_prof_end("bug_add"); |
241 | |||
242 | 296 | return $ret; | return $ret; |
243 | 297 | } | } |
244 | 298 | ||
... | ... | function rg_bug_add($db, $repo_id, $uid, $data) | |
248 | 302 | function rg_bug_delete($db, $repo_id, $bug_id) | function rg_bug_delete($db, $repo_id, $bug_id) |
249 | 303 | { | { |
250 | 304 | rg_prof_start("bug_delete"); | rg_prof_start("bug_delete"); |
251 | |||
252 | 305 | rg_log("bug_delete: $repo_id=$repo_id bug_id=$bug_id"); | rg_log("bug_delete: $repo_id=$repo_id bug_id=$bug_id"); |
253 | 306 | ||
254 | // TODO: Check rights | ||
307 | $ret = FALSE; | ||
308 | do { | ||
309 | // TODO: Check rights | ||
255 | 310 | ||
256 | $now = time(); | ||
311 | $now = time(); | ||
257 | 312 | ||
258 | // Only mark it as such, deletion will happen in background | ||
259 | $sql = "UPDATE bugs SET deleted = $now" | ||
260 | . " WHERE repo_id = $repo_id" | ||
261 | . " AND bug_id = $bug_id"; | ||
262 | $res = rg_sql_query($db, $sql); | ||
263 | if ($res === FALSE) { | ||
264 | rg_bug_set_error("Cannot delete bug (" . rg_sql_error() . ")"); | ||
265 | return FALSE; | ||
266 | } | ||
267 | rg_sql_free_result($res); | ||
313 | // Only mark it as such, deletion will happen in background | ||
314 | $sql = "UPDATE bugs SET deleted = $now" | ||
315 | . " WHERE repo_id = $repo_id" | ||
316 | . " AND bug_id = $bug_id"; | ||
317 | $res = rg_sql_query($db, $sql); | ||
318 | if ($res === FALSE) { | ||
319 | rg_bug_set_error("Cannot delete bug (" . rg_sql_error() . ")"); | ||
320 | break; | ||
321 | } | ||
322 | rg_sql_free_result($res); | ||
323 | $ret = TRUE; | ||
324 | } while (0); | ||
268 | 325 | ||
269 | 326 | rg_prof_end("bug_delete"); | rg_prof_end("bug_delete"); |
270 | |||
271 | return TRUE; | ||
327 | return $ret; | ||
272 | 328 | } | } |
273 | 329 | ||
274 | 330 | /* | /* |
... | ... | function rg_bug_delete($db, $repo_id, $bug_id) | |
278 | 334 | function rg_bug_update($db, $repo_id, $bug_id, $data) | function rg_bug_update($db, $repo_id, $bug_id, $data) |
279 | 335 | { | { |
280 | 336 | rg_prof_start("bug_update"); | rg_prof_start("bug_update"); |
281 | |||
282 | 337 | rg_log("bug_update: repo_id=$repo_id bug_id=$bug_id data: " | rg_log("bug_update: repo_id=$repo_id bug_id=$bug_id data: " |
283 | 338 | . rg_array2string($data)); | . rg_array2string($data)); |
284 | 339 | ||
285 | // First, test if it already exists | ||
286 | $bi = rg_bug_info($db, $repoid, $bug_id); | ||
287 | if ($bi['exists'] != 1) | ||
288 | return FALSE; | ||
340 | $ret = FALSE; | ||
341 | do { | ||
342 | // First, test if it already exists | ||
343 | $bi = rg_bug_info($db, $repoid, $bug_id); | ||
344 | if (($bi === FALSE) || ($bi['exists'] != 1)) | ||
345 | break; | ||
289 | 346 | ||
290 | $e_data = $data; | ||
291 | $e_data['title'] = rg_sql_escape($db, $data['title']); | ||
292 | $e_data['body'] = rg_sql_escape($db, $data['body']); | ||
347 | $e_data = $data; | ||
348 | $e_data['title'] = rg_sql_escape($db, $data['title']); | ||
349 | $e_data['body'] = rg_sql_escape($db, $data['body']); | ||
350 | $e_data['state'] = sprintf("%u", $data['state']); | ||
351 | // TODO: make a function to sanitize the input to be called from | ||
352 | // both update and insert. | ||
293 | 353 | ||
294 | $utime = time(); | ||
295 | |||
296 | $sql = "UPDATE bugs SET utime = $now" | ||
297 | . ", title = '" . $e_data['title'] . "'" | ||
298 | . ", body = '" . $e_data['body'] . "'" | ||
299 | . ", labels = '" . $e_data['labels'] . "'" | ||
300 | . ", state = " . $e_data['state'] | ||
301 | . ", assigned_uid = " . $e_data['assigned_uid'] | ||
302 | . " WHERE repo_id = $repo_id" | ||
303 | . " AND bug_id = $bug_id"; | ||
304 | $res = rg_sql_query($db, $sql); | ||
305 | if ($res === FALSE) { | ||
306 | rg_bug_set_error("Cannot update bug (" . rg_sql_error() . ")"); | ||
307 | return FALSE; | ||
308 | } | ||
309 | rg_sql_free_result($res); | ||
354 | $utime = time(); | ||
310 | 355 | ||
311 | rg_prof_end("bug_update"); | ||
356 | $sql = "UPDATE bugs SET utime = $now" | ||
357 | . ", title = '" . $e_data['title'] . "'" | ||
358 | . ", body = '" . $e_data['body'] . "'" | ||
359 | . ", state = " . $e_data['state'] | ||
360 | . ", assigned_uid = " . $e_data['assigned_uid'] | ||
361 | . " WHERE repo_id = $repo_id" | ||
362 | . " AND bug_id = $bug_id"; | ||
363 | $res = rg_sql_query($db, $sql); | ||
364 | if ($res === FALSE) { | ||
365 | rg_bug_set_error("Cannot update bug (" . rg_sql_error() . ")"); | ||
366 | break; | ||
367 | } | ||
368 | rg_sql_free_result($res); | ||
369 | $ret = TRUE; | ||
370 | } while (0); | ||
312 | 371 | ||
313 | return TRUE; | ||
372 | rg_prof_end("bug_update"); | ||
373 | return $ret; | ||
314 | 374 | } | } |
315 | 375 | ||
316 | 376 | /* | /* |
... | ... | function rg_bug_update($db, $repo_id, $bug_id, $data) | |
319 | 379 | function rg_bug_list_query($db, $url, $sql) | function rg_bug_list_query($db, $url, $sql) |
320 | 380 | { | { |
321 | 381 | rg_prof_start("bug_list_query"); | rg_prof_start("bug_list_query"); |
322 | |||
323 | 382 | rg_log("bug_list_query: url=$url, sql=$sql..."); | rg_log("bug_list_query: url=$url, sql=$sql..."); |
324 | 383 | ||
325 | $res = rg_sql_query($db, $sql); | ||
326 | if ($res === FALSE) { | ||
327 | rg_bug_set_error("cannot list by query (" . rg_sql_error() . ")"); | ||
328 | return FALSE; | ||
329 | } | ||
384 | $ret = FALSE; | ||
385 | do { | ||
386 | $res = rg_sql_query($db, $sql); | ||
387 | if ($res === FALSE) { | ||
388 | rg_bug_set_error("cannot list by query (" . rg_sql_error() . ")"); | ||
389 | break; | ||
390 | } | ||
330 | 391 | ||
331 | $d = array(); | ||
332 | while (($row = rg_sql_fetch_array($res))) { | ||
333 | rg_bug_cosmetic($db, $row); | ||
334 | $row['url_bug'] = $url . "/bug/" . $row['bug_id']; | ||
335 | $d[] = $row; | ||
336 | } | ||
337 | rg_sql_free_result($res); | ||
392 | $d = array(); | ||
393 | while (($row = rg_sql_fetch_array($res))) { | ||
394 | rg_bug_cosmetic($db, $row); | ||
395 | $row['url_bug'] = $url . "/bug/" . $row['bug_id']; | ||
396 | $d[] = $row; | ||
397 | } | ||
398 | rg_sql_free_result($res); | ||
399 | $ret = TRUE; | ||
400 | } while (0); | ||
401 | |||
402 | if ($ret !== FALSE) | ||
403 | $ret = rg_template_table("repo/bug/list", $d, array()); | ||
338 | 404 | ||
339 | 405 | rg_prof_end("bug_list_query"); | rg_prof_end("bug_list_query"); |
406 | return $ret; | ||
407 | } | ||
408 | |||
409 | /* | ||
410 | * Loads all saved searches | ||
411 | */ | ||
412 | function rg_bug_search_load_all($db, $repo_id, $uid, $url) | ||
413 | { | ||
414 | rg_prof_start("bug_search_load_all"); | ||
415 | rg_log("bug_search_load_all: repo_id=$repo_id uid=$uid"); | ||
416 | |||
417 | $ret = FALSE; | ||
418 | do { | ||
419 | $sql = "SELECT name FROM bug_search" | ||
420 | . " WHERE (repo_id = $repo_id OR repo_id = 0)" | ||
421 | . " AND uid = $uid" | ||
422 | . " ORDER BY repo_id, name"; | ||
423 | $res = rg_sql_query($db, $sql); | ||
424 | if ($res === FALSE) { | ||
425 | rg_bug_set_error("cannot load searches (" . rg_sql_error() . ")"); | ||
426 | break; | ||
427 | } | ||
428 | |||
429 | $data = array(); | ||
430 | // Add predefined | ||
431 | $data['All'] = "All"; | ||
432 | $data['Open'] = "Open"; | ||
433 | $data['Closed'] = "Closed"; | ||
434 | |||
435 | while (($row = rg_sql_fetch_array($res))) { | ||
436 | $name = $row['name']; | ||
437 | $data[$name] = $name; | ||
438 | } | ||
439 | |||
440 | $ret = array(); | ||
441 | foreach ($data as $name => $junk) | ||
442 | $ret[] = array("HTML:name" => "<a href=" . $url | ||
443 | . "/list/" . $name . ">" . $name . "</a>"); | ||
340 | 444 | ||
341 | return rg_template_table("repo/bug/list", $d, array()); | ||
445 | rg_sql_free_result($res); | ||
446 | } while (0); | ||
447 | |||
448 | rg_prof_end("bug_search_load_all"); | ||
449 | return $ret; | ||
342 | 450 | } | } |
343 | 451 | ||
344 | 452 | /* | /* |
345 | * | ||
453 | * Loads a saved search | ||
346 | 454 | */ | */ |
347 | function rg_bug_list($db, $url, $repo_id) | ||
455 | function rg_bug_search_load($db, $repo_id, $uid, $name) | ||
348 | 456 | { | { |
349 | rg_log("bug_list: url=$url, repo_id=$repo_id"); | ||
457 | rg_prof_start("bug_search_load"); | ||
458 | rg_log("bug_search_load: repo_id=$repo_id uid=$uid name=$name"); | ||
459 | |||
460 | $ret = FALSE; | ||
461 | do { | ||
462 | $template = array( | ||
463 | "name" => $name, | ||
464 | "reported_by" => 0, | ||
465 | "assigned_to" => 0, | ||
466 | "state" => 0, | ||
467 | "start" => 0, | ||
468 | "end" => 0, | ||
469 | "title_string" => "", | ||
470 | "body_string" => "", | ||
471 | "bugs_per_page" => 25, | ||
472 | "global" => 0, | ||
473 | "standard" => 1 | ||
474 | ); | ||
475 | |||
476 | // Pre-defined | ||
477 | if (strcmp($name, "All") == 0) { | ||
478 | $ret = $template; | ||
479 | break; | ||
480 | } | ||
481 | if (strcmp($name, "Open") == 0) { | ||
482 | $template['state'] = 1; | ||
483 | $ret = $template; | ||
484 | break; | ||
485 | } | ||
486 | if (strcmp($name, "Closed") == 0) { | ||
487 | $template['state'] = 2; | ||
488 | $ret = $template; | ||
489 | break; | ||
490 | } | ||
350 | 491 | ||
351 | $sql = "SELECT * FROM bugs" | ||
352 | . " WHERE repo_id = $repo_id" | ||
353 | . " AND deleted = 0" | ||
354 | . " ORDER BY itime"; | ||
492 | $e_name = rg_sql_escape($db, $name); | ||
355 | 493 | ||
356 | return rg_bug_list_query($db, $url, $sql); | ||
494 | $sql = "SELECT name, data FROM bug_search" | ||
495 | . " WHERE (repo_id = $repo_id OR repo_id = 0)" | ||
496 | . " AND uid = $uid" | ||
497 | . " AND name = '$e_name'"; | ||
498 | $res = rg_sql_query($db, $sql); | ||
499 | if ($res === FALSE) { | ||
500 | rg_bug_set_error("cannot search load (" . rg_sql_error() . ")"); | ||
501 | break; | ||
502 | } | ||
503 | |||
504 | $rows = rg_sql_num_rows($res); | ||
505 | if ($rows > 0) { | ||
506 | $row = rg_sql_fetch_array($res); | ||
507 | $_data = @unserialize($row['data']); | ||
508 | if ($_data === FALSE) { | ||
509 | rg_bug_set_error("cannot unserialize search data"); | ||
510 | break; | ||
511 | } | ||
512 | $ret = $_data; | ||
513 | $ret['name'] = $row['name']; //TODO: escape?! | ||
514 | $ret['standard'] = 0; | ||
515 | } else { | ||
516 | $ret = array(); | ||
517 | } | ||
518 | rg_sql_free_result($res); | ||
519 | } while (0); | ||
520 | |||
521 | rg_prof_end("bug_search_load"); | ||
522 | return $ret; | ||
357 | 523 | } | } |
358 | 524 | ||
359 | 525 | /* | /* |
360 | * | ||
526 | * Saves the search filtering | ||
527 | * TODO: name should not be inside data? | ||
361 | 528 | */ | */ |
362 | function rg_bug_search($db, $q) | ||
529 | function rg_bug_search_save($db, $repo_id, $uid, $q) | ||
363 | 530 | { | { |
364 | rg_log("bug_search: q=$q..."); | ||
531 | rg_prof_start("bug_search_save"); | ||
532 | rg_log("rg_bug_search_save: repo_id=$repo_id uid=$uid" | ||
533 | . " q=" . rg_array2string($q)); | ||
365 | 534 | ||
366 | $e_q = rg_sql_escape($db, $q); | ||
535 | $ret = FALSE; | ||
536 | do { | ||
537 | $name = $q['name']; | ||
538 | unset($q['name']); | ||
539 | |||
540 | // Test if is already present | ||
541 | $old = rg_bug_search_load($db, $repo_id, $uid, $name); | ||
542 | if ($old === FALSE) | ||
543 | break; | ||
367 | 544 | ||
368 | $sql = "SELECT * FROM bugs" | ||
369 | . " WHERE deleted = 0" | ||
370 | . " AND (title ILIKE '%$e_q%' OR body ILIKE '%$e_q%')" | ||
371 | . " AND deleted = 0" | ||
372 | . " ORDER BY itime" | ||
373 | . " LIMIT 10"; | ||
545 | $s = serialize($q); | ||
546 | $e_data = rg_sql_escape($db, $s); | ||
547 | $e_name = rg_sql_escape($db, $name); | ||
374 | 548 | ||
375 | return rg_bug_list_query($db, "", $sql); | ||
549 | // Global? | ||
550 | if (isset($q['global']) && ($q['global'] == 0)) | ||
551 | $e_repo_id = $repo_id; | ||
552 | else | ||
553 | $e_repo_id = 0; | ||
554 | |||
555 | if (empty($old)) { | ||
556 | $sql = "INSERT INTO bug_search (repo_id, uid, name" | ||
557 | . ", data)" | ||
558 | . " VALUES ($e_repo_id, $uid, '$e_name'" | ||
559 | . ", '$e_data')"; | ||
560 | } else { | ||
561 | $sql = "UPDATE bug_search" | ||
562 | . " SET data = '$e_data'" | ||
563 | . " WHERE repo_id = $e_repo_id" | ||
564 | . " AND uid = $uid" | ||
565 | . " AND name = '$e_name'"; | ||
566 | } | ||
567 | $res = rg_sql_query($db, $sql); | ||
568 | if ($res === FALSE) { | ||
569 | rg_bug_set_error("cannot save search (" . rg_sql_error() . ")"); | ||
570 | break; | ||
571 | } | ||
572 | rg_sql_free_result($res); | ||
573 | $ret = TRUE; | ||
574 | } while (0); | ||
575 | |||
576 | rg_prof_end("bug_search_save"); | ||
577 | return $ret; | ||
376 | 578 | } | } |
377 | 579 | ||
580 | /* | ||
581 | * Search for bugs | ||
582 | */ | ||
583 | function rg_bug_search($db, $url, $repo_id, $uid, $q) | ||
584 | { | ||
585 | rg_prof_start("bug_search"); | ||
586 | rg_log("bug_search: url=$url repo_id=$repo_id uid=$uid" | ||
587 | . " q=" . rg_array2string($q)); | ||
588 | |||
589 | $add = array(); | ||
590 | $limit = 25; | ||
591 | $ret = FALSE; | ||
592 | do { | ||
593 | // reported_by | ||
594 | if (!empty($q['reported_by'])) { | ||
595 | $_ui = rg_user_info($db, "", $q['reported_by'], "", ""); | ||
596 | if ($_ui['exists'] != 1) { | ||
597 | rg_bug_set_error("cannot lookup user (reported_by)"); | ||
598 | break; | ||
599 | } | ||
600 | $add[] = "uid = " . $_ui['uid']; | ||
601 | } | ||
602 | |||
603 | // assigned to | ||
604 | if (!empty($q['assigned_to'])) { | ||
605 | $_ui = rg_user_info($db, "", $q['assigned_to'], "", ""); | ||
606 | if ($_ui['exists'] != 1) { | ||
607 | rg_bug_set_error("cannot lookup user (assigned_to)"); | ||
608 | break; | ||
609 | } | ||
610 | $add[] = "AND assigned_uid = " . $_ui['uid']; | ||
611 | } | ||
612 | |||
613 | // state | ||
614 | if (isset($q['state']) && ($q['state'] > 0)) | ||
615 | $add[] = "AND state = " . $q['state']; | ||
616 | |||
617 | // start | ||
618 | if (!empty($q['start'])) { | ||
619 | $ts = rg_date2ts($q['start'], 0, 0, 0); | ||
620 | if ($ts === FALSE) { | ||
621 | rg_bug_set_error("invalid start date format"); | ||
622 | break; | ||
623 | } | ||
624 | $add[] = "AND itime >= $ts"; | ||
625 | } | ||
626 | |||
627 | // end | ||
628 | if (!empty($q['end'])) { | ||
629 | $ts = rg_date2ts_last_second($q['end']); | ||
630 | if ($ts === FALSE) { | ||
631 | rg_bug_set_error("invalid end date format"); | ||
632 | break; | ||
633 | } | ||
634 | $add[] = "AND itime <= $ts"; | ||
635 | } | ||
636 | |||
637 | // title_string | ||
638 | if (!empty($q['title_string'])) { | ||
639 | $_t = rg_sql_escape($db, $q['title_string']); | ||
640 | $add[] = "AND title ILIKE '%" . $_t . "%'"; | ||
641 | } | ||
642 | |||
643 | // body_string | ||
644 | if (!empty($q['body_string'])) { | ||
645 | $_t = rg_sql_escape($db, $q['body_string']); | ||
646 | $add[] = "AND body ILIKE '%$" . $_t . "%'"; | ||
647 | } | ||
648 | |||
649 | // bugs_per_page | ||
650 | if (!empty($q['bugs_per_page'])) | ||
651 | $limit = $q['bugs_per_page']; | ||
652 | |||
653 | // Only if we have a name and the user is logged in | ||
654 | if (!empty($q['name']) && ($uid > 0)) { | ||
655 | $r = rg_bug_search_save($db, $repo_id, $uid, $q); | ||
656 | if ($r === FALSE) | ||
657 | break; | ||
658 | } | ||
659 | |||
660 | $sql = "SELECT * FROM bugs" | ||
661 | . " WHERE repo_id = $repo_id" | ||
662 | . " AND deleted = 0" | ||
663 | . " " . implode(" ", $add) | ||
664 | . " ORDER BY itime" | ||
665 | . " LIMIT $limit"; | ||
666 | |||
667 | // TODO: order | ||
668 | $ret = TRUE; | ||
669 | } while (0); | ||
670 | |||
671 | if ($ret !== FALSE) | ||
672 | $ret = rg_bug_list_query($db, $url, $sql); | ||
673 | |||
674 | rg_prof_end("bug_search"); | ||
675 | return $ret; | ||
676 | } | ||
677 | |||
678 | /* | ||
679 | * Delete a saved search | ||
680 | * TODO: Check rights! | ||
681 | */ | ||
682 | function rg_bug_search_remove($db, $repo_id, $uid, $name) | ||
683 | { | ||
684 | rg_prof_start("bug_search_delete"); | ||
685 | rg_log("bug_search_remove: repo_id=$repo_id uid=$uid name=$name"); | ||
686 | |||
687 | $ret = FALSE; | ||
688 | do { | ||
689 | $e_name = rg_sql_escape($db, $name); | ||
690 | |||
691 | $sql = "DELETE FROM bug_search" | ||
692 | . " WHERE repo_id = $repo_id" | ||
693 | . " AND uid = $uid" | ||
694 | . " AND name = '$e_name'"; | ||
695 | $res = rg_sql_query($db, $sql); | ||
696 | if ($res === FALSE) { | ||
697 | rg_bug_set_error("cannot remove search (" . rg_sql_error() . ")"); | ||
698 | break; | ||
699 | } | ||
700 | rg_sql_free_result($res); | ||
701 | $ret = TRUE; | ||
702 | } while (0); | ||
703 | |||
704 | rg_prof_end("bug_search_delete"); | ||
705 | return $ret; | ||
706 | } | ||
707 | |||
708 | /*** NOTES ***/ | ||
709 | |||
378 | 710 | /* | /* |
379 | 711 | * Add a note for a bug | * Add a note for a bug |
380 | 712 | */ | */ |
381 | 713 | function rg_bug_note_add($db, $repo_id, $bug_id, $uid, $data) | function rg_bug_note_add($db, $repo_id, $bug_id, $uid, $data) |
382 | 714 | { | { |
383 | 715 | rg_prof_start("bug_note_add"); | rg_prof_start("bug_note_add"); |
384 | |||
385 | 716 | rg_log("bug_note_add: repo_id=$repo_id bug_id=$bug_id" | rg_log("bug_note_add: repo_id=$repo_id bug_id=$bug_id" |
386 | 717 | . " data: " . rg_array2string($data)); | . " data: " . rg_array2string($data)); |
387 | 718 | ||
388 | // TODO: test if user is allowed to add a note | ||
719 | $ret = FALSE; | ||
720 | do { | ||
721 | // TODO: test if user is allowed to add a note | ||
389 | 722 | ||
390 | $e_data = $data; | ||
391 | $e_data['note'] = rg_sql_escape($db, $data['note']); | ||
723 | $e_data = $data; | ||
724 | $e_data['note'] = rg_sql_escape($db, $data['note']); | ||
392 | 725 | ||
393 | $itime = time(); | ||
394 | $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "?"; | ||
395 | |||
396 | $sql = "INSERT INTO bug_notes (repo_id, bug_id, itime, uid, ip" | ||
397 | . ", note)" | ||
398 | . " VALUES ($repo_id, $bug_id, $itime, $uid, '$ip'" | ||
399 | . ", '" . $e_data['note'] . "')"; | ||
400 | $res = rg_sql_query($db, $sql); | ||
401 | if ($res === FALSE) { | ||
402 | rg_bug_set_error("Cannot insert bug note (" . rg_sql_error() . ")"); | ||
403 | return FALSE; | ||
404 | } | ||
405 | rg_sql_free_result($res); | ||
726 | $itime = time(); | ||
727 | $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "?"; | ||
406 | 728 | ||
407 | rg_prof_end("bug_note_add"); | ||
729 | $sql = "INSERT INTO bug_notes (repo_id, bug_id, itime, uid, ip" | ||
730 | . ", note)" | ||
731 | . " VALUES ($repo_id, $bug_id, $itime, $uid, '$ip'" | ||
732 | . ", '" . $e_data['note'] . "')"; | ||
733 | $res = rg_sql_query($db, $sql); | ||
734 | if ($res === FALSE) { | ||
735 | rg_bug_set_error("Cannot insert bug note (" . rg_sql_error() . ")"); | ||
736 | break; | ||
737 | } | ||
738 | rg_sql_free_result($res); | ||
739 | $ret = TRUE; | ||
740 | } while (0); | ||
408 | 741 | ||
409 | return TRUE; | ||
742 | rg_prof_end("bug_note_add"); | ||
743 | return $ret; | ||
410 | 744 | } | } |
411 | 745 | ||
412 | 746 | /* | /* |
... | ... | function rg_bug_note_add($db, $repo_id, $bug_id, $uid, $data) | |
415 | 749 | function rg_bug_note_list($db, $repo_id, $bug_id, $offset) | function rg_bug_note_list($db, $repo_id, $bug_id, $offset) |
416 | 750 | { | { |
417 | 751 | rg_prof_start("bug_note_list"); | rg_prof_start("bug_note_list"); |
418 | |||
419 | 752 | rg_log("bug_note_list: repo_id=$repo_id bug_id=$bug_id"); | rg_log("bug_note_list: repo_id=$repo_id bug_id=$bug_id"); |
420 | 753 | ||
421 | // TODO: test if user is allowed to see a note | ||
422 | |||
423 | $sql = "SELECT * FROM bug_notes" | ||
424 | . " WHERE repo_id = $repo_id" | ||
425 | . " AND bug_id = $bug_id" | ||
426 | . " ORDER BY itime" | ||
427 | . " LIMIT 20 OFFSET $offset"; | ||
428 | $res = rg_sql_query($db, $sql); | ||
429 | if ($res === FALSE) { | ||
430 | rg_bug_set_error("Cannot select bug notes (" . rg_sql_error() . ")"); | ||
431 | return FALSE; | ||
432 | } | ||
754 | $ret = FALSE; | ||
755 | do { | ||
756 | // TODO: test if user is allowed to see a note | ||
433 | 757 | ||
434 | $data = array(); | ||
435 | while (($row = rg_sql_fetch_array($res))) { | ||
436 | $row['creation'] = gmdate("Y-m-d H:i", $row['itime']); | ||
758 | $sql = "SELECT * FROM bug_notes" | ||
759 | . " WHERE repo_id = $repo_id" | ||
760 | . " AND bug_id = $bug_id" | ||
761 | . " ORDER BY itime" | ||
762 | . " LIMIT 20 OFFSET $offset"; | ||
763 | $res = rg_sql_query($db, $sql); | ||
764 | if ($res === FALSE) { | ||
765 | rg_bug_set_error("Cannot select bug notes (" . rg_sql_error() . ")"); | ||
766 | break; | ||
767 | } | ||
437 | 768 | ||
438 | $_ui = rg_user_info($db, $row['uid'], "", ""); | ||
439 | if ($_ui['exists'] == 1) | ||
440 | $row['owner'] = $_ui['username']; | ||
441 | else | ||
442 | $row['owner'] = "?"; | ||
769 | $ret = array(); | ||
770 | while (($row = rg_sql_fetch_array($res))) { | ||
771 | $row['creation'] = gmdate("Y-m-d H:i", $row['itime']); | ||
443 | 772 | ||
444 | $row['HTML:note'] = nl2br($row['note']); | ||
445 | unset($row['note']); | ||
773 | $_ui = rg_user_info($db, $row['uid'], "", ""); | ||
774 | if ($_ui['exists'] == 1) | ||
775 | $row['owner'] = $_ui['username']; | ||
776 | else | ||
777 | $row['owner'] = "?"; | ||
446 | 778 | ||
447 | $data[] = $row; | ||
448 | } | ||
449 | rg_sql_free_result($res); | ||
779 | $row['HTML:note'] = nl2br($row['note']); | ||
780 | unset($row['note']); | ||
450 | 781 | ||
451 | rg_prof_end("bug_note_list"); | ||
782 | $ret[] = $row; | ||
783 | } | ||
784 | rg_sql_free_result($res); | ||
785 | } while (0); | ||
452 | 786 | ||
453 | return $data; | ||
787 | rg_prof_end("bug_note_list"); | ||
788 | return $ret; | ||
454 | 789 | } | } |
455 | 790 | ||
456 | /* LABELS */ | ||
791 | /*** LABELS ***/ | ||
457 | 792 | ||
458 | 793 | /* | /* |
459 | 794 | * Build an array from a string of labels | * Build an array from a string of labels |
... | ... | function rg_bug_label_string2array($s) | |
462 | 797 | { | { |
463 | 798 | $ret = array(); | $ret = array(); |
464 | 799 | ||
465 | $s = preg_replace('/\r/', ',', $s); | ||
466 | $s = preg_replace('/\n/', ',', $s); | ||
800 | $s = preg_replace('/[\r\n\t ]/u', ',', $s); | ||
467 | 801 | rg_log("DEBUG: s=[$s]"); | rg_log("DEBUG: s=[$s]"); |
468 | 802 | $list = explode(",", $s); | $list = explode(",", $s); |
803 | rg_log("DEBUG: list: " . rg_array2string($list)); | ||
469 | 804 | if (empty($list)) | if (empty($list)) |
470 | 805 | return array(); | return array(); |
471 | 806 | ||
472 | 807 | foreach ($list as $label) { | foreach ($list as $label) { |
473 | $label = trim($label); | ||
474 | |||
475 | 808 | if (empty($label)) | if (empty($label)) |
476 | 809 | continue; | continue; |
477 | 810 | ||
... | ... | function rg_bug_label_diff($a, $b) | |
511 | 844 | */ | */ |
512 | 845 | function rg_bug_label_get($db, $repo_id, $bug_id) | function rg_bug_label_get($db, $repo_id, $bug_id) |
513 | 846 | { | { |
514 | $ret = array(); | ||
847 | rg_prof_start("bug_label_get"); | ||
848 | rg_log("bug_label_get: repo_id=$repo_id bug_id=$bug_id"); | ||
515 | 849 | ||
516 | $sql = "SELECT DISTINCT label FROM bug_labels" | ||
517 | . " WHERE repo_id = $repo_id" | ||
518 | . " AND bug_id = $bug_id"; | ||
519 | $res = rg_sql_query($db, $sql); | ||
520 | if ($res === FALSE) { | ||
521 | rg_bug_set_error("Cannot select labels (" . rg_sql_error() . ")"); | ||
522 | return FALSE; | ||
523 | } | ||
524 | while (($row = rg_sql_fetch_array($res))) | ||
525 | $ret[] = $row['label']; | ||
526 | rg_sql_free_result($res); | ||
850 | $ret = FALSE; | ||
851 | do { | ||
852 | $sql = "SELECT DISTINCT label FROM bug_labels" | ||
853 | . " WHERE repo_id = $repo_id" | ||
854 | . " AND bug_id = $bug_id" | ||
855 | . " ORDER BY label"; | ||
856 | $res = rg_sql_query($db, $sql); | ||
857 | if ($res === FALSE) { | ||
858 | rg_bug_set_error("Cannot select labels (" . rg_sql_error() . ")"); | ||
859 | break; | ||
860 | } | ||
861 | $ret = array(); | ||
862 | while (($row = rg_sql_fetch_array($res))) | ||
863 | $ret[] = $row['label']; | ||
864 | rg_sql_free_result($res); | ||
865 | } while(0); | ||
527 | 866 | ||
867 | rg_prof_end("bug_label_get"); | ||
528 | 868 | return $ret; | return $ret; |
529 | 869 | } | } |
530 | 870 | ||
... | ... | function rg_bug_label_get($db, $repo_id, $bug_id) | |
534 | 874 | function rg_bug_label_insert($db, $repo_id, $bug_id, $labels) | function rg_bug_label_insert($db, $repo_id, $bug_id, $labels) |
535 | 875 | { | { |
536 | 876 | rg_prof_start("bug_label_insert"); | rg_prof_start("bug_label_insert"); |
877 | rg_log("bug_label_insert: repo_id=$repo_id bug_id=$bug_id labels=$labels"); | ||
537 | 878 | ||
538 | $labels = rg_bug_label_string2array($labels); | ||
539 | rg_log("DEBUG: labels: " . rg_array2string($labels)); | ||
540 | if (empty($labels)) | ||
541 | return TRUE; | ||
879 | $ret = FALSE; | ||
880 | do { | ||
881 | $labels = rg_bug_label_string2array($labels); | ||
882 | rg_log("DEBUG: labels: " . rg_array2string($labels)); | ||
883 | if (empty($labels)) { | ||
884 | $ret = TRUE; | ||
885 | break; | ||
886 | } | ||
542 | 887 | ||
543 | $existing = rg_bug_label_get($db, $repo_id, $bug_id); | ||
544 | rg_log("DEBUG: existing: " . rg_array2string($existing)); | ||
545 | if ($existing === FALSE) | ||
546 | return FALSE; | ||
888 | $existing = rg_bug_label_get($db, $repo_id, $bug_id); | ||
889 | rg_log("DEBUG: existing: " . rg_array2string($existing)); | ||
890 | if ($existing === FALSE) | ||
891 | break; | ||
547 | 892 | ||
548 | $diff = rg_bug_label_diff($labels, $existing); | ||
549 | rg_log("DEBUG: diff: " . rg_array2string($diff)); | ||
550 | if (empty($diff)) | ||
551 | return TRUE; | ||
893 | $diff = rg_bug_label_diff($labels, $existing); | ||
894 | rg_log("DEBUG: diff: " . rg_array2string($diff)); | ||
895 | if (empty($diff)) { | ||
896 | $ret = TRUE; | ||
897 | break; | ||
898 | } | ||
552 | 899 | ||
553 | $ret = TRUE; | ||
554 | foreach ($diff as $label) { | ||
555 | $e_label = rg_sql_escape($db, $label); | ||
900 | $list = array(); | ||
901 | foreach ($diff as $label) { | ||
902 | $e_label = rg_sql_escape($db, $label); | ||
903 | $list[] = "($repo_id, $bug_id, '$e_label')"; | ||
904 | } | ||
556 | 905 | $sql = "INSERT INTO bug_labels (repo_id, bug_id, label)" | $sql = "INSERT INTO bug_labels (repo_id, bug_id, label)" |
557 | . " VALUES ($repo_id, $bug_id, '$e_label')"; | ||
906 | . " VALUES " . implode(",", $list); | ||
558 | 907 | $res = rg_sql_query($db, $sql); | $res = rg_sql_query($db, $sql); |
559 | 908 | if ($res === FALSE) { | if ($res === FALSE) { |
560 | rg_bug_set_error("Cannot insert label (" . rg_sql_error() . ")"); | ||
561 | $ret = FALSE; | ||
909 | rg_bug_set_error("Cannot insert labels (" . rg_sql_error() . ")"); | ||
562 | 910 | break; | break; |
563 | 911 | } | } |
564 | 912 | rg_sql_free_result($res); | rg_sql_free_result($res); |
565 | } | ||
913 | $ret = TRUE; | ||
914 | } while (0); | ||
566 | 915 | ||
567 | 916 | rg_prof_end("bug_label_insert"); | rg_prof_end("bug_label_insert"); |
568 | |||
569 | 917 | return $ret; | return $ret; |
570 | 918 | } | } |
571 | 919 | ||
... | ... | function rg_bug_label_insert($db, $repo_id, $bug_id, $labels) | |
574 | 922 | */ | */ |
575 | 923 | function rg_bug_label_html($db, $repo_id, $bug_id) | function rg_bug_label_html($db, $repo_id, $bug_id) |
576 | 924 | { | { |
925 | rg_prof_start("bug_label_html"); | ||
926 | |||
577 | 927 | $labels = rg_bug_label_get($db, $repo_id, $bug_id); | $labels = rg_bug_label_get($db, $repo_id, $bug_id); |
578 | 928 | ||
929 | $a = array(); | ||
579 | 930 | if (!empty($labels)) { | if (!empty($labels)) { |
580 | $a = array(); | ||
581 | 931 | foreach ($labels as $label) | foreach ($labels as $label) |
582 | $a[] = array("label" => $label); | ||
932 | $a[] = array("HTML:label" => $label); | ||
583 | 933 | } | } |
584 | 934 | ||
585 | return rg_template_table("repo/bug/list_labels", $a, array()); | ||
935 | $ret = rg_template_table("repo/bug/list_labels", $a, array()); | ||
936 | |||
937 | rg_prof_end("bug_label_html"); | ||
938 | return $ret; | ||
586 | 939 | } | } |
587 | 940 | ||
588 | 941 | ?> | ?> |
File inc/feedback/suggestion.php changed (mode: 100644) (index d9345b1..1b34a83) | |||
... | ... | if ($doit == 1) { | |
10 | 10 | $email = rg_var_str("email"); | $email = rg_var_str("email"); |
11 | 11 | $suggestion = rg_var_str("suggestion"); | $suggestion = rg_var_str("suggestion"); |
12 | 12 | ||
13 | while (1) { | ||
13 | do { | ||
14 | 14 | if (!rg_token_valid($db, $sid, $token)) { | if (!rg_token_valid($db, $sid, $token)) { |
15 | 15 | $errmsg[] = "invalid token; try again"; | $errmsg[] = "invalid token; try again"; |
16 | 16 | break; | break; |
... | ... | if ($doit == 1) { | |
34 | 34 | ||
35 | 35 | $show_form = 0; | $show_form = 0; |
36 | 36 | $_suggestion .= "Thank you very much!"; | $_suggestion .= "Thank you very much!"; |
37 | break; | ||
38 | } | ||
37 | } while (0); | ||
39 | 38 | } else { | } else { |
40 | 39 | $email = ""; | $email = ""; |
41 | 40 | $suggestion = ""; | $suggestion = ""; |
File inc/log.inc.php changed (mode: 100644) (index 0c6640f..08fa1d5) | |||
... | ... | function rg_log_set_file($file) | |
18 | 18 | $rg_log_file = $file; | $rg_log_file = $file; |
19 | 19 | } | } |
20 | 20 | ||
21 | /* | ||
22 | * Transforms strange chars to hexa | ||
23 | */ | ||
24 | function rg_log_callback($matches) | ||
25 | { | ||
26 | $n = pack("a*", $matches[0]); | ||
27 | $tmp = unpack("H*", $n); | ||
28 | return "[" . $tmp[1] . "]"; | ||
29 | } | ||
30 | |||
31 | 21 | function rg_log($str) | function rg_log($str) |
32 | 22 | { | { |
33 | 23 | global $rg_log_file; | global $rg_log_file; |
... | ... | function rg_log($str) | |
47 | 37 | $buf0 = gmdate("Y-m-d H:i:s", $t['sec']) . "." . sprintf("%03u", $t['usec'] / 1000); | $buf0 = gmdate("Y-m-d H:i:s", $t['sec']) . "." . sprintf("%03u", $t['usec'] / 1000); |
48 | 38 | $buf0 .= " " . $rg_log_sid . " "; | $buf0 .= " " . $rg_log_sid . " "; |
49 | 39 | $buf = ""; | $buf = ""; |
50 | $str = preg_replace_callback('/[^\pL\pN\pP\pS \t]/uU', "rg_log_callback", $str); | ||
40 | $str = preg_replace_callback('/[^\pL\pN\pP\pS \t]/uU', "rg_callback_hexa", $str); | ||
51 | 41 | $buf .= $buf0 . $str . "\n"; | $buf .= $buf0 . $str . "\n"; |
52 | 42 | ||
53 | 43 | if ($rg_log_fd !== NULL) | if ($rg_log_fd !== NULL) |
File inc/struct.inc.php changed (mode: 100644) (index d7cf83a..30775b4) | |||
... | ... | $rg_sql_struct[6]['tables'] = array( | |
135 | 135 | . ", ip TEXT NOT NULL" | . ", ip TEXT NOT NULL" |
136 | 136 | . ", title TEXT NOT NULL" | . ", title TEXT NOT NULL" |
137 | 137 | . ", body TEXT NOT NULL" | . ", body TEXT NOT NULL" |
138 | . ", state SMALLINT NOT NULL" | ||
138 | 139 | . ", assigned_uid INT NOT NULL" | . ", assigned_uid INT NOT NULL" |
139 | 140 | . ", deleted INT NOT NULL" | . ", deleted INT NOT NULL" |
140 | 141 | . ")", | . ")", |
... | ... | $rg_sql_struct[6]['other'] = array( | |
163 | 164 | . " ON bug_labels (repo_id, bug_id)" | . " ON bug_labels (repo_id, bug_id)" |
164 | 165 | ); | ); |
165 | 166 | ||
167 | $rg_sql_struct[7] = array(); | ||
168 | $rg_sql_struct[7]['tables'] = array( | ||
169 | "bug_search" => "CREATE TABLE bug_search (" | ||
170 | . "repo_id INT NOT NULL" | ||
171 | . ", uid INT NOT NULL" | ||
172 | . ", name TEXT NOT NULL" | ||
173 | . ", data TEXT NOT NULL" | ||
174 | . ")" | ||
175 | ); | ||
176 | $rg_sql_struct[7]['other'] = array( | ||
177 | "bug_search_repo_id_uid" => "CREATE INDEX bug_search_i_repo_id_uid" | ||
178 | . " ON bug_search(repo_id, uid)" | ||
179 | ); | ||
180 | |||
166 | 181 | // This must be the last line | // This must be the last line |
167 | 182 | $rg_sql_schema_ver = count($rg_sql_struct); | $rg_sql_schema_ver = count($rg_sql_struct); |
168 | 183 |
File inc/user/create.php changed (mode: 100644) (index c2f26bf..263c7c1) | |||
... | ... | if ($doit == 1) { | |
20 | 20 | $xpass2 = rg_var_str("xpass2"); | $xpass2 = rg_var_str("xpass2"); |
21 | 21 | $session_time = rg_var_uint("session_time"); | $session_time = rg_var_uint("session_time"); |
22 | 22 | ||
23 | while (1) { | ||
23 | do { | ||
24 | 24 | if (strcmp($xpass, $xpass2) != 0) { | if (strcmp($xpass, $xpass2) != 0) { |
25 | 25 | $errmsg[] = "password are not the same"; | $errmsg[] = "password are not the same"; |
26 | 26 | break; | break; |
... | ... | if ($doit == 1) { | |
61 | 61 | ||
62 | 62 | $show_form = 0; | $show_form = 0; |
63 | 63 | $_create .= "Check your e-mail and follow the link inside."; | $_create .= "Check your e-mail and follow the link inside."; |
64 | break; | ||
65 | } | ||
64 | } while (0); | ||
66 | 65 | } else { | } else { |
67 | 66 | $xuser = ""; | $xuser = ""; |
68 | 67 | $realname = ""; | $realname = ""; |
File inc/user/info/info.php changed (mode: 100644) (index b68994f..d883155) | |||
... | ... | if ($doit == 1) { | |
19 | 19 | $rights = $rg_ui['rights']; | $rights = $rg_ui['rights']; |
20 | 20 | $session_time = rg_var_uint("session_time"); | $session_time = rg_var_uint("session_time"); |
21 | 21 | ||
22 | while (1) { | ||
22 | do { | ||
23 | 23 | $_u = array(); | $_u = array(); |
24 | 24 | $_u['uid'] = $rg_ui['uid']; | $_u['uid'] = $rg_ui['uid']; |
25 | 25 | $_u['username'] = $xuser; | $_u['username'] = $xuser; |
... | ... | if ($doit == 1) { | |
36 | 36 | } | } |
37 | 37 | ||
38 | 38 | $_info .= "Information was updated!<br />"; | $_info .= "Information was updated!<br />"; |
39 | break; | ||
40 | } | ||
39 | } while (0); | ||
41 | 40 | } else { | } else { |
42 | 41 | $xuser = $rg_ui['username']; | $xuser = $rg_ui['username']; |
43 | 42 | $realname = $rg_ui['realname']; | $realname = $rg_ui['realname']; |
File inc/user/pass/pass.php changed (mode: 100644) (index 5f18947..7b7c9c1) | |||
... | ... | if ($doit == 1) { | |
11 | 11 | $pass1 = rg_var_str("pass1"); | $pass1 = rg_var_str("pass1"); |
12 | 12 | $pass2 = rg_var_str("pass2"); | $pass2 = rg_var_str("pass2"); |
13 | 13 | ||
14 | while (1) { | ||
14 | do { | ||
15 | 15 | if (!rg_token_valid($db, $sid, $token)) { | if (!rg_token_valid($db, $sid, $token)) { |
16 | 16 | $errmsg[] = "invalid token; try again"; | $errmsg[] = "invalid token; try again"; |
17 | 17 | break; | break; |
... | ... | if ($doit == 1) { | |
34 | 34 | ||
35 | 35 | $_pass .= "Password was changed with success!<br />"; | $_pass .= "Password was changed with success!<br />"; |
36 | 36 | $show_form = 0; | $show_form = 0; |
37 | break; | ||
38 | } | ||
37 | } while (0); | ||
39 | 38 | } | } |
40 | 39 | ||
41 | 40 | if ($show_form == 1) { | if ($show_form == 1) { |
File inc/user/repo/bug/add/add.php changed (mode: 100644) (index 0dc7471..50efdb4) | |||
1 | 1 | <?php | <?php |
2 | rg_log("/inc/repo/bug/add/add"); | ||
2 | rg_log("/inc/user/repo/bug/add/add"); | ||
3 | 3 | ||
4 | 4 | $bug_more = $_more; | $bug_more = $_more; |
5 | 5 | $_bug_add = ""; | $_bug_add = ""; |
... | ... | if ($doit == 0) { | |
10 | 10 | // defaults | // defaults |
11 | 11 | $_x['title'] = ""; | $_x['title'] = ""; |
12 | 12 | $_x['body'] = ""; | $_x['body'] = ""; |
13 | $_x['state'] = 1; | ||
13 | 14 | $_x['labels'] = ""; | $_x['labels'] = ""; |
14 | 15 | $_x['assigned_to'] = 0; | $_x['assigned_to'] = 0; |
15 | 16 | } else { | } else { |
16 | 17 | $_x['title'] = rg_var_str("title"); | $_x['title'] = rg_var_str("title"); |
17 | 18 | $_x['body'] = rg_var_str("body"); | $_x['body'] = rg_var_str("body"); |
19 | $_x['state'] = rg_var_uint("state"); | ||
18 | 20 | $_x['labels'] = rg_var_str("labels"); | $_x['labels'] = rg_var_str("labels"); |
19 | 21 | $_x['assigned_uid'] = 0; | $_x['assigned_uid'] = 0; |
20 | 22 | ||
21 | while (1) { | ||
23 | do { | ||
22 | 24 | if (!rg_token_valid($db, $sid, rg_var_str("token"))) { | if (!rg_token_valid($db, $sid, rg_var_str("token"))) { |
23 | 25 | $bug_errmsg[] = "Invalid token. Try again."; | $bug_errmsg[] = "Invalid token. Try again."; |
24 | 26 | break; | break; |
... | ... | if ($doit == 0) { | |
34 | 36 | break; | break; |
35 | 37 | } | } |
36 | 38 | ||
39 | if (($_x['state'] < 1) || ($_x['state'] > 3)) { | ||
40 | $bug_errmsg[] = "State is not valid."; | ||
41 | break; | ||
42 | } | ||
43 | |||
37 | 44 | $bug_id = rg_bug_add($db, $ri['repo_id'], $ui['uid'], $_x); | $bug_id = rg_bug_add($db, $ri['repo_id'], $ui['uid'], $_x); |
38 | 45 | if ($bug_id === FALSE) { | if ($bug_id === FALSE) { |
39 | 46 | $bug_errmsg[] = "Cannot add bug (" . rg_bug_error() . ")."; | $bug_errmsg[] = "Cannot add bug (" . rg_bug_error() . ")."; |
... | ... | if ($doit == 0) { | |
43 | 50 | // redirect to bug home | // redirect to bug home |
44 | 51 | $url = rg_re_bugpage($rg_ui, $ri, $bug_id); | $url = rg_re_bugpage($rg_ui, $ri, $bug_id); |
45 | 52 | rg_redirect($url); | rg_redirect($url); |
46 | } | ||
53 | } while (0); | ||
47 | 54 | } | } |
48 | 55 | ||
49 | 56 | $bug_more = array_merge($bug_more, $_x); | $bug_more = array_merge($bug_more, $_x); |
... | ... | $bug_more['HTML:bug_errmsg'] = rg_template_errmsg($bug_errmsg); | |
51 | 58 | $bug_more['bug_action'] = "Add bug"; | $bug_more['bug_action'] = "Add bug"; |
52 | 59 | $bug_more['rg_action'] = rg_re_post($cop); | $bug_more['rg_action'] = rg_re_post($cop); |
53 | 60 | $bug_more['rg_form_token'] = rg_token_get($db, $sid); | $bug_more['rg_form_token'] = rg_token_get($db, $sid); |
61 | $bug_more['HTML:state_select'] = rg_bug_state_select($_x['state']); | ||
54 | 62 | $_bug_add .= rg_template("repo/bug/bug_add.html", $bug_more); | $_bug_add .= rg_template("repo/bug/bug_add.html", $bug_more); |
55 | 63 | ?> | ?> |
File inc/user/repo/bug/main.php changed (mode: 100644) (index 4ef8ebf..71fdb4d) | |||
... | ... | rg_log("/inc/user/repo/bug/main"); | |
3 | 3 | ||
4 | 4 | $_bug_body = ""; | $_bug_body = ""; |
5 | 5 | ||
6 | $_op = isset($paras[0]) ? $paras[0] : ""; | ||
6 | $_more['can_save'] = $rg_ui['uid'] > 0 ? 1 : 0; | ||
7 | |||
8 | $_op = empty($paras) ? "list" : array_shift($paras); | ||
7 | 9 | switch ($_op) { | switch ($_op) { |
10 | case 'search': | ||
11 | include($INC . "/user/repo/bug/search/search.php"); | ||
12 | $_bug_body .= $_bug_search; | ||
13 | break; | ||
14 | |||
8 | 15 | case 'add': | case 'add': |
9 | 16 | include($INC . "/user/repo/bug/add/add.php"); | include($INC . "/user/repo/bug/add/add.php"); |
10 | 17 | $_bug_body .= $_bug_add; | $_bug_body .= $_bug_add; |
11 | 18 | break; | break; |
12 | 19 | ||
13 | case '': /* list */ | ||
14 | $r = rg_bug_list($db, $_more['url_repo'], $ri['repo_id']); | ||
20 | case 'list': /* list */ | ||
21 | $_search = empty($paras) ? "All" : array_shift($paras); | ||
22 | |||
23 | $_url = rg_re_repopage($ui, $ri['name']) . "/bug"; | ||
24 | |||
25 | // Somebody pressed "Remove" button? | ||
26 | if (rg_var_uint("remove") == 1) { | ||
27 | $token = rg_var_str("token"); | ||
28 | if (!rg_token_valid($db, $sid, $token)) { | ||
29 | $_bug_body .= "Error: invalid token. Try again."; // TODO | ||
30 | exit(1); // security_violation! | ||
31 | } | ||
32 | |||
33 | $r = rg_bug_search_remove($db, $ri['repo_id'], $rg_ui['uid'], | ||
34 | $_search); | ||
35 | if ($r === FALSE) | ||
36 | $_bug_body .= "Error: cannot delete search!"; // TODO | ||
37 | } | ||
38 | |||
39 | $r = rg_bug_search_load_all($db, $ri['repo_id'], $rg_ui['uid'], $_url); | ||
40 | if ($r === FALSE) { | ||
41 | $_bug_body .= "Error: cannot load all searches!"; // TODO | ||
42 | } else { | ||
43 | $_bug_body .= rg_template_table("repo/bug/search/list", | ||
44 | $r, $_more); | ||
45 | } | ||
46 | |||
47 | $filter = rg_bug_search_load($db, $ri['repo_id'], $rg_ui['uid'], $_search); | ||
48 | if ($filter === FALSE) { | ||
49 | $_bug_body .= "Error: cannot load search!"; // TODO | ||
50 | $filter = array(); | ||
51 | } | ||
52 | |||
53 | if (isset($filter['name'])) | ||
54 | $_more['search_name'] = $filter['name']; | ||
55 | |||
56 | $r = rg_bug_search($db, $_more['url_repo'], $ri['repo_id'], | ||
57 | $rg_ui['uid'], $filter); | ||
15 | 58 | if ($r === FALSE) | if ($r === FALSE) |
16 | $_bug_body .= "Error!"; // TODO: do something OK here! | ||
59 | $_bug_body .= "Error: Cannot search bugs!"; // TODO: do something OK here! | ||
17 | 60 | else | else |
18 | 61 | $_bug_body .= $r; | $_bug_body .= $r; |
62 | |||
63 | // Show remove for custom search | ||
64 | if (isset($filter['standard']) && ($filter['standard'] == 0)) { | ||
65 | $_remove_more = $_more; | ||
66 | $_remove_more['rg_action'] = $_url . "/list/" . $filter['name']; | ||
67 | $_remove_more['rg_form_token'] = rg_token_get($db, $sid); | ||
68 | $_remove_more['search_remove_errmsg'] = ""; | ||
69 | $_bug_body .= rg_template("repo/bug/search/remove.html", | ||
70 | $_remove_more); | ||
71 | } | ||
19 | 72 | break; | break; |
20 | 73 | ||
21 | 74 | default: // go directly to a bug | default: // go directly to a bug |
File inc/user/repo/bug/search/search.php added (mode: 100644) (index 0000000..484e520) | |||
1 | <?php | ||
2 | rg_log("/inc/user/repo/bug/search/search"); | ||
3 | |||
4 | $_my_more = $_more; | ||
5 | $_bug_search = ""; | ||
6 | $bug_errmsg = array(); | ||
7 | |||
8 | $_x = array(); | ||
9 | if ($doit == 0) { | ||
10 | // defaults | ||
11 | $_x['reported_by'] = ""; | ||
12 | $_x['assigned_to'] = ""; | ||
13 | $_x['state'] = 0; | ||
14 | $_x['order_by'] = ""; | ||
15 | $_x['include'] = ""; | ||
16 | $_x['exclude'] = ""; | ||
17 | $_x['start'] = ""; | ||
18 | $_x['end'] = ""; | ||
19 | $_x['title_string'] = ""; | ||
20 | $_x['body_string'] = ""; | ||
21 | $_x['bugs_per_page'] = 25; | ||
22 | $_x['global'] = 0; | ||
23 | $_x['name'] = ""; | ||
24 | } else { | ||
25 | $_x['reported_by'] = rg_var_str("reported_by"); | ||
26 | $_x['assigned_to'] = rg_var_str("assigned_to"); | ||
27 | $_x['state'] = rg_var_uint("state"); | ||
28 | $_x['order_by'] = rg_var_str("order_by"); | ||
29 | $_x['include'] = rg_var_str("include"); | ||
30 | $_x['exclude'] = rg_var_str("exclude"); | ||
31 | $_x['start'] = rg_var_str("start"); | ||
32 | $_x['end'] = rg_var_str("end"); | ||
33 | $_x['title_string'] = rg_var_str("title_string"); | ||
34 | $_x['body_string'] = rg_var_str("body_string"); | ||
35 | $_x['bugs_per_page'] = rg_var_uint("bugs_per_page"); | ||
36 | $_x['global'] = rg_var_uint("global"); | ||
37 | $_x['name'] = rg_var_str("name"); | ||
38 | |||
39 | do { | ||
40 | /* | ||
41 | if (empty($_x['title'])) { | ||
42 | $bug_errmsg[] = "Title too short."; | ||
43 | break; | ||
44 | } | ||
45 | */ | ||
46 | |||
47 | $bugs = rg_bug_search($db, $_more['url_repo'], $ri['repo_id'], | ||
48 | $rg_ui['uid'], $_x); | ||
49 | if ($bugs === FALSE) { | ||
50 | $bug_errmsg[] = "Cannot search bug (" . rg_bug_error() . ")."; | ||
51 | break; | ||
52 | } | ||
53 | |||
54 | // Show bugs | ||
55 | $_bug_search .= $bugs; | ||
56 | } while (0); | ||
57 | } | ||
58 | |||
59 | $_my_more = array_merge($_my_more, $_x); | ||
60 | $_my_more['HTML:bug_errmsg'] = rg_template_errmsg($bug_errmsg); | ||
61 | $_my_more['rg_action'] = rg_re_post($cop); | ||
62 | $_my_more['HTML:state_select'] = rg_bug_state_select($_x['state']); | ||
63 | $_bug_search .= rg_template("repo/bug/bug_search.html", $_my_more); | ||
64 | ?> |
File inc/user/repo/bug/show.php changed (mode: 100644) (index 32efe9c..18b1972) | |||
... | ... | rg_log("/inc/user/repo/bug/show"); | |
3 | 3 | ||
4 | 4 | $_bug_show = ""; | $_bug_show = ""; |
5 | 5 | ||
6 | $_my_more = $_more; | ||
7 | $_my_more['bug_id'] = $bug_id; | ||
8 | |||
6 | 9 | $ibug = rg_bug_info($db, $ri['repo_id'], $bug_id); | $ibug = rg_bug_info($db, $ri['repo_id'], $bug_id); |
7 | if ($ibug['exists'] != 1) | ||
8 | die("TODO: Invalid bug (" . rg_bug_error() . ")!"); // TODO: do not use die! | ||
10 | if ($ibug === FALSE) | ||
11 | rg_fatal("Cannot lookup bug!"); | ||
12 | if ($ibug['exists'] != 1) { | ||
13 | $_bug_body .= rg_template("repo/bug/not_found.html", $_my_more); | ||
14 | return; | ||
15 | } | ||
9 | 16 | ||
10 | $_tmp = array_merge($_more, $ibug); | ||
17 | $_my_more = array_merge($_my_more, $ibug); | ||
11 | 18 | ||
12 | 19 | // insert? | // insert? |
13 | 20 | $doit = rg_var_uint("doit"); | $doit = rg_var_uint("doit"); |
14 | 21 | $note_errmsg = array(); | $note_errmsg = array(); |
15 | 22 | if ($doit == 0) { | if ($doit == 0) { |
16 | 23 | // default values | // default values |
17 | $_tmp['note'] = ""; | ||
24 | $_my_more['note'] = ""; | ||
18 | 25 | } else { | } else { |
19 | while (1) { | ||
26 | do { | ||
20 | 27 | $token = rg_var_str("token"); | $token = rg_var_str("token"); |
21 | 28 | $note = rg_var_str("note"); | $note = rg_var_str("note"); |
22 | 29 | ||
... | ... | if ($doit == 0) { | |
40 | 47 | } | } |
41 | 48 | ||
42 | 49 | // prepare form for other note | // prepare form for other note |
43 | $_tmp['note'] = ""; | ||
44 | break; | ||
45 | } | ||
50 | $_my_more['note'] = ""; | ||
51 | } while (0); | ||
46 | 52 | } | } |
47 | 53 | ||
48 | 54 | // load labels | // load labels |
49 | 55 | $labels = rg_bug_label_get($db, $ri['repo_id'], $bug_id); | $labels = rg_bug_label_get($db, $ri['repo_id'], $bug_id); |
50 | 56 | if ($labels === FALSE) | if ($labels === FALSE) |
51 | $_tmp['HTML:labels'] = "Cannot load labels!"; | ||
57 | $_my_more['HTML:labels'] = "Cannot load labels!"; | ||
52 | 58 | else | else |
53 | $_tmp['HTML:labels'] = rg_bug_label_html($db, $ri['repo_id'], $bug_id); | ||
59 | $_my_more['HTML:labels'] = rg_bug_label_html($db, $ri['repo_id'], $bug_id); | ||
54 | 60 | ||
55 | 61 | // load notes | // load notes |
56 | 62 | $notes = rg_bug_note_list($db, $ri['repo_id'], $bug_id, 0); | $notes = rg_bug_note_list($db, $ri['repo_id'], $bug_id, 0); |
57 | 63 | if ($notes === FALSE) | if ($notes === FALSE) |
58 | $_tmp['HTML:notes'] = "Cannot load notes!"; | ||
64 | $_my_more['HTML:notes'] = "Cannot load notes!"; | ||
59 | 65 | else | else |
60 | $_tmp['HTML:notes'] = rg_template_table("repo/bug/list_note", $notes, array()); | ||
66 | $_my_more['HTML:notes'] = rg_template_table("repo/bug/list_note", $notes, $_my_more); | ||
61 | 67 | ||
62 | 68 | // add note form | // add note form |
63 | $_tmp['HTML:note_errmsg'] = rg_template_errmsg($note_errmsg); | ||
69 | $_my_more['HTML:note_errmsg'] = rg_template_errmsg($note_errmsg); | ||
64 | 70 | ||
65 | $_tmp['rg_action'] = rg_re_post($cop); | ||
66 | $_tmp['rg_form_token'] = rg_token_get($db, $sid); | ||
67 | $_tmp['HTML:note_add'] = rg_template("repo/bug/note_add.html", $_tmp); | ||
71 | $_my_more['rg_action'] = rg_re_post($cop); | ||
72 | $_my_more['rg_form_token'] = rg_token_get($db, $sid); | ||
73 | $_my_more['HTML:note_add'] = rg_template("repo/bug/note_add.html", $_my_more); | ||
68 | 74 | ||
69 | $_bug_show .= rg_template("repo/bug/show.html", $_tmp); | ||
75 | $_bug_show .= rg_template("repo/bug/show.html", $_my_more); | ||
70 | 76 | ?> | ?> |
File inc/user/repo/delete/delete.php changed (mode: 100644) (index 151293d..fab6c27) | |||
... | ... | $_delete = ""; | |
5 | 5 | ||
6 | 6 | $errmsg = array(); | $errmsg = array(); |
7 | 7 | ||
8 | while (1) { | ||
8 | do { | ||
9 | 9 | $r = rg_repo_delete($db, $ri['repo_id'], $rg_ui); | $r = rg_repo_delete($db, $ri['repo_id'], $rg_ui); |
10 | 10 | if ($r === FALSE) { | if ($r === FALSE) { |
11 | 11 | $errmsg[] = rg_repo_error(); | $errmsg[] = rg_repo_error(); |
12 | 12 | break; | break; |
13 | 13 | } | } |
14 | |||
15 | break; | ||
16 | } | ||
14 | } while (0); | ||
17 | 15 | ||
18 | 16 | $_err = implode("<br />\n", $errmsg); | $_err = implode("<br />\n", $errmsg); |
19 | 17 | if (!empty($_err)) { | if (!empty($_err)) { |
File inc/user/repo/edit/edit.php changed (mode: 100644) (index c3bfe96..b554608) | |||
... | ... | if ($doit == 1) { | |
20 | 20 | $description = rg_var_str("description"); | $description = rg_var_str("description"); |
21 | 21 | $rights = @rg_rights_a2s($_REQUEST['rights']); | $rights = @rg_rights_a2s($_REQUEST['rights']); |
22 | 22 | ||
23 | while (1) { | ||
23 | do { | ||
24 | 24 | // lookup user | // lookup user |
25 | 25 | $_ui = rg_user_info($db, 0, $rr['user'], ""); | $_ui = rg_user_info($db, 0, $rr['user'], ""); |
26 | 26 | if ($_ui['ok'] != 1) { | if ($_ui['ok'] != 1) { |
... | ... | if ($doit == 1) { | |
44 | 44 | ||
45 | 45 | $_edit .= "The repository was updated with success!"; | $_edit .= "The repository was updated with success!"; |
46 | 46 | $_show_form = 0; | $_show_form = 0; |
47 | |||
48 | break; | ||
49 | } | ||
47 | } while (0); | ||
50 | 48 | } else { | } else { |
51 | 49 | // load variables | // load variables |
52 | 50 | $repo_id = $ri['repo_id']; | $repo_id = $ri['repo_id']; |
File inc/util.inc.php changed (mode: 100644) (index a58816b..94791fa) | |||
... | ... | function rg_image_callback($matches) | |
367 | 367 | */ | */ |
368 | 368 | function rg_prepare_image($line) | function rg_prepare_image($line) |
369 | 369 | { | { |
370 | return preg_replace_callback('/@@IMG:(.*)@@/U', "rg_image_callback", $line); | ||
370 | return preg_replace_callback('/@@IMG:(.*)@@/uU', "rg_image_callback", $line); | ||
371 | 371 | } | } |
372 | 372 | ||
373 | 373 | /* | /* |
374 | 374 | * Replace conditionals | * Replace conditionals |
375 | * @@if(X)_@@A@@_@@B@@ - if X is 0 will return @@B@@, else @@A@@ | ||
375 | * @@if(X){{@@A@@}}{{@@B@@}} - if X is 0 will return @@B@@, else @@A@@ | ||
376 | 376 | */ | */ |
377 | 377 | function rg_prepare_conditionals(&$data, &$what, &$values) | function rg_prepare_conditionals(&$data, &$what, &$values) |
378 | 378 | { | { |
379 | $what['false'] = "/@@if\(0\){{(.*)}}{{(.*)}}/U"; | ||
380 | $values['false'] = "\\2"; | ||
379 | // we need greedy (!U) here to take care of cascading ifs | ||
380 | // TODO: probably we need to repeat the replace? | ||
381 | $what['false'] = "/@@if\(0\){{(.*)}}{{(.*)}}/su"; | ||
382 | $values['false'] = '$2'; | ||
381 | 383 | ||
382 | $what['true'] = "/@@if\(.*\){{(.*)}}{{(.*)}}/U"; | ||
383 | $values['true'] = "\\1"; | ||
384 | // For condition, we must be non greedy! | ||
385 | $what['true'] = "/@@if\(.*?\){{(.*)}}{{(.*)}}/su"; | ||
386 | $values['true'] = '$1'; | ||
384 | 387 | } | } |
385 | 388 | ||
386 | 389 | function rg_prepare_replace(&$data, &$what, &$values) | function rg_prepare_replace(&$data, &$what, &$values) |
... | ... | function rg_redirect($url) | |
582 | 585 | exit(0); | exit(0); |
583 | 586 | } | } |
584 | 587 | ||
588 | /* | ||
589 | * Transforms strange chars to hexa | ||
590 | */ | ||
591 | function rg_callback_hexa($matches) | ||
592 | { | ||
593 | $n = pack("a*", $matches[0]); | ||
594 | $tmp = unpack("H*", $n); | ||
595 | return "[" . $tmp[1] . "]"; | ||
596 | } | ||
597 | |||
585 | 598 | /* | /* |
586 | 599 | * Transforms an array in a string | * Transforms an array in a string |
587 | 600 | */ | */ |
... | ... | function rg_array2string($a) | |
593 | 606 | if (empty($a)) | if (empty($a)) |
594 | 607 | return ""; | return ""; |
595 | 608 | ||
596 | $what = array("/\n/", "/\r/"); | ||
597 | $values = array("\\n", "\\r"); | ||
609 | $what = array("/[^\pL\pN\pP\pS ]/uU"); | ||
598 | 610 | ||
599 | 611 | $ret = ""; | $ret = ""; |
600 | 612 | $add = ""; | $add = ""; |
601 | 613 | foreach ($a as $k => $v) { | foreach ($a as $k => $v) { |
602 | 614 | if (is_array($v)) | if (is_array($v)) |
603 | $s = "[" . rg_array2string($v) . "]"; | ||
615 | $s = rg_array2string($v); | ||
604 | 616 | else | else |
605 | $s = preg_replace($what, $values, $v); | ||
606 | $ret .= $add . "$k=$s"; | ||
617 | $s = preg_replace_callback($what, "rg_callback_hexa", $v); | ||
618 | $ret .= $add . "$k=[$s]"; | ||
607 | 619 | $add = " "; | $add = " "; |
608 | 620 | } | } |
609 | 621 | ||
... | ... | function rg_shutdown_error() | |
735 | 747 | rg_error_handler($a['type'], $a['message'], $a['file'], $a['line']); | rg_error_handler($a['type'], $a['message'], $a['file'], $a['line']); |
736 | 748 | } | } |
737 | 749 | ||
750 | /* | ||
751 | * YYYY-MM-DD -> timestamp | ||
752 | */ | ||
753 | function rg_date2ts($s) | ||
754 | { | ||
755 | rg_log("rg_date2ts s=[$s]"); | ||
756 | |||
757 | if (strlen($s) != 10) | ||
758 | return FALSE; | ||
759 | |||
760 | $f = explode("-", $s); | ||
761 | |||
762 | if (count($f) != 3) | ||
763 | return FALSE; | ||
764 | |||
765 | return gmmktime(0, 0, 0, $f[1], $f[2], $f[0]); | ||
766 | } | ||
767 | |||
768 | /* | ||
769 | * YYYY-MM-DD -> timestamp (last second of the day) | ||
770 | */ | ||
771 | function rg_date2ts_last_second($s) | ||
772 | { | ||
773 | rg_log("rg_date2ts_last_second s=[$s]"); | ||
774 | |||
775 | if (strlen($s) != 10) | ||
776 | return FALSE; | ||
777 | |||
778 | $f = explode("-", $s); | ||
779 | |||
780 | if (count($f) != 3) | ||
781 | return FALSE; | ||
782 | |||
783 | return gmmktime(0, 0, 0, $f[1], $f[2] + 1, $f[0]) - 1; | ||
784 | } | ||
785 | |||
738 | 786 | ?> | ?> |
File root/index.php changed (mode: 100644) (index 3b1b94a..69e7116) | |||
... | ... | rg_log("_COOKIE: " . rg_array2string($_COOKIE)); | |
82 | 82 | rg_log("Start! cop=[$cop] op=$op subop=$subop subsubop=$subsubop" | rg_log("Start! cop=[$cop] op=$op subop=$subop subsubop=$subsubop" |
83 | 83 | . " doit=$doit sid=$sid rr: " . rg_array2string($rr)); | . " doit=$doit sid=$sid rr: " . rg_array2string($rr)); |
84 | 84 | rg_log("paras: " . implode("|", $paras)); | rg_log("paras: " . implode("|", $paras)); |
85 | rg_log("DEBUG: locale: " . setlocale(LC_ALL, 0)); | ||
86 | 85 | ||
87 | 86 | ||
88 | 87 | // database connection | // database connection |
... | ... | $more['HTML:rg_theme_url'] = $THEME_URL; | |
153 | 152 | $more['HTML:rg_body'] = $body; | $more['HTML:rg_body'] = $body; |
154 | 153 | echo rg_template("index.html", $more); | echo rg_template("index.html", $more); |
155 | 154 | ||
155 | rg_log("DONE!"); | ||
156 | 156 | rg_prof_log("rg_log"); | rg_prof_log("rg_log"); |
157 | 157 | ?> | ?> |
File root/themes/default/hints/repo/anon_push.html changed (mode: 100644) (index 728084b..111ce60) | |||
... | ... | merge request:<br /> | |
4 | 4 | <code> | <code> |
5 | 5 | ... clone the repository ...<br /> | ... clone the repository ...<br /> |
6 | 6 | ... make some changes and some commits ...<br /> | ... make some changes and some commits ...<br /> |
7 | git push | ||
7 | git push<br /> | ||
8 | 8 | </code> | </code> |
File root/themes/default/hints/repo/clone_git.html changed (mode: 100644) (index 64b7498..c8e45d5) | |||
1 | 1 | Clone this repository using git:<br /> | Clone this repository using git:<br /> |
2 | 2 | <code> | <code> |
3 | 3 | git clone @@git@@ local_dir<br /> | git clone @@git@@ local_dir<br /> |
4 | cd local_dir | ||
4 | cd local_dir<br /> | ||
5 | 5 | </code> | </code> |
File root/themes/default/hints/repo/clone_ssh.html changed (mode: 100644) (index 5b80b64..fd24385) | |||
1 | 1 | Clone this repository using ssh (do not forget to upload a key):<br /> | Clone this repository using ssh (do not forget to upload a key):<br /> |
2 | 2 | <code> | <code> |
3 | 3 | git clone @@ssh@@ local_dir<br /> | git clone @@ssh@@ local_dir<br /> |
4 | cd local_dir | ||
4 | cd local_dir<br /> | ||
5 | 5 | </code> | </code> |
File root/themes/default/hints/repo/merge.html changed (mode: 100644) (index 61535f8..2ecc06b) | |||
1 | 1 | How to merge?<br /> | How to merge?<br /> |
2 | 2 | ||
3 | 3 | <code> | <code> |
4 | git fetch @@url@@ refs/mr/rg_xxxxxxxx | ||
5 | git merge ??? | ||
4 | git fetch @@url@@ refs/mr/rg_xxxxxxxx<br /> | ||
5 | git merge ???<br /> | ||
6 | 6 | </code> | </code> |
7 | 7 | <br /> | <br /> |
8 | 8 | ||
9 | 9 | How to "see" all merge requests as branches:<br /> | How to "see" all merge requests as branches:<br /> |
10 | 10 | Add, in config file, under the remote you want, a line like this:<br /> | Add, in config file, under the remote you want, a line like this:<br /> |
11 | 11 | <code> | <code> |
12 | fetch = +refs/namespaces/*:refs/remotes/your_remote_name_for_example_origin/mr/* | ||
12 | fetch = +refs/namespaces/*:refs/remotes/your_remote_name_for_example_origin/mr/*<br /> | ||
13 | 13 | </code> | </code> |
14 | 14 | After you run a git fetch, you will have all the merge requests localy.<br /> | After you run a git fetch, you will have all the merge requests localy.<br /> |
15 | 15 | You can do ??? | You can do ??? |
File root/themes/default/hints/repo/remote_add.html added (mode: 100644) (index 0000000..46ffbaf) | |||
1 | You have the project locally, but not in a Git repository:<br /> | ||
2 | <code> | ||
3 | cd local_dir<br /> | ||
4 | git init<br /> | ||
5 | git remote add origin @@ssh@@<br /> | ||
6 | git push origin master<br /> | ||
7 | </code> | ||
8 | <br /> | ||
9 | |||
10 | If you are switching from another Git hosting provider:<br /> | ||
11 | <code> | ||
12 | cd local_dir<br /> | ||
13 | git remote change origin @@ssh@@<br /> | ||
14 | git push origin master<br /> | ||
15 | </code> |
File root/themes/default/index.html changed (mode: 100644) (index a8d2c8d..e393d90) | |||
24 | 24 | </div> | </div> |
25 | 25 | </div> <!-- header --> | </div> <!-- header --> |
26 | 26 | ||
27 | <div id="main"> | ||
27 | <div id="main_container"> | ||
28 | <div id="main"> | ||
28 | 29 | @@rg_body@@ | @@rg_body@@ |
29 | </div> <!-- main --> | ||
30 | </div> <!-- main --> | ||
31 | </div> <!-- main_container --> | ||
30 | 32 | ||
31 | 33 | <div id="footer"> | <div id="footer"> |
32 | 34 | <div style="float: left; padding: 5px;"> | <div style="float: left; padding: 5px;"> |
File root/themes/default/repo/bug/bug_add.html changed (mode: 100644) (index c8f6f6a..b99eeaf) | |||
18 | 18 | <br /> | <br /> |
19 | 19 | <br /> | <br /> |
20 | 20 | ||
21 | <label for="state" class="form_item_title">State</label><br /> | ||
22 | @@state_select@@ | ||
23 | <br /> | ||
24 | <br /> | ||
25 | |||
21 | 26 | <label for="labels" class="form_item_title">Labels (comma or Enter separated)</label><br /> | <label for="labels" class="form_item_title">Labels (comma or Enter separated)</label><br /> |
22 | 27 | <textarea name="labels" rows="3" cols="80">@@labels@@</textarea> | <textarea name="labels" rows="3" cols="80">@@labels@@</textarea> |
23 | 28 | <br /> | <br /> |
File root/themes/default/repo/bug/bug_search.html added (mode: 100644) (index 0000000..0c67033) | |||
1 | <div class="formarea"> | ||
2 | |||
3 | <div class="formarea_title">Search bugs</div><br /> | ||
4 | |||
5 | @@bug_errmsg@@ | ||
6 | |||
7 | <form method="post" action="@@rg_action@@"> | ||
8 | <input type="hidden" name="doit" value="1" /> | ||
9 | |||
10 | <label for="reported_by" class="form_item_title">Reported by</label><br /> | ||
11 | <input type="text" name="reported_by" value="@@reported_by@@" size="30" /> | ||
12 | <br /> | ||
13 | <br /> | ||
14 | |||
15 | <label for="assigned_to" class="form_item_title">Assigned to</label><br /> | ||
16 | <input type="text" name="assigned_to" value="@@assigned_to@@" size="30" /> | ||
17 | <br /> | ||
18 | <br /> | ||
19 | |||
20 | <label for="state" class="form_item_title">State</label><br /> | ||
21 | @@state_select@@ | ||
22 | <br /> | ||
23 | <br /> | ||
24 | |||
25 | <label for="order_by" class="form_item_title">Order by</label><br /> | ||
26 | <input type="text" name="order_by" value="@@order_by@@" size="40" /> | ||
27 | <br /> | ||
28 | <br /> | ||
29 | |||
30 | <label for="start" class="form_item_title">Start date (yyyy-mm-dd)</label><br /> | ||
31 | <input type="text" name="start" value="@@start@@" size="10" /> | ||
32 | <br /> | ||
33 | <br /> | ||
34 | |||
35 | <label for="end" class="form_item_title">End date (yyyy-mm-dd)</label><br /> | ||
36 | <input type="text" name="end" value="@@end@@" size="10" /> | ||
37 | <br /> | ||
38 | <br /> | ||
39 | |||
40 | <label for="title_string" class="form_item_title">Title contains</label><br /> | ||
41 | <input type="text" name="title_string" value="@@title_string@@" size="40" /> | ||
42 | <br /> | ||
43 | <br /> | ||
44 | |||
45 | <label for="body_string" class="form_item_title">Body contains</label><br /> | ||
46 | <input type="text" name="body_string" value="@@body_string@@" size="40" /> | ||
47 | <br /> | ||
48 | <br /> | ||
49 | |||
50 | <label for="bugs_per_page" class="form_item_title">Bugs per page</label><br /> | ||
51 | <input type="text" name="bugs_per_page" value="@@bugs_per_page@@" size="40" /> | ||
52 | <br /> | ||
53 | <br /> | ||
54 | |||
55 | @@if(@@can_save@@){{ | ||
56 | <label for="global" class="form_item_title">Make this search global?</label><br /> | ||
57 | <input type="checkbox" name="global" @@if(global){{checked="checked"}}{{}} /> | ||
58 | <br /> | ||
59 | <br /> | ||
60 | |||
61 | <label for="body" class="form_item_title">Save search as</label><br /> | ||
62 | <input type="text" name="name" value="@@name@@" size="40" /> | ||
63 | <br /> | ||
64 | <br /> | ||
65 | }}{{}} | ||
66 | |||
67 | <input type="submit" name="button" value="Search" /> | ||
68 | |||
69 | </form> | ||
70 | </div> |
File root/themes/default/repo/bug/list_labels/footer.html changed (mode: 100644) (index 8902b2e..a9b0151) | |||
1 | 1 | </ul> | </ul> |
2 | 2 | </div> | </div> |
3 | <br /> |
File root/themes/default/repo/bug/list_note/between.html added (mode: 100644) (index 0000000..cc35a8a) | |||
1 | <div style="height: 5px;"> | ||
2 | </div> |
File root/themes/default/repo/bug/list_note/footer.html changed (mode: 100644) (index 000ca4b..04f5b84) | |||
1 | </table> | ||
1 | </div> |
File root/themes/default/repo/bug/list_note/header.html changed (mode: 100644) (index 536924a..3c19d8b) | |||
1 | <table> | ||
2 | <tr> | ||
3 | <th>Creation (UTC)</th> | ||
4 | <th>Owner</th> | ||
5 | <th>Note</th> | ||
6 | </tr> | ||
7 | |||
1 | <div class="notes"> |
File root/themes/default/repo/bug/list_note/line.html changed (mode: 100644) (index 9d1825e..ccb8ae8) | |||
1 | <tr> | ||
2 | <td>@@creation@@</td> | ||
3 | <td>@@owner@@</td> | ||
4 | <td>@@note@@</td> | ||
5 | </tr> | ||
6 | |||
1 | <div class="note"> | ||
2 | <b>@@owner@@</b> - @@creation@@ | ||
3 | <div class="note_body"> | ||
4 | @@note@@ | ||
5 | </div> | ||
6 | </div> |
File root/themes/default/repo/bug/main.html changed (mode: 100644) (index a98cf6b..320e8a7) | |||
2 | 2 | <ul> | <ul> |
3 | 3 | <li><a href="@@url_repo@@/bug">List</a></li> | <li><a href="@@url_repo@@/bug">List</a></li> |
4 | 4 | <li><a href="@@url_repo@@/bug/add">Add</a></li> | <li><a href="@@url_repo@@/bug/add">Add</a></li> |
5 | <li><a href="@@url_repo@@/bug/search">Search</a></li> | ||
5 | 6 | </ul> | </ul> |
6 | 7 | </div> | </div> |
7 | 8 |
File root/themes/default/repo/bug/not_found.html added (mode: 100644) (index 0000000..1d11b35) | |||
1 | <div class="warning"> | ||
2 | Bug <b>@@bug_id@@</b> not found. | ||
3 | </div> |
File root/themes/default/repo/bug/search/list/footer.html copied from file root/themes/default/repo/urls/footer.html (similarity 100%) |
File root/themes/default/repo/bug/search/list/header.html added (mode: 100644) (index 0000000..13457c1) | |||
1 | <div class="searches"> | ||
2 | <ul> |
File root/themes/default/repo/bug/search/list/line.html added (mode: 100644) (index 0000000..40decf0) | |||
1 | <li>@@name@@</li> |
File root/themes/default/repo/bug/search/list/nodata.html copied from file root/themes/default/errmsg/nodata.html (similarity 100%) |
File root/themes/default/repo/bug/search/remove.html added (mode: 100644) (index 0000000..b032b77) | |||
1 | @@search_remove_errmsg@@ | ||
2 | |||
3 | <form method="post" action="@@rg_action@@"> | ||
4 | <input type="hidden" name="remove" value="1" /> | ||
5 | <input type="hidden" name="token" value="@@rg_form_token@@" /> | ||
6 | <input type="hidden" name="name" value="@@search_name@@" /> | ||
7 | |||
8 | <input type="submit" name="button" value="Remove [@@search_name@@]" /> | ||
9 | </form> |
File root/themes/default/repo/bug/show.html changed (mode: 100644) (index 1691b9e..cc276f2) | |||
11 | 11 | </div> | </div> |
12 | 12 | ||
13 | 13 | @@labels@@ | @@labels@@ |
14 | |||
14 | 15 | @@notes@@ | @@notes@@ |
15 | 16 | ||
16 | 17 | @@note_add@@ | @@note_add@@ |
File root/themes/try3/main.css changed (mode: 100644) (index dfd903b..1d15b50) | |||
... | ... | body { | |
7 | 7 | font-family: helvetica, sans-serif; | font-family: helvetica, sans-serif; |
8 | 8 | font-size: 10pt; | font-size: 10pt; |
9 | 9 | line-height: 105%; | line-height: 105%; |
10 | background-color: #FFFF99; | ||
10 | background-color: #FFFFBB; | ||
11 | 11 | } | } |
12 | 12 | ||
13 | 13 | table { | table { |
... | ... | code { | |
32 | 32 | font-weight: bold; | font-weight: bold; |
33 | 33 | } | } |
34 | 34 | ||
35 | form input, form textarea { | ||
35 | form input, form textarea, form select, form option { | ||
36 | 36 | border: 1px solid #CCCCCC; | border: 1px solid #CCCCCC; |
37 | font-size: 11pt; | ||
38 | padding: 5px; | ||
37 | font-size: 10pt; | ||
38 | padding: 2px; | ||
39 | margin: 2px; | ||
39 | 40 | } | } |
40 | 41 | form input[type="submit"] { font-weight: bold; } | form input[type="submit"] { font-weight: bold; } |
41 | 42 | ||
... | ... | form input[type="submit"] { font-weight: bold; } | |
77 | 78 | border-bottom: 1px solid #CCCCCC; | border-bottom: 1px solid #CCCCCC; |
78 | 79 | } | } |
79 | 80 | ||
81 | #main_container { | ||
82 | min-height: 400px; | ||
83 | background-color: #EEEEEE; | ||
84 | width: 100%; | ||
85 | } | ||
86 | |||
80 | 87 | #main { | #main { |
81 | 88 | padding-top: 10px; | padding-top: 10px; |
82 | 89 | padding-left: 25px; | padding-left: 25px; |
83 | padding-bottom: 10px; | ||
84 | 90 | padding-right: 25px; | padding-right: 25px; |
85 | min-height: 400px; | ||
91 | padding-bottom: 10px; | ||
86 | 92 | line-height: 120%; | line-height: 120%; |
87 | background-color: #EEEEEE; | ||
88 | width: 100%; | ||
89 | 93 | } | } |
90 | 94 | ||
91 | 95 | #footer { | #footer { |
... | ... | form input[type="submit"] { font-weight: bold; } | |
96 | 100 | } | } |
97 | 101 | ||
98 | 102 | .formarea { | .formarea { |
103 | margin-top: 10px; | ||
99 | 104 | border: 1px solid #CCCCCC; | border: 1px solid #CCCCCC; |
100 | 105 | padding: 5px; | padding: 5px; |
101 | 106 | border-radius: 4px 4px 4px 4px; | border-radius: 4px 4px 4px 4px; |
... | ... | label { | |
159 | 164 | .submenu { | .submenu { |
160 | 165 | border: 1px solid #CCCCCC; | border: 1px solid #CCCCCC; |
161 | 166 | border-bottom: 1px solid #CCCCCC; | border-bottom: 1px solid #CCCCCC; |
162 | background-color: #FFFF99; | ||
167 | background-color: #FFFFBB; | ||
163 | 168 | margin-bottom: 3px; | margin-bottom: 3px; |
164 | 169 | display: table; | display: table; |
165 | 170 | } | } |
... | ... | label { | |
221 | 226 | background-color: #a0d0ff; | background-color: #a0d0ff; |
222 | 227 | } | } |
223 | 228 | ||
229 | .searches { padding: 3px 0px; margin: 3px 0px; } | ||
230 | .searches ul { list-style-type: none; } | ||
231 | .searches ul li { | ||
232 | display: inline; | ||
233 | padding: 3px 3px; | ||
234 | text-decoration: none; | ||
235 | color: black; | ||
236 | border: 1px solid #cccccc; | ||
237 | border-radius: 4px 4px 4px 4px; | ||
238 | font-size: 9pt; | ||
239 | background-color: #a0d0ff; | ||
240 | } | ||
241 | .searches ul li a { | ||
242 | text-decoration: none; | ||
243 | } | ||
244 | |||
224 | 245 | .hints { | .hints { |
225 | 246 | margin-top: 5px; | margin-top: 5px; |
226 | 247 | background-color: #A0FFA0; | background-color: #A0FFA0; |
... | ... | label { | |
237 | 258 | ||
238 | 259 | ||
239 | 260 | .bug { | .bug { |
240 | margin-top: 5px; | ||
261 | margin-top: 10px; | ||
241 | 262 | } | } |
242 | 263 | .bug_body { | .bug_body { |
243 | margin-left: 5px; | ||
264 | margin-top: 3px; | ||
244 | 265 | background-color: #A0FFA0; | background-color: #A0FFA0; |
245 | 266 | padding: 5px; | padding: 5px; |
246 | 267 | border-radius: 4px 4px 4px 4px; | border-radius: 4px 4px 4px 4px; |
... | ... | label { | |
249 | 270 | display: table; | display: table; |
250 | 271 | } | } |
251 | 272 | ||
273 | .notes { | ||
274 | margin-top: 10px; | ||
275 | display: table; | ||
276 | } | ||
277 | |||
278 | .note { | ||
279 | border: 1px solid #cccccc; | ||
280 | padding: 3px; | ||
281 | background-color: #DDDDDD; | ||
282 | } | ||
283 | .note_body { | ||
284 | padding: 3px; | ||
285 | background-color: #EEEEEE; | ||
286 | margin-top: 3px; | ||
287 | } | ||
288 | |||
289 | .warning { | ||
290 | margin-top: 10px; | ||
291 | background-color: #FFAAAA; | ||
292 | padding: 5px; | ||
293 | border: 1px solid #CCCCCC; | ||
294 | display: table; | ||
295 | } | ||
296 | |||
297 | .button { | ||
298 | background: -moz-linear-gradient(center top , #A0FFA0 0px, #A0FFA0 100%) repeat scroll 0 0 padding-box transparent; | ||
299 | border: 1px solid #CCCCCC; | ||
300 | border-radius: 4px 4px 4px 4px; | ||
301 | box-shadow: 0 2px 2px #90FF90 inset; | ||
302 | color: #90DD90; | ||
303 | display: inline-block; | ||
304 | font-weight: bold; | ||
305 | text-decoration: none; | ||
306 | text-shadow: 0 1px 1px #000000; | ||
307 | |||
308 | font-size: 24px; | ||
309 | padding: 8px; | ||
310 | } |
File samples/config.php changed (mode: 100644) (index 733af1a..fc06ed2) | |||
5 | 5 | $rg_base = "/home/rocketgit"; | $rg_base = "/home/rocketgit"; |
6 | 6 | ||
7 | 7 | // Database | // Database |
8 | $rg_sql = "host=localhost user=rocketgit dbname=rocketgit"; | ||
8 | $rg_sql = "host=localhost user=rocketgit dbname=rocketgit application_name=rocketgit"; | ||
9 | 9 | $rg_sql_debug = 1; | $rg_sql_debug = 1; |
10 | 10 | ||
11 | 11 | // Session | // Session |
File tests/bug.php changed (mode: 100644) (index cb7de83..d92ca6d) | |||
... | ... | if ($r === FALSE) { | |
49 | 49 | } | } |
50 | 50 | ||
51 | 51 | $r = rg_bug_info($db, $repo_id, $bug_id); | $r = rg_bug_info($db, $repo_id, $bug_id); |
52 | if ($r['exists'] != 1) { | ||
52 | if ($r === FALSE) { | ||
53 | 53 | rg_log("Cannot lookup a bug (" . rg_bug_error() . ")!"); | rg_log("Cannot lookup a bug (" . rg_bug_error() . ")!"); |
54 | 54 | exit(1); | exit(1); |
55 | 55 | } | } |
56 | if ($r['exists'] != 1) { | ||
57 | rg_log("Seems the bug does not exists!"); | ||
58 | exit(1); | ||
59 | } | ||
56 | 60 | ||
57 | 61 | // test a non existing bug | // test a non existing bug |
58 | 62 | $r = rg_bug_info($db, $repo_id, 0); | $r = rg_bug_info($db, $repo_id, 0); |
63 | if ($r === FALSE) { | ||
64 | rg_log("Cannot lookup a bug (" . rg_bug_error() . ")!"); | ||
65 | exit(1); | ||
66 | } | ||
59 | 67 | if ($r['exists'] != 0) { | if ($r['exists'] != 0) { |
60 | 68 | rg_log("Wrong bug number (0) returned valid data!"); | rg_log("Wrong bug number (0) returned valid data!"); |
61 | 69 | exit(1); | exit(1); |