Merge branch 'sw_new_course' of http://repository.trustie.net/xianbo/trustie2 into sw_new_course
Conflicts: app/controllers/admin_controller.rbsw_new_course
commit
2e5916cf5e
@ -0,0 +1,11 @@
|
|||||||
|
class MemoMessage < ActiveRecord::Base
|
||||||
|
attr_accessible :forum_id, :memo_id, :memo_type, :user_id, :viewed
|
||||||
|
|
||||||
|
belongs_to :memo
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
|
validates :user_id,presence: true
|
||||||
|
validates :forum_id,presence: true
|
||||||
|
validates :memo_id,presence: true
|
||||||
|
validates :memo_type, presence: true
|
||||||
|
end
|
@ -0,0 +1,10 @@
|
|||||||
|
class UserFeedbackMessage < ActiveRecord::Base
|
||||||
|
attr_accessible :journals_for_message_id, :journals_for_message_type, :user_id, :viewed
|
||||||
|
|
||||||
|
belongs_to :journals_for_message
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
|
validates :user_id,presence: true
|
||||||
|
validates :journals_for_message_id,presence: true
|
||||||
|
validates :journals_for_message_type, presence: true
|
||||||
|
end
|
@ -1,40 +1,47 @@
|
|||||||
<div class="navHomepage">
|
<div class="navHomepage">
|
||||||
<div class="navHomepageLogo fl">
|
<div class="navHomepageLogo fl">
|
||||||
<%=link_to image_tag("../images/logo.png",weight:"51px", height: "45px",class: "mt3")%>
|
<%=link_to image_tag("../images/logo.png",width:"51px", height: "45px",class: "mt3"), "javascript:void(0);"%>
|
||||||
</div>
|
</div>
|
||||||
<div class="fl">
|
<div class="fl">
|
||||||
<ul>
|
<ul>
|
||||||
<li class="navHomepageMenu fl"><a href="javascript:void(0);" class="homepageWhite f16">首页</a></li>
|
<li class="navHomepageMenu fl">
|
||||||
<li class="navHomepageMenu fl"><a href="javascript:void(0);" class="homepageWhite f16">资源库</a></li>
|
<a href="javascript:void(0);" class="c_white f16">帮助中心</a>
|
||||||
<li class="navHomepageMenu fl"><a href="javascript:void(0);" class="homepageWhite f16">作业</a></li>
|
</li>
|
||||||
<li class="navHomepageMenu fl"><a href="javascript:void(0);" class="homepageWhite f16">联系人</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="fl">
|
|
||||||
|
<div class="fl" id="navHomepageSearch">
|
||||||
<form class="navHomepageSearchBox">
|
<form class="navHomepageSearchBox">
|
||||||
<input type="text" name="navHomepageSearch" class="navHomepageSearchInput" />
|
<input type="text" name="navHomepageSearch" class="navHomepageSearchInput"/>
|
||||||
<a href="javascript:void(0);" class="homepageSearchIcon"></a>
|
<a href="javascript:void(0);" class="homepageSearchIcon"></a>
|
||||||
</form>
|
</form>
|
||||||
|
<div class="navSearchTypeBox" id="navHomepageSearchType">
|
||||||
|
<div class="fl mr15">
|
||||||
|
<div class="fl mt5">
|
||||||
|
<input type="radio" value="课程" name="navSearchType" checked/>
|
||||||
</div>
|
</div>
|
||||||
<div class="navHomepageProfile">
|
课程
|
||||||
<ul>
|
</div>
|
||||||
<li class="homepageProfileMenuIcon">
|
<div class="fl mr15">
|
||||||
<a href="javascript:void(0);">
|
<div class="fl mt5">
|
||||||
<div class="mt5 mb8">
|
<input type="radio" value="项目" name="navSearchType" />
|
||||||
<img src="images/homepageProfileImage.png" width="40" height="40" />
|
</div>
|
||||||
</div>
|
项目
|
||||||
</a>
|
</div>
|
||||||
<ul class="topnav_login_list">
|
<div class="fl mr15">
|
||||||
<li><a href="javascript:void(0);" class="menuGrey">修改资料</a> </li>
|
<div class="fl mt5">
|
||||||
<li><a href="javascript:void(0);" class="menuGrey">账号设置</a> </li>
|
<input type="radio" value="用户" name="navSearchType" />
|
||||||
<li><a href="javascript:void(0);" class="menuGrey">退出</a></li>
|
</div>
|
||||||
</ul>
|
用户</div>
|
||||||
</li>
|
<div id="navSearchAlert" class="fr mr10">
|
||||||
</ul>
|
<span class="c_red">请选择搜索类型</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="loginInButton" class="fr ml20">
|
||||||
|
<a href="javascript:void(0);" class="c_white db">登录</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="navHomepageNews">
|
<div id="loginSignButton" class="fr">
|
||||||
<a href="javascript:void(0);" class="homepageNewsIcon">
|
<a href="javascript:void(0);" class="c_white db">注册</a>
|
||||||
<div class="newsActive"></div>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
@ -0,0 +1,10 @@
|
|||||||
|
<% if user.user_extensions && user.user_extensions.brief_introduction && !user.user_extensions.brief_introduction.empty? %>
|
||||||
|
<%= user.user_extensions.brief_introduction %>
|
||||||
|
<% else%>
|
||||||
|
这位童鞋很懒,什么也没有留下~
|
||||||
|
<% end %>
|
||||||
|
<% if User.current == user%>
|
||||||
|
<a href="javascript:void(0);" onclick="show_edit_user_introduction();">
|
||||||
|
<img src="../images/signature_edit.png" width="12" height="12" />
|
||||||
|
</a>
|
||||||
|
<% end%>
|
@ -0,0 +1,12 @@
|
|||||||
|
<% courses.each do |course|%>
|
||||||
|
<li class="homepageLeftMenuCoursesLine">
|
||||||
|
<%= link_to (course_endTime_timeout?(course) ? "[已关闭] #{course.name}" : "#{course.name}").html_safe, course_path(course.id,:host=>Setting.host_course), :class => "coursesLineGrey"%>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if courses.size == 5%>
|
||||||
|
<li class="homepageLeftMenuMore" id="user_show_more_course">
|
||||||
|
<input type="hidden" value="<%= page%>" id="course_page_num">
|
||||||
|
<a href="javascript:void(0);" class="homepageLeftMenuMoreIcon" onclick="show_more_course('<%= user_courses4show_user_path(user.id)%>');"></a>
|
||||||
|
</li>
|
||||||
|
<% end%>
|
@ -0,0 +1,11 @@
|
|||||||
|
<% projects.each do |project|%>
|
||||||
|
<li class="homepageLeftMenuCoursesLine">
|
||||||
|
<%= link_to project.name, project_path(project.id,:host=>Setting.host_name), :class => "coursesLineGrey"%>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
<% if projects.size == 5%>
|
||||||
|
<li class="homepageLeftMenuMore" id="user_show_more_project">
|
||||||
|
<input type="hidden" value="<%= page%>" id="project_page_num">
|
||||||
|
<a href="javascript:void(0);" class="homepageLeftMenuMoreIcon" onclick="show_more_project('<%= user_projects4show_user_path(user.id)%>');"></a>
|
||||||
|
</li>
|
||||||
|
<% end%>
|
@ -1,11 +1,7 @@
|
|||||||
<% if User.current.logged?%>
|
<% if User.current.logged?%>
|
||||||
<% if User.current == target%>
|
|
||||||
<a href="<%= url_for(:controller => 'my', :action => 'account') %>" class="fr gz_btn mr10 ">编辑资料</a>
|
|
||||||
<%else%>
|
|
||||||
<%if(target.watched_by?(User.current))%>
|
<%if(target.watched_by?(User.current))%>
|
||||||
<a id="user_watch_id" href="<%= watch_path(:object_type=> 'user',:object_id=>target.id,:target_id=>target.id) %>" class="fr qx_btn mr10" data-method="delete" data-remote="true" title="取消关注">取消关注</a>
|
<%= link_to "",watch_path(:object_type=> 'user',:object_id=>target.id,:target_id=>target.id),:class => "homepageFollow", :method => "delete",:remote => "true", :title => "取消关注"%>
|
||||||
<% else %>
|
<% else %>
|
||||||
<a id="user_watch_id" href="<%= watch_path(:object_type=>'user',:object_id=>target.id,:target_id=>target.id) %>" class="fr gz_btn mr10" data-method="post" data-remote="true" title="添加关注">添加关注</a>
|
<%= link_to "",watch_path(:object_type=> 'user',:object_id=>target.id,:target_id=>target.id),:class => "homepageFollowCancel", :method => "post",:remote => "true", :title => "添加关注"%>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end%>
|
|
||||||
<% end %>
|
<% end %>
|
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
|
||||||
|
<!--<button name="button" class="sub_btn" onclick="_file.click()" onmouseover="this.focus()" style="<%#= ie8? ? 'display:none' : ''%>" type="button" ><%#= l(:label_browse) %></button>-->
|
||||||
|
<a href="javascript:void(0);" class="uploadIcon f14" name="button" onclick="_file.click()" onmouseover="" style="<%= ie8? ? 'display:none' : ''%>">
|
||||||
|
<span class="chooseFile">选择文件</span></a>
|
||||||
|
<%= file_field_tag 'attachments[dummy][file]',
|
||||||
|
:id => '_file',
|
||||||
|
:class => ie8? ? '':'file_selector',
|
||||||
|
:multiple => true,
|
||||||
|
:onchange => 'addInputFiles(this);',
|
||||||
|
:style => ie8? ? '': 'display:none',
|
||||||
|
:data => {
|
||||||
|
:max_file_size => Setting.attachment_max_size.to_i.kilobytes,
|
||||||
|
:max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)),
|
||||||
|
:max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i,
|
||||||
|
:upload_path => uploads_path(:format => 'js'),
|
||||||
|
:description_placeholder => l(:label_optional_description),
|
||||||
|
:field_is_public => l(:field_is_public),
|
||||||
|
:are_you_sure => l(:text_are_you_sure),
|
||||||
|
:file_count => l(:label_file_count),
|
||||||
|
:delete_all_files => l(:text_are_you_sure_all)
|
||||||
|
} %>
|
||||||
|
<!--<input type="submit" name="" value="上传文件" class="f_l ml10" style="width:80px; height:26px;">-->
|
||||||
|
|
||||||
|
<!--<span id="upload_file_count">-->
|
||||||
|
<!--<%#= l(:label_no_file_uploaded)%>-->
|
||||||
|
<!--</span>-->
|
||||||
|
<!--(<%#= l(:label_max_size) %>:-->
|
||||||
|
<%#= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>
|
||||||
|
<!--)-->
|
@ -0,0 +1,7 @@
|
|||||||
|
<%= form_tag( url_for(:controller => 'users',:action => 'resource_search',:id=>user.id),
|
||||||
|
:remote=>true ,:method => 'get',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %>
|
||||||
|
<input type="text" name="search" placeholder="输入资源关键词进行搜索" class="searchResource" />
|
||||||
|
<%= hidden_field_tag(:type,type) %>
|
||||||
|
<%= submit_tag '',:class=>'homepageSearchIcon',:onfocus=>'this.blur();',:style=>'border-style:none' %>
|
||||||
|
<!--<a href="javascript:void(0);" onclick='this.parent.submit();return false;' class="searchIcon"></a>-->
|
||||||
|
<% end %>
|
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
|
||||||
|
<div class="resourceSharePopup">
|
||||||
|
<div>
|
||||||
|
<div class="sendText fl">将资源发送至</div>
|
||||||
|
<div class="resourcesSendTo">
|
||||||
|
<select class="resourcesSendType" onclick="chooseSendType('<%= send_id%>','<%= send_ids%>');">
|
||||||
|
<option value="1">课程</option>
|
||||||
|
<option value="2" selected>项目</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div>
|
||||||
|
<div class="fl">
|
||||||
|
<%= form_tag search_user_project_user_path(user),:method => 'get',
|
||||||
|
:remote=>true,:id=>'search_user_project_form',:class=>'resourcesSearchBox' do %>
|
||||||
|
<%= hidden_field_tag(:send_id, send_id) %>
|
||||||
|
<%= hidden_field_tag(:send_ids, send_ids) %>
|
||||||
|
<input type="text" name="search" placeholder="输入项目ID或者名称搜索" class="searchResourcePopup" />
|
||||||
|
<!--<a href="javascript:void(0);" class="searchIconPopup"></a>-->
|
||||||
|
<%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<%= form_tag add_exist_file_to_project_user_path(user),:remote=>true,:id=>'projects_list_form' %>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<%= hidden_field_tag(:send_id, send_id) %>
|
||||||
|
<%= hidden_field_tag(:send_ids, send_ids) %>
|
||||||
|
<div class="courseReferContainer">
|
||||||
|
<% if !projects.empty? %>
|
||||||
|
<% projects.each do |project| %>
|
||||||
|
<ul class="courseSend fl">
|
||||||
|
<li class="fl">
|
||||||
|
<input name="projects_ids[]" type="checkbox" value="<%= project.id %>" class="courseSendCheckbox"/>
|
||||||
|
</li>
|
||||||
|
<li class="sendCourseName fl"><%= truncate( project.name,:length=>18)%></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="courseSendSubmit">
|
||||||
|
<!--<a href="javascript:void(0);" class="sendSourceText">确定</a>-->
|
||||||
|
<%= submit_tag '确定',:class=>'sendSourceText',:onfocus=>'this.blur();' %>
|
||||||
|
</div>
|
||||||
|
<div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText" onclick="closeModal();">取消</a></div>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
|
||||||
|
<div class="resourceSharePopup">
|
||||||
|
<div>
|
||||||
|
<div class="sendText fl">将资源发送至</div>
|
||||||
|
<div class="resourcesSendTo">
|
||||||
|
<select class="resourcesSendType" onclick="chooseSendType('<%= send_id%>','<%= send_ids%>');">
|
||||||
|
<option value="1">课程</option>
|
||||||
|
<option value="2">项目</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div>
|
||||||
|
<div class="fl">
|
||||||
|
<%= form_tag search_user_course_user_path(user),:method => 'get',
|
||||||
|
:remote=>true,:id=>'search_user_course_form',:class=>'resourcesSearchBox' do %>
|
||||||
|
<%= hidden_field_tag(:send_id, send_id) %>
|
||||||
|
<%= hidden_field_tag(:send_ids, send_ids) %>
|
||||||
|
<input type="text" name="search" placeholder="输入课程ID或者名称搜索" class="searchResourcePopup" />
|
||||||
|
<!--<a href="javascript:void(0);" class="searchIconPopup"></a>-->
|
||||||
|
<%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<%= form_tag add_exist_file_to_course_user_path(user),:remote=>true,:id=>'course_list_form' %>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<%= hidden_field_tag(:send_id, send_id) %>
|
||||||
|
<%= hidden_field_tag(:send_ids, send_ids) %>
|
||||||
|
<div class="courseReferContainer">
|
||||||
|
<% if !courses.empty? %>
|
||||||
|
<% courses.each do |course| %>
|
||||||
|
<ul class="courseSend fl">
|
||||||
|
<li class="fl">
|
||||||
|
<input name="course_ids[]" type="checkbox" value="<%= course.id %>" class="courseSendCheckbox"/>
|
||||||
|
</li>
|
||||||
|
<li class="sendCourseName fl"><%= truncate(course.name,:length=>18)%></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="courseSendSubmit">
|
||||||
|
<!--<a href="javascript:void(0);" class="sendSourceText">确定</a>-->
|
||||||
|
<%= submit_tag '确定',:class=>'sendSourceText',:onfocus=>'this.blur();' %>
|
||||||
|
</div>
|
||||||
|
<div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText mt10" onclick="closeModal();">取消</a></div>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
var popupHeight = $(".resourceUploadPopup").outerHeight(true);
|
||||||
|
$(".resourceUploadPopup").css("marginTop",-popupHeight/2);
|
||||||
|
|
||||||
|
|
||||||
|
$(".resourcePopupClose").click(function(){
|
||||||
|
$(".resourceUploadPopup").css("display","none");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="resourceUploadPopup"><span class="uploadText">上传资源 </span>
|
||||||
|
<div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose"></a></div>
|
||||||
|
<div class="uploadBoxContainer">
|
||||||
|
<div class="uploadBox"><a href="javascript:void(0);" class="uploadIcon f14"><span class="chooseFile">选择文件</span></a></div>
|
||||||
|
<div class="uploadResourceIntr">
|
||||||
|
<div class="uploadResourceName">(未选择文件)</div>
|
||||||
|
<div class="uploadResourceIntr2">您可以上传小于<span class="c_red">50MB</span>的文件</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<select class="uploadType">
|
||||||
|
<option value="">资源类型</option>
|
||||||
|
<option value="课件资源">课件资源</option>
|
||||||
|
<option value=“"项目资源">项目资源</option>
|
||||||
|
<option value="附件">附件</option>
|
||||||
|
<option value="无">无</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input type="text" name="" placeholder="关键词" class="uploadKeyword" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="courseSendSubmit"><a href="javascript:void(0);" class="sendSourceText">确定</a></div>
|
||||||
|
<div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText">取消</a></div>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
<% if attachments.nil? || attachments.empty? %>
|
||||||
|
<% else %>
|
||||||
|
<% attachments.each do |attach| %>
|
||||||
|
<ul class="resourcesList">
|
||||||
|
<li class="resourcesListCheckbox fl">
|
||||||
|
<input name="checkbox1[]" type="checkbox" onclick="checkAllBox($(this));" value="<%= attach.id%>" class="resourcesCheckbox" />
|
||||||
|
</li>
|
||||||
|
<li class="resourcesListName fl">
|
||||||
|
<!--<a href="javascript:void(0);" class="resourcesBlack"><%#=truncate(attach.filename,:length=>18)%></a>-->
|
||||||
|
<%= link_to truncate(attach.filename,:length=>18), download_named_attachment_path(attach.id, attach.filename),
|
||||||
|
:title => attach.filename,:class=>'resourcesBlack'%>
|
||||||
|
</li>
|
||||||
|
<li class="resourcesListSize fl"><%= number_to_human_size(attach.filesize) %></li>
|
||||||
|
<li class="resourcesListType fl"><%= get_resource_type(attach.container_type)%></li>
|
||||||
|
<li class="resourcesListUploader fl"><%=User.find(attach.author_id).realname.blank? ? User.find(attach.author_id).nickname : User.find(attach.author_id).realname %></li>
|
||||||
|
<li style="display: none"><%= attach.author_id %></li>
|
||||||
|
<li class="resourcesListTime fl"><%= format_date(attach.created_on) %></li>
|
||||||
|
<li style="display: none"><%= attach.id %></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
@ -0,0 +1,53 @@
|
|||||||
|
<div class="resourceUploadPopup"><span class="uploadDialogText">上传资源 </span>
|
||||||
|
<div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div>
|
||||||
|
<div class="uploadBoxContainer">
|
||||||
|
<%= form_tag(user_resource_create_user_path, :multipart => true,:remote => !ie8?,:name=>"upload_form",:id=>'upload_form') do %>
|
||||||
|
<div>
|
||||||
|
<span id="attachments_fields" xmlns="http://www.w3.org/1999/html">
|
||||||
|
<% if defined?(container) && container && container.saved_attachments %>
|
||||||
|
<script>alert('<% container%>')</script>
|
||||||
|
<% container.attachments.each_with_index do |attachment, i| %>
|
||||||
|
<span id="attachments_p<%= i %>" class="attachment">
|
||||||
|
<%= text_field_tag("attachments[p#{i}][filename]", attachment.filename, :class => 'filename readonly', :readonly=>'readonly')%>
|
||||||
|
<%= text_field_tag("attachments[p#{i}][description]", attachment.description, :maxlength => 254, :placeholder => l(:label_optional_description), :class => 'description', :style=>"display: inline-block;") %>
|
||||||
|
<span class="ispublic-label"><%= l(:field_is_public)%>:</span>
|
||||||
|
<%= check_box_tag("attachments[p#{i}][is_public_checkbox]", attachment.is_public,attachment.is_public == 1 ? true : false,:class => 'remove-upload')%>
|
||||||
|
<%= if attachment.id.nil?
|
||||||
|
#待补充代码
|
||||||
|
else
|
||||||
|
link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload')
|
||||||
|
end
|
||||||
|
%>
|
||||||
|
<%#= render :partial => 'tags/tag', :locals => {:obj => attachment, :object_flag => "6"} %>
|
||||||
|
|
||||||
|
<%= hidden_field_tag "attachments[p#{i}][token]", "#{attachment.token}" %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="uploadBox">
|
||||||
|
|
||||||
|
<input type="hidden" name="attachment_type" value="1">
|
||||||
|
<%= render :partial => 'attachment_list' %>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<!--<a href="javascript:void(0);" class=" fr grey_btn mr40" onclick="closeModal();"><%#= l(:button_cancel)%></a>-->
|
||||||
|
<!--<a id="submit_resource" href="javascript:void(0);" class="blue_btn fr" onclick="submit_resource();"><%#= l(:button_confirm)%></a>-->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="uploadResourceIntr">
|
||||||
|
<div class="uploadResourceName"><span id="upload_file_count">(未选择文件)</span></div>
|
||||||
|
<div class="uploadResourceIntr2">您可以上传小于<span class="c_red">50MB</span>的文件</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<div style="margin-top: 10px" >
|
||||||
|
<div class="courseSendSubmit">
|
||||||
|
<!--<a href="javascript:void(0);" class="sendSourceText" onclick="">确定</a>-->
|
||||||
|
<%= submit_tag '确定',:onclick=>'submit_files();',:onfocus=>'this.blur()',:class=>'sendSourceText' %>
|
||||||
|
</div>
|
||||||
|
<div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText" onclick="closeModal();">取消</a></div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
@ -0,0 +1,2 @@
|
|||||||
|
alert('发送成功')
|
||||||
|
closeModal();
|
@ -0,0 +1,2 @@
|
|||||||
|
alert('发送成功');
|
||||||
|
closeModal();
|
@ -0,0 +1,3 @@
|
|||||||
|
$("#user_brief_introduction_show").html("<%= escape_javascript render(:partial => "layouts/user_brief_introduction", :locals => {:user => @user}) %>");
|
||||||
|
$("#user_brief_introduction_show").show();
|
||||||
|
$("#user_brief_introduction_edit").hide();
|
@ -0,0 +1 @@
|
|||||||
|
alert(1)
|
@ -0,0 +1,5 @@
|
|||||||
|
<% if @preview_able %>
|
||||||
|
top.location.href = '<%=download_named_attachment_path(@file.id, @file.filename, preview: true) %>'
|
||||||
|
<% else %>
|
||||||
|
window.alert('该资源不可预览')
|
||||||
|
<% end %>
|
@ -0,0 +1,2 @@
|
|||||||
|
$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>');
|
||||||
|
$("#pages").html('<%= pagination_links_full @atta_pages, @atta_count, :per_page_links => false, :remote => @is_remote, :flag => true %>');
|
@ -0,0 +1,11 @@
|
|||||||
|
//var screenWidth = $(window).width();
|
||||||
|
//var screenHeight = $(window).height(); //当前浏览器窗口的 宽高
|
||||||
|
//var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度
|
||||||
|
//var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改
|
||||||
|
//var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改
|
||||||
|
var popupHeight = $(".resourceSharePopup").outerHeight(true);
|
||||||
|
$(".resourceSharePopup").css("marginTop",-popupHeight/2);
|
||||||
|
|
||||||
|
$("#upload_box").css('left','').css('top','');
|
||||||
|
$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_popup" ,:locals => {:courses=>@course,:user=>@user,:send_id=>@send_id,:send_ids=>@send_ids})%>');
|
||||||
|
$("#upload_box").css('display','block');
|
@ -0,0 +1,11 @@
|
|||||||
|
//var screenWidth = $(window).width();
|
||||||
|
//var screenHeight = $(window).height(); //当前浏览器窗口的 宽高
|
||||||
|
//var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度
|
||||||
|
//var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改
|
||||||
|
//var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改
|
||||||
|
var popupHeight = $(".resourceSharePopup").outerHeight(true);
|
||||||
|
$(".resourceSharePopup").css("marginTop",-popupHeight/2);
|
||||||
|
|
||||||
|
$("#upload_box").css('left','').css('top','');
|
||||||
|
$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_for_project_popup" ,:locals => {:projects=>@projects,:user=>@user,:send_id=>@send_id,:send_ids=>@send_ids})%>');
|
||||||
|
$("#upload_box").css('display','block');
|
@ -1,4 +1,9 @@
|
|||||||
$('#ajax-modal').html('<%= escape_javascript(render :partial => 'users/show_new_score') %>');
|
$('#ajax-modal').html('<%= escape_javascript(render :partial => 'users/show_new_score') %>');
|
||||||
showModal('ajax-modal', '400px');
|
showModal('ajax-modal', '400px');
|
||||||
$('#ajax-modal').siblings().show();
|
$('#ajax-modal').css('height','auto');
|
||||||
$('#ajax-modal').addClass('new-watcher');
|
$('#ajax-modal').siblings().remove();
|
||||||
|
$('#ajax-modal').before("<span style='float: right;cursor:pointer;padding-left: 513px;'>" +
|
||||||
|
"<a href='javascript:void(0)' onclick='hideModal();'><img src='/images/bid/close.png' width='26px' height='26px' /></a></span>");
|
||||||
|
//$('#ajax-modal').parent().removeClass("alert_praise");
|
||||||
|
$('#ajax-modal').parent().css("top","30%").css("left","35%");
|
||||||
|
$('#ajax-modal').parent().addClass("alert_box");
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
<% for item in @list %>
|
|
||||||
|
|
||||||
<div class="home_courses_list fl" nhname="rec" data-id="<%= item.id %>" data-time="<%= item.updated_at %>">
|
|
||||||
<div class="courses_list_pic fl ml10 mr10">
|
|
||||||
<a href="<%= url_for(:controller => 'courses', :action=>"show", :id=>item.id, :host=>Setting.host_course) %>"><%= image_tag(url_to_avatar(item), :style => 'width:64px;height:64px;') %></a>
|
|
||||||
</div>
|
|
||||||
<span class="fl" style="width:260px;">
|
|
||||||
<a href="<%= url_for(:controller => 'courses', :action=>"show", :id=>item.id, :host=>Setting.host_course) %>" class="home_list_title c_blue02 fl mb10" title="<%= item.name %>"><%= item.name %></a>
|
|
||||||
</span>
|
|
||||||
<div class="fl c_dgrey">
|
|
||||||
<p>主讲老师:<a href="<%= user_path(item.teacher) %>" title="<%= item.teacher.show_name %>"><%= item.teacher.show_name %></a></p>
|
|
||||||
<p>课程作业:<a href="<%=url_for(:controller => 'homework_common', :action => 'index',:course=>item.id, :host=>Setting.host_course)%>"><%= item.homework_commons.count %></a> <span class="ml10"></span>学生:<a href="<%= url_for(:controller => 'courses', :action=>"member", :id=>item.id,:role=>2, :host=>Setting.host_course) %>"><%= studentCount(item) %></a></p>
|
|
||||||
</div>
|
|
||||||
<div class="cl"></div>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
@ -0,0 +1 @@
|
|||||||
|
$("#user_show_more_course").replaceWith("<%= escape_javascript( render :partial => 'layouts/user_courses',:locals => {:courses => @courses,:user => @user, :page => @page} )%>");
|
@ -1,16 +0,0 @@
|
|||||||
<% for item in @list %>
|
|
||||||
<div class="home_courses_list fl" nhname="rec" data-id="<%= item.id %>" data-time="<%= item.updated_on %>">
|
|
||||||
<div class="courses_list_pic fl ml10 mr10">
|
|
||||||
<a href="<%= url_for(:controller => 'projects', :action=>"show", :id=>item.id, :host=>Setting.host_name) %>"><%= image_tag(url_to_avatar(item), :style => 'width:64px;height:64px;') %></a>
|
|
||||||
</div>
|
|
||||||
<span class="fl" style="width:260px;">
|
|
||||||
<a href="<%= url_for(:controller => 'projects', :action=>"show", :id=>item.id, :host=>Setting.host_name) %>" class="home_list_title c_blue02 fl mb10" title="<%= item.name %>"><%= item.name %></a>
|
|
||||||
</span>
|
|
||||||
<div class="fl c_dgrey">
|
|
||||||
<!--<p>项目评分:<a href="<%#= url_for(:controller => 'projects', :action => 'show_projects_score', :id => item.id,:host=>Setting.host_name) %>" data-remote="true"><%#= format( "%.2f" , project_scores(item) ).to_i %></a></p>-->
|
|
||||||
<p>项目评分:<a href="<%= url_for(:controller => 'projects', :action => 'show_projects_score', :id => item.id) %>" data-remote="true"><%= format( "%.2f" , project_scores(item) ).to_i %></a></p>
|
|
||||||
<p>发布缺陷:<a href="<%= url_for(:controller => 'issues', :action=>"index", :project_id=>item.id, :host=>Setting.host_name) %>"><%= item.issues.count %></a> <span class="ml10"></span>成员:<a href="<%= url_for(:controller => 'projects', :action=>"member", :id=>item.id, :host=>Setting.host_name) %>"><%= item.members.count %></a></p>
|
|
||||||
</div>
|
|
||||||
<div class="cl"></div>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
@ -0,0 +1 @@
|
|||||||
|
$("#user_show_more_project").replaceWith("<%= escape_javascript( render :partial => 'layouts/user_projects',:locals => {:projects => @projects,:user => @user, :page => @page} )%>");
|
@ -0,0 +1,3 @@
|
|||||||
|
$("#search_div").html('<%= escape_javascript( render :partial => 'resource_search_form',:locals => {:user=>@user,:type=>@type} ) %>');
|
||||||
|
$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>');
|
||||||
|
$("#pages").html('<%= pagination_links_full @atta_pages, @atta_count, :per_page_links => false, :remote => @is_remote, :flag => true %>');
|
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
closeModal();
|
||||||
|
$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>');
|
||||||
|
//这里不能将翻页的更新
|
@ -0,0 +1,2 @@
|
|||||||
|
$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>');
|
||||||
|
$("#pages").html('<%= pagination_links_full @atta_pages, @atta_count, :per_page_links => false, :remote => @is_remote, :flag => true %>');
|
@ -0,0 +1,13 @@
|
|||||||
|
class CreateMemoMessages < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :memo_messages do |t|
|
||||||
|
t.integer :user_id
|
||||||
|
t.integer :forum_id
|
||||||
|
t.integer :memo_id
|
||||||
|
t.string :memo_type
|
||||||
|
t.integer :viewed
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,12 @@
|
|||||||
|
class CreateUserFeedbackMessages < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :user_feedback_messages do |t|
|
||||||
|
t.integer :user_id
|
||||||
|
t.integer :journals_for_message_id
|
||||||
|
t.string :journals_for_message_type
|
||||||
|
t.integer :viewed
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,14 @@
|
|||||||
|
language: ruby
|
||||||
|
env:
|
||||||
|
- TRAVIS=true
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- 'master'
|
||||||
|
rvm:
|
||||||
|
- 1.9.3-p327
|
||||||
|
- 2.0.0
|
||||||
|
before_script:
|
||||||
|
- "bundle install"
|
||||||
|
- "git submodule init"
|
||||||
|
- "git submodule update"
|
||||||
|
script: "bundle exec rake"
|
@ -0,0 +1,16 @@
|
|||||||
|
2.0.2
|
||||||
|
- Revert MR that broke smart HTTP clients.
|
||||||
|
|
||||||
|
2.0.1
|
||||||
|
- Make sure child processes get reaped after popen, again.
|
||||||
|
|
||||||
|
2.0.0
|
||||||
|
- Use safer shell commands and avoid Dir.chdir
|
||||||
|
- Restrict the environment for shell commands
|
||||||
|
- Make Grack::Server thread-safe (zimbatm)
|
||||||
|
- Make sure child processes get reaped after popen
|
||||||
|
- Verify requested path is actually a Git directory (Ryan Canty)
|
||||||
|
|
||||||
|
|
||||||
|
1.1.0
|
||||||
|
- Modifies service_rpc to use chunked transfer (https://github.com/gitlabhq/grack/pull/1)
|
@ -0,0 +1,10 @@
|
|||||||
|
source "http://ruby.taobao.org"
|
||||||
|
|
||||||
|
gemspec
|
||||||
|
|
||||||
|
group :development do
|
||||||
|
gem 'byebug'
|
||||||
|
gem 'rake'
|
||||||
|
gem 'pry'
|
||||||
|
gem 'rack-test'
|
||||||
|
end
|
@ -0,0 +1,37 @@
|
|||||||
|
PATH
|
||||||
|
remote: .
|
||||||
|
specs:
|
||||||
|
gitlab-grack (2.0.2)
|
||||||
|
rack (~> 1.5.1)
|
||||||
|
|
||||||
|
GEM
|
||||||
|
remote: http://ruby.taobao.org/
|
||||||
|
specs:
|
||||||
|
byebug (4.0.5)
|
||||||
|
columnize (= 0.9.0)
|
||||||
|
coderay (1.1.0)
|
||||||
|
columnize (0.9.0)
|
||||||
|
metaclass (0.0.1)
|
||||||
|
method_source (0.8.2)
|
||||||
|
mocha (0.14.0)
|
||||||
|
metaclass (~> 0.0.1)
|
||||||
|
pry (0.10.1)
|
||||||
|
coderay (~> 1.1.0)
|
||||||
|
method_source (~> 0.8.1)
|
||||||
|
slop (~> 3.4)
|
||||||
|
rack (1.5.2)
|
||||||
|
rack-test (0.6.2)
|
||||||
|
rack (>= 1.0)
|
||||||
|
rake (10.1.0)
|
||||||
|
slop (3.6.0)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
byebug
|
||||||
|
gitlab-grack!
|
||||||
|
mocha (~> 0.11)
|
||||||
|
pry
|
||||||
|
rack-test
|
||||||
|
rake
|
@ -0,0 +1,95 @@
|
|||||||
|
Grack - Ruby/Rack Git Smart-HTTP Server Handler
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
[](https://travis-ci.org/gitlabhq/grack)
|
||||||
|
[](https://codeclimate.com/github/gitlabhq/grack)
|
||||||
|
|
||||||
|
This project aims to replace the builtin git-http-backend CGI handler
|
||||||
|
distributed with C Git with a Rack application. This reason for doing this
|
||||||
|
is to allow far more webservers to be able to handle Git smart http requests.
|
||||||
|
|
||||||
|
The default git-http-backend only runs as a CGI script, and specifically is
|
||||||
|
only targeted for Apache 2.x usage (it requires PATH_INFO to be set and
|
||||||
|
specifically formatted). So, instead of trying to get it to work with
|
||||||
|
other CGI capable webservers (Lighttpd, etc), we can get it running on nearly
|
||||||
|
every major and minor webserver out there by making it Rack capable. Rack
|
||||||
|
applications can run with the following handlers:
|
||||||
|
|
||||||
|
* CGI
|
||||||
|
* FCGI
|
||||||
|
* Mongrel (and EventedMongrel and SwiftipliedMongrel)
|
||||||
|
* WEBrick
|
||||||
|
* SCGI
|
||||||
|
* LiteSpeed
|
||||||
|
* Thin
|
||||||
|
|
||||||
|
These web servers include Rack handlers in their distributions:
|
||||||
|
|
||||||
|
* Ebb
|
||||||
|
* Fuzed
|
||||||
|
* Phusion Passenger (which is mod_rack for Apache and for nginx)
|
||||||
|
* Unicorn
|
||||||
|
* Puma
|
||||||
|
|
||||||
|
With [Warbler](http://caldersphere.rubyforge.org/warbler/classes/Warbler.html),
|
||||||
|
and JRuby, we can also generate a WAR file that can be deployed in any Java
|
||||||
|
web application server (Tomcat, Glassfish, Websphere, JBoss, etc).
|
||||||
|
|
||||||
|
Since the git-http-backend is really just a simple wrapper for the upload-pack
|
||||||
|
and receive-pack processes with the '--stateless-rpc' option, it does not
|
||||||
|
actually re-implement very much.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
========================
|
||||||
|
* Ruby - http://www.ruby-lang.org
|
||||||
|
* Rack - http://rack.rubyforge.org
|
||||||
|
* A Rack-compatible web server
|
||||||
|
* Git >= 1.7 (currently the 'pu' branch)
|
||||||
|
* Mocha (only for running the tests)
|
||||||
|
|
||||||
|
Quick Start
|
||||||
|
========================
|
||||||
|
$ gem install rack
|
||||||
|
$ (edit config.ru to set git project path)
|
||||||
|
$ rackup --host 127.0.0.1 -p 8080 config.ru
|
||||||
|
$ git clone http://127.0.0.1:8080/schacon/grit.git
|
||||||
|
|
||||||
|
Contributing
|
||||||
|
========================
|
||||||
|
If you would like to contribute to the Grack project, I prefer to get
|
||||||
|
pull-requests via GitHub. You should include tests for whatever functionality
|
||||||
|
you add. Just fork this project, push your changes to your fork and click
|
||||||
|
the 'pull request' button. To run the tests, you first need to install the
|
||||||
|
'mocha' mocking library and initialize the submodule.
|
||||||
|
|
||||||
|
$ sudo gem install mocha
|
||||||
|
$ git submodule init
|
||||||
|
$ git submodule update
|
||||||
|
|
||||||
|
Then you should be able to run the tests with a 'rake' command. You can also
|
||||||
|
run coverage tests with 'rake rcov' if you have rcov installed.
|
||||||
|
|
||||||
|
License
|
||||||
|
========================
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2009 Scott Chacon <schacon@gmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env rake
|
||||||
|
require "bundler/gem_tasks"
|
||||||
|
|
||||||
|
task :default => :test
|
||||||
|
|
||||||
|
desc "Run the tests."
|
||||||
|
task :test do
|
||||||
|
Dir.glob("tests/*_test.rb").each do |f|
|
||||||
|
system "ruby #{f}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Run test coverage."
|
||||||
|
task :rcov do
|
||||||
|
system "rcov tests/*_test.rb -i lib/git_http.rb -x rack -x Library -x tests"
|
||||||
|
system "open coverage/index.html"
|
||||||
|
end
|
||||||
|
|
||||||
|
namespace :grack do
|
||||||
|
desc "Start Grack"
|
||||||
|
task :start do
|
||||||
|
system('./bin/testserver')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Start everything."
|
||||||
|
multitask :start => [ 'grack:start' ]
|
@ -0,0 +1,6 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd $(dirname "$0")/..
|
||||||
|
exec /usr/bin/env bundle exec pry -Ilib -r grack
|
@ -0,0 +1,24 @@
|
|||||||
|
#! /usr/bin/env ruby
|
||||||
|
libdir = File.absolute_path( File.join( File.dirname(__FILE__), '../lib' ) )
|
||||||
|
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
||||||
|
|
||||||
|
Bundler.require(:default, :development)
|
||||||
|
|
||||||
|
|
||||||
|
require 'grack'
|
||||||
|
require 'rack'
|
||||||
|
root = File.absolute_path( File.join( File.dirname(__FILE__), '../examples' ) )
|
||||||
|
app = Grack::Server.new({
|
||||||
|
project_root: root,
|
||||||
|
upload_pack: true,
|
||||||
|
receive_pack:true
|
||||||
|
})
|
||||||
|
|
||||||
|
app1= Rack::Builder.new do
|
||||||
|
use Grack::Auth do |username, password|
|
||||||
|
[username, password] == ['123', '455']
|
||||||
|
end
|
||||||
|
run app
|
||||||
|
end
|
||||||
|
|
||||||
|
Rack::Server.start app: app1, Port: 3001
|
@ -0,0 +1 @@
|
|||||||
|
ref: refs/heads/master
|
@ -0,0 +1,6 @@
|
|||||||
|
[core]
|
||||||
|
repositoryformatversion = 0
|
||||||
|
filemode = true
|
||||||
|
bare = true
|
||||||
|
ignorecase = true
|
||||||
|
precomposeunicode = true
|
@ -0,0 +1 @@
|
|||||||
|
Unnamed repository; edit this file 'description' to name the repository.
|
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to check the commit log message taken by
|
||||||
|
# applypatch from an e-mail message.
|
||||||
|
#
|
||||||
|
# The hook should exit with non-zero status after issuing an
|
||||||
|
# appropriate message if it wants to stop the commit. The hook is
|
||||||
|
# allowed to edit the commit message file.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "applypatch-msg".
|
||||||
|
|
||||||
|
. git-sh-setup
|
||||||
|
test -x "$GIT_DIR/hooks/commit-msg" &&
|
||||||
|
exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
|
||||||
|
:
|
@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to check the commit log message.
|
||||||
|
# Called by "git commit" with one argument, the name of the file
|
||||||
|
# that has the commit message. The hook should exit with non-zero
|
||||||
|
# status after issuing an appropriate message if it wants to stop the
|
||||||
|
# commit. The hook is allowed to edit the commit message file.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "commit-msg".
|
||||||
|
|
||||||
|
# Uncomment the below to add a Signed-off-by line to the message.
|
||||||
|
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
|
||||||
|
# hook is more suited to it.
|
||||||
|
#
|
||||||
|
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||||
|
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
||||||
|
|
||||||
|
# This example catches duplicate Signed-off-by lines.
|
||||||
|
|
||||||
|
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
||||||
|
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
||||||
|
echo >&2 Duplicate Signed-off-by lines.
|
||||||
|
exit 1
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to prepare a packed repository for use over
|
||||||
|
# dumb transports.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "post-update".
|
||||||
|
|
||||||
|
exec git update-server-info
|
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to verify what is about to be committed
|
||||||
|
# by applypatch from an e-mail message.
|
||||||
|
#
|
||||||
|
# The hook should exit with non-zero status after issuing an
|
||||||
|
# appropriate message if it wants to stop the commit.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "pre-applypatch".
|
||||||
|
|
||||||
|
. git-sh-setup
|
||||||
|
test -x "$GIT_DIR/hooks/pre-commit" &&
|
||||||
|
exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
|
||||||
|
:
|
@ -0,0 +1,49 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to verify what is about to be committed.
|
||||||
|
# Called by "git commit" with no arguments. The hook should
|
||||||
|
# exit with non-zero status after issuing an appropriate message if
|
||||||
|
# it wants to stop the commit.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "pre-commit".
|
||||||
|
|
||||||
|
if git rev-parse --verify HEAD >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
against=HEAD
|
||||||
|
else
|
||||||
|
# Initial commit: diff against an empty tree object
|
||||||
|
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If you want to allow non-ASCII filenames set this variable to true.
|
||||||
|
allownonascii=$(git config --bool hooks.allownonascii)
|
||||||
|
|
||||||
|
# Redirect output to stderr.
|
||||||
|
exec 1>&2
|
||||||
|
|
||||||
|
# Cross platform projects tend to avoid non-ASCII filenames; prevent
|
||||||
|
# them from being added to the repository. We exploit the fact that the
|
||||||
|
# printable range starts at the space character and ends with tilde.
|
||||||
|
if [ "$allownonascii" != "true" ] &&
|
||||||
|
# Note that the use of brackets around a tr range is ok here, (it's
|
||||||
|
# even required, for portability to Solaris 10's /usr/bin/tr), since
|
||||||
|
# the square bracket bytes happen to fall in the designated range.
|
||||||
|
test $(git diff --cached --name-only --diff-filter=A -z $against |
|
||||||
|
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
|
||||||
|
then
|
||||||
|
cat <<\EOF
|
||||||
|
Error: Attempt to add a non-ASCII file name.
|
||||||
|
|
||||||
|
This can cause problems if you want to work with people on other platforms.
|
||||||
|
|
||||||
|
To be portable it is advisable to rename the file.
|
||||||
|
|
||||||
|
If you know what you are doing you can disable this check using:
|
||||||
|
|
||||||
|
git config hooks.allownonascii true
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If there are whitespace errors, print the offending file names and fail.
|
||||||
|
exec git diff-index --check --cached $against --
|
@ -0,0 +1,53 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# An example hook script to verify what is about to be pushed. Called by "git
|
||||||
|
# push" after it has checked the remote status, but before anything has been
|
||||||
|
# pushed. If this script exits with a non-zero status nothing will be pushed.
|
||||||
|
#
|
||||||
|
# This hook is called with the following parameters:
|
||||||
|
#
|
||||||
|
# $1 -- Name of the remote to which the push is being done
|
||||||
|
# $2 -- URL to which the push is being done
|
||||||
|
#
|
||||||
|
# If pushing without using a named remote those arguments will be equal.
|
||||||
|
#
|
||||||
|
# Information about the commits which are being pushed is supplied as lines to
|
||||||
|
# the standard input in the form:
|
||||||
|
#
|
||||||
|
# <local ref> <local sha1> <remote ref> <remote sha1>
|
||||||
|
#
|
||||||
|
# This sample shows how to prevent push of commits where the log message starts
|
||||||
|
# with "WIP" (work in progress).
|
||||||
|
|
||||||
|
remote="$1"
|
||||||
|
url="$2"
|
||||||
|
|
||||||
|
z40=0000000000000000000000000000000000000000
|
||||||
|
|
||||||
|
while read local_ref local_sha remote_ref remote_sha
|
||||||
|
do
|
||||||
|
if [ "$local_sha" = $z40 ]
|
||||||
|
then
|
||||||
|
# Handle delete
|
||||||
|
:
|
||||||
|
else
|
||||||
|
if [ "$remote_sha" = $z40 ]
|
||||||
|
then
|
||||||
|
# New branch, examine all commits
|
||||||
|
range="$local_sha"
|
||||||
|
else
|
||||||
|
# Update to existing branch, examine new commits
|
||||||
|
range="$remote_sha..$local_sha"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for WIP commit
|
||||||
|
commit=`git rev-list -n 1 --grep '^WIP' "$range"`
|
||||||
|
if [ -n "$commit" ]
|
||||||
|
then
|
||||||
|
echo >&2 "Found WIP commit in $local_ref, not pushing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,169 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (c) 2006, 2008 Junio C Hamano
|
||||||
|
#
|
||||||
|
# The "pre-rebase" hook is run just before "git rebase" starts doing
|
||||||
|
# its job, and can prevent the command from running by exiting with
|
||||||
|
# non-zero status.
|
||||||
|
#
|
||||||
|
# The hook is called with the following parameters:
|
||||||
|
#
|
||||||
|
# $1 -- the upstream the series was forked from.
|
||||||
|
# $2 -- the branch being rebased (or empty when rebasing the current branch).
|
||||||
|
#
|
||||||
|
# This sample shows how to prevent topic branches that are already
|
||||||
|
# merged to 'next' branch from getting rebased, because allowing it
|
||||||
|
# would result in rebasing already published history.
|
||||||
|
|
||||||
|
publish=next
|
||||||
|
basebranch="$1"
|
||||||
|
if test "$#" = 2
|
||||||
|
then
|
||||||
|
topic="refs/heads/$2"
|
||||||
|
else
|
||||||
|
topic=`git symbolic-ref HEAD` ||
|
||||||
|
exit 0 ;# we do not interrupt rebasing detached HEAD
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$topic" in
|
||||||
|
refs/heads/??/*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 0 ;# we do not interrupt others.
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Now we are dealing with a topic branch being rebased
|
||||||
|
# on top of master. Is it OK to rebase it?
|
||||||
|
|
||||||
|
# Does the topic really exist?
|
||||||
|
git show-ref -q "$topic" || {
|
||||||
|
echo >&2 "No such branch $topic"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Is topic fully merged to master?
|
||||||
|
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
|
||||||
|
if test -z "$not_in_master"
|
||||||
|
then
|
||||||
|
echo >&2 "$topic is fully merged to master; better remove it."
|
||||||
|
exit 1 ;# we could allow it, but there is no point.
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Is topic ever merged to next? If so you should not be rebasing it.
|
||||||
|
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
|
||||||
|
only_next_2=`git rev-list ^master ${publish} | sort`
|
||||||
|
if test "$only_next_1" = "$only_next_2"
|
||||||
|
then
|
||||||
|
not_in_topic=`git rev-list "^$topic" master`
|
||||||
|
if test -z "$not_in_topic"
|
||||||
|
then
|
||||||
|
echo >&2 "$topic is already up-to-date with master"
|
||||||
|
exit 1 ;# we could allow it, but there is no point.
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
|
||||||
|
/usr/bin/perl -e '
|
||||||
|
my $topic = $ARGV[0];
|
||||||
|
my $msg = "* $topic has commits already merged to public branch:\n";
|
||||||
|
my (%not_in_next) = map {
|
||||||
|
/^([0-9a-f]+) /;
|
||||||
|
($1 => 1);
|
||||||
|
} split(/\n/, $ARGV[1]);
|
||||||
|
for my $elem (map {
|
||||||
|
/^([0-9a-f]+) (.*)$/;
|
||||||
|
[$1 => $2];
|
||||||
|
} split(/\n/, $ARGV[2])) {
|
||||||
|
if (!exists $not_in_next{$elem->[0]}) {
|
||||||
|
if ($msg) {
|
||||||
|
print STDERR $msg;
|
||||||
|
undef $msg;
|
||||||
|
}
|
||||||
|
print STDERR " $elem->[1]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
' "$topic" "$not_in_next" "$not_in_master"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
This sample hook safeguards topic branches that have been
|
||||||
|
published from being rewound.
|
||||||
|
|
||||||
|
The workflow assumed here is:
|
||||||
|
|
||||||
|
* Once a topic branch forks from "master", "master" is never
|
||||||
|
merged into it again (either directly or indirectly).
|
||||||
|
|
||||||
|
* Once a topic branch is fully cooked and merged into "master",
|
||||||
|
it is deleted. If you need to build on top of it to correct
|
||||||
|
earlier mistakes, a new topic branch is created by forking at
|
||||||
|
the tip of the "master". This is not strictly necessary, but
|
||||||
|
it makes it easier to keep your history simple.
|
||||||
|
|
||||||
|
* Whenever you need to test or publish your changes to topic
|
||||||
|
branches, merge them into "next" branch.
|
||||||
|
|
||||||
|
The script, being an example, hardcodes the publish branch name
|
||||||
|
to be "next", but it is trivial to make it configurable via
|
||||||
|
$GIT_DIR/config mechanism.
|
||||||
|
|
||||||
|
With this workflow, you would want to know:
|
||||||
|
|
||||||
|
(1) ... if a topic branch has ever been merged to "next". Young
|
||||||
|
topic branches can have stupid mistakes you would rather
|
||||||
|
clean up before publishing, and things that have not been
|
||||||
|
merged into other branches can be easily rebased without
|
||||||
|
affecting other people. But once it is published, you would
|
||||||
|
not want to rewind it.
|
||||||
|
|
||||||
|
(2) ... if a topic branch has been fully merged to "master".
|
||||||
|
Then you can delete it. More importantly, you should not
|
||||||
|
build on top of it -- other people may already want to
|
||||||
|
change things related to the topic as patches against your
|
||||||
|
"master", so if you need further changes, it is better to
|
||||||
|
fork the topic (perhaps with the same name) afresh from the
|
||||||
|
tip of "master".
|
||||||
|
|
||||||
|
Let's look at this example:
|
||||||
|
|
||||||
|
o---o---o---o---o---o---o---o---o---o "next"
|
||||||
|
/ / / /
|
||||||
|
/ a---a---b A / /
|
||||||
|
/ / / /
|
||||||
|
/ / c---c---c---c B /
|
||||||
|
/ / / \ /
|
||||||
|
/ / / b---b C \ /
|
||||||
|
/ / / / \ /
|
||||||
|
---o---o---o---o---o---o---o---o---o---o---o "master"
|
||||||
|
|
||||||
|
|
||||||
|
A, B and C are topic branches.
|
||||||
|
|
||||||
|
* A has one fix since it was merged up to "next".
|
||||||
|
|
||||||
|
* B has finished. It has been fully merged up to "master" and "next",
|
||||||
|
and is ready to be deleted.
|
||||||
|
|
||||||
|
* C has not merged to "next" at all.
|
||||||
|
|
||||||
|
We would want to allow C to be rebased, refuse A, and encourage
|
||||||
|
B to be deleted.
|
||||||
|
|
||||||
|
To compute (1):
|
||||||
|
|
||||||
|
git rev-list ^master ^topic next
|
||||||
|
git rev-list ^master next
|
||||||
|
|
||||||
|
if these match, topic has not merged in next at all.
|
||||||
|
|
||||||
|
To compute (2):
|
||||||
|
|
||||||
|
git rev-list master..topic
|
||||||
|
|
||||||
|
if this is empty, it is fully merged to "master".
|
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to prepare the commit log message.
|
||||||
|
# Called by "git commit" with the name of the file that has the
|
||||||
|
# commit message, followed by the description of the commit
|
||||||
|
# message's source. The hook's purpose is to edit the commit
|
||||||
|
# message file. If the hook fails with a non-zero status,
|
||||||
|
# the commit is aborted.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "prepare-commit-msg".
|
||||||
|
|
||||||
|
# This hook includes three examples. The first comments out the
|
||||||
|
# "Conflicts:" part of a merge commit.
|
||||||
|
#
|
||||||
|
# The second includes the output of "git diff --name-status -r"
|
||||||
|
# into the message, just before the "git status" output. It is
|
||||||
|
# commented because it doesn't cope with --amend or with squashed
|
||||||
|
# commits.
|
||||||
|
#
|
||||||
|
# The third example adds a Signed-off-by line to the message, that can
|
||||||
|
# still be edited. This is rarely a good idea.
|
||||||
|
|
||||||
|
case "$2,$3" in
|
||||||
|
merge,)
|
||||||
|
/usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
|
||||||
|
|
||||||
|
# ,|template,)
|
||||||
|
# /usr/bin/perl -i.bak -pe '
|
||||||
|
# print "\n" . `git diff --cached --name-status -r`
|
||||||
|
# if /^#/ && $first++ == 0' "$1" ;;
|
||||||
|
|
||||||
|
*) ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||||
|
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
@ -0,0 +1,128 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to blocks unannotated tags from entering.
|
||||||
|
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "update".
|
||||||
|
#
|
||||||
|
# Config
|
||||||
|
# ------
|
||||||
|
# hooks.allowunannotated
|
||||||
|
# This boolean sets whether unannotated tags will be allowed into the
|
||||||
|
# repository. By default they won't be.
|
||||||
|
# hooks.allowdeletetag
|
||||||
|
# This boolean sets whether deleting tags will be allowed in the
|
||||||
|
# repository. By default they won't be.
|
||||||
|
# hooks.allowmodifytag
|
||||||
|
# This boolean sets whether a tag may be modified after creation. By default
|
||||||
|
# it won't be.
|
||||||
|
# hooks.allowdeletebranch
|
||||||
|
# This boolean sets whether deleting branches will be allowed in the
|
||||||
|
# repository. By default they won't be.
|
||||||
|
# hooks.denycreatebranch
|
||||||
|
# This boolean sets whether remotely creating branches will be denied
|
||||||
|
# in the repository. By default this is allowed.
|
||||||
|
#
|
||||||
|
|
||||||
|
# --- Command line
|
||||||
|
refname="$1"
|
||||||
|
oldrev="$2"
|
||||||
|
newrev="$3"
|
||||||
|
|
||||||
|
# --- Safety check
|
||||||
|
if [ -z "$GIT_DIR" ]; then
|
||||||
|
echo "Don't run this script from the command line." >&2
|
||||||
|
echo " (if you want, you could supply GIT_DIR then run" >&2
|
||||||
|
echo " $0 <ref> <oldrev> <newrev>)" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
|
||||||
|
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Config
|
||||||
|
allowunannotated=$(git config --bool hooks.allowunannotated)
|
||||||
|
allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
|
||||||
|
denycreatebranch=$(git config --bool hooks.denycreatebranch)
|
||||||
|
allowdeletetag=$(git config --bool hooks.allowdeletetag)
|
||||||
|
allowmodifytag=$(git config --bool hooks.allowmodifytag)
|
||||||
|
|
||||||
|
# check for no description
|
||||||
|
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
|
||||||
|
case "$projectdesc" in
|
||||||
|
"Unnamed repository"* | "")
|
||||||
|
echo "*** Project description file hasn't been set" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- Check types
|
||||||
|
# if $newrev is 0000...0000, it's a commit to delete a ref.
|
||||||
|
zero="0000000000000000000000000000000000000000"
|
||||||
|
if [ "$newrev" = "$zero" ]; then
|
||||||
|
newrev_type=delete
|
||||||
|
else
|
||||||
|
newrev_type=$(git cat-file -t $newrev)
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$refname","$newrev_type" in
|
||||||
|
refs/tags/*,commit)
|
||||||
|
# un-annotated tag
|
||||||
|
short_refname=${refname##refs/tags/}
|
||||||
|
if [ "$allowunannotated" != "true" ]; then
|
||||||
|
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
|
||||||
|
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/tags/*,delete)
|
||||||
|
# delete tag
|
||||||
|
if [ "$allowdeletetag" != "true" ]; then
|
||||||
|
echo "*** Deleting a tag is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/tags/*,tag)
|
||||||
|
# annotated tag
|
||||||
|
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
|
||||||
|
then
|
||||||
|
echo "*** Tag '$refname' already exists." >&2
|
||||||
|
echo "*** Modifying a tag is not allowed in this repository." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/heads/*,commit)
|
||||||
|
# branch
|
||||||
|
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
|
||||||
|
echo "*** Creating a branch is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/heads/*,delete)
|
||||||
|
# delete branch
|
||||||
|
if [ "$allowdeletebranch" != "true" ]; then
|
||||||
|
echo "*** Deleting a branch is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/remotes/*,commit)
|
||||||
|
# tracking branch
|
||||||
|
;;
|
||||||
|
refs/remotes/*,delete)
|
||||||
|
# delete tracking branch
|
||||||
|
if [ "$allowdeletebranch" != "true" ]; then
|
||||||
|
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Anything else (is there anything else?)
|
||||||
|
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- Finished
|
||||||
|
exit 0
|
@ -0,0 +1,6 @@
|
|||||||
|
# git ls-files --others --exclude-from=.git/info/exclude
|
||||||
|
# Lines that start with '#' are comments.
|
||||||
|
# For a project mostly in C, the following would be a good set of
|
||||||
|
# exclude patterns (uncomment them if you want to use them):
|
||||||
|
# *.[oa]
|
||||||
|
# *~
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
e1022324d23146d29075a3e7c6f637cb67f091b5
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue