mirror of
https://github.com/wahyd4/gitlabhq.git
synced 2026-08-16 16:16:43 +10:00
Merge branch 'master' of gitlab.com:gitlab-org/gitlab-ce
This commit is contained in:
@@ -2,6 +2,7 @@ Please view this file on the master branch, on stable branches it's out of date.
|
||||
|
||||
v 7.13.0 (unreleased)
|
||||
- Fix redirection to home page URL for unauthorized users (Daniel Gerhardt)
|
||||
- Add branch switching support for graphs (Daniel Gerhardt)
|
||||
- Fix external issue tracker hook/test for HTTPS URLs (Daniel Gerhardt)
|
||||
- Remove link leading to a 404 error in Deploy Keys page (Stan Hu)
|
||||
- Add support for unlocking users in admin settings (Stan Hu)
|
||||
@@ -19,6 +20,7 @@ v 7.13.0 (unreleased)
|
||||
- Update maintenance documentation to explain no need to recompile asssets for omnibus installations (Stan Hu)
|
||||
- Support commenting on diffs in side-by-side mode (Stan Hu)
|
||||
- Fix JavaScript error when clicking on the comment button on a diff line that has a comment already (Stan Hu)
|
||||
- Return 40x error codes if branch could not be deleted in UI (Stan Hu)
|
||||
- Remove project visibility icons from dashboard projects list
|
||||
- Rename "Design" profile settings page to "Preferences".
|
||||
- Allow users to customize their default Dashboard page.
|
||||
@@ -51,6 +53,8 @@ v 7.12.1
|
||||
- Fix closed merge request scope at milestone page (Dmitriy Zaporozhets)
|
||||
- Revert merge request states renaming
|
||||
- Fix hooks for web based events with external issue references (Daniel Gerhardt)
|
||||
- Improve performance for issue and merge request pages
|
||||
- Compress database dumps to reduce backup size
|
||||
|
||||
v 7.12.0
|
||||
- Fix Error 500 when one user attempts to access a personal, internal snippet (Stan Hu)
|
||||
|
||||
@@ -32,7 +32,7 @@ class Projects::BranchesController < Projects::ApplicationController
|
||||
end
|
||||
|
||||
def destroy
|
||||
DeleteBranchService.new(project, current_user).execute(params[:id])
|
||||
status = DeleteBranchService.new(project, current_user).execute(params[:id])
|
||||
@branch_name = params[:id]
|
||||
|
||||
respond_to do |format|
|
||||
@@ -40,7 +40,7 @@ class Projects::BranchesController < Projects::ApplicationController
|
||||
redirect_to namespace_project_branches_path(@project.namespace,
|
||||
@project)
|
||||
end
|
||||
format.js
|
||||
format.js { render status: status[:return_code] }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
class Projects::GraphsController < Projects::ApplicationController
|
||||
include ExtractsPath
|
||||
|
||||
# Authorize
|
||||
before_action :require_non_empty_project
|
||||
before_action :assign_ref_vars
|
||||
before_action :authorize_download_code!
|
||||
|
||||
def show
|
||||
@@ -13,7 +16,7 @@ class Projects::GraphsController < Projects::ApplicationController
|
||||
end
|
||||
|
||||
def commits
|
||||
@commits = @project.repository.commits(nil, nil, 2000, 0, true)
|
||||
@commits = @project.repository.commits(@ref, nil, 2000, 0, true)
|
||||
@commits_graph = Gitlab::Graphs::Commits.new(@commits)
|
||||
@commits_per_week_days = @commits_graph.commits_per_week_days
|
||||
@commits_per_time = @commits_graph.commits_per_time
|
||||
@@ -23,7 +26,7 @@ class Projects::GraphsController < Projects::ApplicationController
|
||||
private
|
||||
|
||||
def fetch_graph
|
||||
@commits = @project.repository.commits(nil, nil, 6000, 0, true)
|
||||
@commits = @project.repository.commits(@ref, nil, 6000, 0, true)
|
||||
@log = []
|
||||
|
||||
@commits.each do |commit|
|
||||
|
||||
@@ -8,17 +8,21 @@ class Projects::RefsController < Projects::ApplicationController
|
||||
def switch
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
new_path = if params[:destination] == "tree"
|
||||
namespace_project_tree_path(@project.namespace, @project,
|
||||
(@id))
|
||||
elsif params[:destination] == "blob"
|
||||
namespace_project_blob_path(@project.namespace, @project,
|
||||
(@id))
|
||||
elsif params[:destination] == "graph"
|
||||
namespace_project_network_path(@project.namespace, @project, @id, @options)
|
||||
else
|
||||
namespace_project_commits_path(@project.namespace, @project, @id)
|
||||
end
|
||||
new_path =
|
||||
case params[:destination]
|
||||
when "tree"
|
||||
namespace_project_tree_path(@project.namespace, @project, @id)
|
||||
when "blob"
|
||||
namespace_project_blob_path(@project.namespace, @project, @id)
|
||||
when "graph"
|
||||
namespace_project_network_path(@project.namespace, @project, @id, @options)
|
||||
when "graphs"
|
||||
namespace_project_graph_path(@project.namespace, @project, @id)
|
||||
when "graphs_commits"
|
||||
commits_namespace_project_graph_path(@project.namespace, @project, @id)
|
||||
else
|
||||
namespace_project_commits_path(@project.namespace, @project, @id)
|
||||
end
|
||||
|
||||
redirect_to new_path
|
||||
end
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
- page_title "Commit statistics"
|
||||
.tree-ref-holder
|
||||
= render 'shared/ref_switcher', destination: 'graphs_commits'
|
||||
= render 'head'
|
||||
|
||||
%p.lead
|
||||
Commit statistics for
|
||||
%strong #{@repository.root_ref}
|
||||
%strong #{@ref}
|
||||
#{@commits_graph.start_date.strftime('%b %d')} - #{@commits_graph.end_date.strftime('%b %d')}
|
||||
|
||||
.row
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
- page_title "Contributor statistics"
|
||||
.tree-ref-holder
|
||||
= render 'shared/ref_switcher', destination: 'graphs'
|
||||
= render 'head'
|
||||
|
||||
.loading-graph
|
||||
.center
|
||||
%h3.page-title
|
||||
@@ -11,7 +14,7 @@
|
||||
.header.clearfix
|
||||
%h3#date_header.page-title
|
||||
%p.light
|
||||
Commits to #{@project.default_branch}, excluding merge commits. Limited by 6,000 commits
|
||||
Commits to #{@ref}, excluding merge commits. Limited by 6,000 commits
|
||||
%input#brush_change{:type => "hidden"}
|
||||
.graphs
|
||||
#contributors-master
|
||||
@@ -35,4 +38,3 @@
|
||||
$(".stat-graph").fadeIn();
|
||||
$(".loading-graph").hide();
|
||||
dataType: "json"
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
- [System Hooks](system_hooks.md)
|
||||
- [Groups](groups.md)
|
||||
- [Namespaces](namespaces.md)
|
||||
- [Settings](settings.md)
|
||||
|
||||
## Clients
|
||||
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
# Application settings
|
||||
|
||||
This API allows you to read and modify GitLab instance application settings.
|
||||
|
||||
|
||||
## Get current application settings:
|
||||
|
||||
```
|
||||
GET /application/settings
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"default_projects_limit": 10,
|
||||
"signup_enabled": true,
|
||||
"signin_enabled": true,
|
||||
"gravatar_enabled": true,
|
||||
"sign_in_text": "",
|
||||
"created_at": "2015-06-12T15:51:55.432Z",
|
||||
"updated_at": "2015-06-30T13:22:42.210Z",
|
||||
"home_page_url": "",
|
||||
"default_branch_protection": 2,
|
||||
"twitter_sharing_enabled": true,
|
||||
"restricted_visibility_levels": [],
|
||||
"max_attachment_size": 10,
|
||||
"session_expire_delay": 10080,
|
||||
"default_project_visibility": 0,
|
||||
"default_snippet_visibility": 0,
|
||||
"restricted_signup_domains": [],
|
||||
"user_oauth_applications": true,
|
||||
"after_sign_out_path": ""
|
||||
}
|
||||
```
|
||||
|
||||
## Change application settings:
|
||||
|
||||
|
||||
|
||||
```
|
||||
PUT /application/settings
|
||||
```
|
||||
|
||||
Parameters:
|
||||
|
||||
- `default_projects_limit` - project limit per user
|
||||
- `signup_enabled` - enable registration
|
||||
- `signin_enabled` - enable login via GitLab account
|
||||
- `gravatar_enabled` - enable gravatar
|
||||
- `sign_in_text` - text on login page
|
||||
- `home_page_url` - redirect to this URL when not logged in
|
||||
- `default_branch_protection` - determine if developers can push to master
|
||||
- `twitter_sharing_enabled` - allow users to share project creation in twitter
|
||||
- `restricted_visibility_levels` - restrict certain visibility levels
|
||||
- `max_attachment_size` - limit attachment size
|
||||
- `session_expire_delay` - session lifetime
|
||||
- `default_project_visibility` - what visibility level new project receives
|
||||
- `default_snippet_visibility` - what visibility level new snippet receives
|
||||
- `restricted_signup_domains` - force people to use only corporate emails for signup
|
||||
- `user_oauth_applications` - allow users to create oauth applicaitons
|
||||
- `after_sign_out_path` - where redirect user after logout
|
||||
|
||||
All parameters are optional. You can send only one that you want to change.
|
||||
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"default_projects_limit": 10,
|
||||
"signup_enabled": true,
|
||||
"signin_enabled": true,
|
||||
"gravatar_enabled": true,
|
||||
"sign_in_text": "",
|
||||
"created_at": "2015-06-12T15:51:55.432Z",
|
||||
"updated_at": "2015-06-30T13:22:42.210Z",
|
||||
"home_page_url": "",
|
||||
"default_branch_protection": 2,
|
||||
"twitter_sharing_enabled": true,
|
||||
"restricted_visibility_levels": [],
|
||||
"max_attachment_size": 10,
|
||||
"session_expire_delay": 10080,
|
||||
"default_project_visibility": 0,
|
||||
"default_snippet_visibility": 0,
|
||||
"restricted_signup_domains": [],
|
||||
"user_oauth_applications": true,
|
||||
"after_sign_out_path": ""
|
||||
}
|
||||
```
|
||||
@@ -57,12 +57,15 @@ sudo -u git -H git clone https://github.com/gitlabhq/mysql-postgresql-converter.
|
||||
sudo -u git -H mkdir db
|
||||
sudo -u git -H python mysql-postgresql-converter/db_converter.py gitlabhq_production.mysql db/database.sql
|
||||
|
||||
# Compress database backup
|
||||
sudo -u git -H gzip db/database.sql
|
||||
|
||||
# Replace the MySQL dump in TIMESTAMP_gitlab_backup.tar.
|
||||
|
||||
# Warning: if you forget to replace TIMESTAMP below, tar will create a new file
|
||||
# 'TIMESTAMP_gitlab_backup.tar' without giving an error.
|
||||
|
||||
sudo -u git -H tar rf TIMESTAMP_gitlab_backup.tar db/database.sql
|
||||
sudo -u git -H tar rf TIMESTAMP_gitlab_backup.tar db/database.sql.gz
|
||||
|
||||
# Done! TIMESTAMP_gitlab_backup.tar can now be restored into a Postgres GitLab
|
||||
# installation. Remember to recreate the indexes after the import.
|
||||
|
||||
@@ -49,5 +49,6 @@ module API
|
||||
mount Namespaces
|
||||
mount Branches
|
||||
mount Labels
|
||||
mount Settings
|
||||
end
|
||||
end
|
||||
|
||||
@@ -277,5 +277,27 @@ module API
|
||||
class BroadcastMessage < Grape::Entity
|
||||
expose :message, :starts_at, :ends_at, :color, :font
|
||||
end
|
||||
|
||||
class ApplicationSetting < Grape::Entity
|
||||
expose :id
|
||||
expose :default_projects_limit
|
||||
expose :signup_enabled
|
||||
expose :signin_enabled
|
||||
expose :gravatar_enabled
|
||||
expose :sign_in_text
|
||||
expose :created_at
|
||||
expose :updated_at
|
||||
expose :home_page_url
|
||||
expose :default_branch_protection
|
||||
expose :twitter_sharing_enabled
|
||||
expose :restricted_visibility_levels
|
||||
expose :max_attachment_size
|
||||
expose :session_expire_delay
|
||||
expose :default_project_visibility
|
||||
expose :default_snippet_visibility
|
||||
expose :restricted_signup_domains
|
||||
expose :user_oauth_applications
|
||||
expose :after_sign_out_path
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
module API
|
||||
class Settings < Grape::API
|
||||
before { authenticated_as_admin! }
|
||||
|
||||
helpers do
|
||||
def current_settings
|
||||
@current_setting ||=
|
||||
(ApplicationSetting.current || ApplicationSetting.create_from_defaults)
|
||||
end
|
||||
end
|
||||
|
||||
# Get current applicaiton settings
|
||||
#
|
||||
# Example Request:
|
||||
# GET /application/settings
|
||||
get "application/settings" do
|
||||
present current_settings, with: Entities::ApplicationSetting
|
||||
end
|
||||
|
||||
# Modify applicaiton settings
|
||||
#
|
||||
# Example Request:
|
||||
# PUT /application/settings
|
||||
put "application/settings" do
|
||||
attributes = current_settings.attributes.keys - ["id"]
|
||||
attrs = attributes_for_keys(attributes)
|
||||
|
||||
if current_settings.update_attributes(attrs)
|
||||
present current_settings, with: Entities::ApplicationSetting
|
||||
else
|
||||
render_validation_error!(current_settings)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -22,9 +22,19 @@ module Backup
|
||||
end
|
||||
report_success(success)
|
||||
abort 'Backup failed' unless success
|
||||
|
||||
$progress.print 'Compressing database ... '
|
||||
success = system('gzip', db_file_name)
|
||||
report_success(success)
|
||||
abort 'Backup failed: compress error' unless success
|
||||
end
|
||||
|
||||
def restore
|
||||
$progress.print 'Decompressing database ... '
|
||||
success = system('gzip', '-d', db_file_name_gz)
|
||||
report_success(success)
|
||||
abort 'Restore failed: decompress error' unless success
|
||||
|
||||
success = case config["adapter"]
|
||||
when /^mysql/ then
|
||||
$progress.print "Restoring MySQL database #{config['database']} ... "
|
||||
@@ -48,6 +58,10 @@ module Backup
|
||||
File.join(db_dir, 'database.sql')
|
||||
end
|
||||
|
||||
def db_file_name_gz
|
||||
File.join(db_dir, 'database.sql.gz')
|
||||
end
|
||||
|
||||
def mysql_args
|
||||
args = {
|
||||
'host' => '--host',
|
||||
|
||||
@@ -55,4 +55,30 @@ describe Projects::BranchesController do
|
||||
it { is_expected.to render_template('new') }
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST destroy" do
|
||||
render_views
|
||||
|
||||
before do
|
||||
post :destroy,
|
||||
format: :js,
|
||||
id: branch,
|
||||
namespace_id: project.namespace.to_param,
|
||||
project_id: project.to_param
|
||||
end
|
||||
|
||||
context "valid branch name, valid source" do
|
||||
let(:branch) { "feature" }
|
||||
|
||||
it { expect(response.status).to eq(200) }
|
||||
it { expect(subject).to render_template('destroy') }
|
||||
end
|
||||
|
||||
context "invalid branch name, valid ref" do
|
||||
let(:branch) { "no-branch" }
|
||||
|
||||
it { expect(response.status).to eq(404) }
|
||||
it { expect(subject).to render_template('destroy') }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe API::API, 'Settings', api: true do
|
||||
include ApiHelpers
|
||||
|
||||
let(:user) { create(:user) }
|
||||
let(:admin) { create(:admin) }
|
||||
|
||||
|
||||
describe "GET /application/settings" do
|
||||
it "should return application settings" do
|
||||
get api("/application/settings", admin)
|
||||
expect(response.status).to eq(200)
|
||||
expect(json_response).to be_an Hash
|
||||
expect(json_response['default_projects_limit']).to eq(42)
|
||||
expect(json_response['signin_enabled']).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
describe "PUT /application/settings" do
|
||||
it "should update application settings" do
|
||||
put api("/application/settings", admin),
|
||||
default_projects_limit: 3, signin_enabled: false
|
||||
expect(response.status).to eq(200)
|
||||
expect(json_response['default_projects_limit']).to eq(3)
|
||||
expect(json_response['signin_enabled']).to be_falsey
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user