From f6b2e1748bb9f7b0a7464de44ddd92d61c056317 Mon Sep 17 00:00:00 2001
From: caicai8 <1149225589@qq.com>
Date: Mon, 6 Jan 2020 10:37:25 +0800
Subject: [PATCH 1/4] component
---
public/react/src/forge/Branch/CloneAddress.js | 32 +++++++++++++++++++
public/react/src/forge/Branch/SelectBranch.js | 2 ++
public/react/src/forge/Branch/branch.css | 9 ++++++
.../src/forge/Main/CoderRootDirectory.js | 21 ++----------
public/react/src/forge/Main/list.css | 10 +-----
5 files changed, 47 insertions(+), 27 deletions(-)
create mode 100644 public/react/src/forge/Branch/CloneAddress.js
create mode 100644 public/react/src/forge/Branch/branch.css
diff --git a/public/react/src/forge/Branch/CloneAddress.js b/public/react/src/forge/Branch/CloneAddress.js
new file mode 100644
index 000000000..a983612d5
--- /dev/null
+++ b/public/react/src/forge/Branch/CloneAddress.js
@@ -0,0 +1,32 @@
+import React , { Component } from 'react';
+import { Dropdown , Icon , Menu } from 'antd';
+
+import "./branch.css"
+
+// 点击按钮复制功能
+function jsCopy(){
+ var e = document.getElementById("copy_rep_content");
+ e.select();
+ document.execCommand("Copy");
+}
+class CloneAddress extends Component{
+
+ render(){
+ const { http_url , downloadUrl } = this.props;
+ return(
+
+
this.changeAddress("http")}>HTTP
+ {/*
this.changeAddress("ssh")}>SSH */}
+
+
jsCopy()}>
+
+
+
+
+
+
+
+ )
+ }
+}
+export default CloneAddress;
\ No newline at end of file
diff --git a/public/react/src/forge/Branch/SelectBranch.js b/public/react/src/forge/Branch/SelectBranch.js
index ca5ee9413..a3fcff973 100644
--- a/public/react/src/forge/Branch/SelectBranch.js
+++ b/public/react/src/forge/Branch/SelectBranch.js
@@ -1,6 +1,8 @@
import React , { Component } from 'react';
import { Dropdown , Icon , Menu } from 'antd';
+import "./branch.css"
+
class SelectBranch extends Component{
render(){
diff --git a/public/react/src/forge/Branch/branch.css b/public/react/src/forge/Branch/branch.css
new file mode 100644
index 000000000..f54901088
--- /dev/null
+++ b/public/react/src/forge/Branch/branch.css
@@ -0,0 +1,9 @@
+.branchDropdown{
+ border:1px solid #eee;
+ border-radius: 4px;
+ display: flex;
+ justify-content: center;
+ padding:0px 10px;
+ height: 35px;
+ line-height: 35px;
+}
\ No newline at end of file
diff --git a/public/react/src/forge/Main/CoderRootDirectory.js b/public/react/src/forge/Main/CoderRootDirectory.js
index 038f841a8..5e6be652e 100644
--- a/public/react/src/forge/Main/CoderRootDirectory.js
+++ b/public/react/src/forge/Main/CoderRootDirectory.js
@@ -6,13 +6,9 @@ import { getImageUrl } from 'educoder';
import axios from 'axios';
import SelectBranch from '../Branch/SelectBranch'
+import CloneAddress from '../Branch/CloneAddress'
+
-// 点击按钮复制功能
-function jsCopy(){
- var e = document.getElementById("copy_rep_content");
- e.select();
- document.execCommand("Copy");
-}
class CoderRootDirectory extends Component{
constructor(props){
super(props);
@@ -163,18 +159,7 @@ class CoderRootDirectory extends Component{
-
-
this.changeAddress("http")}>HTTP
- {/*
this.changeAddress("ssh")}>SSH */}
-
-
jsCopy()}>
-
-
-
-
-
-
-
+
Date: Mon, 6 Jan 2020 14:14:25 +0800
Subject: [PATCH 2/4] =?UTF-8?q?issue=E7=9A=84=E5=8A=A8=E6=80=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/application_controller.rb | 2 +-
app/controllers/issues_controller.rb | 4 +-
app/controllers/journals_controller.rb | 2 +
app/controllers/project_trends_controller.rb | 49 +++++++++++++++++++
app/models/issue.rb | 6 +++
app/models/project.rb | 10 ++++
app/models/project_trend.rb | 5 ++
app/models/user.rb | 2 +
.../issues/_simple_issue_item.json.jbuilder | 18 +++++++
app/views/project_trends/index.json.jbuilder | 24 +++++++++
config/locales/zh-CN.yml | 9 ++++
config/routes.rb | 1 +
.../20200106022157_create_project_trends.rb | 12 +++++
spec/models/project_trend_spec.rb | 5 ++
14 files changed, 147 insertions(+), 2 deletions(-)
create mode 100644 app/controllers/project_trends_controller.rb
create mode 100644 app/models/project_trend.rb
create mode 100644 app/views/issues/_simple_issue_item.json.jbuilder
create mode 100644 app/views/project_trends/index.json.jbuilder
create mode 100644 db/migrate/20200106022157_create_project_trends.rb
create mode 100644 spec/models/project_trend_spec.rb
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index aa0b0188f..d3f65a6bc 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -328,7 +328,7 @@ class ApplicationController < ActionController::Base
def current_user
# User.current
- User.find_by_id 36401
+ User.find_by_id 1
end
## 默认输出json
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index 5d515b36e..436e56702 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -49,7 +49,7 @@ class IssuesController < ApplicationController
order_name = params[:order_name] || "created_on" #或者"updated_on"
@page = params[:page]
- @limit = params[:limit] || "15"
+ @limit = params[:limit] || 15
@issues = issues.order("#{order_name} #{order_type}")
@issues_size = issues.size
@issues = issues.order("#{order_name} #{order_type}").page(@page).per(@limit)
@@ -175,6 +175,7 @@ class IssuesController < ApplicationController
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'issue', status: 0)
end
+ @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
normal_status(0, "创建成功")
else
normal_status(-1, "创建失败")
@@ -300,6 +301,7 @@ class IssuesController < ApplicationController
end
if @issue.update_attribute(:status_id, type)
if type == 5
+ @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "close")
@issue.issue_times.update_all(end_time: Time.now)
end
@issue.create_journal_detail(false, [], [])
diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb
index 6c3bc49ed..edcec73cd 100644
--- a/app/controllers/journals_controller.rb
+++ b/app/controllers/journals_controller.rb
@@ -35,6 +35,8 @@ class JournalsController < ApplicationController
end
end
end
+ @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal")
+
normal_status(0, "评论成功")
else
normal_status(-1, "评论失败")
diff --git a/app/controllers/project_trends_controller.rb b/app/controllers/project_trends_controller.rb
new file mode 100644
index 000000000..84821ba65
--- /dev/null
+++ b/app/controllers/project_trends_controller.rb
@@ -0,0 +1,49 @@
+class ProjectTrendsController < ApplicationController
+ before_action :set_project
+ before_action :check_project_public
+
+ def index
+ @project_issues_count = @project.get_issues_count(nil)
+ @project_open_issues_count = @project.get_issues_count([1,2,3,4,6])
+ @project_close_issues_count = @project.get_issues_count(5)
+
+ project_trends = @project.project_trends.includes(:user, trend: :user)
+ check_time = params[:time] #时间的筛选
+ check_type = params[:type] #动态类型的筛选,目前已知的有 Issue, PullRequest, Version
+ check_status = params[:status] #类型的选择 "create", "close", "journal",
+
+ if check_time.present?
+ check_time = check_time.to_i
+ project_trends = project_trends.where("created_at between ? and ?",(Time.now.beginning_of_day - check_time.days), Time.now.end_of_day)
+ end
+
+ if check_type.present?
+ project_trends = project_trends.where(trend_type: check_type.to_s.titleize)
+ end
+
+ if check_status.present?
+ project_trends = project_trends.where(action_type: check_status.to_s)
+ end
+ project_trends = project_trends.order("created_at desc")
+
+ @page = params[:page]
+ @limit = params[:limit] || 15
+ @project_trends_size = project_trends.size
+ @project_trends = project_trends.page(@page).per(@limit)
+ end
+
+ private
+
+ def set_project
+ @project = Project.find_by_id(params[:project_id])
+ unless @project.present?
+ normal_status(-1, "项目不存在")
+ end
+ end
+
+ def check_project_public
+ unless @project.is_public || @project.member?(current_user) || current_user.admin?
+ normal_status(-1, "您没有权限")
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 4c995be55..64fa4c368 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -2,6 +2,7 @@ class Issue < ApplicationRecord
#issue_type 1为普通,2为悬赏
belongs_to :project
belongs_to :tracker
+ has_many :project_trends, as: :trend, dependent: :destroy
# belongs_to :issue_tag,optional: true
belongs_to :priority, :class_name => 'IssuePriority', foreign_key: :priority_id,optional: true #
belongs_to :version, foreign_key: :fixed_version_id,optional: true
@@ -17,6 +18,7 @@ class Issue < ApplicationRecord
has_many :issue_times, dependent: :destroy
has_many :issue_depends, dependent: :destroy
scope :issue_includes, ->{includes(:user)}
+ scope :issue_many_includes, ->{includes(journals: :user)}
def get_assign_user
@@ -78,4 +80,8 @@ class Issue < ApplicationRecord
end
end
+ def only_reply_journals
+ journals.where.not(notes: [nil, ""]).journal_includes.limit(2)
+ end
+
end
\ No newline at end of file
diff --git a/app/models/project.rb b/app/models/project.rb
index 6c3938d6c..7a3df8e2b 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -9,6 +9,7 @@ class Project < ApplicationRecord
belongs_to :owner, class_name: 'User', foreign_key: :user_id
belongs_to :project_category , :counter_cache => true
belongs_to :project_language , :counter_cache => true
+ has_many :project_trends, dependent: :destroy
has_many :commits
@@ -51,4 +52,13 @@ class Project < ApplicationRecord
self.identifier.parameterize
end
+ def get_issues_count(status_id)
+ if status_id.present?
+ self&.issues.select(:id, :status_id).where(status_id: status_id)&.pluck(:id).size
+ else
+ self&.issues.select(:id)&.pluck(:id).size
+ end
+
+ end
+
end
diff --git a/app/models/project_trend.rb b/app/models/project_trend.rb
new file mode 100644
index 000000000..28fd0ffad
--- /dev/null
+++ b/app/models/project_trend.rb
@@ -0,0 +1,5 @@
+class ProjectTrend < ApplicationRecord
+ belongs_to :project
+ belongs_to :trend, polymorphic: true, optional: true
+ belongs_to :user
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index b136db2a8..45c20e6e7 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -166,6 +166,8 @@ class User < ApplicationRecord
has_many :composes, dependent: :destroy
has_many :compose_users, dependent: :destroy
+ has_many :project_trends, dependent: :destroy
+
# Groups and active users
scope :active, lambda { where(status: STATUS_ACTIVE) }
diff --git a/app/views/issues/_simple_issue_item.json.jbuilder b/app/views/issues/_simple_issue_item.json.jbuilder
new file mode 100644
index 000000000..e701d179e
--- /dev/null
+++ b/app/views/issues/_simple_issue_item.json.jbuilder
@@ -0,0 +1,18 @@
+json.name issue.subject
+json.created_at format_time(issue.created_on)
+json.updated_at format_time(issue.updated_on)
+json.assign_user_name issue.get_assign_user.try(:show_real_name)
+json.assign_user_login issue.get_assign_user.try(:login)
+json.issue_journal_size issue.get_journals_size
+journals = issue.only_reply_journals
+
+json.issue_journals do
+ json.array! journals.to_a.each do |j|
+ json.user_name j.user.try(:show_real_name)
+ json.user_login j.user.try(:login)
+ json.user_picture url_to_avatar(j.user)
+ json.content j.try(:notes)
+ json.created_at time_from_now(j.created_on)
+ end
+end
+
diff --git a/app/views/project_trends/index.json.jbuilder b/app/views/project_trends/index.json.jbuilder
new file mode 100644
index 000000000..1a573007f
--- /dev/null
+++ b/app/views/project_trends/index.json.jbuilder
@@ -0,0 +1,24 @@
+json.partial! "commons/success"
+json.issues_count @project_issues_count
+json.open_issues_count @project_open_issues_count
+json.close_issues_count @project_close_issues_count
+json.limit @limit
+json.project_trends_size @project_trends_size
+json.project_trends do
+ json.array! @project_trends.to_a.each do |trend|
+ json.id trend.id
+ json.trend_type trend.trend_type
+ json.action_type l("trend.#{trend.action_type}") + l("trend.#{trend.trend_type}")
+ json.trend_id trend.trend_id
+ json.user_login trend.user.login
+ json.user_avatar url_to_avatar(trend.user)
+
+ if trend.trend_type == "Issue"
+ json.partial! "issues/simple_issue_item", locals: {issue: trend.trend}
+ end
+
+ #后续需要天际pullrequest 和 版本的内容
+
+ end
+end
+
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 0b1cdf0fe..5d24def63 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -14,6 +14,15 @@ zh-CN:
'processed': '已审批'
'refused': '已拒绝'
'agreed': '已同意'
+ trend:
+ Issue: 工单
+ PullRequest: 合并请求
+ Version: 版本发布
+ create: 创建了
+ journal: 回复了
+ close: 关闭了
+ merge: 合并了
+ push: 发布了
journal_detail:
issue_tags_value: 标签
diff --git a/config/routes.rb b/config/routes.rb
index 675c00683..5cc9a565e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -45,6 +45,7 @@ Rails.application.routes.draw do
resources :licenses, only: [:index, :show]
resources :projects, only: [:index, :create, :show] do
+ resources :project_trends, only: [:index, :create]
resources :issues do
collection do
get :commit_issues
diff --git a/db/migrate/20200106022157_create_project_trends.rb b/db/migrate/20200106022157_create_project_trends.rb
new file mode 100644
index 000000000..70bcb8cdc
--- /dev/null
+++ b/db/migrate/20200106022157_create_project_trends.rb
@@ -0,0 +1,12 @@
+class CreateProjectTrends < ActiveRecord::Migration[5.2]
+ def change
+ create_table :project_trends do |t|
+ t.integer :user_id
+ t.integer :project_id
+ t.references :trend, polymorphic: true, index: true
+ t.string :action_type
+ t.timestamps
+ end
+ add_index :project_trends, [:user_id, :project_id]
+ end
+end
diff --git a/spec/models/project_trend_spec.rb b/spec/models/project_trend_spec.rb
new file mode 100644
index 000000000..06d3dac5c
--- /dev/null
+++ b/spec/models/project_trend_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe ProjectTrend, type: :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
From 26e2093f77479df6ad77a0b28bb9597ea15b0744 Mon Sep 17 00:00:00 2001
From: SylorHuang
Date: Mon, 6 Jan 2020 17:56:19 +0800
Subject: [PATCH 3/4] version release
---
app/assets/javascripts/version_releases.js | 2 +
app/assets/stylesheets/version_releases.scss | 3 +
.../version_releases_controller.rb | 125 ++++++++++++++++++
app/helpers/version_releases_helper.rb | 2 +
app/models/repository.rb | 1 +
app/models/version_release.rb | 4 +
app/services/gitea/client_service.rb | 12 ++
app/services/gitea/versions/create_service.rb | 34 +++++
app/services/gitea/versions/delete_service.rb | 24 ++++
app/services/gitea/versions/update_service.rb | 35 +++++
app/views/version_releases/edit.json.jbuilder | 1 +
.../version_releases/index.json.jbuilder | 21 +++
config/locales/zh-CN.yml | 3 +
config/routes.rb | 3 +-
.../20200106082806_create_version_releases.rb | 18 +++
...93141_add_project_id_to_version_release.rb | 6 +
.../version_releases_controller_spec.rb | 5 +
spec/helpers/version_releases_helper_spec.rb | 15 +++
spec/models/version_release_spec.rb | 5 +
19 files changed, 318 insertions(+), 1 deletion(-)
create mode 100644 app/assets/javascripts/version_releases.js
create mode 100644 app/assets/stylesheets/version_releases.scss
create mode 100644 app/controllers/version_releases_controller.rb
create mode 100644 app/helpers/version_releases_helper.rb
create mode 100644 app/models/version_release.rb
create mode 100644 app/services/gitea/versions/create_service.rb
create mode 100644 app/services/gitea/versions/delete_service.rb
create mode 100644 app/services/gitea/versions/update_service.rb
create mode 100644 app/views/version_releases/edit.json.jbuilder
create mode 100644 app/views/version_releases/index.json.jbuilder
create mode 100644 db/migrate/20200106082806_create_version_releases.rb
create mode 100644 db/migrate/20200106093141_add_project_id_to_version_release.rb
create mode 100644 spec/controllers/version_releases_controller_spec.rb
create mode 100644 spec/helpers/version_releases_helper_spec.rb
create mode 100644 spec/models/version_release_spec.rb
diff --git a/app/assets/javascripts/version_releases.js b/app/assets/javascripts/version_releases.js
new file mode 100644
index 000000000..dee720fac
--- /dev/null
+++ b/app/assets/javascripts/version_releases.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/stylesheets/version_releases.scss b/app/assets/stylesheets/version_releases.scss
new file mode 100644
index 000000000..e9f35f1b2
--- /dev/null
+++ b/app/assets/stylesheets/version_releases.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the version_releases controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/version_releases_controller.rb b/app/controllers/version_releases_controller.rb
new file mode 100644
index 000000000..41a1a062c
--- /dev/null
+++ b/app/controllers/version_releases_controller.rb
@@ -0,0 +1,125 @@
+class VersionReleasesController < ApplicationController
+ before_action :set_user_and_project
+ before_action :require_login, except: [:index]
+ before_action :find_version , only: [:edit, :update, :destroy]
+
+ def index
+ version_releases = @repository.version_releases.includes(:user)
+ version_releases = version_releases.where(draft: false) unless current_user.present? && (current_user == @user || current_user.admin?)
+
+ @version_releases_size = version_releases.size
+ page = params[:page]
+ @limit = params[:limit] || 15
+ @version_releases = version_releases.order("created_at desc").page(page).limit(@limit)
+ end
+
+ def create
+ if params[:name].nil?
+ normal_status(-1, "名称不能为空")
+ elsif params[:tag_name].blank?
+ normal_status(-1, "标签名称不能为空")
+ else
+ ActiveRecord::Base.transaction do
+ version_params = {
+ body: params[:body],
+ draft: params[:draft] || false,
+ name: params[:name],
+ prerelease: params[:prerelease],
+ tag_name: params[:tag_name],
+ target_commitish: params[:target_commitish] || "master" #分支
+ }
+ version_release = VersionRelease.new(version_params.merge(user_id: current_user.id, repository_id: @repository.id))
+ if version_release.save!
+ git_version_release = Gitea::Versions::CreateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params).call
+
+ if git_version_release
+ update_params = {
+ tarball_url: git_version_release["tarball_url"],
+ zipball_url: git_version_release["zipball_url"],
+ url: git_version_release["url"],
+ version_gid: git_version_release["id"],
+ }
+ version_release.update_attributes!(update_params)
+ end
+ end
+ rescue => e
+ puts "create version release error: #{e.message}"
+ raise Error, e.message
+ end
+ end
+ end
+
+ def edit
+
+ end
+
+ def update
+ if params[:name].nil?
+ normal_status(-1, "名称不能为空")
+ elsif params[:tag_name].blank?
+ normal_status(-1, "标签名称不能为空")
+ else
+ ActiveRecord::Base.transaction do
+ version_params = {
+ body: params[:body],
+ draft: params[:draft] || false,
+ name: params[:name],
+ prerelease: params[:prerelease],
+ tag_name: params[:tag_name],
+ target_commitish: params[:target_commitish] || "master" #分支
+ }
+ if @version.update_attributes!(version_params)
+ git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
+ unless git_version_release
+ raise Error, "更新失败"
+ end
+ end
+ rescue => e
+ puts "update version release error: #{e.message}"
+ raise Error, e.message
+ end
+ end
+ end
+
+ def destroy
+ ActiveRecord::Base.transaction do
+ if @version.destroy
+ git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
+ unless git_version_release
+ raise Error, "删除失败"
+ end
+ end
+ rescue => e
+ puts "destroy version release error: #{e.message}"
+ raise Error, e.message
+ end
+ end
+
+
+ private
+
+ # def set_project
+ # @project = Project.find_by_id(params[:project_id])
+ # @repository = @project.repository #项目的仓库
+ # unless @project.present? && @repository.present?
+ # normal_status(-1, "仓库不存在")
+ # end
+ # end
+
+ def set_user_and_project
+ @project = Project.find_by_id(params[:project_id])
+ @repository = @project.repository #项目的仓库
+ @user = @project.owner
+ unless @user.present? && @project.present? && @repository.present?
+ normal_status(-1, "仓库不存在")
+ end
+ end
+
+ def find_version
+ @version = VersionRelease.find_by_id(params[:id])
+ unless @version.present?
+ normal_status(-1, "版本不存在")
+ end
+ end
+
+end
diff --git a/app/helpers/version_releases_helper.rb b/app/helpers/version_releases_helper.rb
new file mode 100644
index 000000000..cea9ee693
--- /dev/null
+++ b/app/helpers/version_releases_helper.rb
@@ -0,0 +1,2 @@
+module VersionReleasesHelper
+end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index b51463c4b..441a3b236 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -2,6 +2,7 @@ class Repository < ApplicationRecord
self.inheritance_column = nil # FIX The single-table inheritance mechanism failed
belongs_to :project, :touch => true
belongs_to :user
+ has_many :version_releases, dependent: :destroy
validates :identifier, presence: true, uniqueness: true
diff --git a/app/models/version_release.rb b/app/models/version_release.rb
new file mode 100644
index 000000000..22157e8a0
--- /dev/null
+++ b/app/models/version_release.rb
@@ -0,0 +1,4 @@
+class VersionRelease < ApplicationRecord
+ belongs_to :repository
+ belongs_to :user
+end
diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb
index 0d12c39ed..2995e7207 100644
--- a/app/services/gitea/client_service.rb
+++ b/app/services/gitea/client_service.rb
@@ -50,6 +50,18 @@ class Gitea::ClientService < ApplicationService
render_status(response)
end
+ def update(url, params={})
+ puts "[gitea] request params: #{params}"
+ request_url = [api_url, url].join('').freeze
+ auth_token = authen_params(params[:token])
+
+ response = conn(auth_token).put do |req|
+ req.url "#{request_url}"
+ req.body = params[:data].to_json
+ end
+ render_status(response)
+ end
+
private
def conn(auth={})
username = auth[:username] || access_key_id
diff --git a/app/services/gitea/versions/create_service.rb b/app/services/gitea/versions/create_service.rb
new file mode 100644
index 000000000..6f9b6e445
--- /dev/null
+++ b/app/services/gitea/versions/create_service.rb
@@ -0,0 +1,34 @@
+class Gitea::Versions::CreateService < Gitea::ClientService
+ attr_reader :token, :user_name, :repo, :params
+
+ # params EX:
+ # {
+ # "body": "sylor", #user_name
+ # "draft": false,
+ # "name": "string",
+ # "prerelease": true,
+ # "tag_name": "string",
+ # "target_commitish": "string"
+ # }
+ def initialize(token, user_name, repo, params)
+ @token = token
+ @params = params
+ @user_name = user_name
+ @repo = repo
+ end
+
+ def call
+ post(url, request_params)
+ end
+
+ private
+
+ def request_params
+ Hash.new.merge(token: token, data: params)
+ end
+
+ def url
+ "/repos/#{@user}/#{@repo}/releases".freeze
+ end
+
+end
diff --git a/app/services/gitea/versions/delete_service.rb b/app/services/gitea/versions/delete_service.rb
new file mode 100644
index 000000000..98a649932
--- /dev/null
+++ b/app/services/gitea/versions/delete_service.rb
@@ -0,0 +1,24 @@
+class Gitea::Versions::DeleteService < Gitea::ClientService
+ attr_reader :token, :user_name, :repo,:version_gid
+
+ def initialize(token, user_name, repo,version_gid)
+ @token = token
+ @user_name = user_name
+ @repo = repo
+ @version_gid = version_gid
+ end
+
+ def call
+ delete(url, params)
+ end
+
+ private
+
+ def params
+ Hash.new.merge(token: @token)
+ end
+
+ def url
+ "/repos/#{@user}/#{@repo}/releases/#{@version_gid}".freeze
+ end
+end
diff --git a/app/services/gitea/versions/update_service.rb b/app/services/gitea/versions/update_service.rb
new file mode 100644
index 000000000..d9bc778e5
--- /dev/null
+++ b/app/services/gitea/versions/update_service.rb
@@ -0,0 +1,35 @@
+class Gitea::Versions::UpdateService < Gitea::ClientService
+ attr_reader :token, :user_name, :repo, :params, :version_gid
+
+ # params EX:
+ # {
+ # "body": "sylor", #user_name
+ # "draft": false,
+ # "name": "string",
+ # "prerelease": true,
+ # "tag_name": "string",
+ # "target_commitish": "string"
+ # }
+ def initialize(token, user_name, repo, params,version_gid)
+ @token = token
+ @params = params
+ @user_name = user_name
+ @repo = repo
+ @version_gid = version_gid
+ end
+
+ def call
+ update(url, request_params)
+ end
+
+ private
+
+ def request_params
+ Hash.new.merge(token: token, data: params)
+ end
+
+ def url
+ "/repos/#{@user}/#{@repo}/releases/#{@version_gid}".freeze
+ end
+
+end
diff --git a/app/views/version_releases/edit.json.jbuilder b/app/views/version_releases/edit.json.jbuilder
new file mode 100644
index 000000000..4fbaca78d
--- /dev/null
+++ b/app/views/version_releases/edit.json.jbuilder
@@ -0,0 +1 @@
+json.extract! @version, :id, :name, :body, :tag_name, :target_commitish, :draft, :prerelease,:version_gid
\ No newline at end of file
diff --git a/app/views/version_releases/index.json.jbuilder b/app/views/version_releases/index.json.jbuilder
new file mode 100644
index 000000000..c2706aee9
--- /dev/null
+++ b/app/views/version_releases/index.json.jbuilder
@@ -0,0 +1,21 @@
+json.partial! "commons/success"
+json.all_count @version_releases_size
+json.limit @limit
+json.version_releases do
+ json.array! @version_releases.to_a.each do |re|
+ json.id re.id
+ json.version_gid re.version_gid
+ json.name re.name
+ json.body re.body
+ json.tag_name re.tag_name
+ json.target_commitish re.target_commitish
+ json.release_type re.draft ? "草稿" : (re.prerelease ? "预发行" : "稳定")
+ json.tarball_url re.tarball_url
+ json.zipball_url re.zipball_url
+ json.url re.zipball_url
+ json.user_login re.user.try(:login)
+ json.user_avatar url_to_avatar(re.user)
+ json.created_at format_time(re.created_at)
+ json.format_created time_from_now(re.created_at)
+ end
+end
\ No newline at end of file
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 5d24def63..63148bbd8 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -24,6 +24,9 @@ zh-CN:
merge: 合并了
push: 发布了
+ version:
+ draft: 草稿
+
journal_detail:
issue_tags_value: 标签
lock_issue: 锁定工单
diff --git a/config/routes.rb b/config/routes.rb
index 5126e2ad0..d2ef92e8b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,5 +1,5 @@
Rails.application.routes.draw do
-
+
require 'sidekiq/web'
require 'admin_constraint'
mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new
@@ -46,6 +46,7 @@ Rails.application.routes.draw do
resources :licenses, only: [:index, :show]
resources :projects, only: [:index, :create, :show] do
+ resources :version_releases, only: [:index, :create, :edit, :update, :destroy]
resources :project_trends, only: [:index, :create]
resources :issues do
collection do
diff --git a/db/migrate/20200106082806_create_version_releases.rb b/db/migrate/20200106082806_create_version_releases.rb
new file mode 100644
index 000000000..b061702ca
--- /dev/null
+++ b/db/migrate/20200106082806_create_version_releases.rb
@@ -0,0 +1,18 @@
+class CreateVersionReleases < ActiveRecord::Migration[5.2]
+ def change
+ create_table :version_releases do |t|
+ t.integer :user_id
+ t.string :name
+ t.text :body
+ t.string :tag_name
+ t.string :target_commitish
+ t.boolean :draft, default: false
+ t.boolean :prerelease, default: false
+ t.string :tarball_url
+ t.string :zipball_url
+ t.string :url
+ t.string :version_gid
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20200106093141_add_project_id_to_version_release.rb b/db/migrate/20200106093141_add_project_id_to_version_release.rb
new file mode 100644
index 000000000..df75751b6
--- /dev/null
+++ b/db/migrate/20200106093141_add_project_id_to_version_release.rb
@@ -0,0 +1,6 @@
+class AddProjectIdToVersionRelease < ActiveRecord::Migration[5.2]
+ def change
+ add_column :version_releases, :repository_id, :integer
+ add_index :version_releases, [:repository_id]
+ end
+end
diff --git a/spec/controllers/version_releases_controller_spec.rb b/spec/controllers/version_releases_controller_spec.rb
new file mode 100644
index 000000000..2bca43925
--- /dev/null
+++ b/spec/controllers/version_releases_controller_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe VersionReleasesController, type: :controller do
+
+end
diff --git a/spec/helpers/version_releases_helper_spec.rb b/spec/helpers/version_releases_helper_spec.rb
new file mode 100644
index 000000000..d848552dc
--- /dev/null
+++ b/spec/helpers/version_releases_helper_spec.rb
@@ -0,0 +1,15 @@
+require 'rails_helper'
+
+# Specs in this file have access to a helper object that includes
+# the VersionReleasesHelper. For example:
+#
+# describe VersionReleasesHelper do
+# describe "string concat" do
+# it "concats two strings with spaces" do
+# expect(helper.concat_strings("this","that")).to eq("this that")
+# end
+# end
+# end
+RSpec.describe VersionReleasesHelper, type: :helper do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
diff --git a/spec/models/version_release_spec.rb b/spec/models/version_release_spec.rb
new file mode 100644
index 000000000..2cccfcad7
--- /dev/null
+++ b/spec/models/version_release_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe VersionRelease, type: :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
From fd0398e3ca408aca1987a980e427676c12baefda Mon Sep 17 00:00:00 2001
From: SylorHuang
Date: Mon, 6 Jan 2020 19:52:31 +0800
Subject: [PATCH 4/4] version release
---
.../version_releases_controller.rb | 125 ++++++++++--------
app/views/version_releases/new.json.jbuilder | 2 +
config/routes.rb | 2 +-
3 files changed, 76 insertions(+), 53 deletions(-)
create mode 100644 app/views/version_releases/new.json.jbuilder
diff --git a/app/controllers/version_releases_controller.rb b/app/controllers/version_releases_controller.rb
index 41a1a062c..52f5f10a2 100644
--- a/app/controllers/version_releases_controller.rb
+++ b/app/controllers/version_releases_controller.rb
@@ -13,6 +13,18 @@ class VersionReleasesController < ApplicationController
@version_releases = version_releases.order("created_at desc").page(page).limit(@limit)
end
+ def new
+ #获取所有的分支
+ @all_branches = []
+ get_all_branches = Gitea::Repository::BranchesService.new(@user, @repository.try(:identifier)).call
+ if get_all_branches && get_all_branches.size > 0
+ get_all_branches.each do |b|
+ @all_branches.push(b["name"])
+ end
+ end
+
+ end
+
def create
if params[:name].nil?
normal_status(-1, "名称不能为空")
@@ -20,31 +32,38 @@ class VersionReleasesController < ApplicationController
normal_status(-1, "标签名称不能为空")
else
ActiveRecord::Base.transaction do
- version_params = {
- body: params[:body],
- draft: params[:draft] || false,
- name: params[:name],
- prerelease: params[:prerelease],
- tag_name: params[:tag_name],
- target_commitish: params[:target_commitish] || "master" #分支
- }
- version_release = VersionRelease.new(version_params.merge(user_id: current_user.id, repository_id: @repository.id))
- if version_release.save!
- git_version_release = Gitea::Versions::CreateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params).call
+ begin
+ version_params = {
+ body: params[:body],
+ draft: params[:draft] || false,
+ name: params[:name],
+ prerelease: params[:prerelease],
+ tag_name: params[:tag_name],
+ target_commitish: params[:target_commitish] || "master" #分支
+ }
+ version_release = VersionRelease.new(version_params.merge(user_id: current_user.id, repository_id: @repository.id))
+ if version_release.save!
+ git_version_release = Gitea::Versions::CreateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params).call
- if git_version_release
- update_params = {
- tarball_url: git_version_release["tarball_url"],
- zipball_url: git_version_release["zipball_url"],
- url: git_version_release["url"],
- version_gid: git_version_release["id"],
- }
- version_release.update_attributes!(update_params)
+ if git_version_release
+ update_params = {
+ tarball_url: git_version_release["tarball_url"],
+ zipball_url: git_version_release["zipball_url"],
+ url: git_version_release["url"],
+ version_gid: git_version_release["id"],
+ }
+ version_release.update_attributes!(update_params)
+ normal_status(0, "发布成功")
+ else
+ normal_status(-1, "发布失败")
+ end
+ else
+ normal_status(-1, "发布失败")
end
+ rescue => e
+ puts "create version release error: #{e.message}"
+ raise Error, e.message
end
- rescue => e
- puts "create version release error: #{e.message}"
- raise Error, e.message
end
end
end
@@ -60,52 +79,54 @@ class VersionReleasesController < ApplicationController
normal_status(-1, "标签名称不能为空")
else
ActiveRecord::Base.transaction do
- version_params = {
- body: params[:body],
- draft: params[:draft] || false,
- name: params[:name],
- prerelease: params[:prerelease],
- tag_name: params[:tag_name],
- target_commitish: params[:target_commitish] || "master" #分支
- }
- if @version.update_attributes!(version_params)
- git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
- unless git_version_release
- raise Error, "更新失败"
+ begin
+ version_params = {
+ body: params[:body],
+ draft: params[:draft] || false,
+ name: params[:name],
+ prerelease: params[:prerelease],
+ tag_name: params[:tag_name],
+ target_commitish: params[:target_commitish] || "master" #分支
+ }
+ if @version.update_attributes!(version_params)
+ git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
+ unless git_version_release
+ raise Error, "更新失败"
+ end
+ normal_status(0, "更新成功")
+ else
+ normal_status(-1, "更新失败")
end
+ rescue => e
+ puts "update version release error: #{e.message}"
+ raise Error, e.message
end
- rescue => e
- puts "update version release error: #{e.message}"
- raise Error, e.message
end
end
end
def destroy
ActiveRecord::Base.transaction do
- if @version.destroy
- git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
- unless git_version_release
- raise Error, "删除失败"
+ begin
+ if @version.destroy
+ git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
+ unless git_version_release
+ raise Error, "删除失败"
+ end
+ normal_status(0, "删除成功")
+ else
+ normal_status(-1, "删除失败")
end
+ rescue => e
+ puts "destroy version release error: #{e.message}"
+ raise Error, e.message
end
- rescue => e
- puts "destroy version release error: #{e.message}"
- raise Error, e.message
end
end
private
- # def set_project
- # @project = Project.find_by_id(params[:project_id])
- # @repository = @project.repository #项目的仓库
- # unless @project.present? && @repository.present?
- # normal_status(-1, "仓库不存在")
- # end
- # end
-
def set_user_and_project
@project = Project.find_by_id(params[:project_id])
@repository = @project.repository #项目的仓库
diff --git a/app/views/version_releases/new.json.jbuilder b/app/views/version_releases/new.json.jbuilder
new file mode 100644
index 000000000..f5c5fe67f
--- /dev/null
+++ b/app/views/version_releases/new.json.jbuilder
@@ -0,0 +1,2 @@
+json.partial! "commons/success"
+json.branches @all_branches
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index d2ef92e8b..fbaae68ac 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -46,7 +46,7 @@ Rails.application.routes.draw do
resources :licenses, only: [:index, :show]
resources :projects, only: [:index, :create, :show] do
- resources :version_releases, only: [:index, :create, :edit, :update, :destroy]
+ resources :version_releases, only: [:index,:new, :create, :edit, :update, :destroy]
resources :project_trends, only: [:index, :create]
resources :issues do
collection do