diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-11-30 14:21:33 +0300 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-11-30 14:21:33 +0300 |
commit | 00ca7adca2de8ff05cca3df9eb2df8a67f638cfe (patch) | |
tree | 86764da0f493a7169b2fea59e5618b669cd64d56 /doc | |
parent | adb3f3d4e494e8f8d41c1b9e676e395a49cd96b2 (diff) | |
parent | 7e5fa10b665835e3160eee4d333a17fbaef9c113 (diff) |
Merge branch 'master' into fix/rename-mwbs-to-merge-when-pipeline-succeeds
* master: (110 commits)
Rewrite an HTTP link to use HTTPS
Edit /spec/features/profiles/preferences_spec.rb to match changes in 084d90ac
Add blue back to sub nav active
Remove JSX/React eslint plugins.
Fix a transient spec failure
Adds hoverstates for collapsed Issue/Merge Request sidebar
Moved groups above projects
Add StackProf to the Gemfile, along with a utility to get a profile for a spec
Update Sidekiq-cron to fix compatibility issues with Sidekiq 4.2.1
Add a CHANGELOG entry
Alert user when logged in user email is not the same as the invitation
Expose timestamp in build entity used by serializer
Rename `MergeRequest#pipeline` to `head_pipeline`
Remove unnecessary database indexes
CE-specific changes gitlab-org/gitlab-ee#1137
Fixing typo & Clarifying Key name
fix started_at check
fix blob controller spec failure - updated not to use file-path-
fix blob controller spec failure
Merge branch 'jej-use-issuable-finder-instead-of-access-check' into 'security'
...
Conflicts:
app/controllers/projects/merge_requests_controller.rb
lib/api/merge_requests.rb
spec/requests/api/merge_requests_spec.rb
Diffstat (limited to 'doc')
-rw-r--r-- | doc/administration/auth/ldap.md | 2 | ||||
-rw-r--r-- | doc/api/access_requests.md | 8 | ||||
-rw-r--r-- | doc/api/award_emoji.md | 4 | ||||
-rw-r--r-- | doc/api/boards.md | 10 | ||||
-rw-r--r-- | doc/api/branches.md | 7 | ||||
-rw-r--r-- | doc/api/broadcast_messages.md | 4 | ||||
-rw-r--r-- | doc/api/issues.md | 31 | ||||
-rw-r--r-- | doc/api/labels.md | 25 | ||||
-rw-r--r-- | doc/api/members.md | 10 | ||||
-rw-r--r-- | doc/api/merge_requests.md | 43 | ||||
-rw-r--r-- | doc/api/notes.md | 9 | ||||
-rw-r--r-- | doc/api/pipelines.md | 18 | ||||
-rw-r--r-- | doc/api/projects.md | 19 | ||||
-rw-r--r-- | doc/api/system_hooks.md | 3 | ||||
-rw-r--r-- | doc/api/tags.md | 21 | ||||
-rw-r--r-- | doc/api/users.md | 8 | ||||
-rw-r--r-- | doc/development/doc_styleguide.md | 71 | ||||
-rw-r--r-- | doc/development/limit_ee_conflicts.md | 111 | ||||
-rw-r--r-- | doc/development/performance.md | 110 | ||||
-rw-r--r-- | doc/development/ux_guide/components.md | 20 | ||||
-rw-r--r-- | doc/development/ux_guide/img/components-anchorlinks.png | bin | 19948 -> 30089 bytes | |||
-rw-r--r-- | doc/install/installation.md | 2 | ||||
-rw-r--r-- | doc/integration/bitbucket.md | 4 | ||||
-rw-r--r-- | doc/update/8.13-to-8.14.md | 2 |
24 files changed, 331 insertions, 211 deletions
diff --git a/doc/administration/auth/ldap.md b/doc/administration/auth/ldap.md index d3f216fb3bf..b8b63df091e 100644 --- a/doc/administration/auth/ldap.md +++ b/doc/administration/auth/ldap.md @@ -221,7 +221,7 @@ Tip: If you want to limit access to the nested members of an Active Directory group you can use the following syntax: ``` -(memberOf:1.2.840.113556.1.4.1941:=CN=My Group,DC=Example,DC=com) +(memberOf=CN=My Group,DC=Example,DC=com) ``` Please note that GitLab does not support the custom filter syntax used by diff --git a/doc/api/access_requests.md b/doc/api/access_requests.md index ea308b54d62..dee3e384080 100644 --- a/doc/api/access_requests.md +++ b/doc/api/access_requests.md @@ -18,8 +18,6 @@ Gets a list of access requests viewable by the authenticated user. -Returns `200` if the request succeeds. - ``` GET /groups/:id/access_requests GET /projects/:id/access_requests @@ -61,8 +59,6 @@ Example response: Requests access for the authenticated user to a group or project. -Returns `201` if the request succeeds. - ``` POST /groups/:id/access_requests POST /projects/:id/access_requests @@ -94,8 +90,6 @@ Example response: Approves an access request for the given user. -Returns `201` if the request succeeds. - ``` PUT /groups/:id/access_requests/:user_id/approve PUT /projects/:id/access_requests/:user_id/approve @@ -129,8 +123,6 @@ Example response: Denies an access request for the given user. -Returns `200` if the request succeeds. - ``` DELETE /groups/:id/access_requests/:user_id DELETE /projects/:id/access_requests/:user_id diff --git a/doc/api/award_emoji.md b/doc/api/award_emoji.md index 06111f4ab67..58092bdd400 100644 --- a/doc/api/award_emoji.md +++ b/doc/api/award_emoji.md @@ -158,7 +158,7 @@ Example Response: ### Delete an award emoji Sometimes its just not meant to be, and you'll have to remove your award. Only available to -admins or the author of the award. Status code 200 on success, 401 if unauthorized. +admins or the author of the award. ``` DELETE /projects/:id/issues/:issue_id/award_emoji/:award_id @@ -331,7 +331,7 @@ Example Response: ### Delete an award emoji Sometimes its just not meant to be, and you'll have to remove your award. Only available to -admins or the author of the award. Status code 200 on success, 401 if unauthorized. +admins or the author of the award. ``` DELETE /projects/:id/issues/:issue_id/notes/:note_id/award_emoji/:award_id diff --git a/doc/api/boards.md b/doc/api/boards.md index 28681719f43..c83db6df80c 100644 --- a/doc/api/boards.md +++ b/doc/api/boards.md @@ -148,10 +148,6 @@ Example response: Creates a new Issue Board list. -If the operation is successful, a status code of `200` and the newly-created -list is returned. If an error occurs, an error number and a message explaining -the reason is returned. - ``` POST /projects/:id/boards/:board_id/lists ``` @@ -184,10 +180,6 @@ Example response: Updates an existing Issue Board list. This call is used to change list position. -If the operation is successful, a code of `200` and the updated board list is -returned. If an error occurs, an error number and a message explaining the -reason is returned. - ``` PUT /projects/:id/boards/:board_id/lists/:list_id ``` @@ -220,8 +212,6 @@ Example response: ## Delete a board list Only for admins and project owners. Soft deletes the board list in question. -If the operation is successful, a status code `200` is returned. In case you cannot -destroy this board list, or it is not present, code `404` is given. ``` DELETE /projects/:id/boards/:board_id/lists/:list_id diff --git a/doc/api/branches.md b/doc/api/branches.md index f68eeb9f86b..07dfa5d4d7f 100644 --- a/doc/api/branches.md +++ b/doc/api/branches.md @@ -212,9 +212,6 @@ Example response: } ``` -It returns `200` if it succeeds or `400` if failed with an error message -explaining the reason. - ## Delete repository branch ``` @@ -226,8 +223,7 @@ DELETE /projects/:id/repository/branches/:branch | `id` | integer | yes | The ID of a project | | `branch` | string | yes | The name of the branch | -It returns `200` if it succeeds, `404` if the branch to be deleted does not exist -or `400` for other reasons. In case of an error, an explaining message is provided. +In case of an error, an explaining message is provided. ```bash curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/5/repository/branches/newbranch" @@ -253,7 +249,6 @@ DELETE /projects/:id/repository/merged_branches | --------- | ---- | -------- | ----------- | | `id` | integer | yes | The ID of a project | -It returns `200` to indicate deletion of all merged branches was started. ```bash curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/5/repository/merged_branches" diff --git a/doc/api/broadcast_messages.md b/doc/api/broadcast_messages.md index c3a9207a3ae..a3e9c01f335 100644 --- a/doc/api/broadcast_messages.md +++ b/doc/api/broadcast_messages.md @@ -62,10 +62,6 @@ Example response: ## Create a broadcast message -Responds with `400 Bad request` when the `message` parameter is missing or the -`color` or `font` values are invalid, and `201 Created` when the broadcast -message was successfully created. - ``` POST /broadcast_messages ``` diff --git a/doc/api/issues.md b/doc/api/issues.md index 134263d27b4..16f8e32c82a 100644 --- a/doc/api/issues.md +++ b/doc/api/issues.md @@ -315,10 +315,6 @@ Example response: Creates a new project issue. -If the operation is successful, a status code of `200` and the newly-created -issue is returned. If an error occurs, an error number and a message explaining -the reason is returned. - ``` POST /projects/:id/issues ``` @@ -377,10 +373,6 @@ Example response: Updates an existing project issue. This call is also used to mark an issue as closed. -If the operation is successful, a code of `200` and the updated issue is -returned. If an error occurs, an error number and a message explaining the -reason is returned. - ``` PUT /projects/:id/issues/:issue_id ``` @@ -439,8 +431,6 @@ Example response: ## Delete an issue Only for admins and project owners. Soft deletes the issue in question. -If the operation is successful, a status code `200` is returned. In case you cannot -destroy this issue, or it is not present, code `404` is given. ``` DELETE /projects/:id/issues/:issue_id @@ -457,9 +447,7 @@ curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://git ## Move an issue -Moves an issue to a different project. If the operation is successful, a status -code `201` together with moved issue is returned. If the project, issue, or -target project is not found, error `404` is returned. If the target project +Moves an issue to a different project. If the target project equals the source project or the user has insufficient permissions to move an issue, error `400` together with an explaining error message is returned. @@ -518,11 +506,9 @@ Example response: ## Subscribe to an issue -Subscribes the authenticated user to an issue to receive notifications. If the -operation is successful, status code `201` together with the updated issue is -returned. If the user is already subscribed to the issue, the status code `304` -is returned. If the project or issue is not found, status code `404` is -returned. +Subscribes the authenticated user to an issue to receive notifications. +If the user is already subscribed to the issue, the status code `304` +is returned. ``` POST /projects/:id/issues/:issue_id/subscription @@ -576,10 +562,8 @@ Example response: ## Unsubscribe from an issue Unsubscribes the authenticated user from the issue to not receive notifications -from it. If the operation is successful, status code `200` together with the -updated issue is returned. If the user is not subscribed to the issue, the -status code `304` is returned. If the project or issue is not found, status code -`404` is returned. +from it. If the user is not subscribed to the issue, the +status code `304` is returned. ``` DELETE /projects/:id/issues/:issue_id/subscription @@ -633,8 +617,7 @@ Example response: ## Create a todo -Manually creates a todo for the current user on an issue. If the request is -successful, status code `200` together with the created todo is returned. If +Manually creates a todo for the current user on an issue. If there already exists a todo for the user on that issue, status code `304` is returned. diff --git a/doc/api/labels.md b/doc/api/labels.md index 78686fdcad4..863b28c23b7 100644 --- a/doc/api/labels.md +++ b/doc/api/labels.md @@ -82,9 +82,6 @@ Example response: Creates a new label for the given repository with the given name and color. -It returns 200 if the label was successfully created, 400 for wrong parameters -and 409 if the label already exists. - ``` POST /projects/:id/labels ``` @@ -121,10 +118,6 @@ Example response: Deletes a label with a given name. -It returns 200 if the label was successfully deleted, 400 for wrong parameters -and 404 if the label does not exist. -In case of an error, an additional error message is returned. - ``` DELETE /projects/:id/labels ``` @@ -159,10 +152,6 @@ Example response: Updates an existing label with new name or new color. At least one parameter is required, to update the label. -It returns 200 if the label was successfully deleted, 400 for wrong parameters -and 404 if the label does not exist. -In case of an error, an additional error message is returned. - ``` PUT /projects/:id/labels ``` @@ -199,11 +188,9 @@ Example response: ## Subscribe to a label -Subscribes the authenticated user to a label to receive notifications. If the -operation is successful, status code `201` together with the updated label is -returned. If the user is already subscribed to the label, the status code `304` -is returned. If the project or label is not found, status code `404` is -returned. +Subscribes the authenticated user to a label to receive notifications. +If the user is already subscribed to the label, the status code `304` +is returned. ``` POST /projects/:id/labels/:label_id/subscription @@ -237,10 +224,8 @@ Example response: ## Unsubscribe from a label Unsubscribes the authenticated user from a label to not receive notifications -from it. If the operation is successful, status code `200` together with the -updated label is returned. If the user is not subscribed to the label, the -status code `304` is returned. If the project or label is not found, status code -`404` is returned. +from it. If the user is not subscribed to the label, the +status code `304` is returned. ``` DELETE /projects/:id/labels/:label_id/subscription diff --git a/doc/api/members.md b/doc/api/members.md index 6535e9a7801..5dcb2a5f60a 100644 --- a/doc/api/members.md +++ b/doc/api/members.md @@ -16,8 +16,6 @@ The access levels are defined in the `Gitlab::Access` module. Currently, these l Gets a list of group or project members viewable by the authenticated user. -Returns `200` if the request succeeds. - ``` GET /groups/:id/members GET /projects/:id/members @@ -60,8 +58,6 @@ Example response: Gets a member of a group or project. -Returns `200` if the request succeeds. - ``` GET /groups/:id/members/:user_id GET /projects/:id/members/:user_id @@ -95,8 +91,6 @@ Example response: Adds a member to a group or project. -Returns `201` if the request succeeds. - ``` POST /groups/:id/members POST /projects/:id/members @@ -131,8 +125,6 @@ Example response: Updates a member of a group or project. -Returns `200` if the request succeeds. - ``` PUT /groups/:id/members/:user_id PUT /projects/:id/members/:user_id @@ -167,8 +159,6 @@ Example response: Removes a user from a group or project. -Returns `200` if the request succeeds. - ``` DELETE /groups/:id/members/:user_id DELETE /projects/:id/members/:user_id diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md index 1d1d646138c..9460b3f73b1 100644 --- a/doc/api/merge_requests.md +++ b/doc/api/merge_requests.md @@ -338,9 +338,6 @@ Parameters: } ``` -If the operation is successful, 200 and the newly created merge request is returned. -If an error occurs, an error number and a message explaining the reason is returned. - ## Update MR Updates an existing merge request. You can change the target branch, title, or even close the MR. @@ -415,14 +412,9 @@ Parameters: } ``` -If the operation is successful, 200 and the updated merge request is returned. -If an error occurs, an error number and a message explaining the reason is returned. - ## Delete a merge request Only for admins and project owners. Soft deletes the merge request in question. -If the operation is successful, a status code `200` is returned. In case you cannot -destroy this merge request, or it is not present, code `404` is given. ``` DELETE /projects/:id/merge_requests/:merge_request_id @@ -441,15 +433,14 @@ curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://git Merge changes submitted with MR using this API. -If the merge succeeds you'll get a `200 OK`. -If it has some conflicts and can not be merged - you'll get a 405 and the error message 'Branch cannot be merged' +If it has some conflicts and can not be merged - you'll get a `405` and the error message 'Branch cannot be merged' -If merge request is already merged or closed - you'll get a 406 and the error message 'Method Not Allowed' +If merge request is already merged or closed - you'll get a `406` and the error message 'Method Not Allowed' -If the `sha` parameter is passed and does not match the HEAD of the source - you'll get a 409 and the error message 'SHA does not match HEAD of source branch' +If the `sha` parameter is passed and does not match the HEAD of the source - you'll get a `409` and the error message 'SHA does not match HEAD of source branch' -If you don't have permissions to accept this merge request - you'll get a 401 +If you don't have permissions to accept this merge request - you'll get a `401` ``` PUT /projects/:id/merge_requests/:merge_request_id/merge @@ -521,13 +512,11 @@ Parameters: ## Cancel Merge When Pipeline Succeeds -If successful you'll get `200 OK`. +If you don't have permissions to accept this merge request - you'll get a `401` -If you don't have permissions to accept this merge request - you'll get a 401 +If the merge request is already merged or closed - you get `405` and error message 'Method Not Allowed' -If the merge request is already merged or closed - you get 405 and error message 'Method Not Allowed' - -In case the merge request is not set to be merged when the build succeeds, you'll also get a 406 error. +In case the merge request is not set to be merged when the build succeeds, you'll also get a `406` error. ``` PUT /projects/:id/merge_requests/:merge_request_id/cancel_merge_when_build_succeeds ``` @@ -671,11 +660,8 @@ Example response when an external issue tracker (e.g. JIRA) is used: ## Subscribe to a merge request -Subscribes the authenticated user to a merge request to receive notification. If -the operation is successful, status code `201` together with the updated merge -request is returned. If the user is already subscribed to the merge request, the -status code `304` is returned. If the project or merge request is not found, -status code `404` is returned. +Subscribes the authenticated user to a merge request to receive notification. If the user is already subscribed to the merge request, the +status code `304` is returned. ``` POST /projects/:id/merge_requests/:merge_request_id/subscription @@ -748,10 +734,8 @@ Example response: ## Unsubscribe from a merge request Unsubscribes the authenticated user from a merge request to not receive -notifications from that merge request. If the operation is successful, status -code `200` together with the updated merge request is returned. If the user is -not subscribed to the merge request, the status code `304` is returned. If the -project or merge request is not found, status code `404` is returned. +notifications from that merge request. If the user is +not subscribed to the merge request, the status code `304` is returned. ``` DELETE /projects/:id/merge_requests/:merge_request_id/subscription @@ -823,9 +807,8 @@ Example response: ## Create a todo -Manually creates a todo for the current user on a merge request. If the -request is successful, status code `200` together with the created todo is -returned. If there already exists a todo for the user on that merge request, +Manually creates a todo for the current user on a merge request. +If there already exists a todo for the user on that merge request, status code `304` is returned. ``` diff --git a/doc/api/notes.md b/doc/api/notes.md index 9971806be56..214dfa4068d 100644 --- a/doc/api/notes.md +++ b/doc/api/notes.md @@ -109,8 +109,7 @@ Parameters: ### Delete an issue note -Deletes an existing note of an issue. On success, this API method returns 200 -and the deleted note. If the note does not exist, the API returns 404. +Deletes an existing note of an issue. ``` DELETE /projects/:id/issues/:issue_id/notes/:note_id @@ -234,8 +233,7 @@ Parameters: ### Delete a snippet note -Deletes an existing note of a snippet. On success, this API method returns 200 -and the deleted note. If the note does not exist, the API returns 404. +Deletes an existing note of a snippet. ``` DELETE /projects/:id/snippets/:snippet_id/notes/:note_id @@ -364,8 +362,7 @@ Parameters: ### Delete a merge request note -Deletes an existing note of a merge request. On success, this API method returns -200 and the deleted note. If the note does not exist, the API returns 404. +Deletes an existing note of a merge request. ``` DELETE /projects/:id/merge_requests/:merge_request_id/notes/:note_id diff --git a/doc/api/pipelines.md b/doc/api/pipelines.md index 6455c333faf..82351ae688f 100644 --- a/doc/api/pipelines.md +++ b/doc/api/pipelines.md @@ -41,7 +41,8 @@ Example of response "started_at": null, "finished_at": null, "committed_at": null, - "duration": null + "duration": null, + "coverage": "30.0" }, { "id": 48, @@ -64,7 +65,8 @@ Example of response "started_at": null, "finished_at": null, "committed_at": null, - "duration": null + "duration": null, + "coverage": null } ] ``` @@ -110,7 +112,8 @@ Example of response "started_at": null, "finished_at": "2016-08-11T11:32:35.145Z", "committed_at": null, - "duration": null + "duration": null, + "coverage": "30.0" } ``` @@ -155,7 +158,8 @@ Example of response "started_at": null, "finished_at": null, "committed_at": null, - "duration": null + "duration": null, + "coverage": null } ``` @@ -200,7 +204,8 @@ Response: "started_at": null, "finished_at": "2016-08-11T11:32:35.145Z", "committed_at": null, - "duration": null + "duration": null, + "coverage": null } ``` @@ -245,7 +250,8 @@ Response: "started_at": null, "finished_at": "2016-08-11T11:32:35.145Z", "committed_at": null, - "duration": null + "duration": null, + "coverage": null } ``` diff --git a/doc/api/projects.md b/doc/api/projects.md index bd27a0a6fae..de57f91bb8e 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -645,7 +645,7 @@ Parameters: ### Edit project -Updates an existing project +Updates an existing project. ``` PUT /projects/:id @@ -676,9 +676,6 @@ Parameters: | `lfs_enabled` | boolean | no | Enable LFS | | `request_access_enabled` | boolean | no | Allow users to request member access | -On success, method returns 200 with the updated project. If parameters are -invalid, 400 is returned. - ### Fork project Forks a project into the user namespace of the authenticated user or the one provided. @@ -696,8 +693,7 @@ Parameters: ### Star a project -Stars a given project. Returns status code `201` and the project on success and -`304` if the project is already starred. +Stars a given project. Returns status code `304` if the project is already starred. ``` POST /projects/:id/star @@ -767,8 +763,7 @@ Example response: ### Unstar a project -Unstars a given project. Returns status code `200` and the project on success -and `304` if the project is not starred. +Unstars a given project. Returns status code `304` if the project is not starred. ``` DELETE /projects/:id/star @@ -839,10 +834,6 @@ Example response: Archives the project if the user is either admin or the project owner of this project. This action is idempotent, thus archiving an already archived project will not change the project. -Status code 201 with the project as body is given when successful, in case the user doesn't -have the proper access rights, code 403 is returned. Status 404 is returned if the project -doesn't exist, or is hidden to the user. - ``` POST /projects/:id/archive ``` @@ -928,10 +919,6 @@ Example response: Unarchives the project if the user is either admin or the project owner of this project. This action is idempotent, thus unarchiving an non-archived project will not change the project. -Status code 201 with the project as body is given when successful, in case the user doesn't -have the proper access rights, code 403 is returned. Status 404 is returned if the project -doesn't exist, or is hidden to the user. - ``` POST /projects/:id/unarchive ``` diff --git a/doc/api/system_hooks.md b/doc/api/system_hooks.md index efd23d514bc..3fb8b73be6d 100644 --- a/doc/api/system_hooks.md +++ b/doc/api/system_hooks.md @@ -108,8 +108,7 @@ Example response: ## Delete system hook -Deletes a system hook. It returns `200 OK` if the hooks is deleted and -`404 Not Found` if the hook is not found. +Deletes a system hook. --- diff --git a/doc/api/tags.md b/doc/api/tags.md index 398b080e3f6..14573d48fe4 100644 --- a/doc/api/tags.md +++ b/doc/api/tags.md @@ -40,9 +40,7 @@ Parameters: ## Get a single repository tag -Get a specific repository tag determined by its name. It returns `200` together -with the tag information if the tag exists. It returns `404` if the tag does not -exist. +Get a specific repository tag determined by its name. ``` GET /projects/:id/repository/tags/:tag_name @@ -124,14 +122,12 @@ Parameters: The message will be `nil` when creating a lightweight tag otherwise it will contain the annotation. -It returns 201 if the operation succeed. In case of an error, -405 with an explaining error message is returned. +In case of an error, +status code `405` with an explaining error message is returned. ## Delete a tag -Deletes a tag of a repository with given name. On success, this API method -returns 200 with the name of the deleted tag. If the tag does not exist, the -API returns 404. +Deletes a tag of a repository with given name. ``` DELETE /projects/:id/repository/tags/:tag_name @@ -150,9 +146,8 @@ Parameters: ## Create a new release -Add release notes to the existing git tag. It returns 201 if the release is -created successfully. If the tag does not exist, 404 is returned. If there -already exists a release for the given tag, 409 is returned. +Add release notes to the existing git tag. If there +already exists a release for the given tag, status code `409` is returned. ``` POST /projects/:id/repository/tags/:tag_name/release @@ -173,9 +168,7 @@ Parameters: ## Update a release -Updates the release notes of a given release. It returns 200 if the release is -successfully updated. If the tag or the release does not exist, it returns 404 -with a proper error message. +Updates the release notes of a given release. ``` PUT /projects/:id/repository/tags/:tag_name/release diff --git a/doc/api/users.md b/doc/api/users.md index b38c335490a..52a6b691610 100644 --- a/doc/api/users.md +++ b/doc/api/users.md @@ -271,8 +271,8 @@ Parameters: - `can_create_group` (optional) - User can create groups - true or false - `external` (optional) - Flags the user as external - true or false(default) -Note, at the moment this method does only return a 404 error, -even in cases where a 409 (Conflict) would be more appropriate, +Note, at the moment this method does only return a `404` error, +even in cases where a `409` (Conflict) would be more appropriate, e.g. when renaming the email address to some existing one. ## User deletion @@ -449,8 +449,6 @@ Parameters: - `title` (required) - new SSH Key's title - `key` (required) - new SSH key -Will return created key with status `201 Created` on success, or `404 Not found` on fail. - ## Delete SSH key for current user Deletes key owned by currently authenticated user. @@ -581,8 +579,6 @@ Parameters: - `id` (required) - id of specified user - `email` (required) - email address -Will return created email with status `201 Created` on success, or `404 Not found` on fail. - ## Delete email for current user Deletes email owned by currently authenticated user. diff --git a/doc/development/doc_styleguide.md b/doc/development/doc_styleguide.md index b137e6ae82e..fc948a7a116 100644 --- a/doc/development/doc_styleguide.md +++ b/doc/development/doc_styleguide.md @@ -113,6 +113,77 @@ merge request. add an alternative text: `[identifier]: https://example.com "Alternative text"` that appears when hovering your mouse on a link +### Linking to inline docs + +Sometimes it's needed to link to the built-in documentation that GitLab provides +under `/help`. This is normally done in files inside the `app/views/` directory +with the help of the `help_page_path` helper method. + +In its simplest form, the HAML code to generate a link to the `/help` page is: + +```haml += link_to 'Help page', help_page_path('user/permissions') +``` + +The `help_page_path` contains the path to the document you want to link to with +the following conventions: + +- it is relative to the `doc/` directory in the GitLab repository +- the `.md` extension must be omitted +- it must not end with a slash (`/`) + +Below are some special cases where should be used depending on the context. +You can combine one or more of the following: + +1. **Linking to an anchor link.** Use `anchor` as part of the `help_page_path` + method: + + ```haml + = link_to 'Help page', help_page_path('user/permissions', anchor: 'anchor-link') + ``` + +1. **Opening links in a new tab.** This should be the default behavior: + + ```haml + = link_to 'Help page', help_page_path('user/permissions'), target: '_blank' + ``` + +1. **Linking to a circle icon.** Usually used in settings where a long + description cannot be used, like near checkboxes. You can basically use + any font awesome icon, but prefer the `question-circle`: + + ```haml + = link_to icon('question-circle'), help_page_path('user/permissions') + ``` + +1. **Using a button link.** Useful in places where text would be out of context + with the rest of the page layout: + + ```haml + = link_to 'Help page', help_page_path('user/permissions'), class: 'btn btn-info' + ``` + +1. **Underlining a link.** + + ```haml + = link_to 'Help page', help_page_path('user/permissions'), class: 'underlined-link' + ``` + +1. **Using links inline of some text.** + + ```haml + Description to #{link_to 'Help page', help_page_path('user/permissions')}. + ``` + +1. **Adding a period at the end of the sentence.** Useful when you don't want + the period to be part of the link: + + ```haml + = succeed '.' do + Learn more in the + = link_to 'Help page', help_page_path('user/permissions') + ``` + ## Images - Place images in a separate directory named `img/` in the same directory where diff --git a/doc/development/limit_ee_conflicts.md b/doc/development/limit_ee_conflicts.md index b7e6387838e..568dedf1669 100644 --- a/doc/development/limit_ee_conflicts.md +++ b/doc/development/limit_ee_conflicts.md @@ -143,109 +143,162 @@ to resolve when you add the indentation to the equation. For instance this kind of thing: ```haml +.form-group.detail-page-description + = form.label :description, 'Description', class: 'control-label' + .col-sm-10 + = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do + = render 'projects/zen', f: form, attr: :description, + classes: 'note-textarea', + placeholder: "Write a comment or drag your files here...", + supports_slash_commands: !issuable.persisted? + = render 'projects/notes/hints', supports_slash_commands: !issuable.persisted? + .clearfix + .error-alert +- if issuable.is_a?(Issue) + .form-group + .col-sm-offset-2.col-sm-10 + .checkbox + = form.label :confidential do + = form.check_box :confidential + This issue is confidential and should only be visible to team members with at least Reporter access. - if can?(current_user, :"admin_#{issuable.to_ability_name}", issuable.project) - has_due_date = issuable.has_attribute?(:due_date) %hr .row %div{ class: (has_due_date ? "col-lg-6" : "col-sm-12") } .form-group.issue-assignee - = f.label :assignee_id, "Assignee", class: "control-label #{"col-lg-4" if has_due_date}" + = form.label :assignee_id, "Assignee", class: "control-label #{"col-lg-4" if has_due_date}" .col-sm-10{ class: ("col-lg-8" if has_due_date) } .issuable-form-select-holder - if issuable.assignee_id - = f.hidden_field :assignee_id + = form.hidden_field :assignee_id = dropdown_tag(user_dropdown_label(issuable.assignee_id, "Assignee"), options: { toggle_class: "js-dropdown-keep-input js-user-search js-issuable-form-dropdown js-assignee-search", title: "Select assignee", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee js-filter-submit", placeholder: "Search assignee", data: { first_user: current_user.try(:username), null_user: true, current_user: true, project_id: project.try(:id), selected: issuable.assignee_id, field_name: "#{issuable.class.model_name.param_key}[assignee_id]", default_label: "Assignee"} }) .form-group.issue-milestone - = f.label :milestone_id, "Milestone", class: "control-label #{"col-lg-4" if has_due_date}" + = form.label :milestone_id, "Milestone", class: "control-label #{"col-lg-4" if has_due_date}" .col-sm-10{ class: ("col-lg-8" if has_due_date) } .issuable-form-select-holder = render "shared/issuable/milestone_dropdown", selected: issuable.milestone, name: "#{issuable.class.model_name.param_key}[milestone_id]", show_any: false, show_upcoming: false, extra_class: "js-issuable-form-dropdown js-dropdown-keep-input", dropdown_title: "Select milestone" .form-group - has_labels = @labels && @labels.any? - = f.label :label_ids, "Labels", class: "control-label #{"col-lg-4" if has_due_date}" - = f.hidden_field :label_ids, multiple: true, value: '' + = form.label :label_ids, "Labels", class: "control-label #{"col-lg-4" if has_due_date}" + = form.hidden_field :label_ids, multiple: true, value: '' .col-sm-10{ class: "#{"col-lg-8" if has_due_date} #{'issuable-form-padding-top' if !has_labels}" } .issuable-form-select-holder - = render "shared/issuable/label_dropdown", classes: ["js-issuable-form-dropdown"], selected: issuable.labels, data_options: { field_name: "#{issuable.class.model_name.param_key}[label_ids][]", show_any: false, show_menu_above: 'true' }, dropdown_title: "Select label" - + = render "shared/issuable/label_dropdown", classes: ["js-issuable-form-dropdown"], selected: issuable.labels, data_options: { field_name: "#{issuable.class.model_name.param_key}[label_ids][]", show_any: false }, dropdown_title: "Select label" - if issuable.respond_to?(:weight) + - weight_options = Issue.weight_options + - weight_options.delete(Issue::WEIGHT_ALL) + - weight_options.delete(Issue::WEIGHT_ANY) .form-group - = f.label :label_ids, class: "control-label #{"col-lg-4" if has_due_date}" do + = form.label :label_ids, class: "control-label #{"col-lg-4" if has_due_date}" do Weight .col-sm-10{ class: ("col-lg-8" if has_due_date) } - = f.select :weight, issues_weight_options(issuable.weight, edit: true), { include_blank: true }, - { class: 'select2 js-select2', data: { placeholder: "Select weight" }} - + .issuable-form-select-holder + - if issuable.weight + = form.hidden_field :weight + = dropdown_tag(issuable.weight || "Weight", options: { title: "Select weight", toggle_class: 'js-weight-select js-issuable-form-weight', dropdown_class: "dropdown-menu-selectable dropdown-menu-weight", + placeholder: "Search weight", data: { field_name: "#{issuable.class.model_name.param_key}[weight]" , default_label: "Weight" } }) do + %ul + - weight_options.each do |weight| + %li + %a{href: "#", data: { id: weight, none: weight === Issue::WEIGHT_NONE }, class: ("is-active" if issuable.weight == weight)} + = weight - if has_due_date .col-lg-6 .form-group - = f.label :due_date, "Due date", class: "control-label" + = form.label :due_date, "Due date", class: "control-label" .col-sm-10 .issuable-form-select-holder - = f.text_field :due_date, id: "issuable-due-date", class: "datepicker form-control", placeholder: "Select due date" + = form.text_field :due_date, id: "issuable-due-date", class: "datepicker form-control", placeholder: "Select due date" ``` could be simplified by using partials: ```haml -= render 'metadata_form', issuable: issuable += render 'shared/issuable/form/description', issuable: issuable, form: form + +- if issuable.respond_to?(:confidential) + .form-group + .col-sm-offset-2.col-sm-10 + .checkbox + = form.label :confidential do + = form.check_box :confidential + This issue is confidential and should only be visible to team members with at least Reporter access. + += render 'shared/issuable/form/metadata', issuable: issuable, form: form ``` -and then the `_metadata_form.html.haml` could be as follows: +and then the `app/views/shared/issuable/form/_metadata.html.haml` could be as follows: ```haml +- issuable = local_assigns.fetch(:issuable) + - return unless can?(current_user, :"admin_#{issuable.to_ability_name}", issuable.project) - has_due_date = issuable.has_attribute?(:due_date) +- has_labels = @labels && @labels.any? +- form = local_assigns.fetch(:form) + %hr .row %div{ class: (has_due_date ? "col-lg-6" : "col-sm-12") } .form-group.issue-assignee - = f.label :assignee_id, "Assignee", class: "control-label #{"col-lg-4" if has_due_date}" + = form.label :assignee_id, "Assignee", class: "control-label #{"col-lg-4" if has_due_date}" .col-sm-10{ class: ("col-lg-8" if has_due_date) } .issuable-form-select-holder - if issuable.assignee_id - = f.hidden_field :assignee_id + = form.hidden_field :assignee_id = dropdown_tag(user_dropdown_label(issuable.assignee_id, "Assignee"), options: { toggle_class: "js-dropdown-keep-input js-user-search js-issuable-form-dropdown js-assignee-search", title: "Select assignee", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee js-filter-submit", - placeholder: "Search assignee", data: { first_user: current_user.try(:username), null_user: true, current_user: true, project_id: project.try(:id), selected: issuable.assignee_id, field_name: "#{issuable.class.model_name.param_key}[assignee_id]", default_label: "Assignee"} }) + placeholder: "Search assignee", data: { first_user: current_user.try(:username), null_user: true, current_user: true, project_id: issuable.project.try(:id), selected: issuable.assignee_id, field_name: "#{issuable.class.model_name.param_key}[assignee_id]", default_label: "Assignee"} }) .form-group.issue-milestone - = f.label :milestone_id, "Milestone", class: "control-label #{"col-lg-4" if has_due_date}" + = form.label :milestone_id, "Milestone", class: "control-label #{"col-lg-4" if has_due_date}" .col-sm-10{ class: ("col-lg-8" if has_due_date) } .issuable-form-select-holder = render "shared/issuable/milestone_dropdown", selected: issuable.milestone, name: "#{issuable.class.model_name.param_key}[milestone_id]", show_any: false, show_upcoming: false, extra_class: "js-issuable-form-dropdown js-dropdown-keep-input", dropdown_title: "Select milestone" .form-group - has_labels = @labels && @labels.any? - = f.label :label_ids, "Labels", class: "control-label #{"col-lg-4" if has_due_date}" - = f.hidden_field :label_ids, multiple: true, value: '' + = form.label :label_ids, "Labels", class: "control-label #{"col-lg-4" if has_due_date}" + = form.hidden_field :label_ids, multiple: true, value: '' .col-sm-10{ class: "#{"col-lg-8" if has_due_date} #{'issuable-form-padding-top' if !has_labels}" } .issuable-form-select-holder - = render "shared/issuable/label_dropdown", classes: ["js-issuable-form-dropdown"], selected: issuable.labels, data_options: { field_name: "#{issuable.class.model_name.param_key}[label_ids][]", show_any: false, show_menu_above: 'true' }, dropdown_title: "Select label" + = render "shared/issuable/label_dropdown", classes: ["js-issuable-form-dropdown"], selected: issuable.labels, data_options: { field_name: "#{issuable.class.model_name.param_key}[label_ids][]", show_any: false }, dropdown_title: "Select label" - = render 'weight_form', issuable: issuable, has_due_date: has_due_date + = render "shared/issuable/form/weight", issuable: issuable, form: form - if has_due_date .col-lg-6 .form-group - = f.label :due_date, "Due date", class: "control-label" + = form.label :due_date, "Due date", class: "control-label" .col-sm-10 .issuable-form-select-holder - = f.text_field :due_date, id: "issuable-due-date", class: "datepicker form-control", placeholder: "Select due date" + = form.text_field :due_date, id: "issuable-due-date", class: "datepicker form-control", placeholder: "Select due date" ``` -and then the `_weight_form.html.haml` could be as follows: +and then the `app/views/shared/issuable/form/_weight.html.haml` could be as follows: ```haml +- issuable = local_assigns.fetch(:issuable) + - return unless issuable.respond_to?(:weight) - has_due_date = issuable.has_attribute?(:due_date) +- form = local_assigns.fetch(:form) .form-group - = f.label :label_ids, class: "control-label #{"col-lg-4" if has_due_date}" do + = form.label :label_ids, class: "control-label #{"col-lg-4" if has_due_date}" do Weight .col-sm-10{ class: ("col-lg-8" if has_due_date) } - = f.select :weight, issues_weight_options(issuable.weight, edit: true), { include_blank: true }, - { class: 'select2 js-select2', data: { placeholder: "Select weight" }} + .issuable-form-select-holder + - if issuable.weight + = form.hidden_field :weight + + = weight_dropdown_tag(issuable, toggle_class: 'js-issuable-form-weight') do + %ul + - Issue.weight_options.each do |weight| + %li + %a{ href: '#', data: { id: weight, none: weight === Issue::WEIGHT_NONE }, class: ("is-active" if issuable.weight == weight) } + = weight ``` Note: diff --git a/doc/development/performance.md b/doc/development/performance.md index 8337c2d9cb3..5c43ae7b79a 100644 --- a/doc/development/performance.md +++ b/doc/development/performance.md @@ -101,6 +101,116 @@ In short: 5. If you must write a benchmark use the benchmark-ips Gem instead of Ruby's `Benchmark` module. +## Profiling + +By collecting snapshots of process state at regular intervals, profiling allows +you to see where time is spent in a process. The [StackProf](https://github.com/tmm1/stackprof) +gem is included in GitLab's development environment, allowing you to investigate +the behaviour of suspect code in detail. + +It's important to note that profiling an application *alters its performance*, +and will generally be done *in an unrepresentative environment*. In particular, +a method is not necessarily troublesome just because it is executed many times, +or takes a long time to execute. Profiles are tools you can use to better +understand what is happening in an application - using that information wisely +is up to you! + +Keeping that in mind, to create a profile, identify (or create) a spec that +exercises the troublesome code path, then run it using the `bin/rspec-stackprof` +helper, e.g.: + +``` +$ LIMIT=10 bin/rspec-stackprof spec/policies/project_policy_spec.rb +8/8 |====== 100 ======>| Time: 00:00:18 + +Finished in 18.19 seconds (files took 4.8 seconds to load) +8 examples, 0 failures + +================================== + Mode: wall(1000) + Samples: 17033 (5.59% miss rate) + GC: 1901 (11.16%) +================================== + TOTAL (pct) SAMPLES (pct) FRAME + 6000 (35.2%) 2566 (15.1%) Sprockets::Cache::FileStore#get + 2018 (11.8%) 888 (5.2%) ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#exec_no_cache + 1338 (7.9%) 640 (3.8%) ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements#execute + 3125 (18.3%) 394 (2.3%) Sprockets::Cache::FileStore#safe_open + 913 (5.4%) 301 (1.8%) ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#exec_cache + 288 (1.7%) 288 (1.7%) ActiveRecord::Attribute#initialize + 246 (1.4%) 246 (1.4%) Sprockets::Cache::FileStore#safe_stat + 295 (1.7%) 193 (1.1%) block (2 levels) in class_attribute + 187 (1.1%) 187 (1.1%) block (4 levels) in class_attribute +``` + +You can limit the specs that are run by passing any arguments `rspec` would +normally take. + +The output is sorted by the `Samples` column by default. This is the number of +samples taken where the method is the one currently being executed. The `Total` +column shows the number of samples taken where the method, or any of the methods +it calls, were being executed. + +To create a graphical view of the call stack: + +```shell +$ stackprof tmp/project_policy_spec.rb.dump --graphviz > project_policy_spec.dot +$ dot -Tsvg project_policy_spec.dot > project_policy_spec.svg +``` + +To load the profile in [kcachegrind](https://kcachegrind.github.io/): + +``` +$ stackprof tmp/project_policy_spec.dump --callgrind > project_policy_spec.callgrind +$ kcachegrind project_policy_spec.callgrind # Linux +$ qcachegrind project_policy_spec.callgrind # Mac +``` + +It may be useful to zoom in on a specific method, e.g.: + +``` +$ stackprof tmp/project_policy_spec.rb.dump --method warm_asset_cache +TestEnv#warm_asset_cache (/Users/lupine/dev/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/spec/support/test_env.rb:164) + samples: 0 self (0.0%) / 6288 total (36.9%) + callers: + 6288 ( 100.0%) block (2 levels) in <top (required)> + callees (6288 total): + 6288 ( 100.0%) Capybara::RackTest::Driver#visit + code: + | 164 | def warm_asset_cache + | 165 | return if warm_asset_cache? + | 166 | return unless defined?(Capybara) + | 167 | + 6288 (36.9%) | 168 | Capybara.current_session.driver.visit '/' + | 169 | end +$ stackprof tmp/project_policy_spec.rb.dump --method BasePolicy#abilities +BasePolicy#abilities (/Users/lupine/dev/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/app/policies/base_policy.rb:79) + samples: 0 self (0.0%) / 50 total (0.3%) + callers: + 25 ( 50.0%) BasePolicy.abilities + 25 ( 50.0%) BasePolicy#collect_rules + callees (50 total): + 25 ( 50.0%) ProjectPolicy#rules + 25 ( 50.0%) BasePolicy#collect_rules + code: + | 79 | def abilities + | 80 | return RuleSet.empty if @user && @user.blocked? + | 81 | return anonymous_abilities if @user.nil? + 50 (0.3%) | 82 | collect_rules { rules } + | 83 | end +``` + +Since the profile includes the work done by the test suite as well as the +application code, these profiles can be used to investigate slow tests as well. +However, for smaller runs (like this example), this means that the cost of +setting up the test suite will tend to dominate. + +It's also possible to modify the application code in-place to output profiles +whenever a particular code path is triggered without going through the test +suite first. See the +[StackProf documentation](https://github.com/tmm1/stackprof/blob/master/README.md) +for details. + ## Importance of Changes When working on performance improvements, it's important to always ask yourself diff --git a/doc/development/ux_guide/components.md b/doc/development/ux_guide/components.md index 764c3355714..8e51edd23ef 100644 --- a/doc/development/ux_guide/components.md +++ b/doc/development/ux_guide/components.md @@ -43,7 +43,7 @@ Primary links are blue in their rest state. Secondary links (such as the time st #### Hover -An underline should always be added on hover. A gray link becomes blue on hover. +On hover, an underline should be added and the color should change. Both the primary and secondary link should become the darker blue color on hover. #### Focus @@ -72,9 +72,7 @@ Secondary buttons are for alternative commands. They should be conveyed by a bu ### Icon and text treatment Text should be in sentence case, where only the first word is capitalized. "Create issue" is correct, not "Create Issue". Buttons should only contain an icon or a text, not both. ->>> -TODO: Rationalize this. Ensure that we still believe this. ->>> +> TODO: Rationalize this. Ensure that we still believe this. ### Colors Follow the color guidance on the [basics](basics.md#color) page. The default color treatment is the white/grey button. @@ -85,13 +83,13 @@ Follow the color guidance on the [basics](basics.md#color) page. The default col Dropdowns are used to allow users to choose one (or many) options from a list of options. If this list of options is more 20, there should generally be a way to search through and filter the options (see the complex filter dropdowns below.) ->>> -TODO: Will update this section when the new filters UI is implemented. ->>> +> TODO: Will update this section when the new filters UI is implemented. ![Dropdown states](img/components-dropdown.png) +### Max size +The max height for dropdowns should target **10-15 items**. If the height of the dropdown is too large, the list becomes very hard to parse and it is easy to visually lose track of the item you are looking for. Usability also suffers as more mouse movement is required, and you have a larger area in which you hijack the scroll away from the page level. While it may initially seem counterintuitive to not show as many items as you can, it is actually quicker and easier to process the information when it is cropped at a reasonable height. --- @@ -164,9 +162,7 @@ Cover blocks are generally used to create a heading element for a page, such as ## Panels ->>> -TODO: Catalog how we are currently using panels and rationalize how they relate to alerts ->>> +> TODO: Catalog how we are currently using panels and rationalize how they relate to alerts ![Panels](img/components-panels.png) @@ -174,9 +170,7 @@ TODO: Catalog how we are currently using panels and rationalize how they relate ## Alerts ->>> -TODO: Catalog how we are currently using alerts ->>> +> TODO: Catalog how we are currently using alerts ![Alerts](img/components-alerts.png) diff --git a/doc/development/ux_guide/img/components-anchorlinks.png b/doc/development/ux_guide/img/components-anchorlinks.png Binary files differindex 7dd6a8a3876..4a9c730566c 100644 --- a/doc/development/ux_guide/img/components-anchorlinks.png +++ b/doc/development/ux_guide/img/components-anchorlinks.png diff --git a/doc/install/installation.md b/doc/install/installation.md index dabd69d7466..ee02d6024d9 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -403,7 +403,7 @@ If you are not using Linux you may have to run `gmake` instead of cd /home/git sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git cd gitlab-workhorse - sudo -u git -H git checkout v1.0.0 + sudo -u git -H git checkout v1.0.1 sudo -u git -H make ### Initialize Database and Activate Advanced Features diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md index 556d71b8b76..9122dc62e39 100644 --- a/doc/integration/bitbucket.md +++ b/doc/integration/bitbucket.md @@ -123,7 +123,7 @@ To be able to access repositories on Bitbucket, GitLab will automatically register your public key with Bitbucket as a deploy key for the repositories to be imported. Your public key needs to be at `~/.ssh/bitbucket_rsa` which translates to `/var/opt/gitlab/.ssh/bitbucket_rsa` for Omnibus packages and to -`/home/git/.ssh/bitbucket_rsa.pub` for installations from source. +`/home/git/.ssh/bitbucket_rsa` for installations from source. --- @@ -199,7 +199,7 @@ Your GitLab server is now able to connect to Bitbucket over SSH. You should be able to see the "Import projects from Bitbucket" option on the New Project page enabled. -## Acknowledgemts +## Acknowledgements Special thanks to the writer behind the following article: diff --git a/doc/update/8.13-to-8.14.md b/doc/update/8.13-to-8.14.md index 46ea19d11d0..a0e895773ce 100644 --- a/doc/update/8.13-to-8.14.md +++ b/doc/update/8.13-to-8.14.md @@ -84,7 +84,7 @@ GitLab 8.1. ```bash cd /home/git/gitlab-workhorse sudo -u git -H git fetch --all -sudo -u git -H git checkout v1.0.0 +sudo -u git -H git checkout v1.0.1 sudo -u git -H make ``` |