added svn commit logging
- added a new post-commit script - updated repo.sh to install this script in a svn repository.
This commit is contained in:
parent
84edaebec2
commit
3c1a982fd9
@ -1,7 +1,7 @@
|
||||
|
||||
cfgdir=$(CFGDIR)
|
||||
cfg_DATA = codepot.ini codepot.sql codepot.a2ldap
|
||||
cfg_SCRIPTS = repo.sh start-commit
|
||||
cfg_SCRIPTS = repo.sh start-commit post-commit
|
||||
|
||||
EXTRA_DIST = $(cfg_DATA) $(cfg_SCRIPTS)
|
||||
|
||||
|
@ -166,7 +166,7 @@ top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
wwwdir = @wwwdir@
|
||||
cfg_DATA = codepot.ini codepot.sql codepot.a2ldap
|
||||
cfg_SCRIPTS = repo.sh start-commit
|
||||
cfg_SCRIPTS = repo.sh start-commit post-commit
|
||||
EXTRA_DIST = $(cfg_DATA) $(cfg_SCRIPTS)
|
||||
all: all-am
|
||||
|
||||
|
@ -75,10 +75,16 @@ sysadmin_userid =
|
||||
max_upload_size = "10000"
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; Maximum number of latest projects to show
|
||||
; Maximum number of latest projects to show in the front page
|
||||
;------------------------------------------------------------------------------
|
||||
max_latest_projects = "10"
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; Maximum number of svn commits to show in the front page
|
||||
;------------------------------------------------------------------------------
|
||||
max_svn_commits = "10"
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; directory to accomodate subversion repositories
|
||||
;------------------------------------------------------------------------------
|
||||
|
@ -73,3 +73,10 @@ CREATE TABLE file (
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) charset=utf8 engine=InnoDB;
|
||||
|
||||
CREATE TABLE log (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
type VARCHAR(16) NOT NULL,
|
||||
message TEXT NOT NULL,
|
||||
createdon DATETIME NOT NULL,
|
||||
INDEX timed_type (createdon, type)
|
||||
) charset=utf8 engine=InnoDB;
|
||||
|
13
codepot/etc/post-commit
Executable file
13
codepot/etc/post-commit
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
post_commit() {
|
||||
local repo_path="$1"
|
||||
local rev="$2"
|
||||
local repo="`basename "${repo_path}"`"
|
||||
|
||||
ans="`wget -q -O- "%API%/logSvnCommit/${repo}/${rev}" 2>/dev/null`"
|
||||
return 0
|
||||
}
|
||||
|
||||
post_commit "$1" "$2"
|
||||
exit $?
|
@ -29,10 +29,19 @@ make_repo() {
|
||||
chmod 0755 "${repodir}/start-commit"
|
||||
#}
|
||||
|
||||
#[ -f "${repodir}/post-commit" ] || {
|
||||
sed "s|%API%|${api}|g" "${cfgdir}/post-commit" > "${repodir}/post-commit" || {
|
||||
echo "ERROR: cannot install post-commit to ${repodir}"
|
||||
return 1;
|
||||
}
|
||||
chmod 0755 "${repodir}/post-commit"
|
||||
#}
|
||||
|
||||
svnadmin create "${repodir}/${reponame}" && {
|
||||
oldpwd="`pwd`"
|
||||
cd "${repodir}/${reponame}/hooks"
|
||||
ln -sf ../../start-commit start-commit
|
||||
ln -sf ../../post-commit post-commit
|
||||
cd "${oldpwd}"
|
||||
}
|
||||
|
||||
|
@ -9,14 +9,23 @@ class API extends Controller
|
||||
|
||||
function projectHasMember ($projectid, $userid)
|
||||
{
|
||||
// TODO: access control - may allow localhost only
|
||||
$this->load->model ('ProjectModel', 'projects');
|
||||
print ($this->projects->projectHasMember ($projectid, $userid) === FALSE)? 'NO': 'YES';
|
||||
}
|
||||
|
||||
function projectIsOwnedBy ($projectid, $userid)
|
||||
{
|
||||
// TODO: access control - may allow localhost only
|
||||
$this->load->model ('ProjectModel', 'projects');
|
||||
print ($this->projects->projectIsOwnedBy ($projectid, $userid) === FALSE)? 'NO': 'YES';
|
||||
}
|
||||
|
||||
function logSvnCommit ($repo, $rev)
|
||||
{
|
||||
// TODO: access control - may allow localhost only
|
||||
$this->load->model ('LogModel', 'logs');
|
||||
$this->logs->writeSvnCommit ($repo, $rev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -30,8 +30,9 @@ class User extends Controller
|
||||
if (CODEPOT_ALWAYS_REQUIRE_SIGNIN && $login['id'] == '')
|
||||
redirect ('main/signin');
|
||||
|
||||
$this->load->model ('ProjectModel', 'projects');
|
||||
$this->load->model ('SiteModel', 'sites');
|
||||
$this->load->model ('ProjectModel', 'projects');
|
||||
$this->load->model ('LogModel', 'logs');
|
||||
|
||||
$site = $this->sites->get (CODEPOT_DEFAULT_SITEID);
|
||||
if ($site === FALSE)
|
||||
@ -39,28 +40,35 @@ class User extends Controller
|
||||
$data['login'] = $login;
|
||||
$data['message'] = 'DATABASE ERROR';
|
||||
$this->load->view ($this->VIEW_ERROR, $data);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
$latest_projects = $this->projects->getLatestProjects ($login['id'], CODEPOT_MAX_LATEST_PROJECTS);
|
||||
if ($latest_projects === FALSE)
|
||||
{
|
||||
$data['login'] = $login;
|
||||
$data['message'] = 'DATABASE ERROR';
|
||||
$this->load->view ($this->VIEW_ERROR, $data);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($site === NULL) $site = $this->sites->getDefault ();
|
||||
if ($site === NULL) $site = $this->sites->getDefault ();
|
||||
|
||||
$data['login'] = $login;
|
||||
$data['latest_projects'] = $latest_projects;
|
||||
$data['site'] = $site;
|
||||
//$data['user_name'] = '';
|
||||
//$data['user_pass'] = '';
|
||||
$this->load->view ($this->VIEW_HOME, $data);
|
||||
}
|
||||
$latest_projects = $this->projects->getLatestProjects ($login['id'], CODEPOT_MAX_LATEST_PROJECTS);
|
||||
if ($latest_projects === FALSE)
|
||||
{
|
||||
$data['login'] = $login;
|
||||
$data['message'] = 'DATABASE ERROR';
|
||||
$this->load->view ($this->VIEW_ERROR, $data);
|
||||
return;
|
||||
}
|
||||
|
||||
$svn_commits = $this->logs->getSvnCommits (CODEPOT_MAX_SVN_COMMITS);
|
||||
if ($svn_commits === FALSE)
|
||||
{
|
||||
$data['login'] = $login;
|
||||
$data['message'] = 'DATABASE ERROR';
|
||||
$this->load->view ($this->VIEW_ERROR, $data);
|
||||
return;
|
||||
}
|
||||
|
||||
$data['login'] = $login;
|
||||
$data['latest_projects'] = $latest_projects;
|
||||
$data['svn_commits'] = $svn_commits;
|
||||
$data['site'] = $site;
|
||||
//$data['user_name'] = '';
|
||||
//$data['user_pass'] = '';
|
||||
$this->load->view ($this->VIEW_HOME, $data);
|
||||
}
|
||||
|
||||
function projectlist ()
|
||||
|
@ -43,6 +43,7 @@ $lang['Size'] = 'Size';
|
||||
$lang['Source'] = 'Source';
|
||||
$lang['Summary'] = 'Summary';
|
||||
$lang['System'] = 'System';
|
||||
$lang['SVN commits'] = 'SVN commits';
|
||||
$lang['Tag'] = 'Tag';
|
||||
$lang['Text'] = 'Text';
|
||||
$lang['Time'] = 'Time';
|
||||
|
@ -43,6 +43,7 @@ $lang['Size'] = 'Ukuran';
|
||||
$lang['Source'] = 'Sumber';
|
||||
$lang['Summary'] = 'Rangkuman';
|
||||
$lang['System'] = 'Sistem';
|
||||
$lang['SVN commits'] = 'SVN commits';
|
||||
$lang['Tag'] = 'Label';
|
||||
$lang['Text'] = 'Teks';
|
||||
$lang['Time'] = 'Waktu';
|
||||
|
@ -43,6 +43,7 @@ $lang['Size'] = '크기';
|
||||
$lang['Source'] = '소스';
|
||||
$lang['Summary'] = '요약';
|
||||
$lang['System'] = '시스템';
|
||||
$lang['SVN commits'] = 'SVN 커밋';
|
||||
$lang['Tag'] = '태그';
|
||||
$lang['Text'] = '본문';
|
||||
$lang['Time'] = '시간';
|
||||
|
@ -4,6 +4,7 @@ www_DATA = \
|
||||
index.html \
|
||||
ldaploginmodel.php \
|
||||
loginmodel.php \
|
||||
logmodel.php \
|
||||
projectmodel.php \
|
||||
sitemodel.php \
|
||||
subversionmodel.php \
|
||||
|
@ -167,6 +167,7 @@ www_DATA = \
|
||||
index.html \
|
||||
ldaploginmodel.php \
|
||||
loginmodel.php \
|
||||
logmodel.php \
|
||||
projectmodel.php \
|
||||
sitemodel.php \
|
||||
subversionmodel.php \
|
||||
|
126
codepot/src/codepot/models/logmodel.php
Normal file
126
codepot/src/codepot/models/logmodel.php
Normal file
@ -0,0 +1,126 @@
|
||||
<?php
|
||||
|
||||
class LogModel extends Model
|
||||
{
|
||||
function LogModel ()
|
||||
{
|
||||
parent::Model ();
|
||||
$this->load->database ();
|
||||
}
|
||||
|
||||
/*
|
||||
function get ($id)
|
||||
{
|
||||
$this->db->trans_start ();
|
||||
|
||||
$this->db->where ('id', (string)$id);
|
||||
$query = $this->db->get ('log');
|
||||
|
||||
$result = $query->result ();
|
||||
if (empty($result))
|
||||
{
|
||||
$this->db->trans_complete ();
|
||||
if ($this->db->trans_status() === FALSE) return FALSE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
$this->db->trans_complete ();
|
||||
if ($this->db->trans_status() === FALSE) return FALSE;
|
||||
|
||||
return $result[0];
|
||||
}
|
||||
*/
|
||||
|
||||
function getSvnCommits ($limit)
|
||||
{
|
||||
$this->db->trans_start ();
|
||||
|
||||
$this->db->where ('type', 'svn-commit');
|
||||
$this->db->order_by ('createdon', 'desc');
|
||||
$query = $this->db->get ('log', $limit);
|
||||
|
||||
$result = $query->result ();
|
||||
$this->db->trans_complete ();
|
||||
if ($this->db->trans_status() === FALSE) return FALSE;
|
||||
|
||||
$count = 0;
|
||||
$commits = array ();
|
||||
foreach ($result as $row)
|
||||
{
|
||||
list($repo,$rev) = split('[,]', $row->message);
|
||||
|
||||
$commits[$count]['repo'] = $repo;
|
||||
$commits[$count]['rev'] = $rev;
|
||||
|
||||
|
||||
$log = @svn_log (
|
||||
'file:///'.CODEPOT_SVNREPO_DIR."/{$repo}",
|
||||
$rev, $rev, 1,SVN_DISCOVER_CHANGED_PATHS);
|
||||
if ($log === FALSE || count($log) < 1)
|
||||
{
|
||||
$commits[$count]['author'] = '';
|
||||
$commits[$count]['message'] = '';
|
||||
$commits[$count]['time'] = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
$commits[$count]['author'] = $log[0]['author'];
|
||||
$commits[$count]['message'] = $log[0]['msg'];
|
||||
$commits[$count]['time'] = $log[0]['date'];
|
||||
}
|
||||
|
||||
$count++;
|
||||
}
|
||||
|
||||
return $commits;
|
||||
}
|
||||
|
||||
function writeSvnCommit ($repo, $rev)
|
||||
{
|
||||
$log->type = 'svn-commit';
|
||||
$log->message = "{$repo},{$rev}";
|
||||
$this->write ($log);
|
||||
}
|
||||
|
||||
function write ($log)
|
||||
{
|
||||
$this->db->trans_begin ();
|
||||
|
||||
$this->db->set ('type', $log->type);
|
||||
$this->db->set ('message', $log->message);
|
||||
$this->db->set ('createdon', date('Y-m-d H:i:s'));
|
||||
$this->db->insert ('log');
|
||||
|
||||
if ($this->db->trans_status() === FALSE)
|
||||
{
|
||||
$this->db->trans_rollback ();
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->db->trans_commit ();
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
function delete ($log)
|
||||
{
|
||||
$this->db->trans_begin ();
|
||||
|
||||
$this->db->where ('id', $log->id);
|
||||
$this->db->delete ('log');
|
||||
|
||||
if ($this->db->trans_status() === FALSE)
|
||||
{
|
||||
$this->db->trans_rollback ();
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->db->trans_commit ();
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -11,7 +11,7 @@ function render_wiki()
|
||||
creole_render_wiki (
|
||||
"user_home_mainarea_textpre",
|
||||
"user_home_mainarea_text",
|
||||
""
|
||||
"<?=dirname(dirname(current_url()))?>/user/home/"
|
||||
);
|
||||
}
|
||||
</script>
|
||||
@ -78,6 +78,44 @@ foreach ($latest_projects as $project)
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="box">
|
||||
<div class="boxtitle"><?=$this->lang->line('SVN commits')?></div>
|
||||
<table id="user_home_mainarea_sidebar_svn_commits_table">
|
||||
<?php
|
||||
$xdot = $this->converter->AsciiToHex ('.');
|
||||
foreach ($svn_commits as $commit)
|
||||
{
|
||||
print '<tr class="odd">';
|
||||
print '<td>';
|
||||
print substr($commit['time'], 0, 10);
|
||||
print '</td>';
|
||||
print '<td>';
|
||||
print anchor (
|
||||
"/source/file/{$commit['repo']}/{$xdot}/{$commit['rev']}",
|
||||
$commit['repo']);
|
||||
print '</td>';
|
||||
print '<td>';
|
||||
print anchor (
|
||||
"/source/revision/{$commit['repo']}/{$xdot}/{$commit['rev']}",
|
||||
$commit['rev']);
|
||||
print '</td>';
|
||||
print '<td>';
|
||||
print htmlspecialchars ($commit['author']);
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
|
||||
print '<tr class="even">';
|
||||
print '<td colspan=4>';
|
||||
$sm = strtok (trim ($commit['message']), "\r\n");
|
||||
print htmlspecialchars ($sm);
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div> <!-- user_home_mainarea_sidebar -->
|
||||
|
||||
<div id="user_home_mainarea_text">
|
||||
|
@ -25,6 +25,7 @@ function load_ini ($file)
|
||||
array ('login_model', 'string', 'LdapLoginModel'),
|
||||
array ('sysadmin_userid', 'string', ''),
|
||||
array ('max_upload_size', 'string', '10000'), // kbytes
|
||||
array ('max_svn_commits', 'integer', 10),
|
||||
array ('max_latest_projects', 'integer', 10),
|
||||
|
||||
array ('database_username', 'string', ''),
|
||||
|
@ -2,6 +2,27 @@
|
||||
* This file contains specific IDs for furthur customization.
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------
|
||||
* user home view
|
||||
*-----------------------------------------------*/
|
||||
#user_home_mainarea_sidebar {
|
||||
width: 25em;
|
||||
}
|
||||
|
||||
#user_home_mainarea_sidebar_svn_commits_table {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#user_home_mainarea_sidebar_svn_commits_table tr.odd {
|
||||
background-color: #bbccef;
|
||||
}
|
||||
|
||||
#user_home_mainarea_sidebar_svn_commits_table tr.even {
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------
|
||||
* project file home view
|
||||
*-----------------------------------------------*/
|
||||
|
Loading…
Reference in New Issue
Block a user