[Fusionforge-commits] FusionForge branch master updated. 04cf37bf1553fdc10ff350702e60e05609ab8d0a

Franck Villaume nerville at fusionforge.org
Sat Oct 25 17:31:06 CEST 2014


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "FusionForge".

The branch, master has been updated
       via  04cf37bf1553fdc10ff350702e60e05609ab8d0a (commit)
       via  1f86520548d31c955c5d56e00374fd394db3baae (commit)
      from  aaf685b3a638553549170b611f817d2832d5bcde (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 04cf37bf1553fdc10ff350702e60e05609ab8d0a
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Oct 25 17:29:05 2014 +0200

    implement [#743]: new widget Project Latest Commits

diff --git a/src/CHANGES b/src/CHANGES
index 74b30f0..1191920 100644
--- a/src/CHANGES
+++ b/src/CHANGES
@@ -13,7 +13,8 @@ Fusionforge-X.X:
 * [#716] General: Update the jQuery Auto-height plugin (TrivialDev)
 * Plugin scmhook: Update git post-receive eMail hook (tarent solutions GmbH, Teckids e.V.)
 * [#684] Widget Public Area: display FRS link (TrivialDev)
-* [#743] Widget My Latest Commits: New widget to display user commits on "My Page" (TrivialDev)
+* [#743] Widget My Latest Commits: New widget to display user commits on "My Page"
+         Widget Project Latest Commits: New widget to display the 5 latest commits on the project page  (TrivialDev)
 * [#745] Widget Project Latest Documents: enhancement, add actions buttons (monitor, delete) (TrivialDev)
 * [#655] Tracker: enable support for multi-select extrafield in roadmap (TrivialDev)
 * [#662] Forum: store the attached file on FS. (TrivialDev)
diff --git a/src/common/widget/Widget.class.php b/src/common/widget/Widget.class.php
index 76870ca..bf8af51 100644
--- a/src/common/widget/Widget.class.php
+++ b/src/common/widget/Widget.class.php
@@ -19,46 +19,41 @@
  * along with Fusionforge. If not, see <http://www.gnu.org/licenses/>.
  */
 
-require_once 'common/widget/WidgetLayoutManager.class.php';
+require_once $gfcommon.'widget/WidgetLayoutManager.class.php';
 
-require_once 'common/widget/Widget_MySurveys.class.php';
-require_once 'common/widget/Widget_MyProjects.class.php';
-require_once 'common/widget/Widget_MyBookmarks.class.php';
-require_once 'common/widget/Widget_MyMonitoredForums.class.php';
-require_once('common/widget/Widget_MyMonitoredFp.class.php');
-require_once 'common/widget/Widget_MyLatestCommits.class.php';
-require_once 'common/widget/Widget_MyProjectsLastDocuments.class.php';
-require_once 'common/widget/Widget_MyArtifacts.class.php';
+require_once $gfcommon.'widget/Widget_MySurveys.class.php';
+require_once $gfcommon.'widget/Widget_MyProjects.class.php';
+require_once $gfcommon.'widget/Widget_MyBookmarks.class.php';
+require_once $gfcommon.'widget/Widget_MyMonitoredForums.class.php';
+require_once $gfcommon.'widget/Widget_MyMonitoredFp.class.php';
+require_once $gfcommon.'widget/Widget_MyLatestCommits.class.php';
+require_once $gfcommon.'widget/Widget_MyProjectsLastDocuments.class.php';
+require_once $gfcommon.'widget/Widget_MyArtifacts.class.php';
 //require_once('common/widget/Widget_MyBugs.class.php');
 //require_once('common/widget/Widget_MySrs.class.php');
-require_once 'common/widget/Widget_MyTasks.class.php';
-require_once 'common/widget/Widget_MyRss.class.php';
+require_once $gfcommon.'widget/Widget_MyTasks.class.php';
+require_once $gfcommon.'widget/Widget_MyRss.class.php';
 
-require_once 'common/widget/Widget_MyAdmin.class.php';
-/*
-   require_once 'common/widget/Widget_MyTwitterFollow.class.php';
-   require_once 'common/widget/Widget_MySystemEvent.class.php';
+require_once $gfcommon.'widget/Widget_MyAdmin.class.php';
+//require_once 'common/widget/Widget_MyTwitterFollow.class.php';
+//require_once 'common/widget/Widget_MySystemEvent.class.php';
 //require_once('common/widget/Widget_MyWikiPage.class.php');
-*/require_once('common/widget/Widget_ProjectDescription.class.php');
+require_once $gfcommon.'widget/Widget_ProjectDescription.class.php' ;
 //require_once('common/widget/Widget_ProjectClassification.class.php');
 
-require_once 'common/widget/Widget_ProjectMembers.class.php';
-require_once 'common/widget/Widget_ProjectInfo.class.php';
-require_once 'common/widget/Widget_ProjectLatestFileReleases.class.php';
-require_once 'common/widget/Widget_ProjectLatestDocuments.class.php';
-require_once('common/widget/Widget_ProjectDocumentsActivity.class.php');
-
-require_once 'common/widget/Widget_ProjectLatestNews.class.php';
-require_once 'common/widget/Widget_ProjectPublicAreas.class.php';
-require_once 'common/widget/Widget_ProjectRss.class.php';/*
-							     require_once 'common/widget/Widget_ProjectLatestSvnCommits.class.php';
-							     require_once 'common/widget/Widget_ProjectLatestCvsCommits.class.php';
-							     require_once 'common/widget/Widget_ProjectTwitterFollow.class.php';
+require_once $gfcommon.'widget/Widget_ProjectMembers.class.php';
+require_once $gfcommon.'widget/Widget_ProjectInfo.class.php';
+require_once $gfcommon.'widget/Widget_ProjectLatestFileReleases.class.php';
+require_once $gfcommon.'widget/Widget_ProjectLatestDocuments.class.php';
+require_once $gfcommon.'widget/Widget_ProjectDocumentsActivity.class.php' ;
+require_once $gfcommon.'widget/Widget_ProjectLatestNews.class.php';
+require_once $gfcommon.'widget/Widget_ProjectPublicAreas.class.php';
+require_once $gfcommon.'widget/Widget_ProjectRss.class.php';
+require_once $gfcommon.'widget/Widget_ProjectLatestCommits.class.php';
+//require_once 'common/widget/Widget_ProjectTwitterFollow.class.php';
 //require_once('common/widget/Widget_ProjectWikiPage.class.php');
-require_once 'common/widget/Widget_ProjectSvnStats.class.php';
-							   */
-
-require_once 'common/widget/Widget_MyMonitoredDocuments.class.php';
+//require_once 'common/widget/Widget_ProjectSvnStats.class.php';
+require_once $gfcommon.'widget/Widget_MyMonitoredDocuments.class.php';
 
 /**
 * "Codendi" Layout Widget
@@ -273,13 +268,10 @@ require_once 'common/widget/Widget_MyMonitoredDocuments.class.php';
 				break;
 			case 'projectwikipage':                    //not yet
 				$o = new Widget_ProjectWikiPage();
-				break;
-			case 'projectlatestsvncommits':
-				$o = new Widget_ProjectLatestSvnCommits();
-				break;
-			case 'projectlatestcvscommits':
-				$o = new Widget_ProjectLatestCvsCommits();
 				break;*/
+			case 'projectlatestcommits':
+				$o = new Widget_ProjectLatestCommits();
+				break;
 			default:
 				//$em = EventManager::instance();
 				//$em->processEvent('widget_instance', array('widget' => $widget_name, 'instance' => &$o));
@@ -310,8 +302,7 @@ require_once 'common/widget/Widget_MyMonitoredDocuments.class.php';
 				// project home widgets
 				$widgets = array('projectdescription', 'projectmembers', 'projectinfo',
 						'projectlatestfilereleases', 'projectlatestdocuments', 'projectlatestnews', 'projectpublicareas', //'projectwikipage' //not yet
-						'projectlatestsvncommits', 'projectlatestcvscommits', 'projecttwitterfollow',
-						'projectsvnstats', 'projectrss', 'projectdocumentsactivity',
+						'projectlatestcommits', 'projecttwitterfollow', 'projectsvnstats', 'projectrss', 'projectdocumentsactivity',
 						);
 				break;
 			case WidgetLayoutManager::OWNER_TYPE_HOME:
diff --git a/src/common/widget/Widget_ProjectLatestCommits.class.php b/src/common/widget/Widget_ProjectLatestCommits.class.php
new file mode 100644
index 0000000..242ad8a
--- /dev/null
+++ b/src/common/widget/Widget_ProjectLatestCommits.class.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Widget_ProjectLatestCommits
+ *
+ * Copyright 2014 Franck Villaume - TrivialDev
+ *
+ * This file is a part of Fusionforge.
+ *
+ * Fusionforge is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Fusionforge is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Fusionforge. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+class Widget_ProjectLatestCommits extends Widget {
+
+	/**
+	* Default number of commits to display
+	*/
+	const NB_COMMITS_TO_DISPLAY = 5;
+
+
+	public function __construct() {
+		$this->Widget('projectlatestcommits');
+		$request =& HTTPRequest::instance();
+		$pm = ProjectManager::instance();
+		$project = $pm->getProject($request->get('group_id'));
+		if ($project && $this->canBeUsedByProject($project) && forge_check_perm('scm', $project->getID(), 'read')) {
+			$this->content['title'] = _('5 Latest Commits');
+		}
+	}
+
+	public function getTitle() {
+		return _('5 Latest Commits');
+	}
+
+	public function _getLinkToCommit($project, $commit_id, $pluginName) {
+		$url = '';
+		switch ($pluginName) {
+			case 'scmsvn': {
+				$url = '/scm/viewvc.php/?root='.$project->getUnixname().'&view=rev&revision='.$commit_id;
+				break;
+			}
+			case 'scmgit': {
+				$url = '/scm/browser.php?group_id='.$project->getID().'&commit='.$commit_id;
+				break;
+			}
+		}
+		return util_make_link($url, _('commit')._(': ').$commit_id);
+		//return '/svn/?func=detailrevision&group_id='.$group_id.'&rev_id='.$commit_id;
+	}
+
+	public function getContent() {
+		global $HTML;
+		$html = '';
+		//$uh = new UserHelper();
+		$request = HTTPRequest::instance();
+		$pm = ProjectManager::instance();
+		$project = $pm->getProject($request->get('group_id'));
+		$revisions = array();
+		if ($project->usesPlugin('scmsvn') && forge_check_perm('scmsvn', $project->getID(), 'read')) {
+			$scmPlugin = plugin_get_object('scmsvn');
+			$revisions = $scmPlugin->getCommits($project, null, self::NB_COMMITS_TO_DISPLAY);
+		}
+		if ($project->usesPlugin('scmgit') && forge_check_perm('scmgit', $project->getID(), 'read')) {
+			$scmPlugin = plugin_get_object('scmgit');
+			$revisions = $scmPlugin->getCommits($project, null, self::NB_COMMITS_TO_DISPLAY);
+		}
+		if (count($revisions) > 0) {
+			foreach ($revisions as $key => $revision) {
+				$revisionDescription = substr($revision['description'], 0, 255);
+				if (strlen($revision['description']) > 255) {
+					$revisionDescription .= ' [...]';
+				}
+				$html .= html_e('div', array('class' => $HTML->boxGetAltRowStyle($key, true), 'style' => 'border-bottom:1px solid #ddd'),
+						html_e('div', array('style' => 'font-size:0.98em'),
+							$this->_getLinkToCommit($project, $revision['commit_id'], $revision['pluginName']).
+							' '._('on').' '.
+							date(_("Y-m-d H:i"), $revision['date'])).
+						html_e('div', array('style' => 'padding-left:20px; padding-bottom:4px; color:#555'),
+							$revisionDescription));
+			}
+		} else {
+			$html .= $HTML->information(_('No commit found'));
+		}
+		return $html;
+	}
+
+	function getCategory() {
+		return _('SCM');
+	}
+
+	function getDescription() {
+		return _('List the 5 most recent commits by team project.');
+	}
+
+	function isAjax() {
+		return true;
+	}
+
+	function getAjaxUrl($owner_id, $owner_type) {
+		$request =& HTTPRequest::instance();
+		$ajax_url = parent::getAjaxUrl($owner_id, $owner_type);
+		if ($request->exist('hide_item_id') || $request->exist('hide_scm')) {
+			$ajax_url .= '&hide_item_id='.$request->get('hide_item_id').'&hide_scm='.$request->get('hide_scm');
+		}
+		return $ajax_url;
+	}
+
+	function isAvailable() {
+		return isset($this->content['title']);
+	}
+
+	function canBeUsedByProject(&$project) {
+		return $project->usesSCM();
+	}
+}

commit 1f86520548d31c955c5d56e00374fd394db3baae
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Oct 25 17:26:23 2014 +0200

    getUserCommits -> getCommits: more generic function

diff --git a/src/common/widget/Widget_MyLatestCommits.class.php b/src/common/widget/Widget_MyLatestCommits.class.php
index bf17d96..4a8c1ff 100644
--- a/src/common/widget/Widget_MyLatestCommits.class.php
+++ b/src/common/widget/Widget_MyLatestCommits.class.php
@@ -29,7 +29,7 @@ class Widget_MyLatestCommits extends Widget {
 	const NB_COMMITS_TO_DISPLAY = 5;
 
 	/**
-	* Number of SVN commits to display (user preferences)
+	* Number of commits to display (user preferences)
 	*/
 	private $_nb_commits;
 
@@ -59,7 +59,6 @@ class Widget_MyLatestCommits extends Widget {
 			}
 		}
 		return util_make_link($url, _('commit')._(': ').$commit_id);
-		//return '/svn/?func=detailrevision&group_id='.$group_id.'&rev_id='.$commit_id;
 	}
 
 	public function getContent() {
@@ -87,13 +86,13 @@ class Widget_MyLatestCommits extends Widget {
 				$hide_scm = null;
 			}
 			$revisions = array();
-			if ($project->usesPlugin('scmsvn') && forge_check_perm('scmsvn', $project->getID(), 'read')) {
+			if ($project->usesPlugin('scmsvn') && forge_check_perm('scm', $project->getID(), 'read')) {
 				$scmPlugin = plugin_get_object('scmsvn');
-				$revisions = $scmPlugin->getUserCommits($project, $user, $this->_nb_commits);
+				$revisions = $scmPlugin->getCommits($project, $user, $this->_nb_commits);
 			}
-			if ($project->usesPlugin('scmgit') && forge_check_perm('scmgit', $project->getID(), 'read')) {
+			if ($project->usesPlugin('scmgit') && forge_check_perm('scm', $project->getID(), 'read')) {
 				$scmPlugin = plugin_get_object('scmgit');
-				$revisions = $scmPlugin->getUserCommits($project, $user, $this->_nb_commits);
+				$revisions = $scmPlugin->getCommits($project, $user, $this->_nb_commits);
 			}
 			if (count($revisions) > 0) {
 				$global_nb_revisions += count($revisions);
@@ -101,13 +100,12 @@ class Widget_MyLatestCommits extends Widget {
 				$html .= html_e('div', array(), $hide_url.util_make_link('/scm/?group_id='.$project->getID(), $project->getPublicName()));
 
 				if (!$hide_now) {
-					$i = 0;
-					foreach ($revisions as $revision) {
+					foreach ($revisions as $key => $revision) {
 						$revisionDescription = substr($revision['description'], 0, 255);
 						if (strlen($revision['description']) > 255) {
 							$revisionDescription .= ' [...]';
 						}
-						$html .= html_e('div', array('class' => $HTML->boxGetAltRowStyle($i++, true), 'style' => 'border-bottom:1px solid #ddd'),
+						$html .= html_e('div', array('class' => $HTML->boxGetAltRowStyle($key, true), 'style' => 'border-bottom:1px solid #ddd'),
 								html_e('div', array('style' => 'font-size:0.98em'),
 									$this->_getLinkToCommit($project, $revision['commit_id'], $revision['pluginName']).
 									' '._('on').' '.
diff --git a/src/plugins/scmgit/common/GitPlugin.class.php b/src/plugins/scmgit/common/GitPlugin.class.php
index cd1c101..bee7f50 100644
--- a/src/plugins/scmgit/common/GitPlugin.class.php
+++ b/src/plugins/scmgit/common/GitPlugin.class.php
@@ -1159,15 +1159,22 @@ control over it to the project's administrator.");
 		echo $HTML->closeForm();
 	}
 
-	function getUserCommits($project, $user, $nb_commits) {
+	function getCommits($project, $user = null, $nb_commits) {
 		$commits = array();
 		if ($project->usesPlugin($this->name) && forge_get_config('use_dav', $this->name) && forge_check_perm($this->name, $project->getID(), 'read')) {
 			$repo = forge_get_config('repos_path', $this->name) . '/' . $project->getUnixName() . '/' . $project->getUnixName() . '.git';
-			$email = $user->getEmail();
-			$fullname = $user->getFirstName().' '.$user->getLastName();
-			$userunixname = $user->getUnixName();
+			if ($user) {
+				$email = $user->getEmail();
+				$fullname = $user->getFirstName().' '.$user->getLastName();
+				$userunixname = $user->getUnixName();
+				$pipecmd = "GIT_DIR=\"$repo\" git log --date=raw --all --pretty='format:%ad||%ae||%s||%h' --name-status --max-count=$nb_commits --author=\"$email\" --author=\"$fullname\"  --author=\"$userunixname\"";
+
+			} else {
+				$pipecmd = "GIT_DIR=\"$repo\" git log --date=raw --all --pretty='format:%ad||%ae||%s||%h' --name-status --max-count=$nb_commits";
+
+			}
 			if (is_dir($repo)) {
-				$pipe = popen("GIT_DIR=\"$repo\" git log --date=raw --all --pretty='format:%ad||%ae||%s||%h' --name-status --max-count=$nb_commits --author=\"$email\" --author=\"$fullname\"  --author=\"$userunixname\"", 'r' );
+				$pipe = popen($pipecmd, 'r' );
 				$i = 0;
 				while (!feof($pipe) && $data = fgets($pipe)) {
 					$line = trim($data);
diff --git a/src/plugins/scmsvn/common/SVNPlugin.class.php b/src/plugins/scmsvn/common/SVNPlugin.class.php
index 9a9fcb2..c7e8d99 100644
--- a/src/plugins/scmsvn/common/SVNPlugin.class.php
+++ b/src/plugins/scmsvn/common/SVNPlugin.class.php
@@ -682,7 +682,7 @@ some control over it to the project's administrator.");
 		return true;
 	}
 
-	function getUserCommits($project, $user, $nbCommits) {
+	function getCommits($project, $user = null, $nbCommits) {
 		global $commits, $users, $adds, $updates, $messages, $times, $revisions, $deletes, $time_ok, $user_list, $last_message, $notimecheck;
 		$commits = 0;
 		$users = array();
@@ -696,14 +696,17 @@ some control over it to the project's administrator.");
 		$user_list = array();
 		$last_message = '';
 		$notimecheck = true;
-		$userRevisions = array();
+		$revisionsArr = array();
 		if ($project->usesPlugin($this->name) && forge_get_config('use_dav', $this->name) && forge_check_perm($this->name, $project->getID(), 'read')) {
 			$repo = forge_get_config('repos_path', $this->name) . '/' . $project->getUnixName();
-			$email = $user->getEmail();
-			$fullname = $user->getFirstName().' '.$user->getLastName();
-			$userunixname = $user->getUnixName();
+			if ($user) {
+				$userunixname = $user->getUnixName();
+				$pipecmd = "svn log file://$repo --xml -v --limit $nbCommits --search \"$userunixname\" 2> /dev/null";
+			} else {
+				$pipecmd = "svn log file://$repo --xml -v --limit $nbCommits 2> /dev/null";
+			}
 			if (is_dir($repo)) {
-				$pipe = popen("svn log file://$repo --xml -v --limit $nbCommits --search \"$userunixname\" 2> /dev/null", 'r' );
+				$pipe = popen($pipecmd, 'r' );
 				$xml_parser = xml_parser_create();
 				xml_set_element_handler($xml_parser, "SVNPluginStartElement", "SVNPluginEndElement");
 				xml_set_character_data_handler($xml_parser, "SVNPluginCharData");
@@ -725,17 +728,22 @@ some control over it to the project's administrator.");
 			if ($adds > 0 || $updates > 0 || $commits > 0 || $deletes > 0) {
 				$i = 0;
 				foreach ($messages as $message) {
-					if ($users[$i] == $userunixname) {
-						$userRevisions[$i]['pluginName'] = 'scmsvn';
-						$userRevisions[$i]['description'] = htmlspecialchars($message);
-						$userRevisions[$i]['commit_id'] = $revisions[$i];
-						$userRevisions[$i]['date'] = $times[$i];
+					if ($user && ($users[$i] == $userunixname)) {
+						$revisionsArr[$i]['pluginName'] = 'scmsvn';
+						$revisionsArr[$i]['description'] = htmlspecialchars($message);
+						$revisionsArr[$i]['commit_id'] = $revisions[$i];
+						$revisionsArr[$i]['date'] = $times[$i];
+					} else {
+						$revisionsArr[$i]['pluginName'] = 'scmsvn';
+						$revisionsArr[$i]['description'] = htmlspecialchars($message);
+						$revisionsArr[$i]['commit_id'] = $revisions[$i];
+						$revisionsArr[$i]['date'] = $times[$i];
 					}
 					$i++;
 				}
 			}
 		}
-		return $userRevisions;
+		return $revisionsArr;
 	}
 }
 

-----------------------------------------------------------------------

Summary of changes:
 src/CHANGES                                        |    3 +-
 src/common/widget/Widget.class.php                 |   71 +++++------
 src/common/widget/Widget_MyLatestCommits.class.php |   16 ++-
 .../widget/Widget_ProjectLatestCommits.class.php   |  125 ++++++++++++++++++++
 src/plugins/scmgit/common/GitPlugin.class.php      |   17 ++-
 src/plugins/scmsvn/common/SVNPlugin.class.php      |   32 +++--
 6 files changed, 197 insertions(+), 67 deletions(-)
 create mode 100644 src/common/widget/Widget_ProjectLatestCommits.class.php


hooks/post-receive
-- 
FusionForge



More information about the Fusionforge-commits mailing list