List of commits:
Subject Hash Author Date (UTC)
Add 'watch' button for user; corrected 'watch' bugs 73ca78916920d60c12725c709d136e80238aa1eb Catalin(ux) M. BOIE 2015-12-07 19:49:48
TODO updates, log last webhook output 24895c5ccb8c47315bd6897f2a60f9c8c3b3d6b1 Catalin(ux) M. BOIE 2015-12-06 17:04:56
keys: add some caching and prevent updating first_use if not necessary 35a152bc27fb1791f3f9d8ad1287c3847ed334a1 Catalin(ux) M. BOIE 2015-12-05 17:21:19
Deal correctly with cache regarding last_bug_id 705351cdea6af55f9dd61de0d85d41b8ac33fc88 Catalin(ux) M. BOIE 2015-12-03 21:01:08
Settle to Affero GPLv3+ 679d4032059256a01610e65cbff5496d32d9fc7d Catalin(ux) M. BOIE 2015-12-03 19:40:12
Missing Affero dee2c08fc8a0371ac37f6f00bf7f3e2e01f92e92 Catalin(ux) M. BOIE 2015-12-03 19:36:10
DO not show 2fa hint for a visiting user 4ff8837ef0f45572592f1d81724737b3732a046a Catalin(ux) M. BOIE 2015-12-03 17:25:24
Let the user choose the e-mail, no defaults should be suggested 09450741613a407c09bb465bff8a3c19c565df9a Catalin(ux) M. BOIE 2015-12-02 18:12:08
Pass uid for all events; more fixes for unit tests 866e43baf739ae7072949559d1c7e089c086af76 Catalin(ux) M. BOIE 2015-11-19 19:28:26
404 http error was receive for showing blobs ending in .php or .html ff87d956360a86e88a751d4c391585c84bb1e132 Catalin(ux) M. BOIE 2015-11-18 20:32:50
When creating an array, last_bug_id is set now correctly f679840c7ac3879aae69f488c561a5bd73ce71f1 Catalin(ux) M. BOIE 2015-11-18 19:14:48
We allow empty description for bugs c5a1b4057963eac575cc3d0d4872c4519fea80b0 Catalin(ux) M. BOIE 2015-11-18 18:26:39
Show the repo # on main repo page c72f4d8627ab577a92c5531ed7afb9e55a6bfd1b Catalin(ux) M. BOIE 2015-11-18 18:25:00
Bumped version to 0.42 8e9fab68ff08040402c0aa25539d1e8b29258f7d Catalin(ux) M. BOIE 2015-11-18 18:14:40
Renamed the virtual machines files 040c9f3a87826a52713b3b5f48d19c83236f8aa8 Catalin(ux) M. BOIE 2015-11-18 18:13:57
Admin user must not confirm the account by e-mail 0a81a2824087d9dcd2d1981c860946fd49cc8bf7 Catalin(ux) M. BOIE 2015-11-18 18:04:26
Bump the version to 0.41 363368555480d4c79c13867805c59541fd59e37c Catalin(ux) M. BOIE 2015-11-18 16:37:16
Mostly debug signaling by cache 2cd13a1f01403ebe733ef64ff2446b93e2cd46af Catalin(ux) M. BOIE 2015-11-18 16:36:40
Only texts changes. 37b6e035a5027c99a8b21672cef5431673320892 Catalin(ux) M. BOIE 2015-11-17 17:58:52
webhooks fixes 422d74f1cd4133e73ceb3edbb7a7da6d48c102f2 Catalin(ux) M. BOIE 2015-11-17 15:53:10
Commit 73ca78916920d60c12725c709d136e80238aa1eb - Add 'watch' button for user; corrected 'watch' bugs
Author: Catalin(ux) M. BOIE
Author date (UTC): 2015-12-07 19:49
Committer name: Catalin(ux) M. BOIE
Committer date (UTC): 2015-12-07 19:49
Parent(s): 24895c5ccb8c47315bd6897f2a60f9c8c3b3d6b1
Signer:
Signing key:
Signing status: N
Tree: bea0e0a67a3cda8a85819ff8ca79ae220dcec865
File Lines added Lines deleted
inc/struct.inc.php 9 2
inc/user/home-page.php 3 0
inc/user/repo-page.php 4 1
inc/user/repo/bug/show/show.php 2 49
inc/watch.inc.php 151 31
root/themes/default/repo/main.html 1 0
root/themes/default/user/home.html 2 0
root/themes/default/watch.html 6 0
File inc/struct.inc.php changed (mode: 100644) (index 8eeffec..cf54505)
... ... $rg_sql_struct[35]['other'] = array(
482 482 "ALTER TABLE webhooks ADD opaque TEXT NOT NULL DEFAULT ''" "ALTER TABLE webhooks ADD opaque TEXT NOT NULL DEFAULT ''"
483 483 ); );
484 484
485 $rg_sql_struct[36]['tables'] = array();
485 $rg_sql_struct[36]['tables'] = array(
486 'watch_user' => "CREATE TABLE watch_user ("
487 . "uid INT NOT NULL"
488 . ", watch_uid INT NOT NULL)"
489 );
486 490 $rg_sql_struct[36]['other'] = array( $rg_sql_struct[36]['other'] = array(
487 491 'users drop double unique constriaint' => 'users drop double unique constriaint' =>
488 492 "ALTER TABLE users DROP CONSTRAINT users_username_key", "ALTER TABLE users DROP CONSTRAINT users_username_key",
489 493 'last_cmd' => 'last_cmd' =>
490 494 "ALTER TABLE keys ADD last_cmd TEXT NOT NULL DEFAULT ''", "ALTER TABLE keys ADD last_cmd TEXT NOT NULL DEFAULT ''",
491 495 'wh_last_output' => 'wh_last_output' =>
492 "ALTER TABLE webhooks ADD last_output TEXT NOT NULL DEFAULT ''"
496 "ALTER TABLE webhooks ADD last_output TEXT NOT NULL DEFAULT ''",
497 'watch_repo_i_uid' => "CREATE INDEX watch_repo_i_uid on watch_repo(uid)",
498 'watch_bug_i_uid' => "CREATE INDEX watch_bug_i_uid on watch_repo(uid)",
499 'watch_user_i_uid' => "CREATE INDEX watch_user_i_uid on watch_repo(uid)"
493 500 ); );
494 501
495 502 // This must be the last line // This must be the last line
File inc/user/home-page.php changed (mode: 100644) (index 42227f8..46b79cb)
... ... if ($rg['page_ui']['exists'] == 0) {
9 9 return; return;
10 10 } }
11 11
12 rg_watch_hl_process($db, $rg, 'user', $rg['page_ui']['uid'],
13 0, $rg['page_ui']['homepage']);
14
12 15 $_home .= rg_template('user/home.html', $rg, TRUE /*xss*/); $_home .= rg_template('user/home.html', $rg, TRUE /*xss*/);
13 16
14 17
File inc/user/repo-page.php changed (mode: 100644) (index e7f2d16..f61f99a)
... ... if (strcmp($_subop, "history") == 0) {
289 289 } }
290 290 } }
291 291
292 rg_watch_hl_process($db, $rg, 'repo', $rg['ri']['repo_id'], 0, $rg['url_repo']);
293
292 294 $rg['per_repo_menu'][$_subop] = 1; $rg['per_repo_menu'][$_subop] = 1;
293 295 $rg['HTML:repo_body'] = $_repo_body; $rg['HTML:repo_body'] = $_repo_body;
294 $_repo_page = rg_template("repo/main.html", $rg, TRUE /* xss */);
296 $_repo_page = rg_template("repo/main.html", $rg, TRUE /*xss*/);
297
295 298 ?> ?>
File inc/user/repo/bug/show/show.php changed (mode: 100644) (index 29082f0..3c24355)
... ... else
118 118
119 119
120 120 // watch // watch
121 $watch_error = '';
122 $watch = rg_watch_load($db, "bug", $rg['login_ui']['uid'], $rg['ri']['repo_id'],
123 $rg['bug']['bug_id']);
124 if ($watch === FALSE) {
125 $watch_error = rg_warning("Internal error.");
126 } else {
127 while (1) {
128 if (rg_var_uint('watch_doit') != 1)
129 break;
130
131 if (rg_var_uint('watch') == $watch) {
132 rg_log('Already in proper state');
133 break;
134 }
135
136 if (!rg_valid_referer()) {
137 $watch_error = rg_warning('Invalid referer; try again', $rg);
138 break;
139 }
140
141 if (!rg_token_valid($db, $rg, 'bug_watch', FALSE)) {
142 $watch_error = rg_warning('Invalid token. Try again.', $rg);
143 break;
144 }
145
146 if (rg_var_uint('watch') == 1)
147 $r = rg_watch_add($db, 'bug', $rg['login_ui']['uid'],
148 $rg['ri']['repo_id'], $rg['bug']['bug_id']);
149 else
150 $r = rg_watch_del($db, 'bug', $rg['login_ui']['uid'],
151 $rg['ri']['repo_id'], $rg['bug']['bug_id']);
152 if ($r === FALSE) {
153 $watch_error = rg_warning('Internal error. Try again', $rg);
154 break;
155 }
156
157 $watch = 1 - $watch;
158
159 break;
160 }
161
162 $rg['rg_form_token_tag'] = 'bug_watch';
163 $rg['rg_form_token'] = rg_token_get($db, $rg, 'bug_watch');
164 $rg['bug']['watch'] = 1 - $watch;
165 $rg['HTML:watch_form'] = rg_template('repo/bug/b_watch.html',
166 $rg, TRUE /*xss*/);
167 }
168 if (!empty($delete_error))
169 $rg['HTML:watch_error'] = $delete_error;
121 rg_watch_hl_process($db, $rg, 'bug', $rg['ri']['repo_id'],
122 $rg['bug']['bug_id'], $rg['url_repo']);
170 123
171 124
172 125 // delete/undelete // delete/undelete
File inc/watch.inc.php changed (mode: 100644) (index 3817a05..1f0d9d4)
... ... function rg_watch_set_error($str)
11 11 { {
12 12 global $rg_watch_error; global $rg_watch_error;
13 13 $rg_watch_error = $str; $rg_watch_error = $str;
14 rg_log($str);
14 rg_log('Set error to ' . $str);
15 15 } }
16 16
17 17 function rg_watch_error() function rg_watch_error()
 
... ... function rg_watch_error()
24 24 /* /*
25 25 * Returns a watched entry * Returns a watched entry
26 26 */ */
27 $rg_watch_load_cache = array();
28 27 function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2) function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2)
29 28 { {
30 global $rg_watch_load_cache;
31
32 $key = $type . "-" . $uid . "-" . $obj_id1 . "-" . $obj_id2;
33 if (isset($rg_watch_load_cache[$key]))
34 return $rg_watch_load_cache[$key];
35
36 29 rg_prof_start("watch_load"); rg_prof_start("watch_load");
37 30 rg_log_enter("watch_load: type=$type uid=$uid obj_id=$obj_id1/$obj_id2"); rg_log_enter("watch_load: type=$type uid=$uid obj_id=$obj_id1/$obj_id2");
38 31
39 32 $ret = FALSE; $ret = FALSE;
40 33 while (1) { while (1) {
41 $params = array("uid" => $uid,
42 "obj_id1" => $obj_id1,
43 "obj_id2" => $obj_id2);
34 $key = 'watch' . '::' . $type . '::' . $uid
35 . '::' . $obj_id1 . '::' . $obj_id2;
36 $c = rg_cache_get($key);
37 if ($c !== FALSE) {
38 rg_log('DEBUG: c=' . $c . '.');
39 $ret = $c;
40 break;
41 }
42
43 $params = array(
44 'uid' => $uid,
45 'obj_id1' => $obj_id1,
46 'obj_id2' => $obj_id2);
44 47 if (strcmp($type, "bug") == 0) { if (strcmp($type, "bug") == 0) {
45 48 $sql = "SELECT 1 FROM watch_bug" $sql = "SELECT 1 FROM watch_bug"
46 49 . " WHERE uid = @@uid@@" . " WHERE uid = @@uid@@"
 
... ... function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2)
50 53 $sql = "SELECT 1 FROM watch_repo" $sql = "SELECT 1 FROM watch_repo"
51 54 . " WHERE uid = @@uid@@" . " WHERE uid = @@uid@@"
52 55 . " AND repo_id = @@obj_id1@@"; . " AND repo_id = @@obj_id1@@";
56 } else if (strcmp($type, "user") == 0) {
57 $sql = "SELECT 1 FROM watch_user"
58 . " WHERE uid = @@uid@@"
59 . " AND watch_uid = @@obj_id1@@";
53 60 } else { } else {
54 61 rg_internal_error("Invalid watch type!"); rg_internal_error("Invalid watch type!");
55 62 break; break;
56 63 } }
57 64 $res = rg_sql_query_params($db, $sql, $params); $res = rg_sql_query_params($db, $sql, $params);
58 if ($res === FALSE)
65 if ($res === FALSE) {
66 rg_watch_set_error('cannot get data from db');
59 67 break; break;
68 }
60 69
61 70 $rows = rg_sql_num_rows($res); $rows = rg_sql_num_rows($res);
62 71 rg_sql_free_result($res); rg_sql_free_result($res);
63 72
64 73 $ret = $rows > 0 ? 1 : 0; $ret = $rows > 0 ? 1 : 0;
65 $rg_watch_load_cache[$key] = $ret;
74
75 rg_cache_set($key, $ret, RG_SOCKET_NO_WAIT);
66 76 break; break;
67 77 } }
68 78
 
... ... function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2)
74 84 /* /*
75 85 * Add somebody to the watch list * Add somebody to the watch list
76 86 */ */
77 $rg_watch_add_state = array();
78 function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2)
87 function rg_watch_add($db, $type, $login_uid, $obj_id1, $obj_id2)
79 88 { {
80 89 global $rg_watch_add_state; global $rg_watch_add_state;
81 90
82 // If watch already added, skip.
83 $key = $type . "-" . $uid . "-" . $obj_id1 . "-" . $obj_id2;
84 if (isset($rg_watch_add_state[$key]))
85 return $rg_watch_add_state[$key];
86
87 91 rg_prof_start("watch_add"); rg_prof_start("watch_add");
88 rg_log_enter("watch_add type=$type, uid=$uid obj_id=$obj_id1/$obj_id2");
92 rg_log_enter("watch_add type=$type, login_uid=$login_uid"
93 . " obj_id=$obj_id1/$obj_id2");
89 94
90 95 $ret = FALSE; $ret = FALSE;
91 96 while (1) { while (1) {
92 $r = rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2);
97 $r = rg_watch_load($db, $type, $login_uid, $obj_id1, $obj_id2);
93 98 if ($r === FALSE) if ($r === FALSE)
94 99 break; break;
95 100 if ($r === 1) { // already in watch list if ($r === 1) { // already in watch list
 
... ... function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2)
97 102 break; break;
98 103 } }
99 104
100 $params = array("uid" => $uid,
105 $params = array("uid" => $login_uid,
101 106 "obj_id1" => $obj_id1, "obj_id1" => $obj_id1,
102 107 "obj_id2" => $obj_id2); "obj_id2" => $obj_id2);
103 108
 
... ... function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2)
107 112 } else if (strcmp($type, "repo") == 0) { } else if (strcmp($type, "repo") == 0) {
108 113 $sql = "INSERT INTO watch_repo (uid, repo_id)" $sql = "INSERT INTO watch_repo (uid, repo_id)"
109 114 . " VALUES (@@uid@@, @@obj_id1@@)"; . " VALUES (@@uid@@, @@obj_id1@@)";
115 } else if (strcmp($type, "user") == 0) {
116 $sql = "INSERT INTO watch_user (uid, watch_uid)"
117 . " VALUES (@@uid@@, @@obj_id1@@)";
110 118 } else { } else {
111 119 rg_internal_error("Invalid watch type!"); rg_internal_error("Invalid watch type!");
112 120 break; break;
113 121 } }
114 122 $res = rg_sql_query_params($db, $sql, $params); $res = rg_sql_query_params($db, $sql, $params);
115 if ($res === FALSE)
123 if ($res === FALSE) {
124 rg_watch_set_error('cannot insert data in db');
116 125 break; break;
126 }
117 127 rg_sql_free_result($res); rg_sql_free_result($res);
118 128
129 $key = 'watch' . '::' . $type . '::' . $login_uid
130 . '::' . $obj_id1 . '::' . $obj_id2;
131 rg_cache_set($key, 1, RG_SOCKET_NO_WAIT);
132
119 133 $ret = TRUE; $ret = TRUE;
120 134 break; break;
121 135 } }
122 136
123 $rg_watch_add_state[$key] = $ret;
124
125 137 rg_log_exit(); rg_log_exit();
126 138 rg_prof_end("watch_add"); rg_prof_end("watch_add");
127 139 return $ret; return $ret;
 
... ... function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2)
133 145 function rg_watch_del($db, $type, $login_uid, $obj_id1, $obj_id2) function rg_watch_del($db, $type, $login_uid, $obj_id1, $obj_id2)
134 146 { {
135 147 rg_prof_start("watch_del"); rg_prof_start("watch_del");
136 rg_log_enter("watch_del type=$type, login_uid=$login_uid obj_id=$obj_id1/$obj_id2");
148 rg_log_enter("watch_del type=$type, login_uid=$login_uid"
149 . " obj_id=$obj_id1/$obj_id2");
137 150
138 151 $ret = FALSE; $ret = FALSE;
139 152 while (1) { while (1) {
153 $r = rg_watch_load($db, $type, $login_uid, $obj_id1, $obj_id2);
154 if ($r === FALSE)
155 break;
156 if ($r === 0) { // already deleted
157 rg_log('DEBUG: watch not active, nothing to do');
158 $ret = TRUE;
159 break;
160 }
161
140 162 $params = array("login_uid" => $login_uid, $params = array("login_uid" => $login_uid,
141 163 "obj_id1" => $obj_id1, "obj_id1" => $obj_id1,
142 164 "obj_id2" => $obj_id2); "obj_id2" => $obj_id2);
 
... ... function rg_watch_del($db, $type, $login_uid, $obj_id1, $obj_id2)
150 172 $sql = "DELETE FROM watch_repo" $sql = "DELETE FROM watch_repo"
151 173 . " WHERE uid = @@login_uid@@" . " WHERE uid = @@login_uid@@"
152 174 . " AND repo_id = @@obj_id1@@"; . " AND repo_id = @@obj_id1@@";
175 } else if (strcmp($type, "user") == 0) {
176 $sql = "DELETE FROM watch_user"
177 . " WHERE uid = @@login_uid@@"
178 . " AND watch_uid = @@obj_id1@@";
153 179 } else { } else {
154 180 rg_internal_error("Invalid watch type!"); rg_internal_error("Invalid watch type!");
155 181 break; break;
156 182 } }
157 183 $res = rg_sql_query_params($db, $sql, $params); $res = rg_sql_query_params($db, $sql, $params);
158 if ($res === FALSE)
184 if ($res === FALSE) {
185 rg_watch_set_error('cannot delete data from db');
159 186 break; break;
187 }
160 188 rg_sql_free_result($res); rg_sql_free_result($res);
161 189
190 $key = 'watch' . '::' . $type . '::' . $login_uid
191 . '::' . $obj_id1 . '::' . $obj_id2;
192 rg_cache_unset($key, RG_SOCKET_NO_WAIT);
193
162 194 $ret = TRUE; $ret = TRUE;
163 195 break; break;
164 196 } }
 
... ... function rg_watch_load_by_obj_id($db, $type, $obj_id1, $obj_id2)
188 220 } else if (strcmp($type, "repo") == 0) { } else if (strcmp($type, "repo") == 0) {
189 221 $sql = "SELECT uid FROM watch_repo" $sql = "SELECT uid FROM watch_repo"
190 222 . " WHERE repo_id = @@obj_id1@@"; . " WHERE repo_id = @@obj_id1@@";
223 } else if (strcmp($type, "user") == 0) {
224 $sql = "SELECT uid FROM watch_user"
225 . " WHERE watch_uid = @@obj_id1@@";
191 226 } else { } else {
192 227 rg_internal_error("Invalid watch type!"); rg_internal_error("Invalid watch type!");
193 228 break; break;
194 229 } }
195 230 $res = rg_sql_query_params($db, $sql, $params); $res = rg_sql_query_params($db, $sql, $params);
196 if ($res === FALSE)
231 if ($res === FALSE) {
232 rg_watch_set_error('cannot get data from db');
197 233 break; break;
234 }
198 235
199 236 $ret = array(); $ret = array();
200 while (($row = rg_sql_fetch_array($res))) {
237 while (($row = rg_sql_fetch_array($res)))
201 238 $ret[] = $row['uid']; $ret[] = $row['uid'];
202 }
203 239 rg_sql_free_result($res); rg_sql_free_result($res);
204 240
205 241 break; break;
 
... ... function rg_watch_load_by_obj_id($db, $type, $obj_id1, $obj_id2)
210 246 return $ret; return $ret;
211 247 } }
212 248
249 /*
250 * Helper to easy dealing witch watch buttons.
251 * It show and process the presses.
252 */
253 function rg_watch_hl_process($db, &$rg, $type, $obj_id1, $obj_id2, $url)
254 {
255 rg_prof_start('watch_hl_process');
256 rg_log_enter('watch_hl_process');
257
258 $ret = FALSE;
259 $rg['HTML:watch_form'] = '';
260 $rg['HTML:watch_error'] = '';
261 while (1) {
262 // If user is not logged in, we cannot add a watch
263 if ($rg['login_ui']['uid'] == 0) {
264 $ret = TRUE;
265 break;
266 }
267
268 // The owner is already watching his repos
269 if ($rg['login_ui']['uid'] == $rg['page_ui']['uid']) {
270 $ret = TRUE;
271 break;
272 }
273
274 $watch = rg_watch_load($db, $type, $rg['login_ui']['uid'],
275 $obj_id1, $obj_id2);
276 if ($watch === FALSE)
277 break;
278
279 if (rg_var_uint('watch_doit') == 1) {
280 if (!rg_valid_referer()) {
281 rg_watch_set_error('invalid referer; try again');
282 break;
283 }
284
285 if (!rg_token_valid($db, $rg, 'watch', FALSE)) {
286 rg_watch_set_error('invalid token; try again');
287 break;
288 }
289
290 if (rg_var_uint('watch') == $watch)
291 $next_value = 1 - $watch;
292 else
293 $next_value = $watch;
294 } else {
295 $next_value = 1 - $watch;
296 }
297
298 rg_log('DEBUG: watch=' . $watch . ' next_value=' . $next_value);
299 $rg['watch'] = array(
300 'url' => $url,
301 'next_value' => $next_value);
302 $rg['rg_form_token_tag'] = 'watch';
303 $rg['rg_form_token'] = rg_token_get($db, $rg, 'watch');
304 $rg['HTML:watch_form'] = rg_template('watch.html',
305 $rg, TRUE /*xss*/);
306
307 if (rg_var_uint('watch_doit') != 1) {
308 $ret = TRUE;
309 break;
310 }
311
312 if ($watch == 0)
313 $r = rg_watch_add($db, $type, $rg['login_ui']['uid'],
314 $obj_id1, $obj_id2);
315 else
316 $r = rg_watch_del($db, $type, $rg['login_ui']['uid'],
317 $obj_id1, $obj_id2);
318 if ($r === FALSE)
319 break;
320
321 $ret = TRUE;
322 break;
323 }
324
325 if ($ret === FALSE)
326 $rg['HTML:watch_error'] = rg_warning('Watch error: ' . rg_watch_error());
327
328 rg_log_exit();
329 rg_prof_end('watch_hl_process');
330 return $ret;
331 }
332
213 333 ?> ?>
File root/themes/default/repo/main.html changed (mode: 100644) (index 6cac4ff..f5454c2)
7 7 (@@if(@@ri::public@@ == 1){{public}}{{private}}) (@@if(@@ri::public@@ == 1){{public}}{{private}})
8 8 (License: @@if("@@ri::license@@" == ""){{Unspecified}}{{@@ri::license@@}}) (License: @@if("@@ri::license@@" == ""){{Unspecified}}{{@@ri::license@@}})
9 9 (since @@ri::itime_nice@@) (since @@ri::itime_nice@@)
10 <div style="display: inline-block">@@watch_form@@ @@watch_error@@</div>
10 11 </div> </div>
11 12 <div class="repo_desc"> <div class="repo_desc">
12 13 @@ri::description_nlbr@@ @@ri::description_nlbr@@
File root/themes/default/user/home.html changed (mode: 100644) (index 1fa1929..abb028f)
1 1 <div class="main_title"> <div class="main_title">
2 2 <img src="https://www.gravatar.com/avatar/@@page_ui::email_md5@@?s=64&amp;r=g" alt="avatar" width="64" height="64" /> <img src="https://www.gravatar.com/avatar/@@page_ui::email_md5@@?s=64&amp;r=g" alt="avatar" width="64" height="64" />
3 3 Home page of user @@page_ui::username@@ (#@@page_ui::uid@@) Home page of user @@page_ui::username@@ (#@@page_ui::uid@@)
4 <div style="display: inline-block">@@watch_form@@ @@watch_error@@</div>
4 5 </div> </div>
6
File root/themes/default/watch.html added (mode: 100644) (index 0000000..74a0708)
1 <form method="post" action="@@watch::url@@">
2 <input type="hidden" name="watch_doit" value="1" />
3 <input type="hidden" name="watch" value="@@watch::next_value@@" />
4 <input type="hidden" name="token" value="@@rg_form_token@@" />
5 <input type="submit" name="button" value="@@if(@@watch::next_value@@ == 1){{Watch}}{{Unwatch}}" />
6 </form>
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/catalinux/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/catalinux/rocketgit

Clone this repository using git:
git clone git://git.rocketgit.com/user/catalinux/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main