Commit b8ea26f7a6904eae83732d473f55fc959773417f

Authored by dosire
2 parents d54e3f36 dc8bd607

Merge branch 'master' into readable-doc-readme

Conflicts:
	doc/README.md
CHANGELOG
... ... @@ -6,6 +6,7 @@ v 6.8.0
6 6 - Drop all tables before restoring a Postgres backup
7 7 - Make the repository downloads path configurable
8 8 - Create branches via API (sponsored by O'Reilly Media)
  9 + - Changed permission of gitlab-satellites directory not to be world accessible
9 10  
10 11 v 6.7.2
11 12 - Fix upgrader script
... ...
Gemfile
... ... @@ -12,8 +12,6 @@ gem "rails", "~> 4.0.0"
12 12  
13 13 gem "protected_attributes"
14 14 gem 'rails-observers'
15   -gem 'actionpack-page_caching'
16   -gem 'actionpack-action_caching'
17 15  
18 16 # Default values for AR models
19 17 gem "default_value_for", "~> 3.0.0"
... ...
Gemfile.lock
... ... @@ -27,10 +27,6 @@ GEM
27 27 erubis (~> 2.7.0)
28 28 rack (~> 1.5.2)
29 29 rack-test (~> 0.6.2)
30   - actionpack-action_caching (1.1.0)
31   - actionpack (>= 4.0.0, < 5.0)
32   - actionpack-page_caching (1.0.2)
33   - actionpack (>= 4.0.0, < 5)
34 30 activemodel (4.0.3)
35 31 activesupport (= 4.0.3)
36 32 builder (~> 3.1.0)
... ... @@ -567,8 +563,6 @@ PLATFORMS
567 563  
568 564 DEPENDENCIES
569 565 ace-rails-ap
570   - actionpack-action_caching
571   - actionpack-page_caching
572 566 acts-as-taggable-on
573 567 annotate (~> 2.6.0.beta2)
574 568 asciidoctor
... ...
app/assets/stylesheets/application.scss
... ... @@ -2,7 +2,7 @@
2 2 * This is a manifest file that'll automatically include all the stylesheets available in this directory
3 3 * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4 4 * the top of the compiled file, but it's generally better to create a new file per style scope.
5   - *= require jquery.ui.gitlab
  5 + *= require jquery.ui.datepicker
6 6 *= require jquery.atwho
7 7 *= require select2
8 8 *= require highlightjs.min
... ... @@ -43,6 +43,7 @@
43 43 @import "generic/forms.scss";
44 44 @import "generic/selects.scss";
45 45 @import "generic/highlight.scss";
  46 +@import "generic/jquery.scss";
46 47  
47 48 /**
48 49 * Page specific styles (issues, projects etc):
... ...
app/assets/stylesheets/generic/jquery.scss 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +.ui-widget {
  2 + font-family: $regular_font;
  3 + font-size: $font-size-base;
  4 +
  5 + &.ui-datepicker-inline {
  6 + border: 1px solid #DDD;
  7 + padding: 10px;
  8 + width: 270px;
  9 +
  10 + .ui-datepicker-header {
  11 + background: #EEE;
  12 + border-color: #DDD;
  13 + }
  14 +
  15 + .ui-datepicker-calendar td a {
  16 + padding: 5px;
  17 + text-align: center;
  18 + }
  19 + }
  20 +}
... ...
app/assets/stylesheets/jquery.ui.gitlab.css
... ... @@ -1,257 +0,0 @@
1   -/* Interaction Cues
2   -----------------------------------*/
3   -.ui-state-disabled { cursor: default !important; }
4   -
5   -
6   -/* Icons
7   -----------------------------------*/
8   -
9   -/* states and images */
10   -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
11   -
12   -
13   -/* Misc visuals
14   -----------------------------------*/
15   -
16   -/* Overlays */
17   -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
18   -
19   -
20   -/*
21   - * jQuery UI CSS Framework 1.8.7
22   - *
23   - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
24   - * Dual licensed under the MIT or GPL Version 2 licenses.
25   - * http://jquery.org/license
26   - *
27   - * http://docs.jquery.com/UI/Theming/API
28   - *
29   - * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller
30   - */
31   -
32   -
33   -/* Component containers
34   -----------------------------------*/
35   -.ui-widget { font-family: Arial,sans-serif; font-size: 1.1em; }
36   -.ui-widget .ui-widget { font-size: 1em; }
37   -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial,sans-serif; font-size: 1em; }
38   -.ui-widget-content { border: 1px solid #CCC; background: #ffffff; color: #4F4F4F; }
39   -.ui-widget-content a { color: #4F4F4F; }
40   -.ui-widget-header { border: 1px solid #B6B6B6; color: #4F4F4F; font-weight: bold; }
41   -.ui-widget-header {
42   - background: #ededed url(bg_fallback.png) 0 0 repeat-x; /* Old browsers */
43   - background: -moz-linear-gradient(top, #ededed 0%, #c4c4c4 100%); /* FF3.6+ */
44   - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(100%,#c4c4c4)); /* Chrome,Safari4+ */
45   - background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */
46   - background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */
47   - background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */
48   - background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */
49   -}
50   -.ui-widget-header a { color: #4F4F4F; }
51   -
52   -/* Interaction states
53   -----------------------------------*/
54   -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #B6B6B6; font-weight: normal; color: #4F4F4F; }
55   -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
56   - background: #ededed url(bg_fallback.png) 0 0 repeat-x; /* Old browsers */
57   - background: -moz-linear-gradient(top, #ededed 0%, #c4c4c4 100%); /* FF3.6+ */
58   - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(100%,#c4c4c4)); /* Chrome,Safari4+ */
59   - background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */
60   - background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */
61   - background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */
62   - background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */
63   - -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset;
64   - -moz-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset;
65   - box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset;
66   -}
67   -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #4F4F4F; text-decoration: none; }
68   -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #9D9D9D; font-weight: normal; color: #313131; }
69   -.ui-state-hover a, .ui-state-hover a:hover { color: #313131; text-decoration: none; }
70   -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
71   - outline: none;
72   - color: #1c4257; border: 1px solid #7096ab;
73   - background: #ededed url(bg_fallback.png) 0 -50px repeat-x; /* Old browsers */
74   - background: -moz-linear-gradient(top, #b9e0f5 0%, #92bdd6 100%); /* FF3.6+ */
75   - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b9e0f5), color-stop(100%,#92bdd6)); /* Chrome,Safari4+ */
76   - background: -webkit-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Chrome10+,Safari5.1+ */
77   - background: -o-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Opera11.10+ */
78   - background: -ms-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* IE10+ */
79   - background: linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* W3C */
80   - -webkit-box-shadow: none;
81   - -moz-box-shadow: none;
82   - box-shadow: none;
83   -}
84   -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #313131; text-decoration: none; }
85   -.ui-widget :active { outline: none; }
86   -
87   -/* Interaction Cues
88   -----------------------------------*/
89   -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { border: 1px solid #d2dbf4; background: #f4f8fd; color: #0d2054; -moz-border-radius: 0 !important; -webkit-border-radius: 0 !important; border-radius: 0 !important; }
90   -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
91   -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { border: 1px solid #e2d0d0; background: #fcf0f0; color: #280b0b; -moz-border-radius: 0 !important; -webkit-border-radius: 0 !important; border-radius: 0 !important; }
92   -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
93   -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
94   -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
95   -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
96   -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
97   -
98   -/* Icons
99   -----------------------------------*/
100   -
101   -/* states and images */
102   -.ui-icon { width: 16px; height: 16px; background-image: url(ui-icons_222222_256x240.png); }
103   -.ui-widget-content .ui-icon {background-image: url(ui-icons_222222_256x240.png); }
104   -.ui-widget-header .ui-icon {background-image: url(ui-icons_222222_256x240.png); }
105   -.ui-state-default .ui-icon { background-image: url(ui-icons_454545_256x240.png); }
106   -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(ui-icons_454545_256x240.png); }
107   -.ui-state-active .ui-icon {background-image: url(ui-icons_454545_256x240.png); }
108   -.ui-state-highlight .ui-icon {background-image: url(ui-icons_454545_256x240.png); }
109   -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { background: url(icon_sprite.png) -16px 0 no-repeat !important; }
110   -.ui-state-highlight .ui-icon, .ui-state-error .ui-icon { margin-top: -1px; }
111   -
112   -
113   -/* Misc visuals
114   -----------------------------------*/
115   -
116   -/* Overlays */
117   -.ui-widget-overlay { background: #262b33; opacity: .70;filter:Alpha(Opacity=70); }
118   -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #000000; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
119   -/*
120   - * jQuery UI Selectable 1.8.7
121   - *
122   - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
123   - * Dual licensed under the MIT or GPL Version 2 licenses.
124   - * http://jquery.org/license
125   - *
126   - * http://docs.jquery.com/UI/Selectable#theming
127   - */
128   -.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
129   -/*
130   - * jQuery UI Autocomplete 1.8.7
131   - *
132   - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
133   - * Dual licensed under the MIT or GPL Version 2 licenses.
134   - * http://jquery.org/license
135   - *
136   - * http://docs.jquery.com/UI/Autocomplete#theming
137   - */
138   -.ui-autocomplete {
139   - position: absolute; cursor: default; z-index: 3;
140   - -moz-border-radius: 0;
141   - -webkit-border-radius: 0;
142   - border-radius: 0;
143   - -moz-box-shadow: 0 1px 5px rgba(0,0,0,0.3);
144   - -webkit-box-shadow: 0 1px 5px rgba(0,0,0,0.3);
145   - box-shadow: 0 1px 5px rgba(0,0,0,0.3);
146   -}
147   -
148   -/* workarounds */
149   -* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
150   -
151   -/*
152   - * jQuery UI Menu 1.8.7
153   - *
154   - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
155   - * Dual licensed under the MIT or GPL Version 2 licenses.
156   - * http://jquery.org/license
157   - *
158   - * http://docs.jquery.com/UI/Menu#theming
159   - */
160   -.ui-menu {
161   - list-style:none;
162   - padding: 1px;
163   - margin: 0;
164   - display:block;
165   - float: left;
166   -}
167   -.ui-menu .ui-menu {
168   - margin-top: -3px;
169   -}
170   -.ui-menu .ui-menu-item {
171   - margin:0;
172   - padding: 0;
173   - zoom: 1;
174   - float: left;
175   - clear: left;
176   - width: 100%;
177   -}
178   -.ui-menu .ui-menu-item a {
179   - text-decoration:none;
180   - display:block;
181   - padding:.2em .4em;
182   - line-height:1.5;
183   - zoom:1;
184   - color: #666;
185   - font-size: 13px;
186   -}
187   -.ui-menu .ui-menu-item a.ui-state-hover,
188   -.ui-menu .ui-menu-item a.ui-state-active {
189   - font-weight: normal;
190   - margin: -1px;
191   - background: #D9EDF7;
192   - color: #3A89A3;
193   - text-shadow: 0px 1px 1px #fff;
194   - border: none;
195   - border: 1px solid #ADE;
196   - cursor: pointer;
197   - font-weight: bold;
198   -}
199   -
200   -/*
201   - * jQuery UI Datepicker 1.8.7
202   - *
203   - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
204   - * Dual licensed under the MIT or GPL Version 2 licenses.
205   - * http://jquery.org/license
206   - *
207   - * http://docs.jquery.com/UI/Datepicker#theming
208   - */
209   -.ui-datepicker {
210   - width: 17em;
211   - padding: 0;
212   - display: none;
213   - border-color: #DDDDDD;
214   - border: none;
215   - box-shadow: none;
216   -}
217   -.ui-datepicker .ui-datepicker-header {
218   - position:relative;
219   - padding:.35em 0;
220   - border: none;
221   - border-bottom: 1px solid #B6B6B6;
222   - -moz-border-radius: 0;
223   - -webkit-border-radius: 0;
224   - border-radius: 0;
225   - margin-bottom: 10px;
226   - border: 1px solid #bbb;
227   - -webkit-box-shadow: 0 0 0 3px #F1F1F1;
228   - -moz-box-shadow: 0 0 0 3px #f1f1f1;
229   - -ms-box-shadow: 0 0 0 3px #f1f1f1;
230   - -o-box-shadow: 0 0 0 3px #f1f1f1;
231   - box-shadow: 0 0 0 3px #F1F1F1;
232   -}
233   -
234   -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 6px; width: 1.8em; height: 1.8em; }
235   -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { border: 1px none; }
236   -.ui-datepicker .ui-datepicker-prev { left:2px; }
237   -.ui-datepicker .ui-datepicker-next { right:2px; }
238   -.ui-datepicker .ui-datepicker-prev span { background-position: 0px -32px !important; }
239   -.ui-datepicker .ui-datepicker-next span { background-position: -16px -32px !important; }
240   -.ui-datepicker .ui-datepicker-prev-hover span { background-position: 0px -48px !important; }
241   -.ui-datepicker .ui-datepicker-next-hover span { background-position: -16px -48px !important; }
242   -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; background: url(icon_sprite.png) no-repeat; }
243   -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; font-size: 12px; text-shadow: 0 1px 0 rgba(255,255,255,0.6); }
244   -.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
245   -.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
246   -.ui-datepicker select.ui-datepicker-month,
247   -.ui-datepicker select.ui-datepicker-year { width: 49%;}
248   -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
249   -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
250   -.ui-datepicker td { border: 0; padding: 1px; line-height: 24px; background-color: #FFF!important; }
251   -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
252   -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
253   -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
254   -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
255   -.ui-datepicker table .ui-state-highlight { border-color: #ADE; }
256   -.ui-datepicker-calendar .ui-state-default { background: transparent; border-color: #FFF; }
257   -.ui-datepicker-calendar .ui-state-active { background: #D9EDF7; border-color: #ADE; color: #3A89A3; font-weight: bold; text-shadow: 0 1px 1px #fff; }
app/assets/stylesheets/main/fonts.scss
1 1 /** Typo **/
2 2 $monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono', 'lucida console', monospace;
  3 +$regular_font: "Helvetica Neue", Helvetica, Arial, sans-serif;
... ...
app/helpers/merge_requests_helper.rb
... ... @@ -20,7 +20,7 @@ module MergeRequestsHelper
20 20 target_project_id: target_project.id,
21 21 source_branch: event.branch_name,
22 22 target_branch: target_project.repository.root_ref,
23   - title: event.branch_name.humanize
  23 + title: event.branch_name.titleize.humanize
24 24 }
25 25 end
26 26  
... ...
app/views/projects/issues/_head.html.haml
... ... @@ -20,6 +20,11 @@
20 20 = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do
21 21 .append-right-10.hidden-xs.hidden-sm
22 22 = search_field_tag :issue_search, nil, { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' }
  23 + = hidden_field_tag :state, params['state']
  24 + = hidden_field_tag :scope, params['scope']
  25 + = hidden_field_tag :assignee_id, params['assignee_id']
  26 + = hidden_field_tag :milestone_id, params['milestone_id']
  27 + = hidden_field_tag :label_id, params['label_id']
23 28 - if can? current_user, :write_issue, @project
24 29 = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do
25 30 %i.icon-plus
... ...
app/views/projects/merge_requests/branch_from.js.haml
... ... @@ -3,5 +3,5 @@
3 3 var mrTitle = $('#merge_request_title');
4 4  
5 5 if(mrTitle.val().length == 0) {
6   - mrTitle.val("#{params[:ref].humanize}");
  6 + mrTitle.val("#{params[:ref].titleize.humanize}");
7 7 }
... ...
config/application.rb
... ... @@ -64,6 +64,7 @@ module Gitlab
64 64 config.assets.enabled = true
65 65 config.assets.paths << Emoji.images_path
66 66 config.assets.precompile << "emoji/*.png"
  67 + config.assets.precompile << "print.css"
67 68  
68 69 # Version of your assets, change this if you want to expire all your assets
69 70 config.assets.version = '1.0'
... ...
doc/install/installation.md
... ... @@ -202,6 +202,7 @@ You can change `6-6-stable` to `master` if you want the *bleeding edge* version,
202 202  
203 203 # Create directory for satellites
204 204 sudo -u git -H mkdir /home/git/gitlab-satellites
  205 + sudo chmod o-rwx /home/git/gitlab-satellites
205 206  
206 207 # Create directories for sockets/pids and make sure GitLab can write to them
207 208 sudo -u git -H mkdir tmp/pids/
... ...
doc/workflow/README.md 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 ++ [Workflow](workflow/workflow.md)
  2 ++ [Project Features](workflow/project_features.md)
... ...
doc/workflow/project_features.md 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +When in a Project -> Settings, you will find Features on the bottom of the page that you can toggle.
  2 +Below you will find a more elaborate explanation of each of these.
  3 +
  4 +
  5 +## Issues
  6 +
  7 +Issues is a really powerful, but lightweight issue tracking system.
  8 +You can make tickets, assign them to people, file them under milestones, order them with labels and have discussion in them.
  9 +They integrate deeply into GitLab and are easily referenced from anywhere by using # and the issuenumber.
  10 +At GitLab.com, we use this for all our project management needs.
  11 +
  12 +## Merge Requests
  13 +
  14 +Using a merge request, you can review and discuss code before it is merged in the branch of your code.
  15 +As with issues, it can be assigned; people, issues, etc. can be refereced; milestones attached.
  16 +We see it as an integral part of working together on code and couldn't work without it.
  17 +
  18 +
  19 +## Wiki
  20 +
  21 +This is a separate system for documentation, built right into GitLab.
  22 +It is source controlled and is very convenient if you don't want to keep you documentation in your source code, but you do want to keep it in your GitLab project.
  23 +
  24 +
  25 +## Wall
  26 +
  27 +For simple, project specific conversations, the wall can be used.
  28 +It's very lightweight and simple and works well if you're not interested in using issues, but still want to occasionally communicate within a project.
  29 +
  30 +
  31 +## Snippets
  32 +
  33 +Snippets are little bits of code or text.
  34 +This is a nice place to put code or text that is used semi-regularly within the project, but does not belong in source control.
  35 +For example, a specific config file that is used by > the team that is only valid for the people that work on the code.
... ...
lib/tasks/gitlab/check.rake
... ... @@ -342,6 +342,7 @@ namespace :gitlab do
342 342 check_repo_base_is_not_symlink
343 343 check_repo_base_user_and_group
344 344 check_repo_base_permissions
  345 + check_satellites_permissions
345 346 check_update_hook_is_up_to_date
346 347 check_repos_update_hooks_is_link
347 348 check_gitlab_shell_self_test
... ... @@ -443,6 +444,29 @@ namespace :gitlab do
443 444 end
444 445 end
445 446  
  447 + def check_satellites_permissions
  448 + print "Satellites access is drwxr-x---? ... "
  449 +
  450 + satellites_path = Gitlab.config.satellites.path
  451 + unless File.exists?(satellites_path)
  452 + puts "can't check because of previous errors".magenta
  453 + return
  454 + end
  455 +
  456 + if File.stat(satellites_path).mode.to_s(8).ends_with?("0750")
  457 + puts "yes".green
  458 + else
  459 + puts "no".red
  460 + try_fixing_it(
  461 + "sudo chmod u+rwx,g+rx,o-rwx #{satellites_path}",
  462 + )
  463 + for_more_information(
  464 + see_installation_guide_section "GitLab"
  465 + )
  466 + fix_and_rerun
  467 + end
  468 + end
  469 +
446 470 def check_repo_base_user_and_group
447 471 gitlab_shell_ssh_user = Gitlab.config.gitlab_shell.ssh_user
448 472 gitlab_shell_owner_group = Gitlab.config.gitlab_shell.owner_group
... ...