List of commits:
Subject Hash Author Date (UTC)
Added git repo size 9828b1fe96e2217ead8863f7a7c0ee3599d16633 Catalin(ux) M. BOIE 2020-08-19 06:01:27
Change artifacts path to be able to compute correct sizes efff16c88415dfca0a4b52981b44620e52778c03 Catalin(ux) M. BOIE 2020-08-19 05:56:17
Some state was not under transaction fd51b92442fb83fc6941f94b22236f5014f0062c Catalin(ux) M. BOIE 2020-08-19 03:24:28
Added artifacts size to repos and users tables 2a8469e3416e63e9bb21ba0e412583fc69fea115 Catalin(ux) M. BOIE 2020-08-19 03:23:58
No need to invalidate last part ts because we already check 75cf0ae1721d9473bb8df780cc61f5c6247a7a6c Catalin(ux) M. BOIE 2020-08-19 03:20:19
Fixed some spaces in profiling 929b95c5d842ffe306031f2ba99d23e435855155 Catalin(ux) M. BOIE 2020-08-18 07:11:30
Added a link to tutorials in the welcome mail 2ef5795e53a26fdc1f9a2adda7bbf7a4f4ccb81f Catalin(ux) M. BOIE 2020-08-17 07:08:15
Change the mail goal bffa2a1f9a4b185916b700b3e8455bbf6f7a82bf Catalin(ux) M. BOIE 2020-08-17 06:59:35
One of the tests was not ran bb295b59daee2158c1a9c435a267d4d2377d36e9 Catalin(ux) M. BOIE 2020-08-17 06:47:52
Doc improvement 039b77222a8fb6e38be0b9a35329c13f86c890af Catalin(ux) M. BOIE 2020-08-17 06:47:27
Fixed form generation test b1ca5d96c15271fbe8a595a22227d15f917779dc Catalin(ux) M. BOIE 2020-08-17 06:46:56
Do not allow adding bugs if not logged in 32db254689f7419fcea479985bbeff5cc579f7e7 Catalin(ux) M. BOIE 2020-08-17 06:45:46
markdown format improvements bc1cc389bc851af6d0fb186bcfaf47525e235b6b Catalin(ux) M. BOIE 2020-08-17 06:45:01
Set the user's last IP also if she never logged in 556ff3e7df07863f977caac1cb25906f8c307583 Catalin(ux) M. BOIE 2020-08-17 06:44:03
Cosmetic d2a744bd020154afa13961f9d3d3da4c51853ff4 Catalin(ux) M. BOIE 2020-08-17 06:42:23
Improved nginx ssl configuration (mostly stapling) a029f78cc3f66605dd95dfcc2abc9976ee1f7076 Catalin(ux) M. BOIE 2020-08-06 05:05:49
Tutorials updates (artifacts and CI) 36ee6f7b792f32a8567c3f2f31088559ab6cd27a Catalin(ux) M. BOIE 2020-08-05 06:16:33
Added Markdown test 23455db9b6ce8a82245f06de6e3d7c7e6b706464 Catalin(ux) M. BOIE 2020-07-31 05:41:46
Some SELinux cosmetic 3bafeaa06231a67dcc66d37b50a6f5411b2bfbf9 Catalin(ux) M. BOIE 2020-07-31 05:41:28
Mostly cosmetic plus some tests 1a538fff7a4886395612471211eeca0c091e6864 Catalin(ux) M. BOIE 2020-07-31 05:41:02
Commit 9828b1fe96e2217ead8863f7a7c0ee3599d16633 - Added git repo size
Author: Catalin(ux) M. BOIE
Author date (UTC): 2020-08-19 06:01
Committer name: Catalin(ux) M. BOIE
Committer date (UTC): 2020-08-19 06:01
Parent(s): efff16c88415dfca0a4b52981b44620e52778c03
Signing key:
Tree: 6d9de606f28732eda85fadb376252728095deea8
File Lines added Lines deleted
inc/admin.inc.php 92 100
inc/struct.inc.php 4 0
inc/user.inc.php 4 0
inc/util.inc.php 126 0
root/themes/default/doc/api.html 5 1
root/themes/default/repo/stats/stats.html 3 1
scripts/cron.php 106 77
tests/helpers.inc.php 2 0
tests/util.php 41 0
File inc/admin.inc.php changed (mode: 100644) (index c0453f1..96106d2)
... ... function rg_admin_report1_suggestions($db, $from, $to)
377 377 // Total // Total
378 378 $sql = "SELECT COUNT(*) AS total FROM suggestions"; $sql = "SELECT COUNT(*) AS total FROM suggestions";
379 379 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
380 if ($res === FALSE) {
381 $total = 'ERR';
382 } else {
383 $row = rg_sql_fetch_array($res);
384 $total = $row['total'];
385 rg_sql_free_result($res);
386 }
380 if ($res === FALSE)
381 return FALSE;
382 $row = rg_sql_fetch_array($res);
383 $total = $row['total'];
384 rg_sql_free_result($res);
387 385
388 386 // Yesterday // Yesterday
389 387 $yesterday_text = ''; $yesterday_text = '';
 
... ... function rg_admin_report1_suggestions($db, $from, $to)
393 391 . " WHERE itime >= $y_start" . " WHERE itime >= $y_start"
394 392 . " AND itime <= $y_end"; . " AND itime <= $y_end";
395 393 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
396 if ($res === FALSE) {
397 $yesterday = "ERR";
398 } else {
399 $count = 0;
400 $list = '';
401 while (($row = rg_sql_fetch_array($res))) {
402 $count++;
403 $list .= sprintf("%8u %s\n",
404 $row['uid'], $row['suggestion']);
405 }
406 $yesterday = $count;
407 if ($count)
408 $yesterday_text = "\nYesterday suggestions:\n" . $list;
409 rg_sql_free_result($res);
394 if ($res === FALSE)
395 return FALSE;
396 $count = 0;
397 $list = '';
398 while (($row = rg_sql_fetch_array($res))) {
399 $count++;
400 $list .= sprintf("%8u %s\n", $row['uid'], $row['suggestion']);
410 401 } }
402 rg_sql_free_result($res);
403 $yesterday = $count;
404 if ($count)
405 $yesterday_text = "\nYesterday suggestions:\n" . $list;
411 406
412 407 $ret .= 'Total suggestions: ' . $total; $ret .= 'Total suggestions: ' . $total;
413 408 $ret .= "\nYesterday suggestions: " . $yesterday; $ret .= "\nYesterday suggestions: " . $yesterday;
 
... ... function rg_admin_report1_suggestions($db, $from, $to)
421 416 */ */
422 417 function rg_admin_report_big_repos($db) function rg_admin_report_big_repos($db)
423 418 { {
424 $ret = 'Biggest repos:' . "\n";
419 $ret = 'Biggest repos (name, owner, total, git, artifacts):' . "\n";
425 420 while (1) { while (1) {
426 $sql = 'SELECT uid, name, disk_used_mb FROM repos'
421 $sql = 'SELECT uid, name, disk_used_mb, artifacts_mb'
422 . ' FROM repos'
427 423 . ' ORDER BY disk_used_mb DESC LIMIT 20'; . ' ORDER BY disk_used_mb DESC LIMIT 20';
428 424 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
429 if ($res === FALSE) {
430 $ret .= ' ERR: ' . rg_sql_error();
431 break;
432 }
425 if ($res === FALSE)
426 return FALSE;
433 427
434 428 while (($row = rg_sql_fetch_array($res))) { while (($row = rg_sql_fetch_array($res))) {
435 429 $ui = rg_user_nice($db, $row['uid']); $ui = rg_user_nice($db, $row['uid']);
436 430 $ret .= "\t" . $row['name'] $ret .= "\t" . $row['name']
437 . "\t" . $row['disk_used_mb'] . ' MiB'
438 431 . "\t" . $ui . "\t" . $ui
432 . "\t" . $row['disk_used_mb'] . ' MiB'
433 . "\t" . $row['git_mb'] . ' MiB'
434 . "\t" . $row['artifacts_mb'] . ' MiB'
439 435 . "\n"; . "\n";
440 436 } }
441 437 rg_sql_free_result($res); rg_sql_free_result($res);
 
... ... function rg_admin_report_big_users($db)
457 453 . ' WHERE deleted = 0' . ' WHERE deleted = 0'
458 454 . ' ORDER BY disk_used_mb DESC LIMIT 20'; . ' ORDER BY disk_used_mb DESC LIMIT 20';
459 455 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
460 if ($res === FALSE) {
461 $ret .= ' ERR: ' . rg_sql_error();
462 break;
463 }
456 if ($res === FALSE)
457 return FALSE;
464 458
465 459 while (($row = rg_sql_fetch_array($res))) { while (($row = rg_sql_fetch_array($res))) {
466 460 $ret .= "\t" . $row['username'] $ret .= "\t" . $row['username']
 
... ... function rg_admin_report1($db, $rg)
530 524 . " WHERE itime >= $y_start" . " WHERE itime >= $y_start"
531 525 . " AND itime <= $y_end"; . " AND itime <= $y_end";
532 526 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
533 if ($res === FALSE) {
534 $yesterday = "ERR";
535 $g[$table]['yesterday'] = $yesterday;
536 } else {
537 $row = rg_sql_fetch_array($res);
538 $yesterday = $row['count'];
539 $total_yesterday_changes += $row['count'];
540 $g[$table]['yesterday'] = $yesterday;
541 rg_sql_free_result($res);
542 }
527 if ($res === FALSE)
528 return FALSE;
529 $row = rg_sql_fetch_array($res);
530 $yesterday = $row['count'];
531 $total_yesterday_changes += $row['count'];
532 $g[$table]['yesterday'] = $yesterday;
533 rg_sql_free_result($res);
543 534
544 535 // Total // Total
545 536 $sql = "SELECT COUNT(*) AS total FROM " . $table; $sql = "SELECT COUNT(*) AS total FROM " . $table;
546 537 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
547 if ($res === FALSE) {
548 $total = "ERR";
549 } else {
550 $row = rg_sql_fetch_array($res);
551 $total = $row['total'];
552 $g[$table]['total'] = $total;
553 rg_sql_free_result($res);
554 }
538 if ($res === FALSE)
539 return FALSE;
540 $row = rg_sql_fetch_array($res);
541 $total = $row['total'];
542 $g[$table]['total'] = $total;
543 rg_sql_free_result($res);
555 544
556 545 $body .= $yesterday . "\t\t" . $total . "\t" . $text . "\n"; $body .= $yesterday . "\t\t" . $total . "\t" . $text . "\n";
557 546 } }
 
... ... function rg_admin_report1($db, $rg)
561 550 . ' WHERE itime >= ' . $y_start . ' WHERE itime >= ' . $y_start
562 551 . ' AND itime <= ' . $y_end; . ' AND itime <= ' . $y_end;
563 552 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
564 if ($res === FALSE) {
565 $body .= ' ERR' . "\n";
566 } else {
567 $body .= "\n";
568 while (($row = rg_sql_fetch_array($res))) {
569 $body .= ' ' . $row['username']
570 . ' - ' . $row['realname']
571 . ' - ' . $row['email']
572 . ' [' . $row['last_ip'] . ']'
573 . "\n";
574 }
575 rg_sql_free_result($res);
553 if ($res === FALSE)
554 return FALSE;
555 $body .= "\n";
556 while (($row = rg_sql_fetch_array($res))) {
557 $body .= ' ' . $row['username']
558 . ' - ' . $row['realname']
559 . ' - ' . $row['email']
560 . ' [' . $row['last_ip'] . ']'
561 . "\n";
576 562 } }
563 rg_sql_free_result($res);
577 564
578 565 $body .= "\nYesterday repos:"; $body .= "\nYesterday repos:";
579 566 $sql = 'SELECT name, uid, description, public FROM repos' $sql = 'SELECT name, uid, description, public FROM repos'
580 567 . ' WHERE itime >= ' . $y_start . ' WHERE itime >= ' . $y_start
581 568 . ' AND itime <= ' . $y_end; . ' AND itime <= ' . $y_end;
582 569 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
583 if ($res === FALSE) {
584 $body .= ' ERR' . "\n";
585 } else {
586 $body .= "\n";
587 while (($row = rg_sql_fetch_array($res))) {
588 $u = rg_user_nice($db, $row['uid']);
589 $desc = mb_substr($row['description'], 0, 50) . '...';
590 $desc = preg_replace('/\s/', ' ', $desc);
591 $body .= ' ' . $row['name'] . ' - ' . $u . ' - ' . $desc
592 . ($row['public'] == 1 ? " (public)" : " (private)") . "\n";
593 }
594 rg_sql_free_result($res);
570 if ($res === FALSE)
571 return FALSE;
572 $body .= "\n";
573 while (($row = rg_sql_fetch_array($res))) {
574 $u = rg_user_nice($db, $row['uid']);
575 $desc = mb_substr($row['description'], 0, 50) . '...';
576 $desc = preg_replace('/\s/', ' ', $desc);
577 $body .= ' ' . $row['name'] . ' - ' . $u . ' - ' . $desc
578 . ($row['public'] == 1 ? " (public)" : " (private)") . "\n";
595 579 } }
580 rg_sql_free_result($res);
596 581
597 582 $sug = rg_admin_report1_suggestions($db, $y_start, $y_end); $sug = rg_admin_report1_suggestions($db, $y_start, $y_end);
583 if ($sug === FALSE)
584 return FALSE;
598 585 $body .= "\n" . $sug; $body .= "\n" . $sug;
599 586
600 587 $body .= "\n\n"; $body .= "\n\n";
601 588 $conns = rg_admin_report_conns($db, $y_start, $y_end); $conns = rg_admin_report_conns($db, $y_start, $y_end);
602 if ($conns['ok'] != 1) {
603 $body .= 'Cannot generate conns report: ' . $conns['errmsg'] . '!' . "\n";
604 } else {
605 unset($conns['ok']);
606
607 $body .= 'Number of conns entries: ' . $conns['count'] . "\n";
608 unset($conns['count']);
609
610 $body .= 'Average elap: ' . $conns['avg_elap'] . 'ms' . "\n";
611 unset($conns['avg_elap']);
612
613 //rg_log_ml('DEBUG: conns: ' . print_r($conns, TRUE));
614 foreach ($conns as $t => $i) {
615 $body .= 'Top for \'' . $t . '\':' . "\n";
616 foreach ($i as $k => $v) {
617 if (strcmp($t, 'repo_id') == 0) {
618 $q = explode('/', $k);
619 $k = rg_repo_nice($db, $q[1]) . ' (user ' . rg_user_nice($db, $q[0]) . ')';
620 } else if (strcmp($t, 'uid') == 0) {
621 $k = rg_user_nice($db, $k) . ' (' . $k . ')';
622 }
589 if ($conns['ok'] != 1)
590 return FALSE;
591
592 unset($conns['ok']);
593
594 $body .= 'Number of conns entries: ' . $conns['count'] . "\n";
595 unset($conns['count']);
596
597 $body .= 'Average elap: ' . $conns['avg_elap'] . 'ms' . "\n";
598 unset($conns['avg_elap']);
623 599
624 $k2 = !empty($k) ? $k : 'EMPTY';
625 $body .= ' ' . $v . ' ' . $k2 . "\n";
600 //rg_log_ml('DEBUG: conns: ' . print_r($conns, TRUE));
601 foreach ($conns as $t => $i) {
602 $body .= 'Top for \'' . $t . '\':' . "\n";
603 foreach ($i as $k => $v) {
604 if (strcmp($t, 'repo_id') == 0) {
605 $q = explode('/', $k);
606 $k = rg_repo_nice($db, $q[1]) . ' (user ' . rg_user_nice($db, $q[0]) . ')';
607 } else if (strcmp($t, 'uid') == 0) {
608 $k = rg_user_nice($db, $k) . ' (' . $k . ')';
626 609 } }
627 $body .= "\n";
610
611 $k2 = !empty($k) ? $k : 'EMPTY';
612 $body .= ' ' . $v . ' ' . $k2 . "\n";
628 613 } }
614 $body .= "\n";
629 615 } }
630 616
631 $body .= rg_admin_report_big_repos($db);
632 $body .= rg_admin_report_big_users($db);
617 $r = rg_admin_report_big_repos($db);
618 if ($r === FALSE)
619 return FALSE;
620 $body .= $r;
621 $r= rg_admin_report_big_users($db);
622 if ($r === FALSE)
623 return FALSE;
624 $body .= $r;
633 625
634 626 $rg['ui']['ignore_confirmed'] = 1; $rg['ui']['ignore_confirmed'] = 1;
635 627 $rg['ui']['email'] = $rg_admin_email; $rg['ui']['email'] = $rg_admin_email;
File inc/struct.inc.php changed (mode: 100644) (index da1fbdd..6e0db53)
... ... $rg_sql_struct_slaves['conns'] = array();
676 676
677 677 $rg_sql_struct[46] = array(); $rg_sql_struct[46] = array();
678 678 $rg_sql_struct[46]['other'] = array( $rg_sql_struct[46]['other'] = array(
679 'repo git size' =>
680 'ALTER TABLE repos ADD git_mb INT NOT NULL DEFAULT 0',
681 'user git size' =>
682 'ALTER TABLE users ADD git_mb INT NOT NULL DEFAULT 0',
679 683 'repo artifacts size' => 'repo artifacts size' =>
680 684 'ALTER TABLE repos ADD artifacts_mb INT NOT NULL DEFAULT 0', 'ALTER TABLE repos ADD artifacts_mb INT NOT NULL DEFAULT 0',
681 685 'user artifacts size' => 'user artifacts size' =>
File inc/user.inc.php changed (mode: 100644) (index c554045..9336edb)
... ... function rg_user_list($db)
1452 1452 $ret .= " <th>Last IP</th>\n"; $ret .= " <th>Last IP</th>\n";
1453 1453 $ret .= " <th>Rights</th>\n"; $ret .= " <th>Rights</th>\n";
1454 1454 $ret .= " <th>Disk (MiB)</th>\n"; $ret .= " <th>Disk (MiB)</th>\n";
1455 $ret .= " <th>Git (MiB)</th>\n";
1456 $ret .= " <th>Artifacts (MiB)</th>\n";
1455 1457 $ret .= " <th>Operations</th>\n"; $ret .= " <th>Operations</th>\n";
1456 1458 $ret .= "</tr>\n"; $ret .= "</tr>\n";
1457 1459 while (($row = rg_sql_fetch_array($res))) { while (($row = rg_sql_fetch_array($res))) {
 
... ... function rg_user_list($db)
1476 1478 $v = implode(", ", rg_rights_text("user", $row['rights'])); $v = implode(", ", rg_rights_text("user", $row['rights']));
1477 1479 $ret .= " <td>" . $v . "</td>\n"; $ret .= " <td>" . $v . "</td>\n";
1478 1480 $ret .= " <td>" . $row['disk_used_mb'] . "</td>\n"; $ret .= " <td>" . $row['disk_used_mb'] . "</td>\n";
1481 $ret .= " <td>" . $row['git_mb'] . "</td>\n";
1482 $ret .= " <td>" . $row['artifacts_mb'] . "</td>\n";
1479 1483
1480 1484 // operations // operations
1481 1485 $url = "/op/admin/users"; $url = "/op/admin/users";
File inc/util.inc.php changed (mode: 100644) (index eac4518..a264987)
... ... function rg_load_files($dir, $pattern, $id_field)
3004 3004 return $ret; return $ret;
3005 3005 } }
3006 3006
3007 /*
3008 * Computing the size of a directory (helper)
3009 */
3010 function rg_dir_size_helper($dir, &$icache)
3011 {
3012 $tree = array('dirs' => array());
3013 $ret = FALSE;
3014 while (1) {
3015 $d = @opendir($dir);
3016 if ($d === FALSE) {
3017 rg_util_set_error('cannot open dir: ' . rg_php_err());
3018 break;
3019 }
3020
3021 $error = FALSE;
3022 while (($f = readdir($d)) !== FALSE) {
3023 if (strcmp($f, ".") == 0)
3024 continue;
3025
3026 if (strcmp($f, "..") == 0)
3027 continue;
3028
3029 $s = @stat($dir . '/' . $f);
3030 if ($s === FALSE) {
3031 rg_util_set_error('cannot stat: ' . rg_php_err());
3032 $error = TRUE;
3033 break;
3034 }
3035
3036 if (($s['mode'] & 0040000) == 0040000) { // dir
3037 $v = rg_dir_size_helper($dir . '/' . $f, $icache);
3038 if ($v === FALSE) {
3039 $error = TRUE;
3040 break;
3041 }
3042 } else if (($s['mode'] & 0100000) == 0100000) { // regular file
3043 $k = $s['dev'] . '-' . $s['ino'];
3044 if (!isset($icache[$k]))
3045 $icache[$k] = array(
3046 'links' => $s['nlink'],
3047 'size' => $s['size'],
3048 'blocks' => $s['blocks']
3049 );
3050 $v = $k;
3051 }
3052
3053 $tree['dirs'][$f] = $v;
3054 }
3055 closedir($d);
3056
3057 if (empty($tree['dirs']))
3058 unset($tree['dirs']);
3059
3060 if ($error === FALSE)
3061 $ret = $tree;
3062 break;
3063 }
3064
3065 return $ret;
3066 }
3067
3068 function rg_dir_size_helper2(&$tree, $icache)
3069 {
3070 // Step two, now we can compute the correct size
3071 $tree['blocks'] = 0;
3072 $tree['size'] = 0;
3073 if (!isset($tree['dirs'])) // empty dir
3074 return $tree;
3075
3076 foreach ($tree['dirs'] as $k => &$o) {
3077 if (is_array($o)) { // dir
3078 //echo ' dir [' . $k . ']: ' . rg_array2string($o);
3079 $x = rg_dir_size_helper2($o, $icache);
3080 //echo ' ret: ' . rg_array2string($x) . "\n";
3081 $tree['size'] += $x['size'];
3082 $tree['blocks'] += $x['blocks'];
3083 } else { // file
3084 $p = $icache[$o];
3085 //echo ' file [' . $k . ']: icache: ' . rg_array2string($p) . "\n";
3086 $tree['size'] += intval($p['size'] / $p['links']);
3087 $tree['blocks'] += intval($p['blocks'] / $p['links']);
3088 unset($tree['dirs'][$k]);
3089 }
3090 }
3091 unset($o);
3092
3093 if (empty($tree['dirs']))
3094 unset($tree['dirs']);
3095
3096 return $tree;
3097 }
3098
3099 /*
3100 * Computing the size of a directory
3101 */
3102 function rg_dir_size($dir)
3103 {
3104 rg_prof_start('dir_size');
3105
3106 $ret = FALSE;
3107 while (1) {
3108 $r = file_exists($dir);
3109 if ($r === FALSE) {
3110 $ret = array('blocks' => 0, 'size' => 0);
3111 break;
3112 }
3113
3114 // This will allow us to count correctly the size of the dir
3115 $icache = array();
3116
3117 $ret = rg_dir_size_helper($dir, $icache);
3118 if ($ret === FALSE)
3119 break;
3120
3121 //rg_log_ml('dir_size: ' . print_r($ret));
3122 //rg_log_ml('icache: ' . print_r($icache));
3123
3124 rg_dir_size_helper2($ret, $icache);
3125 unset($icache);
3126 break;
3127 }
3128
3129 rg_prof_end('dir_size');
3130 return $ret;
3131 }
3132
File root/themes/default/doc/api.html changed (mode: 100644) (index 9001445..50d4509)
... ... $ ssh rocketgit@rocketgit.com api user_info user=bla
59 59 "suspended": null, "suspended": null,
60 60 "session_time": "3600", "session_time": "3600",
61 61 "last_seen": "1464805192", "last_seen": "1464805192",
62 "disk_used_mb": null,
62 "disk_used_mb": "0",
63 "git_mb": "0",
64 "artifacts_mb": "0",
63 65 "confirmed": "1468297652", "confirmed": "1468297652",
64 66 "organization": "0", "organization": "0",
65 67 "realname": "my real name", "realname": "my real name",
 
... ... $ ssh rocketgit@rocketgit.com api repo_info repo=repo1
234 236 "git_dir_done": "1", "git_dir_done": "1",
235 237 "deleted": "0", "deleted": "0",
236 238 "disk_used_mb": "0", "disk_used_mb": "0",
239 "git_mb": "0",
240 "artifacts_mb": "0",
237 241 "public": "1", "public": "1",
238 242 "last_bug_id": "1", "last_bug_id": "1",
239 243 "license": "GPLv3", "license": "GPLv3",
File root/themes/default/repo/stats/stats.html changed (mode: 100644) (index 36a5f72..712505e)
3 3 <br /> <br />
4 4
5 5 Added on this site on <b>@@ri::itime_nice@@</b>.<br /> Added on this site on <b>@@ri::itime_nice@@</b>.<br />
6 Disk space used: <b>@@ri::disk_used_mb@@ MiB</b>.<br />
6 Total disk space used: <b>@@ri::disk_used_mb@@ MiB</b>.<br />
7 Disk space used by git: <b>@@ri::git_mb@@ MiB</b>.<br />
8 Disk space used by artifacts: <b>@@ri::artifacts_mb@@ MiB</b>.<br />
7 9 Bugs reported: <b>@@ri::last_bug_id@@</b>.<br /> Bugs reported: <b>@@ri::last_bug_id@@</b>.<br />
8 10 Merge requests: <b>@@ri::last_mr_id@@</b>.<br /> Merge requests: <b>@@ri::last_mr_id@@</b>.<br />
9 11
File scripts/cron.php changed (mode: 100644) (index 51bd9ef..1867c3e)
... ... rg_unlock('cron.lock');
61 61
62 62 rg_stats_insert($db); rg_stats_insert($db);
63 63
64 if (gmdate('Hi') == '0105') {
65 while (1) {
66 if (rg_load() > 100)
67 break;
64 $today_00 = gmmktime(0, 0, 0, gmdate('m'), gmdate('d'), gmdate('Y'));
65 $today_01 = gmmktime(1, 0, 0, gmdate('m'), gmdate('d'), gmdate('Y'));
66
67 $ldru = rg_state_get($db, 'last_disk_repo_usage');
68 while (($ldru < $today_00) && (rg_load() < 30)) {
69 rg_log('Compute repository sizes if dirty...');
70 $sql = 'SELECT uid, repo_id, master, disk_used_mb, git_mb'
71 . ', artifacts_mb'
72 . ' FROM repos'
73 . ' WHERE deleted = 0';
74 $res = rg_sql_query($db, $sql);
75 if ($res === FALSE) {
76 rg_internal_error('Cannot get repo info'
77 . ' (' . rg_sql_error() . ')!');
78 break;
79 }
68 80
69 rg_log('Compute repository sizes if dirty...');
70 // delete 'dirty' files
71 $sql = 'SELECT uid, repo_id, master, disk_used_mb FROM repos'
72 . ' WHERE deleted = 0';
73 $res = rg_sql_query($db, $sql);
74 if ($res === FALSE) {
75 // TODO: rg_internal_error? it must notify me in case of problems
76 rg_log('Cannot run query (' . rg_sql_error() . ')!');
77 break;
81 $ok = TRUE;
82 while (($row = rg_sql_fetch_array($res))) {
83 rg_log('Processing repo ' . $row['repo_id'] . '...');
84 $di = rg_repo_size($row['uid'], $row['repo_id']);
85 if ($di === FALSE) {
86 rg_internal_error('Cannot compute the repo size: '
87 . rg_repo_error());
88 $ok = FALSE;
89 continue;
78 90 } }
79
80 while (($row = rg_sql_fetch_array($res))) {
81 rg_log('Processing repo ' . $row['repo_id'] . '...');
82 $repo_path = rg_repo_path_by_id($row['uid'], $row['repo_id']);
83
84 $all_files = $row['master'] == 0 ? TRUE : FALSE;
85 $disk_used = rg_repo_size($repo_path, $all_files);
86 if ($disk_used === FALSE) {
87 rg_log('Cannot compute the repo size: ' . rg_repo_error());
88 continue;
89 }
90 $disk_used_mb = sprintf('%u', $disk_used / 1024 / 1024);
91 if ($disk_used_mb != $row['disk_used_mb']) {
92 $sql = 'UPDATE repos SET disk_used_mb = ' . $disk_used_mb
93 . ' WHERE repo_id = ' . $row['repo_id']
94 . ' AND disk_used_mb != ' . $disk_used_mb;
95 $res2 = rg_sql_query($db, $sql);
96 if ($res2 === FALSE) {
97 rg_log('Cannot run query!');
98 break;
99 }
100 rg_sql_free_result($res2);
91 if (($di['disk_used_mb'] != $row['disk_used_mb'])
92 || ($di['git_mb'] != $row['git_mb'])
93 || ($di['artifacts_mb'] != $row['artifacts_mb'])) {
94 $sql = 'UPDATE repos'
95 . ' SET disk_used_mb = ' . $di['disk_used_mb']
96 . ', git_mb = ' . $di['git_mb']
97 . ', artifacts_mb = ' . $di['artifacts_mb']
98 . ' WHERE repo_id = ' . $row['repo_id'];
99 $res2 = rg_sql_query($db, $sql);
100 if ($res2 === FALSE) {
101 rg_internal_error('Cannot update repo: ' . rg_sql_error());
102 $ok = FALSE;
103 break;
101 104 } }
105 rg_sql_free_result($res2);
102 106 } }
103 rg_sql_free_result($res);
107 }
108 rg_sql_free_result($res);
109 if ($ok) {
110 $ldru = time();
111 rg_state_set($db, 'last_disk_repo_usage', $ldru);
112 }
113 break;
114 }
115
116 $r = rg_state_get($db, 'last_disk_user_usage');
117 while (($r < $ldru) && (rg_load() < 30)) {
118 rg_log('Compute repository sizes per user...');
119 $sql = 'SELECT uid, SUM(disk_used_mb) AS disk_used_mb'
120 . ', SUM(git_mb) AS git_mb'
121 . ', SUM(artifacts_mb) AS artifacts_mb'
122 . ' FROM repos'
123 . ' GROUP BY uid';
124 $res = rg_sql_query($db, $sql);
125 if ($res === FALSE) {
126 rg_internal_error('Cannot get repo info (' . rg_sql_error() . ')!');
104 127 break; break;
105 128 } }
106 129
107 while (1) {
108 rg_log('Compute repository sizes per user...');
109 $sql = 'SELECT SUM(disk_used_mb) AS disk_used_mb, uid'
110 . ' FROM repos'
111 . ' GROUP BY uid';
112 $res = rg_sql_query($db, $sql);
113 if ($res === FALSE) {
114 rg_log('Cannot run query (' . rg_sql_error() . ')!');
130 $ok = TRUE;
131 while (($row = rg_sql_fetch_array($res))) {
132 $sql = 'UPDATE users'
133 . ' SET disk_used_mb = ' . $row['disk_used_mb']
134 . ', git_mb = ' . $row['git_mb']
135 . ', artifacts_mb = ' . $row['artifacts_mb']
136 . ' WHERE uid = ' . $row['uid']
137 . ' AND (disk_used_mb != ' . $row['disk_used_mb']
138 . ' OR git_mb != ' . $row['git_mb']
139 . ' OR artifacts_mb != ' . $row['artifacts_mb']
140 . ')';
141 $res2 = rg_sql_query($db, $sql);
142 if ($res2 === FALSE) {
143 rg_internal_error('Cannot update (' . rg_sql_error() . ')!');
144 $ok = FALSE;
115 145 break; break;
116 146 } }
117
118 while (($row = rg_sql_fetch_array($res))) {
119 $sql = 'UPDATE users'
120 . ' SET disk_used_mb = ' . $row['disk_used_mb']
121 . ' WHERE uid = ' . $row['uid']
122 . ' AND disk_used_mb != ' . $row['disk_used_mb'];
123 $res2 = rg_sql_query($db, $sql);
124 if ($res2 !== FALSE)
125 rg_sql_free_result($res2);
126 }
127 rg_sql_free_result($res);
128 break;
147 rg_sql_free_result($res2);
129 148 } }
149 rg_sql_free_result($res);
150 if ($ok)
151 rg_state_set($db, 'last_disk_user_usage', time());
152 break;
130 153 } }
131 154
132 if (gmdate('Hi') == '0300') {
155 $r = rg_state_get($db, 'cron_last_clean_forget_pass');
156 while (($r < $today_00) && (rg_load() < 50)) {
133 157 rg_log_enter('Clean old forget_pass entries...'); rg_log_enter('Clean old forget_pass entries...');
134 158 $sql = 'DELETE FROM forgot_pass WHERE expire < ' . $now; $sql = 'DELETE FROM forgot_pass WHERE expire < ' . $now;
135 159 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
136 if ($res !== FALSE)
160 if ($res === FALSE) {
161 rg_internal_error('Cannot delete forgot_pass'
162 . ' (' . rg_sql_error() . ')!');
163 } else {
137 164 rg_sql_free_result($res); rg_sql_free_result($res);
165 rg_state_set($db, 'cron_last_clean_forget_pass', time());
166 }
138 167 rg_log_exit(); rg_log_exit();
168 break;
139 169 } }
140 170
141 171 if (gmdate('i') == '30') { if (gmdate('i') == '30') {
142 172 rg_log_enter('Clean old tokens...'); rg_log_enter('Clean old tokens...');
143 173 $sql = 'DELETE FROM tokens WHERE expire < ' . $now; $sql = 'DELETE FROM tokens WHERE expire < ' . $now;
144 174 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
145 if ($res !== FALSE)
175 if ($res === FALSE)
176 rg_internal_error('Cannot delete expired tokens (' . rg_sql_error() . ')!');
177 else
146 178 rg_sql_free_result($res); rg_sql_free_result($res);
147 179 rg_log_exit(); rg_log_exit();
148 180 } }
 
... ... while (gmdate('Hi') == '0610') {
200 232 . ' ORDER BY relname'; . ' ORDER BY relname';
201 233 $res = rg_sql_query($db, $sql); $res = rg_sql_query($db, $sql);
202 234 if ($res === FALSE) { if ($res === FALSE) {
203 rg_log('Cannot load slave tables: ' . rg_sql_error());
235 rg_internal_error('Cannot check if table exists'
236 . ' (' . rg_sql_error() . ')!');
237 $ok = FALSE;
204 238 break; break;
205 239 } }
206 240 while (($row = rg_sql_fetch_array($res))) { while (($row = rg_sql_fetch_array($res))) {
207 $sql = 'SELECT 1 FROM ' . $row['relname'] . ' LIMIT 1';
241 $sql = 'DROP TABLE ' . $row['relname'];
208 242 $res2 = rg_sql_query($db, $sql); $res2 = rg_sql_query($db, $sql);
209 243 if ($res2 === FALSE) { if ($res2 === FALSE) {
210 rg_log('Cannot select from table ['
211 . $row['relname'] . ']: '
212 . rg_sql_error());
244 rg_internal_error('Cannot drop table (' . rg_sql_error() . ')!');
245 $ok = FALSE;
213 246 break; break;
214 247 } }
215 $rows = rg_sql_num_rows($res2);
216 248 rg_sql_free_result($res2); rg_sql_free_result($res2);
217
218 if ($rows == 1)
219 continue;
220
221 $sql = 'DROP TABLE ' . $row['relname'];
222 $res2 = rg_sql_query($db, $sql);
223 if ($res2 !== FALSE)
224 rg_sql_free_result($res2);
225 249 } }
226 250 rg_sql_free_result($res); rg_sql_free_result($res);
227 251 } }
228 252
229 rg_state_set($db, 'slave_clean_last_run', $when);
230
253 if ($ok)
254 rg_state_set($db, 'part_clean_last_run', time());
231 255 rg_log_exit(); rg_log_exit();
232 256 break; break;
233 257 } }
234 258
235 if (gmdate('Hi') == '0100')
236 rg_admin_report1($db, $rg);
259 $r = rg_state_get($db, 'cron_report1');
260 while (($r < $today_01) && (rg_load() < 50)) {
261 $r = rg_admin_report1($db, $rg);
262 if ($r === FALSE)
263 break;
264 rg_state_set($db, 'cron_report1', time());
265 }
237 266
238 267 // TODO: move it as an event after the push // TODO: move it as an event after the push
239 268 rg_mr_queue_process($db); rg_mr_queue_process($db);
File tests/helpers.inc.php changed (mode: 100644) (index 618fef0..e1e33b2)
... ... function rg_test_create_user($db, &$rg_ui)
36 36 $new['pass'] = 'pass-' . $_user_id . ':'; $new['pass'] = 'pass-' . $_user_id . ':';
37 37 $new['pass2'] = 'pass-' . $_user_id . ':'; $new['pass2'] = 'pass-' . $_user_id . ':';
38 38 $new['disk_used_mb'] = 0; $new['disk_used_mb'] = 0;
39 $new['git_mb'] = 0;
40 $new['artifacts_mb'] = 0;
39 41 $new['last_ip'] = '?'; $new['last_ip'] = '?';
40 42 $_user_id++; $_user_id++;
41 43
File tests/util.php changed (mode: 100644) (index 1fc820e..acd4f1c)
... ... if (strcmp($r, $e) != 0) {
873 873 } }
874 874
875 875
876 rg_log('');
877 rg_log_enter('rg_dir_size - non existing');
878 $r = rg_dir_size('temp_repos/non-existing');
879 if (($r['blocks'] != 0) || ($r['size'] != 0)) {
880 rg_log('Non existing dir returns non-zero sizes!');
881 exit(1);
882 }
883 rg_log_exit();
884
885
886 rg_log('');
887 rg_log_enter('rg_dir_size1');
888 $r = rg_exec('mkdir -p temp_repos && cd temp_repos'
889 . ' && mkdir -p dir1 && cd dir1'
890 . ' && echo "aaa" > a'
891 . ' && echo "bbbbb" > b'
892 . ' && mkdir -p dir2 && echo "a" > dir2/z'
893 . ' && ln -f dir2/z zclone'
894 . ' && mkdir -p empty',
895 '', FALSE, FALSE, FALSE);
896 if ($r['ok'] != 1) {
897 rg_log_ml('r: ' . print_r($r, TRUE));
898 rg_log('Cannot run command!');
899 exit(1);
900 }
901 $r = rg_dir_size('temp_repos/dir1');
902 if ($r === FALSE) {
903 rg_log('Got an error: ' . rg_util_error());
904 exit(1);
905 }
906 if ($r['size'] != 12) {
907 rg_log('Size is not 12: ' . $r['size']);
908 exit(1);
909 }
910 if ($r['blocks'] != 24) {
911 rg_log('Size is not 24: ' . $r['size']);
912 exit(1);
913 }
914 rg_log_exit();
915
916 rg_prof_log();
876 917 rg_log('OK!'); rg_log('OK!');
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