Commit 6ace422c298eef2c592d64c08f59b3da3d8d8a6d
Exists in
master
and in
4 other branches
Merge branch 'master' into 6-0-dev
Conflicts: Gemfile Gemfile.lock
Showing
12 changed files
with
174 additions
and
28 deletions
Show diff stats
CONTRIBUTING.md
... | ... | @@ -8,6 +8,8 @@ GitLab is a popular open source project and the capacity to deal with issues and |
8 | 8 | |
9 | 9 | Please treat our volunteers with courtesy and respect, it will go a long way towards getting your issue resolved. |
10 | 10 | |
11 | +Issues and pull requests should be in English and contain appropriate language for audiences of all ages. | |
12 | + | |
11 | 13 | ## Issue tracker |
12 | 14 | |
13 | 15 | To get support for your particular problem please use the channels as detailed in [the getting help section of the readme](https://github.com/gitlabhq/gitlabhq#getting-help). Professional [support subscriptions](http://www.gitlab.com/subscription/) and [consulting services](http://www.gitlab.com/consultancy/) are available from [GitLab.com](http://www.gitlab.com/). |
... | ... | @@ -16,7 +18,7 @@ The [issue tracker](https://github.com/gitlabhq/gitlabhq/issues) is only for obv |
16 | 18 | |
17 | 19 | Do not use the issue tracker for feature requests. We have a specific [feedback and suggestions forum](http://feedback.gitlab.com) for this purpose. |
18 | 20 | |
19 | -Please send a pull request with a tested solution or a pull request with a failing test instead of opening an issue if you can. If you're unsure where to post, post to the [Support Forum](https://groups.google.com/forum/#!forum/gitlabhq) or [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) first. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there. | |
21 | +Please send a pull request with a tested solution or a pull request with a failing test instead of opening an issue if you can. If you're unsure where to post, post to the [mailing list](https://groups.google.com/forum/#!forum/gitlabhq) or [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) first. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there. | |
20 | 22 | |
21 | 23 | ### Issue tracker guidelines |
22 | 24 | |
... | ... | @@ -26,7 +28,7 @@ Please send a pull request with a tested solution or a pull request with a faili |
26 | 28 | 2. **Steps to reproduce:** How can we reproduce the issue, preferably on the [GitLab Vagrant virtual machine](https://github.com/gitlabhq/gitlab-vagrant-vm) (start with: `vagrant destroy && vagrant up && vagrant ssh`) |
27 | 29 | 3. **Expected behavior:** Describe your issue in detail |
28 | 30 | 4. **Observed behavior** |
29 | -5. **Relevant logs and/or screen shots:** Please use code blocks (-5. **Relevant logs and/or screen -5. **Relevant logs and/or screen -5. **Relevant logs and/or screen ) to format console output, logs, and code as it's very hard to read otherwise. | |
31 | +5. **Relevant logs and/or screenshots:** Please use code blocks (+5. **Relevant logs and/or screen+5. **Relevant logs and/or screen+5. **Relevant logs and/or screen) to format console output, logs, and code as it's very hard to read otherwise. | |
30 | 32 | 6. **Output of checks** |
31 | 33 | * Results of GitLab [Application Check](doc/install/installation.md#check-application-status) (`sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production`); we will only investigate if the tests are passing |
32 | 34 | * Version of GitLab you are running; we will only investigate issues in the latest stable and development releases as per the [maintenance policy](MAINTENANCE.md) |
... | ... | @@ -45,6 +47,7 @@ If you can, please submit a pull request with the fix or improvements including |
45 | 47 | 1. Fork the project on GitHub |
46 | 48 | 1. Create a feature branch |
47 | 49 | 1. Write [tests](README.md#run-the-tests) and code |
50 | +1. Add your changes to the [CHANGELOG](CHANGELOG) | |
48 | 51 | 1. If you have multiple commits please combine them into one commit by [squashing them](http://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits) |
49 | 52 | 1. Push the commit to your fork |
50 | 53 | 1. Submit a pull request |
... | ... | @@ -54,12 +57,13 @@ We will accept pull requests if: |
54 | 57 | |
55 | 58 | * The code has proper tests and all tests pass (or it is a test exposing a failure in existing code) |
56 | 59 | * It can be merged without problems (if not please use: `git rebase master`) |
57 | -* It doesn't break any existing functionality | |
60 | +* It does not break any existing functionality | |
58 | 61 | * It's quality code that conforms to the [Ruby](https://github.com/bbatsov/ruby-style-guide) and [Rails](https://github.com/bbatsov/rails-style-guide) style guides and best practices |
59 | 62 | * The description includes a motive for your change and the method you used to achieve it |
63 | +* It is not a catch all pull request but rather fixes a specific issue or implements a specific feature | |
60 | 64 | * It keeps the GitLab code base clean and well structured |
61 | 65 | * We think other users will benefit from the same functionality |
62 | 66 | * If it makes changes to the UI the pull request should include screenshots |
63 | -* It is a single commit (please use git rebase -i to squash commits) | |
67 | +* It is a single commit (please use `git rebase -i` to squash commits) | |
64 | 68 | |
65 | 69 | For examples of feedback on pull requests please look at already [closed pull requests](https://github.com/gitlabhq/gitlabhq/pulls?direction=desc&page=1&sort=created&state=closed). | ... | ... |
Gemfile
... | ... | @@ -59,8 +59,9 @@ gem "haml-rails" |
59 | 59 | |
60 | 60 | # Files attachments |
61 | 61 | gem "carrierwave" |
62 | + | |
62 | 63 | # for aws storage |
63 | -# gem "fog", "~> 1.3.1" | |
64 | +gem "fog", "~> 1.3.1", group: :aws | |
64 | 65 | |
65 | 66 | # Authorization |
66 | 67 | gem "six" |
... | ... | @@ -76,7 +77,8 @@ gem "github-markup", "~> 0.7.4", require: 'github/markup' |
76 | 77 | gem "asciidoctor" |
77 | 78 | |
78 | 79 | # Servers |
79 | -gem "puma", '~> 2.3.1' | |
80 | +gem "puma", '~> 2.3.1', group: :puma | |
81 | +gem "unicorn", '~> 4.6.3', group: :unicorn | |
80 | 82 | |
81 | 83 | # State machine |
82 | 84 | gem "state_machine" | ... | ... |
Gemfile.lock
... | ... | @@ -117,6 +117,7 @@ GEM |
117 | 117 | erubis (2.7.0) |
118 | 118 | escape_utils (0.2.4) |
119 | 119 | eventmachine (1.0.3) |
120 | + excon (0.13.4) | |
120 | 121 | execjs (1.4.0) |
121 | 122 | multi_json (~> 1.0) |
122 | 123 | factory_girl (4.2.0) |
... | ... | @@ -132,6 +133,16 @@ GEM |
132 | 133 | eventmachine (>= 0.12.0) |
133 | 134 | ffaker (1.16.1) |
134 | 135 | ffi (1.9.0) |
136 | + fog (1.3.1) | |
137 | + builder | |
138 | + excon (~> 0.13.0) | |
139 | + formatador (~> 0.2.0) | |
140 | + mime-types | |
141 | + multi_json (~> 1.0) | |
142 | + net-scp (~> 1.0.4) | |
143 | + net-ssh (>= 2.1.3) | |
144 | + nokogiri (~> 1.5.0) | |
145 | + ruby-hmac | |
135 | 146 | font-awesome-rails (3.1.1.3) |
136 | 147 | railties (>= 3.2, < 5.0) |
137 | 148 | foreman (0.63.0) |
... | ... | @@ -245,6 +256,7 @@ GEM |
245 | 256 | kaminari (0.14.1) |
246 | 257 | actionpack (>= 3.0.0) |
247 | 258 | activesupport (>= 3.0.0) |
259 | + kgio (2.8.0) | |
248 | 260 | launchy (2.3.0) |
249 | 261 | addressable (~> 2.3) |
250 | 262 | letter_opener (1.1.1) |
... | ... | @@ -268,6 +280,9 @@ GEM |
268 | 280 | multipart-post (1.2.0) |
269 | 281 | mysql2 (0.3.11) |
270 | 282 | net-ldap (0.3.1) |
283 | + net-scp (1.0.4) | |
284 | + net-ssh (>= 1.99.1) | |
285 | + net-ssh (2.6.8) | |
271 | 286 | nokogiri (1.5.10) |
272 | 287 | oauth (0.4.7) |
273 | 288 | oauth2 (0.8.1) |
... | ... | @@ -355,6 +370,7 @@ GEM |
355 | 370 | rake (>= 0.8.7) |
356 | 371 | rdoc (~> 3.4) |
357 | 372 | thor (>= 0.14.6, < 2.0) |
373 | + raindrops (0.11.0) | |
358 | 374 | rake (10.1.0) |
359 | 375 | rb-fsevent (0.9.3) |
360 | 376 | rb-inotify (0.9.0) |
... | ... | @@ -401,6 +417,7 @@ GEM |
401 | 417 | rspec-core (~> 2.13.0) |
402 | 418 | rspec-expectations (~> 2.13.0) |
403 | 419 | rspec-mocks (~> 2.13.0) |
420 | + ruby-hmac (0.4.0) | |
404 | 421 | ruby-progressbar (1.1.1) |
405 | 422 | rubyntlm (0.1.1) |
406 | 423 | rubyzip (0.9.9) |
... | ... | @@ -501,6 +518,10 @@ GEM |
501 | 518 | execjs (>= 0.3.0) |
502 | 519 | multi_json (~> 1.0, >= 1.0.2) |
503 | 520 | underscore-rails (1.4.4) |
521 | + unicorn (4.6.3) | |
522 | + kgio (~> 2.6) | |
523 | + rack | |
524 | + raindrops (~> 0.7) | |
504 | 525 | virtus (0.5.5) |
505 | 526 | backports (~> 3.3) |
506 | 527 | descendants_tracker (~> 0.0.1) |
... | ... | @@ -538,6 +559,7 @@ DEPENDENCIES |
538 | 559 | enumerize |
539 | 560 | factory_girl_rails |
540 | 561 | ffaker |
562 | + fog (~> 1.3.1) | |
541 | 563 | font-awesome-rails (~> 3.1.1) |
542 | 564 | foreman |
543 | 565 | gemoji (~> 1.2.1) |
... | ... | @@ -610,4 +632,5 @@ DEPENDENCIES |
610 | 632 | turbolinks |
611 | 633 | uglifier |
612 | 634 | underscore-rails (~> 1.4.4) |
635 | + unicorn (~> 4.6.3) | |
613 | 636 | webmock | ... | ... |
README.md
... | ... | @@ -145,7 +145,7 @@ or start each component separately |
145 | 145 | |
146 | 146 | * [Troubleshooting guide](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Trouble-Shooting-Guide) contains solutions to common problems. |
147 | 147 | |
148 | -* [Support forum](https://groups.google.com/forum/#!forum/gitlabhq) and [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) are the best places to ask questions. For example you can use it if you have questions about: permission denied errors, invisible repos, can't clone/pull/push or with web hooks that don't fire. Please search for similar issues before posting your own, there's a good chance somebody else had the same issue you have now and has resolved it. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there to a fix. | |
148 | +* [Mailing list](https://groups.google.com/forum/#!forum/gitlabhq) and [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) are the best places to ask questions. For example you can use it if you have questions about: permission denied errors, invisible repos, can't clone/pull/push or with web hooks that don't fire. Please search for similar issues before posting your own, there's a good chance somebody else had the same issue you have now and has resolved it. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there to a fix. | |
149 | 149 | |
150 | 150 | * [Feedback and suggestions forum](http://feedback.gitlab.com) is the place to propose and discuss new features for GitLab. |
151 | 151 | ... | ... |
app/views/admin/hooks/_data_ex.html.erb
1 | 1 | <% data_ex_str = <<eos |
2 | 2 | 1. Project created: |
3 | 3 | { |
4 | - "created_at": "2012-07-21T07:30:54Z", | |
5 | - "event_name": "project_create", | |
6 | - "name": "StoreCloud", | |
7 | - "owner_email": "johnsmith@gmail.com", | |
8 | - "owner_name": "John Smith", | |
9 | - "path": "storecloud", | |
10 | - "project_id": 74 | |
4 | + "created_at": "2012-07-21T07:30:54Z", | |
5 | + "event_name": "project_create", | |
6 | + "name": "StoreCloud", | |
7 | + "owner_email": "johnsmith@gmail.com" | |
8 | + "owner_name": "John Smit", | |
9 | + "path": "stormcloud", | |
10 | + "path_with_namespace": "jsmith/stormcloud", | |
11 | + "project_id": 74, | |
11 | 12 | } |
12 | 13 | |
13 | 14 | 2. Project destroyed: |
14 | 15 | { |
15 | - "event_name": "project_destroy", | |
16 | - "name": "Underscore", | |
17 | - "owner_email": "johnsmith@gmail.com", | |
18 | - "owner_name": "John Smith", | |
19 | - "path": "underscore", | |
20 | - "project_id": 73 | |
16 | + "created_at": "2012-07-21T07:30:58Z", | |
17 | + "event_name": "project_destroy", | |
18 | + "name": "Underscore", | |
19 | + "owner_email": "johnsmith@gmail.com" | |
20 | + "owner_name": "John Smith", | |
21 | + "path": "underscore", | |
22 | + "path_with_namespace": "jsmith/underscore", | |
23 | + "project_id": 73, | |
21 | 24 | } |
22 | 25 | |
23 | 26 | 3. New Team Member: | ... | ... |
app/views/help/index.html.haml
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 | on the top of this page |
27 | 27 | %li |
28 | 28 | Ask in our |
29 | - = link_to "support forum", "https://groups.google.com/forum/#!forum/gitlabhq" | |
29 | + = link_to "mailing list", "https://groups.google.com/forum/#!forum/gitlabhq" | |
30 | 30 | or on |
31 | 31 | = link_to "Stack Overflow", "http://stackoverflow.com/questions/tagged/gitlab" |
32 | 32 | %li | ... | ... |
app/views/profiles/account.html.haml
... | ... | @@ -3,7 +3,7 @@ |
3 | 3 | %fieldset |
4 | 4 | %legend Social Accounts |
5 | 5 | .oauth_select_holder |
6 | - %p.hint Tip: Click on icon to activate sigin with one of the following services | |
6 | + %p.hint Tip: Click on icon to activate signin with one of the following services | |
7 | 7 | - enabled_social_providers.each do |provider| |
8 | 8 | %span{class: oauth_active_class(provider) } |
9 | 9 | = link_to authbutton(provider, 32), omniauth_authorize_path(User, provider) | ... | ... |
config/puma.rb.example
... | ... | @@ -61,6 +61,13 @@ bind "unix://#{application_path}/tmp/sockets/gitlab.socket" |
61 | 61 | # |
62 | 62 | # workers 2 |
63 | 63 | |
64 | +# GitLab cluster mode recommendations | |
65 | +# If you have more than 1 GB RAM, uncomment one of the following lines: | |
66 | +# | |
67 | +# workers 2 # if you have at least 1.5 GB RAM | |
68 | +# workers 3 # if you have at least 2 GB RAM | |
69 | +# workers 4 # if you have at least 2.5 GB RAM | |
70 | + | |
64 | 71 | # Code to run when a worker boots to setup the process before booting |
65 | 72 | # the app. |
66 | 73 | # | ... | ... |
... | ... | @@ -0,0 +1,102 @@ |
1 | +# Sample verbose configuration file for Unicorn (not Rack) | |
2 | +# | |
3 | +# This configuration file documents many features of Unicorn | |
4 | +# that may not be needed for some applications. See | |
5 | +# http://unicorn.bogomips.org/examples/unicorn.conf.minimal.rb | |
6 | +# for a much simpler configuration file. | |
7 | +# | |
8 | +# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete | |
9 | +# documentation. | |
10 | + | |
11 | +# Use at least one worker per core if you're on a dedicated server, | |
12 | +# more will usually help for _short_ waits on databases/caches. | |
13 | +worker_processes 2 | |
14 | + | |
15 | +# Since Unicorn is never exposed to outside clients, it does not need to | |
16 | +# run on the standard HTTP port (80), there is no reason to start Unicorn | |
17 | +# as root unless it's from system init scripts. | |
18 | +# If running the master process as root and the workers as an unprivileged | |
19 | +# user, do this to switch euid/egid in the workers (also chowns logs): | |
20 | +# user "unprivileged_user", "unprivileged_group" | |
21 | + | |
22 | +# Help ensure your application will always spawn in the symlinked | |
23 | +# "current" directory that Capistrano sets up. | |
24 | +working_directory "/home/git/gitlab/current" # available in 0.94.0+ | |
25 | + | |
26 | +# listen on both a Unix domain socket and a TCP port, | |
27 | +# we use a shorter backlog for quicker failover when busy | |
28 | +listen "/home/git/gitlab/tmp/sockets/gitlab.socket", :backlog => 64 | |
29 | +listen 8080, :tcp_nopush => true | |
30 | + | |
31 | +# nuke workers after 30 seconds instead of 60 seconds (the default) | |
32 | +timeout 30 | |
33 | + | |
34 | +# feel free to point this anywhere accessible on the filesystem | |
35 | +pid "/home/git/gitlab/tmp/pids/unicorn.pid" | |
36 | + | |
37 | +# By default, the Unicorn logger will write to stderr. | |
38 | +# Additionally, ome applications/frameworks log to stderr or stdout, | |
39 | +# so prevent them from going to /dev/null when daemonized here: | |
40 | +stderr_path "/home/git/gitlab/log/unicorn.stderr.log" | |
41 | +stdout_path "/home/git/gitlab/log/unicorn.stdout.log" | |
42 | + | |
43 | +# combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings | |
44 | +# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow | |
45 | +preload_app true | |
46 | +GC.respond_to?(:copy_on_write_friendly=) and | |
47 | + GC.copy_on_write_friendly = true | |
48 | + | |
49 | +# Enable this flag to have unicorn test client connections by writing the | |
50 | +# beginning of the HTTP headers before calling the application. This | |
51 | +# prevents calling the application for connections that have disconnected | |
52 | +# while queued. This is only guaranteed to detect clients on the same | |
53 | +# host unicorn runs on, and unlikely to detect disconnects even on a | |
54 | +# fast LAN. | |
55 | +check_client_connection false | |
56 | + | |
57 | +before_fork do |server, worker| | |
58 | + # the following is highly recomended for Rails + "preload_app true" | |
59 | + # as there's no need for the master process to hold a connection | |
60 | + defined?(ActiveRecord::Base) and | |
61 | + ActiveRecord::Base.connection.disconnect! | |
62 | + | |
63 | + # The following is only recommended for memory/DB-constrained | |
64 | + # installations. It is not needed if your system can house | |
65 | + # twice as many worker_processes as you have configured. | |
66 | + # | |
67 | + # # This allows a new master process to incrementally | |
68 | + # # phase out the old master process with SIGTTOU to avoid a | |
69 | + # # thundering herd (especially in the "preload_app false" case) | |
70 | + # # when doing a transparent upgrade. The last worker spawned | |
71 | + # # will then kill off the old master process with a SIGQUIT. | |
72 | + # old_pid = "#{server.config[:pid]}.oldbin" | |
73 | + # if old_pid != server.pid | |
74 | + # begin | |
75 | + # sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU | |
76 | + # Process.kill(sig, File.read(old_pid).to_i) | |
77 | + # rescue Errno::ENOENT, Errno::ESRCH | |
78 | + # end | |
79 | + # end | |
80 | + # | |
81 | + # Throttle the master from forking too quickly by sleeping. Due | |
82 | + # to the implementation of standard Unix signal handlers, this | |
83 | + # helps (but does not completely) prevent identical, repeated signals | |
84 | + # from being lost when the receiving process is busy. | |
85 | + # sleep 1 | |
86 | +end | |
87 | + | |
88 | +after_fork do |server, worker| | |
89 | + # per-process listener ports for debugging/admin/migrations | |
90 | + # addr = "127.0.0.1:#{9293 + worker.nr}" | |
91 | + # server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true) | |
92 | + | |
93 | + # the following is *required* for Rails + "preload_app true", | |
94 | + defined?(ActiveRecord::Base) and | |
95 | + ActiveRecord::Base.establish_connection | |
96 | + | |
97 | + # if preload_app is true, then you may also want to check and | |
98 | + # restart any other shared sockets/descriptors such as Memcached, | |
99 | + # and Redis. TokyoCabinet file handles are safe to reuse | |
100 | + # between any number of forked children (assuming your kernel | |
101 | + # correctly implements pread()/pwrite() system calls) | |
102 | +end | ... | ... |
doc/api/README.md
... | ... | @@ -81,3 +81,8 @@ When listing resources you can pass the following parameters: |
81 | 81 | + [System Hooks](system_hooks.md) |
82 | 82 | + [Groups](groups.md) |
83 | 83 | + [User Teams](user_teams.md) |
84 | + | |
85 | +## Clients | |
86 | + | |
87 | ++ [php-gitlab-api](https://github.com/m4tthumphrey/php-gitlab-api) - PHP | |
88 | ++ [Ruby Wrapper](https://github.com/NARKOZ/gitlab) - Ruby | ... | ... |
doc/install/installation.md
... | ... | @@ -173,9 +173,6 @@ You can change `5-3-stable` to `master` if you want the *bleeding edge* version, |
173 | 173 | # Create directory for satellites |
174 | 174 | sudo -u git -H mkdir /home/git/gitlab-satellites |
175 | 175 | |
176 | - # Make config/database.yml readable to git only | |
177 | - sudo -u git -H chmod o-rwx config/database.yml | |
178 | - | |
179 | 176 | # Create directories for sockets/pids and make sure GitLab can write to them |
180 | 177 | sudo -u git -H mkdir tmp/pids/ |
181 | 178 | sudo -u git -H mkdir tmp/sockets/ |
... | ... | @@ -218,6 +215,9 @@ Make sure to edit both `gitlab.yml` and `puma.rb` to match your setup. |
218 | 215 | # Change 'secure password' with the value you have given to $password |
219 | 216 | # You can keep the double quotes around the password |
220 | 217 | sudo -u git -H vim config/database.yml |
218 | + | |
219 | + # Make config/database.yml readable to git only | |
220 | + sudo -u git -H chmod o-rwx config/database.yml | |
221 | 221 | |
222 | 222 | ## Install Gems |
223 | 223 | |
... | ... | @@ -226,10 +226,10 @@ Make sure to edit both `gitlab.yml` and `puma.rb` to match your setup. |
226 | 226 | sudo gem install charlock_holmes --version '0.6.9.4' |
227 | 227 | |
228 | 228 | # For MySQL (note, the option says "without ... postgres") |
229 | - sudo -u git -H bundle install --deployment --without development test postgres | |
229 | + sudo -u git -H bundle install --deployment --without development test postgres unicorn aws | |
230 | 230 | |
231 | 231 | # Or for PostgreSQL (note, the option says "without ... mysql") |
232 | - sudo -u git -H bundle install --deployment --without development test mysql | |
232 | + sudo -u git -H bundle install --deployment --without development test mysql unicorn aws | |
233 | 233 | |
234 | 234 | |
235 | 235 | ## Initialize Database and Activate Advanced Features | ... | ... |
lib/gitlab/blacklist.rb
... | ... | @@ -3,7 +3,7 @@ module Gitlab |
3 | 3 | extend self |
4 | 4 | |
5 | 5 | def path |
6 | - %w(admin dashboard groups help profile projects search public assets u s teams merge_requests issues users snippets ) | |
6 | + %w(admin dashboard groups help profile projects search public assets u s teams merge_requests issues users snippets services) | |
7 | 7 | end |
8 | 8 | end |
9 | 9 | end | ... | ... |