Merge branch 'rep_quality' into develop

dev_pull
huang 9 years ago
commit 5d61d52890

@ -51,7 +51,7 @@ gem 'elasticsearch-rails'
### profile ### profile
gem 'oneapm_rpm' # gem 'oneapm_rpm'
group :development do group :development do
gem 'grape-swagger' gem 'grape-swagger'

@ -300,15 +300,13 @@ class ProjectsController < ApplicationController
return return
end end
logger.debug "111111111"*100
# over
@author = params[:user_id].blank? ? nil : User.active.find(params[:user_id]) @author = params[:user_id].blank? ? nil : User.active.find(params[:user_id])
@page = params[:page] ? params[:page].to_i + 1 : 0 @page = params[:page] ? params[:page].to_i + 1 : 0
# 根据私密性,取出符合条件的所有数据 # 根据私密性,取出符合条件的所有数据
if User.current.member_of?(@project) || User.current.admin? if User.current.member_of?(@project) || User.current.admin?
case params[:type] case params[:type]
when nil when nil
@events_pages = ForgeActivity.where("project_id = ? and forge_act_type in ('Issue', 'Message','News', 'Project', 'Attachment')", @project).includes(:forge_act).order("updated_at desc").limit(10).offset(@page * 10) @events_pages = ForgeActivity.where("project_id = ? and forge_act_type in ('Issue', 'Message','News', 'Project', 'Attachment','Commit')", @project).includes(:forge_act).order("updated_at desc").limit(10).offset(@page * 10)
when 'issue' when 'issue'
@events_pages = ForgeActivity.where("project_id = ? and forge_act_type = 'Issue'", @project).includes(:forge_act).order("updated_at desc").limit(10).offset(@page * 10) @events_pages = ForgeActivity.where("project_id = ? and forge_act_type = 'Issue'", @project).includes(:forge_act).order("updated_at desc").limit(10).offset(@page * 10)
when 'news' when 'news'
@ -321,8 +319,8 @@ class ProjectsController < ApplicationController
else else
@events_pages = ForgeActivity.includes(:project).where("forge_activities.project_id = ? and projects.is_public = ? and forge_act_type != ? ",@project,1, "Document").order("created_at desc").page(params['page'|| 1]).per(10); @events_pages = ForgeActivity.includes(:project).where("forge_activities.project_id = ? and projects.is_public = ? and forge_act_type != ? ",@project,1, "Document").order("created_at desc").page(params['page'|| 1]).per(10);
end end
logger.debug "2"*100
# g = Gitlab.client # 版本库统计图
unless @project.gpid.nil? || @project.project_score.changeset_num == 0 unless @project.gpid.nil? || @project.project_score.changeset_num == 0
# rep_statics_commit = @project.rep_statics.order("commits_num desc") # rep_statics_commit = @project.rep_statics.order("commits_num desc")
rep_statics_commit = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by commits_num desc limit 10") rep_statics_commit = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by commits_num desc limit 10")
@ -335,20 +333,14 @@ class ProjectsController < ApplicationController
@a_commits_del = rep_statics_code.map {|s| s.del.to_i } @a_commits_del = rep_statics_code.map {|s| s.del.to_i }
@a_commits_changeset = rep_statics_code.map {|s| s.changeset.to_i } @a_commits_changeset = rep_statics_code.map {|s| s.changeset.to_i }
g = Gitlab.client g = Gitlab.client
logger.debug "3"*100
begin begin
gid = @project.gpid gid = @project.gpid
logger.debug "31"*100 g_project = g.project(gid)
g_branch = g.project(gid) g_branch = g_project.default_branch.to_s
logger.debug "4"*100
g_branch = g_branch.default_branch.to_s
logger.debug "5"*100
rescue =>e rescue =>e
logger.error("get gitlab project failed: " + e) logger.error("get default branch failed: " + e)
end end
logger.debug "6"*100
@rev = g_branch.nil? ? "master" : g_branch @rev = g_branch.nil? ? "master" : g_branch
logger.debug "7"*100
end end
# 根据对应的请求,返回对应的数据 # 根据对应的请求,返回对应的数据
respond_to do |format| respond_to do |format|

@ -165,7 +165,7 @@ class QualityAnalysisController < ApplicationController
logger.info("result: delete job ###################==>#{d_job}") logger.info("result: delete job ###################==>#{d_job}")
qa.delete qa.delete
respond_to do |format| respond_to do |format|
format.html{redirect_to project_quality_analysis_path(:project_id => @project.id)} format.html{redirect_to :controller => 'repositories', :action => 'show', :id => @project, :repository_id => gitlab_repository(@project).identifier}
end end
rescue Exception => e rescue Exception => e
puts e puts e
@ -199,9 +199,6 @@ class QualityAnalysisController < ApplicationController
# update成功则返回 200 # update成功则返回 200
jenkins_job = @client.job.update("#{job_name}", @doc.to_xml) jenkins_job = @client.job.update("#{job_name}", @doc.to_xml)
get_current_build_status = @client.job.get_current_build_status("Hjqreturn-1280")
logger.error("Failed to update job: ==> #{jenkins_job}") unless jenkins_job == '200'
# 数据更新到Trustie数据 # 数据更新到Trustie数据
if jenkins_job == '200' if jenkins_job == '200'
logger.info("quality_ananlysis will be updated: ==> #{jenkins_job}") logger.info("quality_ananlysis will be updated: ==> #{jenkins_job}")

@ -48,7 +48,7 @@ class RepositoriesController < ApplicationController
include RepositoriesHelper include RepositoriesHelper
helper :project_score helper :project_score
#@root_path = RepositoriesHelper::ROOT_PATH #@root_path = RepositoriesHelper::ROOT_PATH
require 'net/ssh' # require 'net/ssh'
rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed
def new def new

@ -38,6 +38,17 @@ module ApplicationHelper
# super # super
# end # end
# 通过系统外部邮箱查找用户,如果用户不存在则用邮箱替换
def get_user_by_mail mail
user = User.find_by_mail(mail)
user.nil? ? User.find(2) : user
end
# 获取用户单位
# 优先获取高校信息如果改信息不存在则获取occupation
def get_occupation_from_user user
School.where("id=?",user.user_extensions.school_id).first.try(:name).nil? ? user.user_extensions.occupation : School.where("id=?",user.user_extensions.school_id).first.try(:name)
end
def update_visiti_count container def update_visiti_count container
container.update_column(:visits, container.visits + 1) container.update_column(:visits, container.visits + 1)

@ -22,9 +22,7 @@ class Changeset < ActiveRecord::Base
#after_save :be_user_score # user_score #after_save :be_user_score # user_score
has_many :filechanges, :class_name => 'Change', :dependent => :delete_all has_many :filechanges, :class_name => 'Change', :dependent => :delete_all
# fq has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
# end
#Added by nie #Added by nie
has_one :project_status, :dependent => :destroy has_one :project_status, :dependent => :destroy
@ -59,7 +57,6 @@ class Changeset < ActiveRecord::Base
validates :committed_on, presence: true validates :committed_on, presence: true
validates :commit_date, presence: true validates :commit_date, presence: true
validates :scmid, uniqueness: {scope: :repository_id, allow_nil: true} validates :scmid, uniqueness: {scope: :repository_id, allow_nil: true}
scope :visible, lambda {|*args| scope :visible, lambda {|*args|
includes(:repository => :project).where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args)) includes(:repository => :project).where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args))
} }
@ -68,7 +65,7 @@ class Changeset < ActiveRecord::Base
# after_update :be_user_score # after_update :be_user_score
after_destroy :down_user_score after_destroy :down_user_score
# before_create :before_create_cs # before_create :before_create_cs
after_create :act_as_forge_activity # after_create :act_as_forge_activity
def revision=(r) def revision=(r)
@ -118,7 +115,7 @@ class Changeset < ActiveRecord::Base
# 项目中提交动态类型Changeset # 项目中提交动态类型Changeset
# type0 为老版本即Trsutie数据 1为gitlab中获取的动态 # type0 为老版本即Trsutie数据 1为gitlab中获取的动态
def act_as_forge_activity def act_as_forge_activity
self.acts << ForgeActivity.new(:user_id => self.user_id, :project_id => self.project_id, :type => true) self.forge_acts << ForgeActivity.new(:user_id => self.user_id, :project_id => self.project_id, :type => true)
end end
def scan_for_issues def scan_for_issues

@ -0,0 +1,13 @@
class Commit < ActiveRecord::Base
attr_accessible :comments, :committed_on, :committer, :project_id, :repository_id, :version
validates :repository_id, presence: true
validates :version, presence: true, uniqueness: {scope: :repository_id}
validates :committed_on, presence: true
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
after_create :act_as_forge_activity
# 项目中提交动态
def act_as_forge_activity
self.forge_acts << ForgeActivity.new(:user_id => 2, :project_id => self.project_id)
end
end

@ -25,8 +25,11 @@ class ForgeActivity < ActiveRecord::Base
# 在个人动态里面增加当前动态 # 在个人动态里面增加当前动态
# 版本库提交动态不显示在用户动态中 # 版本库提交动态不显示在用户动态中
# Commit为版本库提交类型因为是从gitlab获取不能实时更新
def add_user_activity def add_user_activity
if self.forge_act_type != "Changeset" if self.forge_act_type == "Commit"
self.update_column(:updated_at, self.forge_act.committed_on)
else
user_activity = UserActivity.where("act_type = '#{self.forge_act_type.to_s}' and act_id = '#{self.forge_act_id}'").first user_activity = UserActivity.where("act_type = '#{self.forge_act_type.to_s}' and act_id = '#{self.forge_act_id}'").first
if user_activity if user_activity
user_activity.save user_activity.save
@ -50,7 +53,9 @@ class ForgeActivity < ActiveRecord::Base
# 项目提交动态不显示在组织动态中 # 项目提交动态不显示在组织动态中
def add_org_activity def add_org_activity
if self.forge_act_type != "Changeset" if self.forge_act_type == "Commit"
self.update_column(:updated_at, self.forge_act.committed_on)
else
org_activity = OrgActivity.where("org_act_type = '#{self.forge_act_type.to_s}' and org_act_id = #{self.forge_act_id}").first org_activity = OrgActivity.where("org_act_type = '#{self.forge_act_type.to_s}' and org_act_id = #{self.forge_act_id}").first
if org_activity if org_activity
org_activity.updated_at = self.updated_at org_activity.updated_at = self.updated_at

@ -56,8 +56,7 @@
<td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" align="center" align="center"><%= checked_image user.admin? %></td> <td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" align="center" align="center"><%= checked_image user.admin? %></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="created_on" align="center" title='<%=format_time(user.created_on)%>'><%= format_time(user.created_on) %></td> <td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="created_on" align="center" title='<%=format_time(user.created_on)%>'><%= format_time(user.created_on) %></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="last_login_on" align="center" title='<%= format_time(user.last_login_on)%>'><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td> <td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="last_login_on" align="center" title='<%= format_time(user.last_login_on)%>'><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td>
<% occupation = user.user_extensions.identity == 0 ? School.where("id=?",user.user_extensions.school_id).first.try(:name) : user.user_extensions.occupation %> <td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" align="center" align="center" title="<%= get_occupation_from_user(user) %>"> <%= truncate(get_occupation_from_user(user), :length => 12 ) %></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" align="center" align="center" title="<%= occupation %>"> <%= truncate( occupation, :length => 12 ) %></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="buttons" align="center" title='<%=user.id %>'> <%= change_status_link(user) %></td> <td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="buttons" align="center" title='<%=user.id %>'> <%= change_status_link(user) %></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="buttons" align="center" title='<%=user.id %>'> <%= delete_link user_path(user, :back_url => admin_users_path(params)) unless User.current == user %></td> <td style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" class="buttons" align="center" title='<%=user.id %>'> <%= delete_link user_path(user, :back_url => admin_users_path(params)) unless User.current == user %></td>

@ -72,23 +72,8 @@
<!--Attachment --> <!--Attachment -->
<% when "Attachment" %> <% when "Attachment" %>
<%= render :partial => 'users/project_attachment', :locals => {:activity => activity.forge_act, :user_activity_id => activity.id } %> <%= render :partial => 'users/project_attachment', :locals => {:activity => activity.forge_act, :user_activity_id => activity.id } %>
<!--<div class="problem_main">--> <% when "Commit" %>
<!--<a class="problem_pic fl"><%#= image_tag(url_to_avatar(activity.user), :width => "42", :height => "42") %></a>--> <%= render :partial => 'projects/project_commit', :locals => {:activity => activity.forge_act, :user_activity_id => activity.id } %>
<!--<div class="problem_txt fl mt5 break_word">-->
<!--<a class="problem_name fl ">-->
<!--<%#= h(e.project) if @project.nil? || @project.id != e.project_id %>-->
<!--<%#= link_to h(activity.user), user_path(activity.user_id), :class => "problem_name c_orange fl" %></a><span class="fl"> <%#= l(:label_new_activity) %>-->
<!--</span>-->
<%#= link_to format_activity_title("#{l(:label_attachment)}: #{act.filename}"), {:controller => 'attachments', :action => 'show', :id => act.id}, :class => "problem_tit fl fb" %>
<!--<br/>-->
<!--<p class="mt5 break_word"><#%= textAreailizable act, :description %><br/>-->
<!--<%#= l :label_create_time %>-->
<!--<%#= format_activity_day(act.created_on) %> <%#= format_time(act.created_on, false) %></p>-->
<!--</div>-->
<!--<div class="cl"></div>-->
<!--</div>-->
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>

@ -0,0 +1,28 @@
<% project = Project.find(activity.project_id) %>
<% user = get_user_by_mail(activity.committer) %>
<div class="resources mt10">
<div class="homepagePostBrief">
<div class="homepagePostPortrait">
<%= link_to image_tag(url_to_avatar(user), :width => "50", :height => "50"), user_path(user), :alt => "用户头像" %>
<%= render :partial => 'users/show_detail_info', :locals => {:user => user} %>
</div>
<div class="homepagePostDes">
<div class="homepagePostTo break_word">
<% if user.try(:realname) == ' ' %>
<%= link_to user, user_path(user), :class => "newsBlue mr15" %>
<% else %>
<%= link_to user.try(:realname), user_path(user), :class => "newsBlue mr15" %>
<% end %>
TO
<%= link_to project.to_s+" | 项目代码提交", project_path(project.id,:host=>Setting.host_course), :class => "newsBlue ml15" %>
</div>
<div class="homepagePostTitle break_word" >
<%= link_to activity.comments, {:controller => 'repositories', :action => 'commit_diff', :id => project.id, :changeset => activity.version}, :class => "postGrey" %>
</div>
<div class="homepagePostDate">
提交时间:<%= format_time(activity.committed_on) %>
</div>
</div>
<div class="cl"></div>
</div>
</div>

@ -34,7 +34,7 @@
<p class="fontGrey3">代码重复度</p> <p class="fontGrey3">代码重复度</p>
<p class="fontBlue2 pr"><%= @ha["duplicated_lines_density"].to_i == 0 ? 0 : @ha["duplicated_lines_density"] %> <p class="fontBlue2 pr"><%= @ha["duplicated_lines_density"].to_i == 0 ? 0 : @ha["duplicated_lines_density"] %>
<span class="f10 c_white analysis-genral-icon <%= duplicated_lines_density_status(@ha["duplicated_lines_density"].to_i)[1] %> borderRadius"> <span class="f10 c_white analysis-genral-icon <%= duplicated_lines_density_status(@ha["duplicated_lines_density"].to_i)[1] %> borderRadius">
<%= @ha["duplicated_lines_density"].nil? ? 0 : duplicated_lines_density_status(@ha["duplicated_lines_density"].to_i)[0] %> <%= @ha["duplicated_lines_density"].nil? ? "良好" : duplicated_lines_density_status(@ha["duplicated_lines_density"].to_i)[0] %>
</span> </span>
</p> </p>
</div> </div>
@ -43,7 +43,7 @@
<p class="fontGrey3">注释率</p> <p class="fontGrey3">注释率</p>
<p class="fontBlue2 pr"><%= @ha["comment_lines_density"].to_i == 0 ? 0 : @ha["comment_lines_density"] %> <p class="fontBlue2 pr"><%= @ha["comment_lines_density"].to_i == 0 ? 0 : @ha["comment_lines_density"] %>
<span class="f10 c_white analysis-genral-icon <%= comment_lines_density_status(@ha["comment_lines_density"].to_i)[1] %> borderRadius"> <span class="f10 c_white analysis-genral-icon <%= comment_lines_density_status(@ha["comment_lines_density"].to_i)[1] %> borderRadius">
<%= @ha["comment_lines_density"].nil? ? 0 : comment_lines_density_status(@ha["comment_lines_density"].to_i)[0] %> <%= @ha["comment_lines_density"].nil? ? "较低" : comment_lines_density_status(@ha["comment_lines_density"].to_i)[0] %>
</span> </span>
</p> </p>
</div> </div>

@ -1,6 +0,0 @@
class AddTypeToChangeset < ActiveRecord::Migration
def change
add_column :changesets, :project_id, :integer
add_column :changesets, :type, :integer, :default => false
end
end

@ -0,0 +1,14 @@
class CreateCommits < ActiveRecord::Migration
def change
create_table :commits do |t|
t.integer :repository_id
t.string :version
t.string :committer
t.text :comments
t.datetime :committed_on
t.integer :project_id
t.timestamps
end
end
end

@ -1,25 +1,32 @@
namespace :gitlab do namespace :gitlab do
desc "sync gitlab's commit acts to trustie" desc "sync gitlab's commit acts to trustie"
task :forge_acts => :environment do task :forge_acts => :environment do
begin g = Gitlab.client
g = Gitlab.client projects = Project.find_by_sql("select * from projects where gpid is not null and id not in (2,847,931,942)")
projects = Project.find_by_sql("select * from projects where gpid is not null") projects.each do |project|
projects.each do |project| begin
g_project = g.project(project.gpid) g_project = g.project(project.gpid)
# 获取默认分支 # 获取默认分支
g_default_branch = g_project.default_branch.nil? ? "master" : g_project.default_branch g_default_branch = g_project.default_branch.nil? ? "master" : g_project.default_branch
# 总的提交次数 # 总的提交次数
commit_count = g.user_static(project.gpid, :rev => g_default_branch).count commit_count = g.user_static(project.gpid, :rev => g_default_branch).count
pages = commit_count / 20 + 1 pages = commit_count / 20 + 1
pages.each do |page| puts "#{pages}"
commits = g.commits(g_project.gpid, :ref_name => g_default_branch, :page => page) puts "project id is #{project.id}"
# api获取每次只能获取20次提交所以需要通过取得page值来获取每页的提交动态
(0..pages).each do |page|
commits = g.commits(project.gpid, :ref_name => g_default_branch, :page => page)
commits.each do |commit| commits.each do |commit|
Changeset.create(:project_id => project.id, :repository_id => project.gpid, :revision => commit.id, :committer => commit.author_email, :comments => Redmine::CodesetUtil.to_utf8(commit.title, 'UTF-8'), :committed_on => commit.created_at) Commit.create(:project_id => project.id, :repository_id => project.gpid, :version => commit.id, :committer => commit.author_email, :comments => Redmine::CodesetUtil.to_utf8(commit.title, 'UTF-8'), :committed_on => commit.created_at)
end end
end end
rescue Exception => e
# puts "Some wrong with project #{project.id}"
# Project.where(:id => project.id).first.update_column(:gpid, nil)
# Repository.where(:project_id => project.id).first.destroy
# try
puts e
end end
rescue Exception => e
puts e
end end
end end
end end

@ -0,0 +1,32 @@
namespace :gitlab do
desc "sync gitlab's commit acts to trustie"
task :forge_acts_update => :environment do
g = Gitlab.client
ids = [2,847,931,942]
projects = Project.find(ids)
projects.each do |project|
# c = Commit.where(:project_id => project.id)
# if c.blank?
begin
g_project = g.project(project.gpid)
# 获取默认分支
g_default_branch = g_project.default_branch.nil? ? "master" : g_project.default_branch
# 总的提交次数
commit_count = g.user_static(project.gpid, :rev => g_default_branch).count
pages = commit_count / 20 + 1
puts "#{pages}"
puts "project id is #{project.id}"
# api获取每次只能获取20次提交所以需要通过取得page值来获取每页的提交动态
(0..pages).each do |page|
commits = g.commits(project.gpid, :ref_name => g_default_branch, :page => page)
commits.each do |commit|
Commit.create(:project_id => project.id, :repository_id => project.gpid, :version => commit.id, :committer => commit.author_email, :comments => Redmine::CodesetUtil.to_utf8(commit.title, 'UTF-8'), :committed_on => commit.created_at)
end
end
rescue Exception => e
puts e
end
# end
end
end
end

@ -0,0 +1,41 @@
namespace :gitlab do
desc "sync gitlab's commit acts to trustie"
task :acts_to_trustie => :environment do
begin
projects = Project.where(:status => 1)
projects.each do |project|
c = Commit.find_by_sql("SELECT * FROM `commits` where project_id = #{project.id} order by committed_on limit 1;")
g_project = g.project(project.gpid)
end
rescue Exception => e
puts e
end
g = Gitlab.client
ids = [2,847,931,942]
projects = Project.find(ids)
projects.each do |project|
c = Commit.where(:project_id => project.id)
if c.blank?
begin
g_project = g.project(project.gpid)
# 获取默认分支
g_default_branch = g_project.default_branch.nil? ? "master" : g_project.default_branch
# 总的提交次数
commit_count = g.user_static(project.gpid, :rev => g_default_branch).count
pages = commit_count / 20 + 1
puts "#{pages}"
puts "project id is #{project.id}"
# api获取每次只能获取20次提交所以需要通过取得page值来获取每页的提交动态
(0..pages).each do |page|
commits = g.commits(project.gpid, :ref_name => g_default_branch, :page => page)
commits.each do |commit|
Commit.create(:project_id => project.id, :repository_id => project.gpid, :version => commit.id, :committer => commit.author_email, :comments => Redmine::CodesetUtil.to_utf8(commit.title, 'UTF-8'), :committed_on => commit.created_at)
end
end
rescue Exception => e
puts e
end
end
end
end
end

@ -0,0 +1,18 @@
namespace :gitlab do
desc "sync gitlab's commit acts to trustie"
task :unused => :environment do
begin
Project.where("id in (161,236,266)").update_all(:gpid => nil)
repositories = Repository.find_by_sql("select * from repositories where project_id in (select project_id from repositories group by project_id having count(project_id) > 1);")
repositories.each do |rep|
puts "#{rep.id}"
if rep.type == "Repository::Git"
rep.destroy
end
end
# Repository.where("project_id in (161,236,266)").destroy_all
rescue Exception => e
puts e
end
end
end

@ -0,0 +1,11 @@
FactoryGirl.define do
factory :commit do
repository_id 1
version "MyString"
committer "MyString"
comments "MyText"
committed_on "2016-07-21"
project_id 1
end
end

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe Commit, :type => :model do
pending "add some examples to (or delete) #{__FILE__}"
end
Loading…
Cancel
Save