Commit 8045a81bcf5822f1992442750e1484a93c368229

Authored by Sebastian Ziebell
2 parents 5d8a99f1 2f0a75ab

Merge branch 'master' into fixes/api

Showing 262 changed files with 1808 additions and 1431 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 262 files displayed.

CHANGELOG
  1 +v 5.0.0
  2 + - replaced gitolite with gitlab-shell
  3 +
1 4 v 4.2.0
2 5 - User show page. Via /u/username
3 6 - Show help contents on pages for better navigation
... ...
Gemfile
... ... @@ -32,9 +32,6 @@ gem 'gitlab_omniauth-ldap', '1.0.2', require: "omniauth-ldap"
32 32 # Dump db to yml file. Mostly used to migrate from sqlite to mysql
33 33 gem 'gitlab_yaml_db', '1.0.0', require: "yaml_db"
34 34  
35   -# Gitolite client (for work with gitolite-admin repo)
36   -gem "gitolite", '1.1.0'
37   -
38 35 # Syntax highlighter
39 36 gem "pygments.rb", git: "https://github.com/gitlabhq/pygments.rb.git", branch: "master"
40 37  
... ... @@ -165,5 +162,5 @@ group :test do
165 162 end
166 163  
167 164 group :production do
168   - gem "gitlab_meta", '4.0'
  165 + gem "gitlab_meta", '5.0'
169 166 end
... ...
Gemfile.lock
... ... @@ -107,7 +107,6 @@ GEM
107 107 coderay (>= 1.0.0)
108 108 erubis (>= 2.7.0)
109 109 binding_of_caller (0.6.8)
110   - blankslate (3.1.2)
111 110 bootstrap-sass (2.2.1.1)
112 111 sass (~> 3.2)
113 112 builder (3.0.4)
... ... @@ -188,17 +187,13 @@ GEM
188 187 mime-types (~> 1.19)
189 188 pygments.rb (>= 0.2.13)
190 189 github-markup (0.7.4)
191   - gitlab_meta (4.0)
  190 + gitlab_meta (5.0)
192 191 gitlab_omniauth-ldap (1.0.2)
193 192 net-ldap (~> 0.2.2)
194 193 omniauth (~> 1.0)
195 194 pyu-ruby-sasl (~> 0.0.3.1)
196 195 rubyntlm (~> 0.1.1)
197 196 gitlab_yaml_db (1.0.0)
198   - gitolite (1.1.0)
199   - gratr19 (~> 0.4.4.1)
200   - grit (~> 2.5.0)
201   - hashery (~> 1.5.0)
202 197 grape (0.2.2)
203 198 activesupport
204 199 hashie (~> 1.2)
... ... @@ -208,7 +203,6 @@ GEM
208 203 rack-accept
209 204 rack-mount
210 205 virtus
211   - gratr19 (0.4.4.1)
212 206 growl (1.0.3)
213 207 guard (1.5.4)
214 208 listen (>= 0.4.2)
... ... @@ -227,8 +221,6 @@ GEM
227 221 activesupport (>= 3.1, < 4.1)
228 222 haml (~> 3.1)
229 223 railties (>= 3.1, < 4.1)
230   - hashery (1.5.0)
231   - blankslate
232 224 hashie (1.2.0)
233 225 hike (1.2.1)
234 226 http_parser.rb (0.5.3)
... ... @@ -494,10 +486,9 @@ DEPENDENCIES
494 486 git
495 487 github-linguist (~> 2.3.4)
496 488 github-markup (~> 0.7.4)
497   - gitlab_meta (= 4.0)
  489 + gitlab_meta (= 5.0)
498 490 gitlab_omniauth-ldap (= 1.0.2)
499 491 gitlab_yaml_db (= 1.0.0)
500   - gitolite (= 1.1.0)
501 492 grack!
502 493 grape (~> 0.2.1)
503 494 grit!
... ...
ROADMAP.md
1 1 ## GitLab Roadmap
2 2  
3   -### v4.3 March 22
  3 +### v5.0 March 22
4 4  
5   -* Jenkins CI integration service
  5 +* Replace gitolite with gitlab-shell
6 6 * Usability improvements
7 7 * Notification improvements
8 8  
9 9 ### v4.2 February 22
10 10  
11   -* Campfire integration service
12 11 * Teams
13 12  
... ...
VERSION
1   -4.2.0pre
  1 +5.0.0pre
... ...
app/assets/images/home_icon.PNG

596 Bytes

app/assets/images/icon-attachment.png

450 Bytes

app/assets/javascripts/notes.js
... ... @@ -20,12 +20,12 @@ var NoteList = {
20 20  
21 21 if(NoteList.reversed) {
22 22 var form = $(".js-main-target-form");
23   - form.find(".buttons, .note_options").hide();
  23 + form.find(".note-form-actions").hide();
24 24 var textarea = form.find(".js-note-text");
25 25 textarea.css("height", "40px");
26 26 textarea.on("focus", function(){
27 27 textarea.css("height", "80px");
28   - form.find(".buttons, .note_options").show();
  28 + form.find(".note-form-actions").show();
29 29 });
30 30 }
31 31  
... ...
app/assets/stylesheets/common.scss
... ... @@ -338,10 +338,6 @@ li.note {
338 338 li {
339 339 border-bottom:none !important;
340 340 }
341   - .attachment {
342   - padding-left: 20px;
343   - background:url("icon-attachment.png") no-repeat left center;
344   - }
345 341 }
346 342 }
347 343  
... ...
app/assets/stylesheets/gitlab_bootstrap.scss
... ... @@ -17,6 +17,8 @@ $baseLineHeight: 18px !default;
17 17 @import "gitlab_bootstrap/variables.scss";
18 18 @import "gitlab_bootstrap/fonts.scss";
19 19 @import "gitlab_bootstrap/mixins.scss";
  20 +@import "gitlab_bootstrap/avatar.scss";
  21 +@import "gitlab_bootstrap/nav.scss";
20 22 @import "gitlab_bootstrap/common.scss";
21 23 @import "gitlab_bootstrap/typography.scss";
22 24 @import "gitlab_bootstrap/buttons.scss";
... ...
app/assets/stylesheets/gitlab_bootstrap/avatar.scss 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +/** AVATARS **/
  2 +img.avatar { float: left; margin-right: 12px; width: 40px; border: 1px solid #ddd; padding: 1px; }
  3 +img.avatar.s16 { width: 16px; height: 16px; margin-right: 6px; }
  4 +img.avatar.s24 { width: 24px; height: 24px; margin-right: 8px; }
  5 +img.avatar.s32 { width: 32px; height: 32px; margin-right: 10px; }
  6 +img.avatar.s90 { width: 90px; height: 90px; margin-right: 15px; }
  7 +img.lil_av { padding-left: 4px; padding-right: 3px; }
  8 +img.small { width: 80px; }
... ...
app/assets/stylesheets/gitlab_bootstrap/blocks.scss
... ... @@ -95,7 +95,11 @@
95 95  
96 96 form {
97 97 margin-bottom: 0;
98   - margin-top: 3px;
  98 + margin-top: 0;
  99 + }
  100 +
  101 + .btn-tiny {
  102 + @include box-shadow(0 0px 0px 1px #f1f1f1);
99 103 }
100 104  
101 105 .nav-pills {
... ...
app/assets/stylesheets/gitlab_bootstrap/buttons.scss
1 1 .btn {
2   - @include linear-gradient(#f7f7f7, #d5d5d5);
  2 + @include linear-gradient(#f1f1f1, #e1e1e1);
  3 + text-shadow: 0 1px 1px #FFF;
3 4 border-color: #BBB;
  5 +
4 6 &:hover {
5   - @include bg-gray-gradient;
6   - border-color: #bbb;
  7 + background: #f1f1f1;
  8 + @include linear-gradient(#fAfAfA, #f1f1f1);
  9 + border-color: #AAA;
7 10 color: #333;
8 11 }
9 12  
10   - &.btn-white {
11   - background: #FFF;
12   - }
13   -
14   - &.primary {
  13 + &.btn-primary {
15 14 background: #2a79A3;
16 15 @include linear-gradient(#47A7b7, #2585b5);
17 16 border-color: #2A79A3;
... ... @@ -58,21 +57,18 @@
58 57 }
59 58 }
60 59  
61   - &.save-btn {
  60 + &.btn-create {
62 61 @extend .wide;
63   - @extend .primary;
  62 + @extend .success;
64 63 }
65 64  
66   - &.cancel-btn {
67   - float: right;
68   - }
69   -
70   - &.wide {
71   - padding-left: 30px;
72   - padding-right: 30px;
  65 + &.btn-save {
  66 + @extend .wide;
  67 + @extend .btn-primary;
73 68 }
74 69  
75   - &.danger {
  70 + &.btn-close,
  71 + &.btn-remove {
76 72 @extend .btn-danger;
77 73 border-color: #BD362F;
78 74  
... ... @@ -82,8 +78,13 @@
82 78 }
83 79 }
84 80  
85   - &.danger {
86   - @extend .btn-danger;
  81 + &.btn-cancel {
  82 + float: right;
  83 + }
  84 +
  85 + &.wide {
  86 + padding-left: 20px;
  87 + padding-right: 20px;
87 88 }
88 89  
89 90 &.small {
... ... @@ -95,7 +96,7 @@
95 96 background-color: #ccc;
96 97 }
97 98  
98   - &.very_small {
  99 + &.btn-tiny {
99 100 font-size: 11px;
100 101 padding: 2px 6px;
101 102 line-height: 16px;
... ...
app/assets/stylesheets/gitlab_bootstrap/common.scss
... ... @@ -9,7 +9,6 @@
9 9  
10 10 /** COMMON CLASSES **/
11 11 .left { float:left }
12   -.right { float:right!important }
13 12 .append-bottom-10 { margin-bottom:10px }
14 13 .append-bottom-20 { margin-bottom:20px }
15 14 .prepend-top-10 { margin-top:10px }
... ... @@ -22,82 +21,13 @@
22 21 .light { color: #888 }
23 22 .tiny { font-weight: normal }
24 23  
25   -/** PILLS & TABS**/
26   -.nav-pills {
27   - .active a {
28   - background: $primary_color;
29   - }
30   -
31   - > li > a {
32   - @include border-radius(0);
33   - }
34   - &.nav-stacked {
35   - > li > a {
36   - border-left: 4px solid #EEE;
37   - padding: 12px;
38   - }
39   - > .active > a {
40   - border-color: #29B;
41   - border-radius: 0;
42   - background: #F1F1F1;
43   - color: $style_color;
44   - font-weight: bold;
45   - }
46   - }
47   -}
48   -
49   -.nav-pills > .active > a > i[class^="icon-"] { background: inherit; }
50   -
51   -
52   -
53   -/**
54   - * nav-tabs
55   - *
56   - */
57   -.nav-tabs > li > a, .nav-pills > li > a { color: $style_color; }
58   -.nav.nav-tabs {
59   - li {
60   - > a {
61   - padding: 8px 20px;
62   - margin-right: 7px;
63   - line-height: 20px;
64   - border-color: #EEE;
65   - color: #888;
66   - border-bottom: 1px solid #ddd;
67   - .badge {
68   - background-color: #eee;
69   - color: #888;
70   - text-shadow: 0 1px 1px #fff;
71   - }
72   - i[class^="icon-"] {
73   - line-height: 14px;
74   - }
75   - }
76   - &.active {
77   - > a {
78   - border-color: #CCC;
79   - border-bottom: 1px solid #fff;
80   - color: #333;
81   - }
82   - }
83   - }
84   -
85   - &.nav-small-tabs > li > a { padding: 6px 9px; }
86   -}
87 24  
88 25 /** ALERT MESSAGES **/
89   -.alert-message { @extend .alert; }
90   -.alert-messag.success { @extend .alert-success; }
91   -.alert-message.error { @extend .alert-error; }
92   -
93   -/** AVATARS **/
94   -img.avatar { float: left; margin-right: 12px; width: 40px; border: 1px solid #ddd; padding: 1px; }
95   -img.avatar.s16 { width: 16px; height: 16px; margin-right: 6px; }
96   -img.avatar.s24 { width: 24px; height: 24px; margin-right: 8px; }
97   -img.avatar.s32 { width: 32px; height: 32px; margin-right: 10px; }
98   -img.avatar.s90 { width: 90px; height: 90px; margin-right: 15px; }
99   -img.lil_av { padding-left: 4px; padding-right: 3px; }
100   -img.small { width: 80px; }
  26 +.alert.alert-disabled {
  27 + background: #EEE;
  28 + color: #777;
  29 + border-color: #DDD;
  30 +}
101 31  
102 32 /** HELPERS **/
103 33 .nothing_here_message {
... ...
app/assets/stylesheets/gitlab_bootstrap/nav.scss 0 → 100644
... ... @@ -0,0 +1,65 @@
  1 +/**
  2 + * nav-pills
  3 + *
  4 + */
  5 +.nav-pills {
  6 + .active a {
  7 + background: $primary_color;
  8 + }
  9 +
  10 + > li > a {
  11 + @include border-radius(0);
  12 + }
  13 + &.nav-stacked {
  14 + > li > a {
  15 + border-left: 4px solid #EEE;
  16 + padding: 12px;
  17 + }
  18 + > .active > a {
  19 + border-color: #29B;
  20 + border-radius: 0;
  21 + background: #F1F1F1;
  22 + color: $style_color;
  23 + font-weight: bold;
  24 + }
  25 + }
  26 +}
  27 +
  28 +.nav-pills > .active > a > i[class^="icon-"] { background: inherit; }
  29 +
  30 +
  31 +
  32 +/**
  33 + * nav-tabs
  34 + *
  35 + */
  36 +.nav-tabs > li > a, .nav-pills > li > a { color: $style_color; }
  37 +.nav.nav-tabs {
  38 + li {
  39 + > a {
  40 + padding: 8px 20px;
  41 + margin-right: 7px;
  42 + line-height: 20px;
  43 + border-color: #EEE;
  44 + color: #888;
  45 + border-bottom: 1px solid #ddd;
  46 + .badge {
  47 + background-color: #eee;
  48 + color: #888;
  49 + text-shadow: 0 1px 1px #fff;
  50 + }
  51 + i[class^="icon-"] {
  52 + line-height: 14px;
  53 + }
  54 + }
  55 + &.active {
  56 + > a {
  57 + border-color: #CCC;
  58 + border-bottom: 1px solid #fff;
  59 + color: #333;
  60 + }
  61 + }
  62 + }
  63 +
  64 + &.nav-small-tabs > li > a { padding: 6px 9px; }
  65 +}
... ...
app/assets/stylesheets/sections/events.scss
... ... @@ -127,7 +127,7 @@
127 127 .btn-new-mr {
128 128 @extend .btn-info;
129 129 @extend .small;
130   - @extend .right;
  130 + @extend .pull-right;
131 131 margin: -3px;
132 132 }
133 133 }
... ...
app/assets/stylesheets/sections/login.scss
1 1 /* Login Page */
2   -body.login-page{
3   - padding-top: 10%;
4   - background: #f1f1f1;
  2 +body.login-page{
  3 + padding-top: 7%;
  4 + background: #666;
5 5 }
6 6  
7 7 .login-box{
... ...
app/assets/stylesheets/sections/nav.scss
... ... @@ -6,8 +6,7 @@ ul.main_menu {
6 6 margin: auto;
7 7 margin: 30px 0;
8 8 margin-top: 10px;
9   - border-bottom: 1px solid #DDD;
10   - height: 37px;
  9 + height: 38px;
11 10 position: relative;
12 11 overflow: hidden;
13 12 .count {
... ... @@ -33,6 +32,7 @@ ul.main_menu {
33 32 margin: 0;
34 33 display: table-cell;
35 34 width: 1%;
  35 + border-bottom: 2px solid #EEE;
36 36 &.active {
37 37 border-bottom: 2px solid #474D57;
38 38 a {
... ... @@ -42,10 +42,8 @@ ul.main_menu {
42 42  
43 43 &.home {
44 44 a {
45   - background: url(home_icon.PNG) no-repeat center center;
46   - text-indent:-9999px;
47   - min-width: 20px;
48   - img {
  45 + i {
  46 + font-size: 20px;
49 47 position: relative;
50 48 top: 4px;
51 49 }
... ... @@ -56,7 +54,7 @@ ul.main_menu {
56 54 display: block;
57 55 text-align: center;
58 56 font-weight: normal;
59   - height: 35px;
  57 + height: 36px;
60 58 line-height: 36px;
61 59 color: #777;
62 60 text-shadow: 0 1px 1px white;
... ...
app/assets/stylesheets/sections/notes.scss
... ... @@ -81,14 +81,6 @@ ul.notes {
81 81 .attachment {
82 82 font-size: 14px;
83 83 margin-top: -20px;
84   -
85   - .icon-attachment {
86   - @extend .icon-paper-clip;
87   - font-size: 24px;
88   - position: relative;
89   - text-align: right;
90   - top: 6px;
91   - }
92 84 }
93 85 .note-body {
94 86 margin-left: 45px;
... ... @@ -214,9 +206,11 @@ ul.notes {
214 206 * Note Form
215 207 */
216 208  
217   -.comment-btn,
  209 +.comment-btn {
  210 + @extend .btn-create;
  211 +}
218 212 .reply-btn {
219   - @extend .save-btn;
  213 + @extend .btn-primary;
220 214 }
221 215 .file .content tr.line_holder:hover > td { background: $hover !important; }
222 216 .file .content tr.line_holder:hover > td .line_note_link {
... ... @@ -227,11 +221,6 @@ ul.notes {
227 221 .discussion {
228 222 .new_note {
229 223 margin: 8px 5px 8px 0;
230   -
231   - .note_options {
232   - // because of the smaller width and the extra "cancel" button
233   - margin-top: 8px;
234   - }
235 224 }
236 225 }
237 226 .new_note {
... ... @@ -244,37 +233,6 @@ ul.notes {
244 233 .clearfix {
245 234 margin-bottom: 0;
246 235 }
247   - .note_options {
248   - h6 {
249   - @extend .left;
250   - line-height: 20px;
251   - padding-right: 16px;
252   - padding-bottom: 16px;
253   - }
254   - label {
255   - padding: 0;
256   - }
257   -
258   - .attachment {
259   - @extend .right;
260   - position: relative;
261   - width: 350px;
262   - height: 50px;
263   - margin:0 0 5px !important;
264   -
265   - // hide the actual file field
266   - input {
267   - display: none;
268   - }
269   -
270   - .choose-btn {
271   - float: right;
272   - }
273   - }
274   - .notify_options {
275   - @extend .right;
276   - }
277   - }
278 236 .note_text_and_preview {
279 237 // makes the "absolute" position for links relative to this
280 238 position: relative;
... ... @@ -313,3 +271,17 @@ ul.notes {
313 271 @extend .thumbnail;
314 272 margin-left: 45px;
315 273 }
  274 +
  275 +
  276 +.note-form-actions {
  277 + background: #F9F9F9;
  278 + height: 45px;
  279 + padding: 0 5px;
  280 +
  281 + .note-form-option {
  282 + margin-top: 8px;
  283 + margin-left: 15px;
  284 + @extend .pull-left;
  285 + @extend .span4;
  286 + }
  287 +}
... ...
app/assets/stylesheets/sections/projects.scss
... ... @@ -4,7 +4,7 @@
4 4 }
5 5  
6 6 .side {
7   - @extend .right;
  7 + @extend .pull-right;
8 8  
9 9 .projects_box {
10 10 > .title {
... ...
app/controllers/application_controller.rb
... ... @@ -4,16 +4,12 @@ class ApplicationController &lt; ActionController::Base
4 4 before_filter :set_current_user_for_observers
5 5 before_filter :add_abilities
6 6 before_filter :dev_tools if Rails.env == 'development'
  7 + before_filter :default_headers
7 8  
8 9 protect_from_forgery
9 10  
10 11 helper_method :abilities, :can?
11 12  
12   - rescue_from Gitlab::Gitolite::AccessDenied do |exception|
13   - log_exception(exception)
14   - render "errors/gitolite", layout: "errors", status: 500
15   - end
16   -
17 13 rescue_from Encoding::CompatibilityError do |exception|
18 14 log_exception(exception)
19 15 render "errors/encoding", layout: "errors", status: 500
... ... @@ -148,4 +144,8 @@ class ApplicationController &lt; ActionController::Base
148 144 Rack::MiniProfiler.authorize_request
149 145 end
150 146  
  147 + def default_headers
  148 + headers['X-Frame-Options'] = 'DENY'
  149 + headers['X-XSS-Protection'] = '1; mode=block'
  150 + end
151 151 end
... ...
app/controllers/graph_controller.rb 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +class GraphController < ProjectResourceController
  2 + include ExtractsPath
  3 +
  4 + # Authorize
  5 + before_filter :authorize_read_project!
  6 + before_filter :authorize_code_access!
  7 + before_filter :require_non_empty_project
  8 +
  9 + def show
  10 + respond_to do |format|
  11 + format.html
  12 + format.json do
  13 + graph = Gitlab::Graph::JsonBuilder.new(project, @ref)
  14 + render :json => graph.to_json
  15 + end
  16 + end
  17 + end
  18 +end
... ...
app/controllers/groups_controller.rb
... ... @@ -6,6 +6,7 @@ class GroupsController &lt; ApplicationController
6 6  
7 7 # Authorize
8 8 before_filter :authorize_read_group!, except: [:new, :create]
  9 + before_filter :authorize_admin_group!, only: [:edit, :update, :destroy]
9 10 before_filter :authorize_create_group!, only: [:new, :create]
10 11  
11 12 # Load group projects
... ... @@ -84,6 +85,31 @@ class GroupsController &lt; ApplicationController
84 85 redirect_to people_group_path(@group), notice: 'Users was successfully added.'
85 86 end
86 87  
  88 + def edit
  89 + end
  90 +
  91 + def update
  92 + group_params = params[:group].dup
  93 + owner_id =group_params.delete(:owner_id)
  94 +
  95 + if owner_id
  96 + @group.owner = User.find(owner_id)
  97 + end
  98 +
  99 + if @group.update_attributes(group_params)
  100 + redirect_to @group, notice: 'Group was successfully updated.'
  101 + else
  102 + render action: "edit"
  103 + end
  104 + end
  105 +
  106 + def destroy
  107 + @group.truncate_teams
  108 + @group.destroy
  109 +
  110 + redirect_to root_path, notice: 'Group was removed.'
  111 + end
  112 +
87 113 protected
88 114  
89 115 def group
... ... @@ -106,6 +132,14 @@ class GroupsController &lt; ApplicationController
106 132 end
107 133  
108 134 def authorize_create_group!
109   - can?(current_user, :create_group, nil)
  135 + unless can?(current_user, :create_group, nil)
  136 + return render_404
  137 + end
  138 + end
  139 +
  140 + def authorize_admin_group!
  141 + unless can?(current_user, :manage_group, group)
  142 + return render_404
  143 + end
110 144 end
111 145 end
... ...
app/controllers/projects_controller.rb
... ... @@ -90,16 +90,6 @@ class ProjectsController &lt; ProjectResourceController
90 90 end
91 91 end
92 92  
93   - def graph
94   - respond_to do |format|
95   - format.html
96   - format.json do
97   - graph = Gitlab::Graph::JsonBuilder.new(project)
98   - render :json => graph.to_json
99   - end
100   - end
101   - end
102   -
103 93 def destroy
104 94 return access_denied! unless can?(current_user, :remove_project, project)
105 95  
... ...
app/controllers/refs_controller.rb
... ... @@ -13,6 +13,8 @@ class RefsController &lt; ProjectResourceController
13 13 format.html do
14 14 new_path = if params[:destination] == "tree"
15 15 project_tree_path(@project, (@ref + "/" + params[:path]))
  16 + elsif params[:destination] == "graph"
  17 + project_graph_path(@project, @ref)
16 18 else
17 19 project_commits_path(@project, @ref)
18 20 end
... ...
app/helpers/projects_helper.rb
... ... @@ -43,7 +43,7 @@ module ProjectsHelper
43 43 tm = project.team_member_by_id(author)
44 44  
45 45 if tm
46   - link_to author_html, project_team_member_path(project, tm), class: "author_link"
  46 + link_to author_html, project_team_member_path(project, tm.user_username), class: "author_link"
47 47 else
48 48 author_html
49 49 end.html_safe
... ...
app/mailers/notify.rb
... ... @@ -10,6 +10,10 @@ class Notify &lt; ActionMailer::Base
10 10  
11 11 default from: Gitlab.config.gitlab.email_from
12 12  
  13 + # Just send email with 3 seconds delay
  14 + def self.delay
  15 + delay_for(2.seconds)
  16 + end
13 17  
14 18  
15 19 #
... ... @@ -63,12 +67,12 @@ class Notify &lt; ActionMailer::Base
63 67 # Note
64 68 #
65 69  
66   - def note_commit_email(commit_autor_email, note_id)
  70 + def note_commit_email(recipient_id, note_id)
67 71 @note = Note.find(note_id)
68 72 @commit = @note.noteable
69 73 @commit = CommitDecorator.decorate(@commit)
70 74 @project = @note.project
71   - mail(to: commit_autor_email, subject: subject("note for commit #{@commit.short_id}", @commit.title))
  75 + mail(to: recipient(recipient_id), subject: subject("note for commit #{@commit.short_id}", @commit.title))
72 76 end
73 77  
74 78 def note_issue_email(recipient_id, note_id)
... ...
app/models/key.rb
... ... @@ -24,8 +24,8 @@ class Key &lt; ActiveRecord::Base
24 24 before_save :set_identifier
25 25  
26 26 validates :title, presence: true, length: { within: 0..255 }
27   - validates :key, presence: true, length: { within: 0..5000 }, format: { :with => /ssh-.{3} / }
28   - validate :unique_key, :fingerprintable_key
  27 + validates :key, presence: true, length: { within: 0..5000 }, format: { :with => /ssh-.{3} / }, uniqueness: true
  28 + validate :fingerprintable_key
29 29  
30 30 delegate :name, :email, to: :user, prefix: true
31 31  
... ... @@ -33,14 +33,6 @@ class Key &lt; ActiveRecord::Base
33 33 self.key = self.key.strip unless self.key.blank?
34 34 end
35 35  
36   - def unique_key
37   - query = Key.where(key: key)
38   - query = query.where('(project_id IS NULL OR project_id = ?)', project_id) if project_id
39   - if (query.count > 0)
40   - errors.add :key, 'already exist.'
41   - end
42   - end
43   -
44 36 def fingerprintable_key
45 37 return true unless key # Don't test if there is no key.
46 38 # `ssh-keygen -lf /dev/stdin <<< "#{key}"` errors with: redirection unexpected
... ... @@ -65,7 +57,7 @@ class Key &lt; ActiveRecord::Base
65 57 end
66 58  
67 59 def is_deploy_key
68   - true if project_id
  60 + !!project_id
69 61 end
70 62  
71 63 # projects that has this key
... ... @@ -77,7 +69,7 @@ class Key &lt; ActiveRecord::Base
77 69 end
78 70 end
79 71  
80   - def last_deploy?
81   - Key.where(identifier: identifier).count == 0
  72 + def shell_id
  73 + "key-#{self.id}"
82 74 end
83 75 end
... ...
app/models/namespace.rb
... ... @@ -27,7 +27,6 @@ class Namespace &lt; ActiveRecord::Base
27 27  
28 28 after_create :ensure_dir_exist
29 29 after_update :move_dir
30   - after_commit :update_gitolite, on: :update, if: :require_update_gitolite
31 30 after_destroy :rm_dir
32 31  
33 32 scope :root, where('type IS NULL')
... ... @@ -89,11 +88,6 @@ class Namespace &lt; ActiveRecord::Base
89 88 end
90 89 end
91 90  
92   - def update_gitolite
93   - @require_update_gitolite = false
94   - projects.each(&:update_repository)
95   - end
96   -
97 91 def rm_dir
98 92 dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
99 93 FileUtils.rm_r( dir_path, force: true )
... ...
app/models/project.rb
... ... @@ -8,7 +8,6 @@
8 8 # description :text
9 9 # created_at :datetime not null
10 10 # updated_at :datetime not null
11   -# private_flag :boolean default(TRUE), not null
12 11 # creator_id :integer
13 12 # default_branch :string(255)
14 13 # issues_enabled :boolean default(TRUE), not null
... ... @@ -16,6 +15,7 @@
16 15 # merge_requests_enabled :boolean default(TRUE), not null
17 16 # wiki_enabled :boolean default(TRUE), not null
18 17 # namespace_id :integer
  18 +# public :boolean default(FALSE), not null
19 19 #
20 20  
21 21 require "grit"
... ... @@ -262,8 +262,6 @@ class Project &lt; ActiveRecord::Base
262 262  
263 263 Gitlab::ProjectMover.new(self, old_dir, new_dir).execute
264 264  
265   - gitolite.move_repository(old_repo, self)
266   -
267 265 save!
268 266 end
269 267 rescue Gitlab::ProjectMover::ProjectMoveError => ex
... ... @@ -459,20 +457,6 @@ class Project &lt; ActiveRecord::Base
459 457 namespace.try(:path) || ''
460 458 end
461 459  
462   - def update_repository
463   - GitoliteWorker.perform_async(
464   - :update_repository,
465   - self.id
466   - )
467   - end
468   -
469   - def destroy_repository
470   - GitoliteWorker.perform_async(
471   - :remove_repository,
472   - self.path_with_namespace
473   - )
474   - end
475   -
476 460 def repo_exists?
477 461 @repo_exists ||= (repository && repository.branches.present?)
478 462 rescue
... ...
app/models/project_team.rb
... ... @@ -112,7 +112,6 @@ class ProjectTeam
112 112 source_team.each do |tm|
113 113 tm.save
114 114 end
115   - target_project.update_repository
116 115 end
117 116  
118 117 true
... ...
app/models/protected_branch.rb
... ... @@ -18,13 +18,6 @@ class ProtectedBranch &lt; ActiveRecord::Base
18 18 validates :name, presence: true
19 19 validates :project, presence: true
20 20  
21   - after_save :update_repository
22   - after_destroy :update_repository
23   -
24   - def update_repository
25   - project.update_repository
26   - end
27   -
28 21 def commit
29 22 project.repository.commit(self.name)
30 23 end
... ...
app/models/user.rb
... ... @@ -31,6 +31,8 @@
31 31 # extern_uid :string(255)
32 32 # provider :string(255)
33 33 # username :string(255)
  34 +# can_create_group :boolean default(TRUE), not null
  35 +# can_create_team :boolean default(TRUE), not null
34 36 #
35 37  
36 38 class User < ActiveRecord::Base
... ...
app/models/user_team.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: user_teams
  4 +#
  5 +# id :integer not null, primary key
  6 +# name :string(255)
  7 +# path :string(255)
  8 +# owner_id :integer
  9 +# created_at :datetime not null
  10 +# updated_at :datetime not null
  11 +#
  12 +
1 13 class UserTeam < ActiveRecord::Base
2 14 attr_accessible :name, :owner_id, :path
3 15  
... ...
app/models/user_team_project_relationship.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: user_team_project_relationships
  4 +#
  5 +# id :integer not null, primary key
  6 +# project_id :integer
  7 +# user_team_id :integer
  8 +# greatest_access :integer
  9 +# created_at :datetime not null
  10 +# updated_at :datetime not null
  11 +#
  12 +
1 13 class UserTeamProjectRelationship < ActiveRecord::Base
2 14 attr_accessible :greatest_access, :project_id, :user_team_id
3 15  
... ...
app/models/user_team_user_relationship.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: user_team_user_relationships
  4 +#
  5 +# id :integer not null, primary key
  6 +# user_id :integer
  7 +# user_team_id :integer
  8 +# group_admin :boolean
  9 +# permission :integer
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +#
  13 +
1 14 class UserTeamUserRelationship < ActiveRecord::Base
2 15 attr_accessible :group_admin, :permission, :user_id, :user_team_id
3 16  
... ...
app/models/users_project.rb
... ... @@ -25,15 +25,12 @@ class UsersProject &lt; ActiveRecord::Base
25 25  
26 26 attr_accessor :skip_git
27 27  
28   - after_save :update_repository, unless: :skip_git?
29   - after_destroy :update_repository, unless: :skip_git?
30   -
31 28 validates :user, presence: true
32 29 validates :user_id, uniqueness: { scope: [:project_id], message: "already exists in project" }
33 30 validates :project_access, inclusion: { in: [GUEST, REPORTER, DEVELOPER, MASTER] }, presence: true
34 31 validates :project, presence: true
35 32  
36   - delegate :name, :email, to: :user, prefix: true
  33 + delegate :name, :username, :email, to: :user, prefix: true
37 34  
38 35 scope :guests, where(project_access: GUEST)
39 36 scope :reporters, where(project_access: REPORTER)
... ... @@ -84,11 +81,6 @@ class UsersProject &lt; ActiveRecord::Base
84 81 end
85 82 end
86 83  
87   - GitoliteWorker.perform_async(
88   - :update_repositories,
89   - project_ids
90   - )
91   -
92 84 true
93 85 rescue
94 86 false
... ... @@ -103,11 +95,6 @@ class UsersProject &lt; ActiveRecord::Base
103 95 end
104 96 end
105 97  
106   - GitoliteWorker.perform_async(
107   - :update_repositories,
108   - project_ids
109   - )
110   -
111 98 true
112 99 rescue
113 100 false
... ... @@ -136,10 +123,6 @@ class UsersProject &lt; ActiveRecord::Base
136 123 end
137 124 end
138 125  
139   - def update_repository
140   - project.update_repository
141   - end
142   -
143 126 def project_access_human
144 127 Project.access_options.key(self.project_access)
145 128 end
... ...
app/observers/key_observer.rb
... ... @@ -3,20 +3,17 @@ class KeyObserver &lt; ActiveRecord::Observer
3 3  
4 4 def after_save(key)
5 5 GitoliteWorker.perform_async(
6   - :set_key,
7   - key.identifier,
8   - key.key,
9   - key.projects.map(&:id)
  6 + :add_key,
  7 + key.shell_id,
  8 + key.key
10 9 )
11 10 end
12 11  
13 12 def after_destroy(key)
14   - return if key.is_deploy_key && !key.last_deploy?
15   -
16 13 GitoliteWorker.perform_async(
17 14 :remove_key,
18   - key.identifier,
19   - key.projects.map(&:id)
  15 + key.shell_id,
  16 + key.key,
20 17 )
21 18 end
22 19 end
... ...
app/observers/note_observer.rb
... ... @@ -11,7 +11,9 @@ class NoteObserver &lt; ActiveRecord::Observer
11 11 notify_team(note)
12 12 elsif note.notify_author
13 13 # Notify only author of resource
14   - Notify.delay.note_commit_email(note.noteable.author_email, note.id)
  14 + if note.commit_author
  15 + Notify.delay.note_commit_email(note.commit_author.id, note.id)
  16 + end
15 17 else
16 18 # Otherwise ignore it
17 19 nil
... ...
app/observers/project_observer.rb
1 1 class ProjectObserver < ActiveRecord::Observer
2 2 def after_create(project)
3   - project.update_repository
  3 + GitoliteWorker.perform_async(
  4 + :add_repository,
  5 + project.path_with_namespace
  6 + )
  7 +
  8 + log_info("#{project.owner.name} created a new project \"#{project.name_with_namespace}\"")
4 9 end
5 10  
6 11 def after_update(project)
... ... @@ -8,14 +13,14 @@ class ProjectObserver &lt; ActiveRecord::Observer
8 13 end
9 14  
10 15 def after_destroy(project)
11   - log_info("Project \"#{project.name}\" was removed")
  16 + GitoliteWorker.perform_async(
  17 + :remove_repository,
  18 + project.path_with_namespace
  19 + )
12 20  
13 21 project.satellite.destroy
14   - project.destroy_repository
15   - end
16 22  
17   - def after_create project
18   - log_info("#{project.owner.name} created a new project \"#{project.name_with_namespace}\"")
  23 + log_info("Project \"#{project.name}\" was removed")
19 24 end
20 25  
21 26 protected
... ...
app/views/admin/dashboard/index.html.haml
... ... @@ -6,7 +6,7 @@
6 6 = link_to admin_projects_path do
7 7 %h1= Project.count
8 8 %hr
9   - = link_to 'New Project', new_project_path, class: "btn small"
  9 + = link_to 'New Project', new_project_path, class: "btn btn-small"
10 10 .span4
11 11 .ui-box
12 12 %h5.title Groups
... ... @@ -14,7 +14,7 @@
14 14 = link_to admin_groups_path do
15 15 %h1= Group.count
16 16 %hr
17   - = link_to 'New Group', new_admin_group_path, class: "btn small"
  17 + = link_to 'New Group', new_admin_group_path, class: "btn btn-small"
18 18 .span4
19 19 .ui-box
20 20 %h5.title Users
... ... @@ -22,7 +22,7 @@
22 22 = link_to admin_users_path do
23 23 %h1= User.count
24 24 %hr
25   - = link_to 'New User', new_admin_user_path, class: "btn small"
  25 + = link_to 'New User', new_admin_user_path, class: "btn btn-small"
26 26  
27 27 .row
28 28 .span4
... ... @@ -31,7 +31,7 @@
31 31 - @projects.each do |project|
32 32 %p
33 33 = link_to project.name_with_namespace, [:admin, project]
34   - %span.light.right
  34 + %span.light.pull-right
35 35 = time_ago_in_words project.created_at
36 36 ago
37 37  
... ... @@ -42,7 +42,7 @@
42 42 %p
43 43 = link_to [:admin, user] do
44 44 = user.name
45   - %span.light.right
  45 + %span.light.pull-right
46 46 = time_ago_in_words user.created_at
47 47 ago
48 48  
... ... @@ -51,25 +51,25 @@
51 51 %hr
52 52 %p
53 53 Issues
54   - %span.light.right
  54 + %span.light.pull-right
55 55 = Issue.count
56 56 %p
57 57 Merge Requests
58   - %span.light.right
  58 + %span.light.pull-right
59 59 = MergeRequest.count
60 60 %p
61 61 Notes
62   - %span.light.right
  62 + %span.light.pull-right
63 63 = Note.count
64 64 %p
65 65 Snippets
66   - %span.light.right
  66 + %span.light.pull-right
67 67 = Snippet.count
68 68 %p
69 69 SSH Keys
70   - %span.light.right
  70 + %span.light.pull-right
71 71 = Key.count
72 72 %p
73 73 Milestones
74   - %span.light.right
  74 + %span.light.pull-right
75 75 = Milestone.count
... ...
app/views/admin/groups/edit.html.haml
... ... @@ -2,7 +2,7 @@
2 2 %hr
3 3 = form_for [:admin, @group] do |f|
4 4 - if @group.errors.any?
5   - .alert-message.block-message.error
  5 + .alert.alert-error
6 6 %span= @group.errors.full_messages.first
7 7 .clearfix.group_name_holder
8 8 = f.label :name do
... ... @@ -24,5 +24,5 @@
24 24 %li It will change the git path to repositories under this group.
25 25  
26 26 .form-actions
27   - = f.submit 'Rename group', class: "btn danger"
28   - = link_to 'Cancel', admin_groups_path, class: "btn cancel-btn"
  27 + = f.submit 'Rename group', class: "btn btn-remove"
  28 + = link_to 'Cancel', admin_groups_path, class: "btn btn-cancel"
... ...
app/views/admin/groups/index.html.haml
... ... @@ -4,11 +4,11 @@
4 4 allows you to keep projects organized.
5 5 Use groups for uniting related projects.
6 6  
7   - = link_to 'New Group', new_admin_group_path, class: "btn small right"
  7 + = link_to 'New Group', new_admin_group_path, class: "btn btn-small pull-right"
8 8 %br
9 9 = form_tag admin_groups_path, method: :get, class: 'form-inline' do
10 10 = text_field_tag :name, params[:name], class: "xlarge"
11   - = submit_tag "Search", class: "btn submit primary"
  11 + = submit_tag "Search", class: "btn submit btn-primary"
12 12  
13 13 %table
14 14 %thead
... ... @@ -30,6 +30,6 @@
30 30 %td
31 31 = link_to group.owner_name, admin_user_path(group.owner_id)
32 32 %td.bgred
33   - = link_to 'Rename', edit_admin_group_path(group), id: "edit_#{dom_id(group)}", class: "btn small"
34   - = link_to 'Destroy', [:admin, group], confirm: "REMOVE #{group.name}? Are you sure?", method: :delete, class: "btn small danger"
  33 + = link_to 'Rename', edit_admin_group_path(group), id: "edit_#{dom_id(group)}", class: "btn btn-small"
  34 + = link_to 'Destroy', [:admin, group], confirm: "REMOVE #{group.name}? Are you sure?", method: :delete, class: "btn btn-small btn-remove"
35 35 = paginate @groups, theme: "admin"
... ...
app/views/admin/groups/new.html.haml
... ... @@ -2,7 +2,7 @@
2 2 %hr
3 3 = form_for [:admin, @group] do |f|
4 4 - if @group.errors.any?
5   - .alert-message.block-message.error
  5 + .alert.alert-error
6 6 %span= @group.errors.full_messages.first
7 7 .clearfix
8 8 = f.label :name do
... ... @@ -10,7 +10,7 @@
10 10 .input
11 11 = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
12 12 &nbsp;
13   - = f.submit 'Create group', class: "btn primary"
  13 + = f.submit 'Create group', class: "btn btn-primary"
14 14 %hr
15 15 .padded
16 16 %ul
... ...
app/views/admin/groups/show.html.haml
... ... @@ -14,7 +14,7 @@
14 14 %td
15 15 = @group.name
16 16 &nbsp;
17   - = link_to edit_admin_group_path(@group), class: "btn btn-small right" do
  17 + = link_to edit_admin_group_path(@group), class: "btn btn-small pull-right" do
18 18 %i.icon-edit
19 19 Rename
20 20 %tr
... ... @@ -29,7 +29,7 @@
29 29 Owner:
30 30 %td
31 31 = @group.owner_name
32   - .right
  32 + .pull-right
33 33 = link_to "#", class: "btn btn-small change-owner-link" do
34 34 %i.icon-edit
35 35 Change owner
... ... @@ -42,7 +42,7 @@
42 42 = form_for [:admin, @group] do |f|
43 43 = f.select :owner_id, User.all.map { |user| [user.name, user.id] }, {}, {class: 'chosen'}
44 44 %div
45   - = f.submit 'Change Owner', class: "btn danger"
  45 + = f.submit 'Change Owner', class: "btn btn-remove"
46 46 = link_to "Cancel", "#", class: "btn change-owner-cancel-link"
47 47  
48 48 - if @group.projects.any?
... ... @@ -63,7 +63,7 @@
63 63 %span.monospace= project.path_with_namespace + ".git"
64 64 %td= project.users.count
65 65 %td.bgred
66   - = link_to 'Transfer project to global namespace', remove_project_admin_group_path(@group, project_id: project.id), confirm: 'Remove project from group and move to global namespace. Are you sure?', method: :delete, class: "btn danger small"
  66 + = link_to 'Transfer project to global namespace', remove_project_admin_group_path(@group, project_id: project.id), confirm: 'Remove project from group and move to global namespace. Are you sure?', method: :delete, class: "btn btn-remove small"
67 67  
68 68 = form_tag project_teams_update_admin_group_path(@group), id: "new_team_member", class: "bulk_import", method: :put do
69 69 %table.zebra-striped
... ... @@ -88,7 +88,7 @@
88 88 %td= select_tag :project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3"}
89 89  
90 90 %tr
91   - %td= submit_tag 'Add user to projects in group', class: "btn primary"
  91 + %td= submit_tag 'Add user to projects in group', class: "btn btn-primary"
92 92 %td
93 93 Read more about project permissions
94 94 %strong= link_to "here", help_permissions_path, class: "vlink"
... ... @@ -110,7 +110,7 @@
110 110 .input
111 111 = select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
112 112 .form-actions
113   - = submit_tag 'Add', class: "btn primary"
  113 + = submit_tag 'Add', class: "btn btn-primary"
114 114  
115 115 :javascript
116 116 $(function(){
... ...
app/views/admin/hooks/index.html.haml
... ... @@ -7,7 +7,7 @@
7 7  
8 8 = form_for @hook, as: :hook, url: admin_hooks_path, html: { class: 'form-inline' } do |f|
9 9 -if @hook.errors.any?
10   - .alert-message.block-message.error
  10 + .alert.alert-error
11 11 - @hook.errors.full_messages.each do |msg|
12 12 %p= msg
13 13 .clearfix
... ... @@ -15,7 +15,7 @@
15 15 .input
16 16 = f.text_field :url, class: "text_field xxlarge"
17 17 &nbsp;
18   - = f.submit "Add System Hook", class: "btn primary"
  18 + = f.submit "Add System Hook", class: "btn btn-primary"
19 19 %hr
20 20  
21 21 -if @hooks.any?
... ... @@ -33,7 +33,7 @@
33 33 %td
34 34 = link_to admin_hook_path(hook) do
35 35 %strong= hook.url
36   - = link_to 'Test Hook', admin_hook_test_path(hook), class: "btn small right"
  36 + = link_to 'Test Hook', admin_hook_test_path(hook), class: "btn btn-small pull-right"
37 37 %td POST
38 38 %td
39   - = link_to 'Remove', admin_hook_path(hook), confirm: 'Are you sure?', method: :delete, class: "danger btn small right"
  39 + = link_to 'Remove', admin_hook_path(hook), confirm: 'Are you sure?', method: :delete, class: "btn btn-remove btn-small pull-right"
... ...
app/views/admin/logs/show.html.haml
... ... @@ -15,7 +15,7 @@
15 15 .file_title
16 16 %i.icon-file
17 17 githost.log
18   - .right
  18 + .pull-right
19 19 = link_to '#', class: 'log-bottom' do
20 20 %i.icon-arrow-down
21 21 Scroll down
... ... @@ -29,7 +29,7 @@
29 29 .file_title
30 30 %i.icon-file
31 31 application.log
32   - .right
  32 + .pull-right
33 33 = link_to '#', class: 'log-bottom' do
34 34 %i.icon-arrow-down
35 35 Scroll down
... ... @@ -43,7 +43,7 @@
43 43 .file_title
44 44 %i.icon-file
45 45 production.log
46   - .right
  46 + .pull-right
47 47 = link_to '#', class: 'log-bottom' do
48 48 %i.icon-arrow-down
49 49 Scroll down
... ... @@ -57,7 +57,7 @@
57 57 .file_title
58 58 %i.icon-file
59 59 sidekiq.log
60   - .right
  60 + .pull-right
61 61 = link_to '#', class: 'log-bottom' do
62 62 %i.icon-arrow-down
63 63 Scroll down
... ...
app/views/admin/projects/_form.html.haml
1 1 = form_for [:admin, project] do |f|
2 2 -if project.errors.any?
3   - .alert-message.block-message.error
  3 + .alert.alert-error
4 4 %ul
5 5 - project.errors.full_messages.each do |msg|
6 6 %li= msg
... ... @@ -65,8 +65,8 @@
65 65  
66 66  
67 67 .actions
68   - = f.submit 'Save Project', class: "btn save-btn"
69   - = link_to 'Cancel', admin_projects_path, class: "btn cancel-btn"
  68 + = f.submit 'Save Project', class: "btn btn-save"
  69 + = link_to 'Cancel', admin_projects_path, class: "btn btn-cancel"
70 70  
71 71  
72 72  
... ...
app/views/admin/projects/index.html.haml
1 1 %h3.page_title
2 2 Projects
3   - = link_to 'New Project', new_project_path, class: "btn small right"
  3 + = link_to 'New Project', new_project_path, class: "btn btn-small pull-right"
4 4  
5 5 %hr
6 6  
... ... @@ -37,7 +37,7 @@
37 37  
38 38  
39 39 .form-actions
40   - = submit_tag "Search", class: "btn submit primary"
  40 + = submit_tag "Search", class: "btn submit btn-primary"
41 41 = link_to "Reset", admin_projects_path, class: "btn"
42 42 .span8
43 43 .ui-box
... ... @@ -51,9 +51,9 @@
51 51 - else
52 52 %i.icon-lock.cgreen
53 53 = link_to project.name_with_namespace, [:admin, project]
54   - .right
55   - = link_to 'Edit', edit_admin_project_path(project), id: "edit_#{dom_id(project)}", class: "btn small"
56   - = link_to 'Destroy', [:admin, project], confirm: "REMOVE #{project.name}? Are you sure?", method: :delete, class: "btn small danger"
  54 + .pull-right
  55 + = link_to 'Edit', edit_admin_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small"
  56 + = link_to 'Destroy', [:admin, project], confirm: "REMOVE #{project.name}? Are you sure?", method: :delete, class: "btn btn-small btn-remove"
57 57 - if @projects.blank?
58 58 %p.nothing_here_message 0 projects matches
59 59 - else
... ...
app/views/admin/projects/members/_form.html.haml
1 1 = form_for @team_member_relation, as: :team_member, url: admin_project_member_path(@project, @member) do |f|
2 2 -if @team_member_relation.errors.any?
3   - .alert-message.block-message.error
  3 + .alert.alert-error
4 4 %ul
5 5 - @team_member_relation.errors.full_messages.each do |msg|
6 6 %li= msg
... ... @@ -12,5 +12,5 @@
12 12  
13 13 %br
14 14 .actions
15   - = f.submit 'Save', class: "btn primary"
  15 + = f.submit 'Save', class: "btn btn-primary"
16 16 = link_to 'Cancel', :back, class: "btn"
... ...
app/views/admin/projects/show.html.haml
1 1 %h3.page_title
2 2 Project: #{@project.name_with_namespace}
3   - = link_to edit_admin_project_path(@project), class: "btn right" do
  3 + = link_to edit_admin_project_path(@project), class: "btn pull-right" do
4 4 %i.icon-edit
5 5 Edit
6 6  
... ... @@ -129,8 +129,8 @@
129 129 %td
130 130 = link_to tm.name, admin_user_path(tm)
131 131 %td= @project.project_access_human(tm)
132   - %td= link_to 'Edit Access', edit_admin_project_member_path(@project, tm), class: "btn small"
133   - %td= link_to 'Remove from team', admin_project_member_path(@project, tm), confirm: 'Are you sure?', method: :delete, class: "btn danger small"
  132 + %td= link_to 'Edit Access', edit_admin_project_member_path(@project, tm), class: "btn btn-small"
  133 + %td= link_to 'Remove from team', admin_project_member_path(@project, tm), confirm: 'Are you sure?', method: :delete, class: "btn btn-remove small"
134 134  
135 135 %br
136 136 %h5 Add new team member
... ... @@ -147,7 +147,7 @@
147 147 %td= select_tag :project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3"}
148 148  
149 149 %tr
150   - %td= submit_tag 'Add', class: "btn primary"
  150 + %td= submit_tag 'Add', class: "btn btn-primary"
151 151 %td
152 152 Read more about project permissions
153 153 %strong= link_to "here", help_permissions_path, class: "vlink"
... ...
app/views/admin/teams/edit.html.haml
... ... @@ -2,7 +2,7 @@
2 2 %hr
3 3 = form_for @team, url: admin_team_path(@team), method: :put do |f|
4 4 - if @team.errors.any?
5   - .alert-message.block-message.error
  5 + .alert.alert-error
6 6 %span= @team.errors.full_messages.first
7 7 .clearfix.team_name_holder
8 8 = f.label :name do
... ... @@ -19,5 +19,5 @@
19 19 %li It will change web url for access team and team projects.
20 20  
21 21 .form-actions
22   - = f.submit 'Rename team', class: "btn danger"
23   - = link_to 'Cancel', admin_teams_path, class: "btn cancel-btn"
  22 + = f.submit 'Rename team', class: "btn btn-remove"
  23 + = link_to 'Cancel', admin_teams_path, class: "btn btn-cancel"
... ...
app/views/admin/teams/index.html.haml
... ... @@ -3,12 +3,12 @@
3 3 %small
4 4 simple Teams description
5 5  
6   - = link_to 'New Team', new_admin_team_path, class: "btn small right"
  6 + = link_to 'New Team', new_admin_team_path, class: "btn btn-small pull-right"
7 7 %br
8 8  
9 9 = form_tag admin_teams_path, method: :get, class: 'form-inline' do
10 10 = text_field_tag :name, params[:name], class: "xlarge"
11   - = submit_tag "Search", class: "btn submit primary"
  11 + = submit_tag "Search", class: "btn submit btn-primary"
12 12  
13 13 %table
14 14 %thead
... ... @@ -32,7 +32,7 @@
32 32 %td
33 33 = link_to team.owner.name, admin_user_path(team.owner_id)
34 34 %td.bgred
35   - = link_to 'Rename', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn small"
36   - = link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn small danger"
  35 + = link_to 'Rename', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn btn-small"
  36 + = link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn btn-small btn-remove"
37 37  
38 38 = paginate @teams, theme: "admin"
... ...
app/views/admin/teams/members/_form.html.haml
1 1 = form_tag admin_team_member_path(@team, @member), method: :put do
2 2 -if @member.errors.any?
3   - .alert-message.block-message.error
  3 + .alert.alert-error
4 4 %ul
5 5 - @member.errors.full_messages.each do |msg|
6 6 %li= msg
... ... @@ -16,5 +16,5 @@
16 16  
17 17 %br
18 18 .actions
19   - = submit_tag 'Save', class: "btn primary"
  19 + = submit_tag 'Save', class: "btn btn-primary"
20 20 = link_to 'Cancel', :back, class: "btn"
... ...
app/views/admin/teams/members/new.html.haml
... ... @@ -26,4 +26,4 @@
26 26 %td
27 27 %span= check_box_tag :group_admin
28 28 %span Admin?
29   - %td= submit_tag 'Add', class: "btn primary", id: :add_members_to_team
  29 + %td= submit_tag 'Add', class: "btn btn-primary", id: :add_members_to_team
... ...
app/views/admin/teams/new.html.haml
... ... @@ -2,7 +2,7 @@
2 2 %hr
3 3 = form_for @team, url: admin_teams_path do |f|
4 4 - if @team.errors.any?
5   - .alert-message.block-message.error
  5 + .alert.alert-error
6 6 %span= @team.errors.full_messages.first
7 7 .clearfix
8 8 = f.label :name do
... ... @@ -10,7 +10,7 @@
10 10 .input
11 11 = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
12 12 &nbsp;
13   - = f.submit 'Create team', class: "btn primary"
  13 + = f.submit 'Create team', class: "btn btn-primary"
14 14 %hr
15 15 .padded
16 16 %ul
... ...
app/views/admin/teams/projects/_form.html.haml
1 1 = form_tag admin_team_project_path(@team, @project), method: :put do
2 2 -if @project.errors.any?
3   - .alert-message.block-message.error
  3 + .alert.alert-error
4 4 %ul
5 5 - @project.errors.full_messages.each do |msg|
6 6 %li= msg
... ... @@ -12,5 +12,5 @@
12 12  
13 13 %br
14 14 .actions
15   - = submit_tag 'Save', class: "btn primary"
  15 + = submit_tag 'Save', class: "btn btn-primary"
16 16 = link_to 'Cancel', :back, class: "btn"
... ...
app/views/admin/teams/projects/new.html.haml
... ... @@ -20,4 +20,4 @@
20 20 %tr
21 21 %td= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
22 22 %td= select_tag :greatest_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }
23   - %td= submit_tag 'Add', class: "btn primary", id: :assign_projects_to_team
  23 + %td= submit_tag 'Add', class: "btn btn-primary", id: :assign_projects_to_team
... ...
app/views/admin/teams/show.html.haml
... ... @@ -14,7 +14,7 @@
14 14 %td
15 15 = @team.name
16 16 &nbsp;
17   - = link_to edit_admin_team_path(@team), class: "btn btn-small right" do
  17 + = link_to edit_admin_team_path(@team), class: "btn btn-small pull-right" do
18 18 %i.icon-edit
19 19 Rename
20 20 %tr
... ... @@ -23,7 +23,7 @@
23 23 Owner:
24 24 %td
25 25 = @team.owner.name
26   - .right
  26 + .pull-right
27 27 = link_to "#", class: "btn btn-small change-owner-link" do
28 28 %i.icon-edit
29 29 Change owner
... ... @@ -36,13 +36,13 @@
36 36 = form_for @team, url: admin_team_path(@team) do |f|
37 37 = f.select :owner_id, User.all.map { |user| [user.name, user.id] }, {}, {class: 'chosen'}
38 38 %div
39   - = f.submit 'Change Owner', class: "btn danger"
  39 + = f.submit 'Change Owner', class: "btn btn-remove"
40 40 = link_to "Cancel", "#", class: "btn change-owner-cancel-link"
41 41  
42 42 %fieldset
43 43 %legend
44 44 Members (#{@team.members.count})
45   - %span= link_to 'Add members', new_admin_team_member_path(@team), class: "btn success small right", id: :add_members_to_team
  45 + %span= link_to 'Add members', new_admin_team_member_path(@team), class: "btn btn-primary btn-small pull-right", id: :add_members_to_team
46 46 - if @team.members.any?
47 47 %table#members_list
48 48 %thead
... ... @@ -60,14 +60,14 @@
60 60 %td= @team.human_default_projects_access(member)
61 61 %td= @team.admin?(member) ? "Admin" : "Member"
62 62 %td.bgred
63   - = link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn small"
  63 + = link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn btn-small"
64 64 &nbsp;
65   - = link_to 'Remove', admin_team_member_path(@team, member), confirm: 'Remove member from team. Are you sure?', method: :delete, class: "btn danger small", id: "remove_member_#{member.id}"
  65 + = link_to 'Remove', admin_team_member_path(@team, member), confirm: 'Remove member from team. Are you sure?', method: :delete, class: "btn btn-remove btn-small", id: "remove_member_#{member.id}"
66 66  
67 67 %fieldset
68 68 %legend
69 69 Projects (#{@team.projects.count})
70   - %span= link_to 'Add projects', new_admin_team_project_path(@team), class: "btn success small right", id: :assign_projects_to_team
  70 + %span= link_to 'Add projects', new_admin_team_project_path(@team), class: "btn btn-primary btn-small pull-right", id: :assign_projects_to_team
71 71 - if @team.projects.any?
72 72 %table#projects_list
73 73 %thead
... ... @@ -82,9 +82,9 @@
82 82 %td
83 83 %span= @team.human_max_project_access(project)
84 84 %td.bgred
85   - = link_to 'Edit', edit_admin_team_project_path(@team, project), class: "btn small"
  85 + = link_to 'Edit', edit_admin_team_project_path(@team, project), class: "btn btn-small"
86 86 &nbsp;
87   - = link_to 'Relegate', admin_team_project_path(@team, project), confirm: 'Remove project from team. Are you sure?', method: :delete, class: "btn danger small", id: "relegate_project_#{project.id}"
  87 + = link_to 'Relegate', admin_team_project_path(@team, project), confirm: 'Remove project from team. Are you sure?', method: :delete, class: "btn btn-remove small", id: "relegate_project_#{project.id}"
88 88  
89 89 :javascript
90 90 $(function(){
... ...
app/views/admin/users/_form.html.haml
... ... @@ -63,10 +63,10 @@
63 63 .alert.alert-error
64 64 - if @admin_user.blocked
65 65 %p This user is blocked and is not able to login to GitLab
66   - = link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn small"
  66 + = link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn btn-small"
67 67 - else
68 68 %p Blocked users will be removed from all projects &amp; will not be able to login to GitLab.
69   - = link_to 'Block User', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small danger"
  69 + = link_to 'Block User', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn btn-small btn-remove"
70 70 %fieldset
71 71 %legend Profile
72 72 .clearfix
... ... @@ -80,8 +80,8 @@
80 80 .input= f.text_field :twitter
81 81  
82 82 .actions
83   - = f.submit 'Save', class: "btn save-btn"
  83 + = f.submit 'Save', class: "btn btn-save"
84 84 - if @admin_user.new_record?
85   - = link_to 'Cancel', admin_users_path, class: "btn cancel-btn"
  85 + = link_to 'Cancel', admin_users_path, class: "btn btn-cancel"
86 86 - else
87   - = link_to 'Cancel', admin_user_path(@admin_user), class: "btn cancel-btn"
  87 + = link_to 'Cancel', admin_user_path(@admin_user), class: "btn btn-cancel"
... ...
app/views/admin/users/index.html.haml
1 1 %h3.page_title
2 2 Users
3   - = link_to 'New User', new_admin_user_path, class: "btn small right"
  3 + = link_to 'New User', new_admin_user_path, class: "btn btn-small pull-right"
4 4 %br
5 5  
6 6 = form_tag admin_users_path, method: :get, class: 'form-inline' do
7 7 = text_field_tag :name, params[:name], class: "xlarge"
8   - = submit_tag "Search", class: "btn submit primary"
  8 + = submit_tag "Search", class: "btn submit btn-primary"
9 9 %ul.nav.nav-tabs
10 10 %li{class: "#{'active' unless params[:filter]}"}
11 11 = link_to admin_users_path do
... ... @@ -44,15 +44,15 @@
44 44 %td= user.username
45 45 %td= user.email
46 46 %td= user.users_projects.count
47   - %td= link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: "btn small"
  47 + %td= link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: "btn btn-small"
48 48 %td.bgred
49 49 - if user == current_user
50 50 %span.cred It's you!
51 51 - else
52 52 - if user.blocked
53   - = link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: "btn small success"
  53 + = link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: "btn btn-small success"
54 54 - else
55   - = link_to 'Block', block_admin_user_path(user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small danger"
56   - = link_to 'Destroy', [:admin, user], confirm: "USER #{user.name} WILL BE REMOVED! Are you sure?", method: :delete, class: "btn small danger"
  55 + = link_to 'Block', block_admin_user_path(user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn btn-small btn-remove"
  56 + = link_to 'Destroy', [:admin, user], confirm: "USER #{user.name} WILL BE REMOVED! Are you sure?", method: :delete, class: "btn btn-small btn-remove"
57 57  
58 58 = paginate @admin_users, theme: "admin"
... ...
app/views/admin/users/show.html.haml
... ... @@ -4,7 +4,7 @@
4 4 %small Blocked
5 5 - if @admin_user.admin
6 6 %small Administrator
7   - = link_to edit_admin_user_path(@admin_user), class: "btn right" do
  7 + = link_to edit_admin_user_path(@admin_user), class: "btn pull-right" do
8 8 %i.icon-edit
9 9 Edit
10 10  
... ... @@ -86,7 +86,7 @@
86 86 %td= select_tag :project_access, options_for_select(Project.access_options), class: "project-access-select chosen span3"
87 87  
88 88 %tr
89   - %td= submit_tag 'Add', class: "btn primary"
  89 + %td= submit_tag 'Add', class: "btn btn-primary"
90 90 %td
91 91 Read more about project permissions
92 92 %strong= link_to "here", help_permissions_path, class: "vlink"
... ... @@ -123,5 +123,5 @@
123 123 %tr
124 124 %td= link_to project.name_with_namespace, admin_project_path(project)
125 125 %td= tm.project_access_human
126   - %td= link_to 'Edit Access', edit_admin_project_member_path(project, tm.user), class: "btn small"
127   - %td= link_to 'Remove from team', admin_project_member_path(project, tm.user), confirm: 'Are you sure?', method: :delete, class: "btn small danger"
  126 + %td= link_to 'Edit Access', edit_admin_project_member_path(project, tm.user), class: "btn btn-small"
  127 + %td= link_to 'Remove from team', admin_project_member_path(project, tm.user), confirm: 'Are you sure?', method: :delete, class: "btn btn-small btn-remove"
... ...
app/views/blame/_head.html.haml
... ... @@ -3,5 +3,5 @@
3 3 = render partial: 'shared/ref_switcher', locals: {destination: 'tree', path: params[:path]}
4 4 = nav_link(controller: :refs) do
5 5 = link_to 'Source', project_tree_path(@project, @ref)
6   - %li.right
  6 + %li.pull-right
7 7 = render "shared/clone_panel"
... ...
app/views/commit/huge_commit.html.haml
1 1 = render "commits/commit_box"
2   -.alert-message.block-message.error
  2 +.alert.alert-error
3 3 %h4 Commit diffs are too big to be displayed
... ...
app/views/commit/show.html.haml
1 1 = render "commits/commit_box"
2 2  
3   -%p.right.cgray
  3 +%p.pull-right.cgray
4 4 This commit has
5 5 %span.cgreen #{@commit.stats.additions} additions
6 6 and
... ...
app/views/commits/_commit_box.html.haml
1 1 .ui-box.ui-box-show
2 2 .ui-box-head
3   - .right
  3 + .pull-right
4 4 - if @notes_count > 0
5 5 %span.btn.disabled.grouped
6 6 %i.icon-comment
... ... @@ -13,7 +13,7 @@
13 13 %ul.dropdown-menu
14 14 %li= link_to "Email Patches", project_commit_path(@project, @commit, format: :patch)
15 15 %li= link_to "Plain Diff", project_commit_path(@project, @commit, format: :diff)
16   - = link_to project_tree_path(@project, @commit), class: "btn primary grouped" do
  16 + = link_to project_tree_path(@project, @commit), class: "btn btn-primary grouped" do
17 17 %span Browse Code »
18 18 %h3.commit-title.page_title
19 19 = gfm escape_once(@commit.title)
... ...
app/views/commits/_diffs.html.haml
1 1 - if @suppress_diff
2   - .alert-message.block-message
  2 + .alert.alert-block
3 3 %p
4   - %strong Warning! Large commit with more then #{Commit::DIFF_SAFE_SIZE} files changed.
  4 + %strong Warning! Large commit with more than #{Commit::DIFF_SAFE_SIZE} files changed.
5 5 %p To prevent performance issue we rejected diff information.
6 6 %p
7 7 But if you still want to see diff
... ... @@ -25,7 +25,7 @@
25 25 %span= diff.old_path
26 26  
27 27 - if @commit.prev_commit
28   - = link_to project_tree_path(@project, tree_join(@commit.prev_commit_id, diff.new_path)), {:class => 'btn right view-file'} do
  28 + = link_to project_tree_path(@project, tree_join(@commit.prev_commit_id, diff.new_path)), {:class => 'btn pull-right view-file'} do
29 29 View file @
30 30 %span.commit-short-id= @commit.short_id(6)
31 31 - else
... ... @@ -33,7 +33,7 @@
33 33 - if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode
34 34 %span.file-mode= "#{diff.a_mode} → #{diff.b_mode}"
35 35  
36   - = link_to project_tree_path(@project, tree_join(@commit.id, diff.new_path)), {:class => 'btn very_small right view-file'} do
  36 + = link_to project_tree_path(@project, tree_join(@commit.id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
37 37 View file @
38 38 %span.commit-short-id= @commit.short_id(6)
39 39  
... ...
app/views/commits/_head.html.haml
... ... @@ -22,7 +22,7 @@
22 22  
23 23  
24 24 - if current_controller?(:commits) && current_user.private_token
25   - %li.right
  25 + %li.pull-right
26 26 %span.rss-icon
27 27 = link_to project_commits_path(@project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Feed" do
28 28 = image_tag "rss_ui.png", title: "feed"
... ...
app/views/compare/_form.html.haml
... ... @@ -19,7 +19,7 @@
19 19 = text_field_tag :to, params[:to], placeholder: "aa8b4ef", class: "xlarge"
20 20 .pull-left
21 21 &nbsp;
22   - = submit_tag "Compare", class: "btn primary wide commits-compare-btn"
  22 + = submit_tag "Compare", class: "btn btn-primary wide commits-compare-btn"
23 23 - if @refs_are_same
24 24 .alert
25 25 %span Refs are the same
... ...
app/views/dashboard/_filter.html.haml
... ... @@ -25,9 +25,9 @@
25 25 %li{class: ("active" if params[:project_id] == project.id.to_s)}
26 26 = link_to dashboard_filter_path(entity, project_id: project.id) do
27 27 = project.name_with_namespace
28   - %small.right= entities_per_project(project, entity)
  28 + %small.pull-right= entities_per_project(project, entity)
29 29  
30 30 %fieldset
31 31 %hr
32   - = link_to "Reset", dashboard_filter_path(entity), class: 'btn right'
  32 + = link_to "Reset", dashboard_filter_path(entity), class: 'btn pull-right'
33 33  
... ...
app/views/dashboard/_groups.html.haml
... ... @@ -4,8 +4,8 @@
4 4 %small
5 5 (#{groups.count})
6 6 - if current_user.can_create_group?
7   - %span.right
8   - = link_to new_group_path, class: "btn very_small info" do
  7 + %span.pull-right
  8 + = link_to new_group_path, class: "btn btn-tiny info" do
9 9 %i.icon-plus
10 10 New Group
11 11 %ul.well-list
... ... @@ -13,6 +13,6 @@
13 13 %li
14 14 = link_to group_path(id: group.path), class: dom_class(group) do
15 15 %strong.well-title= truncate(group.name, length: 35)
16   - %span.right.light
  16 + %span.pull-right.light
17 17 - if group.owner == current_user
18 18 %i.icon-wrench
... ...
app/views/dashboard/_projects.html.haml
... ... @@ -4,8 +4,8 @@
4 4 %small
5 5 (#{@projects_count})
6 6 - if current_user.can_create_project?
7   - %span.right
8   - = link_to new_project_path, class: "btn very_small info" do
  7 + %span.pull-right
  8 + = link_to new_project_path, class: "btn btn-tiny info" do
9 9 %i.icon-plus
10 10 New Project
11 11  
... ...
app/views/dashboard/_teams.html.haml
... ... @@ -3,8 +3,8 @@
3 3 Teams
4 4 %small
5 5 (#{@teams.count})
6   - %span.right
7   - = link_to new_team_path, class: "btn very_small info" do
  6 + %span.pull-right
  7 + = link_to new_team_path, class: "btn btn-tiny info" do
8 8 %i.icon-plus
9 9 New Team
10 10 %ul.well-list
... ... @@ -12,7 +12,7 @@
12 12 %li
13 13 = link_to team_path(id: team.path), class: dom_class(team) do
14 14 %strong.well-title= truncate(team.name, length: 35)
15   - %span.right.light
  15 + %span.pull-right.light
16 16 - if team.owner == current_user
17 17 %i.icon-wrench
18 18 - tm = current_user.user_team_user_relationships.find_by_user_team_id(team.id)
... ...
app/views/dashboard/_zero_authorized_projects.html.haml
... ... @@ -6,7 +6,7 @@
6 6 = current_user.projects_limit
7 7 projects. Click on button below to add a new one
8 8 .link_holder
9   - = link_to new_project_path, class: "btn primary" do
  9 + = link_to new_project_path, class: "btn btn-primary" do
10 10 New Project »
11 11 - else
12 12 If you will be added to project - it will be displayed here
... ...
app/views/dashboard/issues.html.haml
1 1 %h3.page_title
2 2 Issues
3 3 %small (assigned to you)
4   - %small.right #{@issues.total_count} issues
  4 + %small.pull-right #{@issues.total_count} issues
5 5  
6 6 %hr
7 7  
... ...
app/views/dashboard/merge_requests.html.haml
1 1 %h3.page_title
2 2 Merge Requests
3 3 %small (authored by or assigned to you)
4   - %small.right #{@merge_requests.total_count} merge requests
  4 + %small.pull-right #{@merge_requests.total_count} merge requests
5 5  
6 6 %hr
7 7 .row
... ...
app/views/dashboard/projects.html.haml
... ... @@ -3,8 +3,8 @@
3 3 %span
4 4 (#{@projects.total_count})
5 5 - if current_user.can_create_project?
6   - %span.right
7   - = link_to new_project_path, class: "btn very_small info" do
  6 + %span.pull-right
  7 + = link_to new_project_path, class: "btn btn-tiny info" do
8 8 %i.icon-plus
9 9 New Project
10 10  
... ... @@ -42,7 +42,7 @@
42 42 %small.light
43 43 %strong Last activity:
44 44 %span= project_last_activity(project)
45   - .right.light
  45 + .pull-right.light
46 46 - if project.owner == current_user
47 47 %i.icon-wrench
48 48 - tm = project.team.get_tm(current_user.id)
... ...
app/views/deploy_keys/_form.html.haml
1 1 %div
2 2 = form_for [@project, @key], url: project_deploy_keys_path do |f|
3 3 -if @key.errors.any?
4   - .alert-message.block-message.error
  4 + .alert.alert-error
5 5 %ul
6 6 - @key.errors.full_messages.each do |msg|
7 7 %li= msg
... ... @@ -18,6 +18,6 @@
18 18 = link_to "here", help_ssh_path
19 19  
20 20 .actions
21   - = f.submit 'Save', class: "save-btn btn"
22   - = link_to "Cancel", project_deploy_keys_path(@project), class: "btn cancel-btn"
  21 + = f.submit 'Save', class: "btn-save btn"
  22 + = link_to "Cancel", project_deploy_keys_path(@project), class: "btn btn-cancel"
23 23  
... ...
app/views/deploy_keys/_show.html.haml
... ... @@ -8,5 +8,5 @@
8 8 = time_ago_in_words(key.created_at)
9 9 ago
10 10 %td
11   - = link_to 'Remove', project_deploy_key_path(key.project, key), confirm: 'Are you sure?', method: :delete, class: "danger btn delete-key small right"
  11 + = link_to 'Remove', project_deploy_key_path(key.project, key), confirm: 'Are you sure?', method: :delete, class: "btn btn-remove delete-key btn-small pull-right"
12 12  
... ...
app/views/deploy_keys/index.html.haml
... ... @@ -4,7 +4,7 @@
4 4 Deploy keys allow read-only access to repository. It matches perfectly for CI, staging or production servers.
5 5  
6 6 - if can? current_user, :admin_project, @project
7   - = link_to new_project_deploy_key_path(@project), class: "btn small", title: "New Deploy Key" do
  7 + = link_to new_project_deploy_key_path(@project), class: "btn btn-small", title: "New Deploy Key" do
8 8 Add Deploy Key
9 9 - if @keys.any?
10 10 %table
... ...
app/views/deploy_keys/show.html.haml
... ... @@ -10,5 +10,5 @@
10 10 &larr; To keys list
11 11 %hr
12 12 %pre= @key.key
13   -.right
14   - = link_to 'Remove', project_deploy_key_path(@key.project, @key), confirm: 'Are you sure?', method: :delete, class: "danger btn delete-key"
  13 +.pull-right
  14 + = link_to 'Remove', project_deploy_key_path(@key.project, @key), confirm: 'Are you sure?', method: :delete, class: "btn-remove btn delete-key"
... ...
app/views/devise/passwords/edit.html.haml
... ... @@ -8,5 +8,5 @@
8 8 %div
9 9 = f.password_field :password_confirmation, class: "text bottom", placeholder: "Confirm new password"
10 10 %div
11   - = f.submit "Change my password", class: "btn primary"
12   - .right= render partial: "devise/shared/links"
  11 + = f.submit "Change my password", class: "btn btn-primary"
  12 + .pull-right= render partial: "devise/shared/links"
... ...
app/views/devise/passwords/new.html.erb
1   -<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :class => "login-box", :method => :post }) do |f| %>
2   - <%= image_tag "login-logo.png", :width => "304", :height => "66", :class => "login-logo", :alt => "Login Logo" %>
  1 +<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { class: "login-box", method: :post }) do |f| %>
  2 + <%= image_tag "login-logo.png", width: "304", height: "66", class: "login-logo", alt: "Login Logo" %>
3 3 <%= devise_error_messages! %>
4   - <%= f.email_field :email, :placeholder => "Email", :class => "text" %>
  4 + <%= f.email_field :email, placeholder: "Email", class: "text" %>
5 5 <br/>
6 6 <br/>
7   - <%= f.submit "Reset password", :class => "primary btn" %>
8   - <div class="right"> <%= link_to "Sign in", new_session_path(resource_name), :class => "btn" %><br /></div>
  7 + <%= f.submit "Reset password", class: "btn-primary btn" %>
  8 + <div class="pull-right"> <%= link_to "Sign in", new_session_path(resource_name), class: "btn" %><br /></div>
9 9 <% end %>
... ...
app/views/devise/registrations/new.html.haml
1   -= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :class => "login-box" }) do |f|
2   - = image_tag "login-logo.png", :width => "304", :height => "66", :class => "login-logo", :alt => "Login Logo"
  1 += form_for(resource, as: resource_name, url: registration_path(resource_name), html: { class: "login-box" }) do |f|
  2 + = image_tag "login-logo.png", width: "304", height: "66", class: "login-logo", alt: "Login Logo"
3 3 = devise_error_messages!
4 4 %div
5   - = f.text_field :name, :class => "text top", :placeholder => "Name", :required => true
  5 + = f.text_field :name, class: "text top", placeholder: "Name", required: true
6 6 %div
7   - = f.text_field :username, :class => "text middle", :placeholder => "Username", :required => true
  7 + = f.text_field :username, class: "text middle", placeholder: "Username", required: true
8 8 %div
9   - = f.email_field :email, :class => "text middle", :placeholder => "Email", :required => true
  9 + = f.email_field :email, class: "text middle", placeholder: "Email", required: true
10 10 %div
11   - = f.password_field :password, :class => "text middle", :placeholder => "Password", :required => true
  11 + = f.password_field :password, class: "text middle", placeholder: "Password", required: true
12 12 %div
13   - = f.password_field :password_confirmation, :class => "text bottom", :placeholder => "Confirm password", :required => true
  13 + = f.password_field :password_confirmation, class: "text bottom", placeholder: "Confirm password", required: true
14 14 %div
15   - = f.submit "Sign up", :class => "primary btn wide"
16   - %br
  15 + = f.submit "Sign up", class: "btn-create btn"
17 16 %hr
18 17 = link_to "Sign in", new_session_path(resource_name)
19   - = link_to "Forgot your password?", new_password_path(resource_name), :class => "right"
  18 + = link_to "Forgot your password?", new_password_path(resource_name), class: "pull-right"
... ...
app/views/devise/sessions/_new_ldap.html.haml
... ... @@ -3,11 +3,11 @@
3 3 = text_field_tag :username, nil, {:class => "text top", :placeholder => "LDAP Login"}
4 4 = password_field_tag :password, nil, {:class => "text bottom", :placeholder => "Password"}
5 5 %br/
6   - = submit_tag "LDAP Sign in", :class => "primary btn"
  6 + = submit_tag "LDAP Sign in", :class => "btn-primary btn"
7 7 - if devise_mapping.omniauthable?
8 8 - (resource_class.omniauth_providers - [:ldap]).each do |provider|
9 9 %hr/
10   - = link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn primary"
  10 + = link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn btn-primary"
11 11 %br/
12 12 %hr/
13 13 %a#other_form_toggle{:href => "#", :onclick => "javascript:$('#new_user').toggle();"} Other Sign in
... ... @@ -24,6 +24,6 @@
24 24 = f.check_box :remember_me
25 25 %span Remember me
26 26 %br/
27   - = f.submit "Sign in", :class => "primary btn"
28   - .right
  27 + = f.submit "Sign in", :class => "btn-primary btn"
  28 + .pull-right
29 29 = render :partial => "devise/shared/links"
... ...
app/views/devise/sessions/new.html.haml
... ... @@ -11,18 +11,18 @@
11 11 = f.check_box :remember_me
12 12 %span Remember me
13 13 %br/
14   - = f.submit "Sign in", :class => "primary btn wide"
15   - .right
  14 + = f.submit "Sign in", :class => "btn-create btn"
  15 + .pull-right
16 16 = link_to "Forgot your password?", new_password_path(resource_name), :class => "btn"
17 17 %br/
18   - %br/
19 18 - if Gitlab.config.gitlab.signup_enabled
20 19 %hr/
21 20 Don't have an account?
22 21 = link_to "Sign up", new_registration_path(resource_name)
23   - .clearfix
24 22 - if devise_mapping.omniauthable? && resource_class.omniauth_providers.present?
  23 + %hr
25 24 %div
  25 + %span Sign in with: &nbsp;
26 26 - resource_class.omniauth_providers.each do |provider|
27 27 %span
28 28 = link_to authbutton(provider, 32), omniauth_authorize_path(resource_name, provider)
... ...
app/views/events/_event.html.haml
1 1 - if event.proper?
2 2 %div.event-item
3   - %span.cgray.right
  3 + %span.cgray.pull-right
4 4 #{time_ago_in_words(event.created_at)} ago.
5 5  
6 6 = image_tag gravatar_icon(event.author_email), class: "avatar s24"
... ...
app/views/graph/show.html.haml 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +%h3.page_title Project Network Graph
  2 +%br
  3 += render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path}
  4 +%br
  5 +.graph_holder
  6 + %h4
  7 + %small You can move around the graph by using the arrow keys.
  8 + #holder.graph
  9 + .loading.loading-gray
  10 +
  11 +:javascript
  12 + var branch_graph;
  13 + $(function(){
  14 + branch_graph = new BranchGraph($("#holder"), {
  15 + url: '#{project_graph_path(@project, @ref, format: :json)}',
  16 + commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}',
  17 + ref: '#{@ref}'
  18 + });
  19 + });
... ...
app/views/groups/_filter.html.haml
... ... @@ -25,9 +25,9 @@
25 25 %li{class: ("active" if params[:project_id] == project.id.to_s)}
26 26 = link_to group_filter_path(entity, project_id: project.id) do
27 27 = project.name_with_namespace
28   - %small.right= entities_per_project(project, entity)
  28 + %small.pull-right= entities_per_project(project, entity)
29 29  
30 30 %fieldset
31 31 %hr
32   - = link_to "Reset", group_filter_path(entity), class: 'btn right'
  32 + = link_to "Reset", group_filter_path(entity), class: 'btn pull-right'
33 33  
... ...
app/views/groups/_new_group_member.html.haml
... ... @@ -14,5 +14,5 @@
14 14  
15 15 .form-actions
16 16 = hidden_field_tag :redirect_to, people_group_path(@group)
17   - = f.submit 'Add', class: "btn save-btn"
  17 + = f.submit 'Add', class: "btn btn-save"
18 18  
... ...
app/views/groups/_new_member.html.haml
... ... @@ -14,5 +14,5 @@
14 14  
15 15 .form-actions
16 16 = hidden_field_tag :redirect_to, people_group_path(@group, project_id: @project.id)
17   - = f.submit 'Add', class: "btn save-btn"
  17 + = f.submit 'Add', class: "btn btn-save"
18 18  
... ...
app/views/groups/_people_filter.html.haml
... ... @@ -6,9 +6,9 @@
6 6 %li{class: ("active" if params[:project_id] == project.id.to_s)}
7 7 = link_to people_group_path(@group, project_id: project.id) do
8 8 = project.name_with_namespace
9   - %small.right= project.users.count
  9 + %small.pull-right= project.users.count
10 10  
11 11 %fieldset
12 12 %hr
13   - = link_to "Reset", people_group_path(@group), class: 'btn right'
  13 + = link_to "Reset", people_group_path(@group), class: 'btn pull-right'
14 14  
... ...
app/views/groups/_projects.html.haml
... ... @@ -4,8 +4,8 @@
4 4 %small
5 5 (#{projects.count})
6 6 - if can? current_user, :manage_group, @group
7   - %span.right
8   - = link_to new_project_path(namespace_id: @group.id), class: "btn very_small info" do
  7 + %span.pull-right
  8 + = link_to new_project_path(namespace_id: @group.id), class: "btn btn-tiny info" do
9 9 %i.icon-plus
10 10 New Project
11 11 %ul.well-list
... ...
app/views/groups/edit.html.haml 0 → 100644
... ... @@ -0,0 +1,50 @@
  1 +%h3.page_title Edit Group
  2 +%hr
  3 += form_for @group do |f|
  4 + - if @group.errors.any?
  5 + .alert.alert-error
  6 + %span= @group.errors.full_messages.first
  7 + .clearfix
  8 + = f.label :name do
  9 + Group name is
  10 + .input
  11 + = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
  12 + &nbsp;
  13 + = f.submit 'Save group', class: "btn btn-save"
  14 +%hr
  15 +
  16 +
  17 +.row
  18 + .span7
  19 + .ui-box
  20 + %h5.title Projects
  21 + %ul.well-list
  22 + - @group.projects.each do |project|
  23 + %li
  24 + - if project.public
  25 + %i.icon-share
  26 + - else
  27 + %i.icon-lock.cgreen
  28 + = link_to project.name_with_namespace, project
  29 + .pull-right
  30 + = link_to 'Team', project_team_index_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small"
  31 + = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small"
  32 + = link_to 'Remove', project, confirm: "REMOVE #{project.name}? Are you sure?", method: :delete, class: "btn btn-small btn-remove"
  33 +
  34 + .span5
  35 + .ui-box
  36 + %h5.title Transfer group
  37 + .padded
  38 + %p
  39 + Transferring group will cause loss of admin control over group and all child projects
  40 + = form_for @group do |f|
  41 + = f.select :owner_id, User.all.map { |user| [user.name, user.id] }, {}, {class: 'chosen'}
  42 + = f.submit 'Transfer group', class: "btn btn-small"
  43 + .ui-box
  44 + %h5.title Remove group
  45 + .padded.bgred
  46 + %p
  47 + Remove of group will cause removing all child projects and resources
  48 + %br
  49 + Removed group can not be restored!
  50 + = link_to 'Remove Group', @group, confirm: 'Removed group can not be restored! Are you sure?', method: :delete, class: "btn btn-remove btn-small"
... ...
app/views/groups/issues.html.haml
1 1 %h3.page_title
2 2 Issues
3 3 %small (assigned to you)
4   - %small.right #{@issues.total_count} issues
  4 + %small.pull-right #{@issues.total_count} issues
5 5  
6 6 %hr
7 7 .row
... ...
app/views/groups/merge_requests.html.haml
1 1 %h3.page_title
2 2 Merge Requests
3 3 %small (authored by or assigned to you)
4   - %small.right #{@merge_requests.total_count} merge requests
  4 + %small.pull-right #{@merge_requests.total_count} merge requests
5 5  
6 6 %hr
7 7 .row
... ...
app/views/groups/new.html.haml
... ... @@ -2,7 +2,7 @@
2 2 %hr
3 3 = form_for @group do |f|
4 4 - if @group.errors.any?
5   - .alert-message.block-message.error
  5 + .alert.alert-error
6 6 %span= @group.errors.full_messages.first
7 7 .clearfix
8 8 = f.label :name do
... ... @@ -10,7 +10,7 @@
10 10 .input
11 11 = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
12 12 &nbsp;
13   - = f.submit 'Create group', class: "btn primary"
  13 + = f.submit 'Create group', class: "btn btn-create"
14 14 %hr
15 15 .padded
16 16 %ul
... ...
app/views/groups/people.html.haml
... ... @@ -16,5 +16,5 @@
16 16 %strong= user.name
17 17 %span.cgray= user.email
18 18 - if @group.owner == user
19   - %span.btn.btn-small.disabled.right Group Owner
  19 + %span.btn.btn-small.disabled.pull-right Group Owner
20 20  
... ...
app/views/groups/search.html.haml
... ... @@ -4,6 +4,6 @@
4 4 %strong Looking for
5 5 .input
6 6 = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
7   - = submit_tag 'Search', class: "btn primary wide"
  7 + = submit_tag 'Search', class: "btn btn-primary wide"
8 8 - if params[:search].present?
9 9 = render 'search/result'
... ...
app/views/groups/show.html.haml
1 1 .projects
2 2 .activities.span8
3 3 = render "events/event_last_push", event: @last_push
4   - = link_to dashboard_path, class: 'btn very_small' do
  4 + = link_to dashboard_path, class: 'btn btn-tiny' do
5 5 &larr; To dashboard
6 6 &nbsp;
7 7 %span.cgray You will only see events from projects in this group
... ...