From fb664d3732c690f9c36c82fd187982f92a15b3a2 Mon Sep 17 00:00:00 2001 From: Hazel Yang Date: Thu, 18 May 2017 05:38:17 +0000 Subject: Add new file --- doc/development/ux_guide/illustrations.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/development/ux_guide/illustrations.md diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md new file mode 100644 index 00000000000..e69de29bb2d -- cgit v1.2.1 From a7b1779c45d9d1eae57d4bcf6613059bfa0b5ace Mon Sep 17 00:00:00 2001 From: Hazel Yang Date: Thu, 18 May 2017 06:15:47 +0000 Subject: Update illustrations.md --- doc/development/ux_guide/illustrations.md | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index e69de29bb2d..168a3cd33f4 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -0,0 +1,52 @@ +# Illustrations + +The illustrations should always align with topics and goals in specific context. + +## Principles + +#### Be simple. +- For clarity, we use simple and specific elements to create our illustrations. + +#### Be optimistic. +- We are an open-minded, optimistic, and friendly team. We should reflect those values on our illustrations to connect with our brand experience. + +#### Be gentle. +- Our illustrations assist users understand context and guide users to the right direction. Illustrations are supportive, so it should be obvious but not aggressive. + + +## Style + +#### Shapes +- All illustrations are geometric rather than organic. +- The illustrations are made by circles, rectangles, squares, and triangles. + +![example-shapes]() + +#### Stroke +- Standard border thickness: **4px** +- Depends on different situations, border thickness can be changed to **3px**. For example, when the illustration size is small, the illustration with 4px border thickness would look tight. In this case, the border thickness can be changed to 3px. +- We use **rounded caps** and **rounded corner**. + +![example-caps-and-corner]() + +#### Radius +- Standard corner radius: **10px** +- Depends on different situations, corner radius can be changed to **5px**. For example, when the illustration size is small, the illustration with 10px corner radius would be over-rounded. In this case, the corner radius can be changed to 5px. + +![example-radius]() + +#### Colors + +| Orange | Purple | Grey | +| -------- | -------- | -------- | +| ![color-orange]() | ![color-purple]() | ![color-grey]() | +| #FC6D26 | #6B4FBB | #EEEEEE | + +##### Color palette +We suggest that pick the colors from the color palette. + +| Orange | Purple | +| -------- | -------- | +| ![palette-orange]() | ![palette-purple]() | + + -- cgit v1.2.1 From a331d7603a3466ff602cddc2a3c5e95385adc5fe Mon Sep 17 00:00:00 2001 From: Hazel Yang Date: Thu, 18 May 2017 06:26:03 +0000 Subject: Update illustrations.md --- doc/development/ux_guide/illustrations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index 168a3cd33f4..89547b2352d 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -43,7 +43,7 @@ The illustrations should always align with topics and goals in specific context. | #FC6D26 | #6B4FBB | #EEEEEE | ##### Color palette -We suggest that pick the colors from the color palette. +For consistency, we suggest to pick the colors from the color palette. | Orange | Purple | | -------- | -------- | -- cgit v1.2.1 From 55a6d20a7ee7dc4f42baa2b5155f80609ca1452b Mon Sep 17 00:00:00 2001 From: Hazel Yang Date: Fri, 19 May 2017 05:21:27 +0000 Subject: Update illustrations.md --- doc/development/ux_guide/illustrations.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index 89547b2352d..5e7d243805d 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -27,7 +27,10 @@ The illustrations should always align with topics and goals in specific context. - Depends on different situations, border thickness can be changed to **3px**. For example, when the illustration size is small, the illustration with 4px border thickness would look tight. In this case, the border thickness can be changed to 3px. - We use **rounded caps** and **rounded corner**. -![example-caps-and-corner]() +| Do | Don't | +| -------- | -------- | +| ![example-caps-and-corner--do]() | ![example-caps-and-corner--dont]() | + #### Radius - Standard corner radius: **10px** @@ -35,15 +38,16 @@ The illustrations should always align with topics and goals in specific context. ![example-radius]() -#### Colors +#### Colors palette + +For consistency, we suggest to pick the colors from the color palette. | Orange | Purple | Grey | | -------- | -------- | -------- | | ![color-orange]() | ![color-purple]() | ![color-grey]() | | #FC6D26 | #6B4FBB | #EEEEEE | -##### Color palette -For consistency, we suggest to pick the colors from the color palette. + | Orange | Purple | | -------- | -------- | -- cgit v1.2.1 From f09a7b0bbb179a15890705667366f7f9dc2a4e24 Mon Sep 17 00:00:00 2001 From: Hazel Date: Fri, 19 May 2017 13:26:25 +0800 Subject: Add the images for illustration guidelines --- .../ux_guide/img/illustrations-border-radius.png | Bin 0 -> 7779 bytes doc/development/ux_guide/img/illustrations-caps-do.png | Bin 0 -> 3775 bytes .../ux_guide/img/illustrations-caps-don't.png | Bin 0 -> 3922 bytes .../ux_guide/img/illustrations-color-grey.png | Bin 0 -> 251 bytes .../ux_guide/img/illustrations-color-orange.png | Bin 0 -> 275 bytes .../ux_guide/img/illustrations-color-purple.png | Bin 0 -> 275 bytes .../ux_guide/img/illustrations-geometric.png | Bin 0 -> 5057 bytes .../ux_guide/img/illustrations-palette-oragne.png | Bin 0 -> 10419 bytes .../ux_guide/img/illustrations-palette-purple.png | Bin 0 -> 9924 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 doc/development/ux_guide/img/illustrations-border-radius.png create mode 100755 doc/development/ux_guide/img/illustrations-caps-do.png create mode 100755 doc/development/ux_guide/img/illustrations-caps-don't.png create mode 100755 doc/development/ux_guide/img/illustrations-color-grey.png create mode 100755 doc/development/ux_guide/img/illustrations-color-orange.png create mode 100755 doc/development/ux_guide/img/illustrations-color-purple.png create mode 100755 doc/development/ux_guide/img/illustrations-geometric.png create mode 100755 doc/development/ux_guide/img/illustrations-palette-oragne.png create mode 100755 doc/development/ux_guide/img/illustrations-palette-purple.png diff --git a/doc/development/ux_guide/img/illustrations-border-radius.png b/doc/development/ux_guide/img/illustrations-border-radius.png new file mode 100755 index 00000000000..4e2fef5c7f5 Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-border-radius.png differ diff --git a/doc/development/ux_guide/img/illustrations-caps-do.png b/doc/development/ux_guide/img/illustrations-caps-do.png new file mode 100755 index 00000000000..7a2c74382f6 Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-caps-do.png differ diff --git a/doc/development/ux_guide/img/illustrations-caps-don't.png b/doc/development/ux_guide/img/illustrations-caps-don't.png new file mode 100755 index 00000000000..848f72dbe30 Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-caps-don't.png differ diff --git a/doc/development/ux_guide/img/illustrations-color-grey.png b/doc/development/ux_guide/img/illustrations-color-grey.png new file mode 100755 index 00000000000..63855026c2b Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-color-grey.png differ diff --git a/doc/development/ux_guide/img/illustrations-color-orange.png b/doc/development/ux_guide/img/illustrations-color-orange.png new file mode 100755 index 00000000000..96765c8c28c Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-color-orange.png differ diff --git a/doc/development/ux_guide/img/illustrations-color-purple.png b/doc/development/ux_guide/img/illustrations-color-purple.png new file mode 100755 index 00000000000..745d2c853ba Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-color-purple.png differ diff --git a/doc/development/ux_guide/img/illustrations-geometric.png b/doc/development/ux_guide/img/illustrations-geometric.png new file mode 100755 index 00000000000..33f05547bac Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-geometric.png differ diff --git a/doc/development/ux_guide/img/illustrations-palette-oragne.png b/doc/development/ux_guide/img/illustrations-palette-oragne.png new file mode 100755 index 00000000000..58df4459c24 Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-palette-oragne.png differ diff --git a/doc/development/ux_guide/img/illustrations-palette-purple.png b/doc/development/ux_guide/img/illustrations-palette-purple.png new file mode 100755 index 00000000000..da5c1e245c9 Binary files /dev/null and b/doc/development/ux_guide/img/illustrations-palette-purple.png differ -- cgit v1.2.1 From 85efbd1f0792b4d69e90de665e3e37345159ff47 Mon Sep 17 00:00:00 2001 From: Hazel Yang Date: Fri, 19 May 2017 05:39:20 +0000 Subject: Add some images to illustrations.md --- doc/development/ux_guide/illustrations.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index 5e7d243805d..cd0d61a9d3d 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -20,7 +20,7 @@ The illustrations should always align with topics and goals in specific context. - All illustrations are geometric rather than organic. - The illustrations are made by circles, rectangles, squares, and triangles. -![example-shapes]() +Example for geometric #### Stroke - Standard border thickness: **4px** @@ -29,14 +29,14 @@ The illustrations should always align with topics and goals in specific context. | Do | Don't | | -------- | -------- | -| ![example-caps-and-corner--do]() | ![example-caps-and-corner--dont]() | +| Do: caps and corner | Don't: caps and corner | #### Radius - Standard corner radius: **10px** - Depends on different situations, corner radius can be changed to **5px**. For example, when the illustration size is small, the illustration with 10px corner radius would be over-rounded. In this case, the corner radius can be changed to 5px. -![example-radius]() +Example for border radius #### Colors palette @@ -44,13 +44,13 @@ For consistency, we suggest to pick the colors from the color palette. | Orange | Purple | Grey | | -------- | -------- | -------- | -| ![color-orange]() | ![color-purple]() | ![color-grey]() | +| Orange | Purple | Grey | | #FC6D26 | #6B4FBB | #EEEEEE | - +--- | Orange | Purple | | -------- | -------- | -| ![palette-orange]() | ![palette-purple]() | +| Palette - Orange | Palette - Purple | -- cgit v1.2.1 From 7125082edc0f775037ed537b5655cccedcdb015a Mon Sep 17 00:00:00 2001 From: Hazel Yang Date: Fri, 19 May 2017 05:40:24 +0000 Subject: Update image size in illustrations.md --- doc/development/ux_guide/illustrations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index cd0d61a9d3d..c6478019ed0 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -44,13 +44,13 @@ For consistency, we suggest to pick the colors from the color palette. | Orange | Purple | Grey | | -------- | -------- | -------- | -| Orange | Purple | Grey | +| Orange | Purple | Grey | | #FC6D26 | #6B4FBB | #EEEEEE | --- | Orange | Purple | | -------- | -------- | -| Palette - Orange | Palette - Purple | +| Palette - Orange | Palette - Purple | -- cgit v1.2.1 From c93131d3d03aa19c9bb6738b170dda48744fb211 Mon Sep 17 00:00:00 2001 From: Hazel Yang Date: Fri, 19 May 2017 05:41:53 +0000 Subject: Update illustrations.md --- doc/development/ux_guide/illustrations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index c6478019ed0..7df8e918e60 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -44,13 +44,13 @@ For consistency, we suggest to pick the colors from the color palette. | Orange | Purple | Grey | | -------- | -------- | -------- | -| Orange | Purple | Grey | +| Orange | Purple | Grey | | #FC6D26 | #6B4FBB | #EEEEEE | --- | Orange | Purple | | -------- | -------- | -| Palette - Orange | Palette - Purple | +| Palette - Orange | Palette - Purple | -- cgit v1.2.1 From ff9a2a8b51de385b4383bf25c5ece5479738f6c4 Mon Sep 17 00:00:00 2001 From: Hazel Date: Wed, 2 Aug 2017 12:43:48 +0800 Subject: Illustration guidelines - Fix grammar error and update images. --- doc/development/ux_guide/illustrations.md | 24 ++++++++++----------- .../ux_guide/img/illustrations-palette-oragne.png | Bin 10419 -> 10439 bytes .../ux_guide/img/illustrations-palette-purple.png | Bin 9924 -> 10002 bytes 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index 7df8e918e60..b9c98277120 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -8,39 +8,39 @@ The illustrations should always align with topics and goals in specific context. - For clarity, we use simple and specific elements to create our illustrations. #### Be optimistic. -- We are an open-minded, optimistic, and friendly team. We should reflect those values on our illustrations to connect with our brand experience. +- We are an open-minded, optimistic, and friendly team. We should reflect those values in our illustrations to connect with our brand experience. #### Be gentle. -- Our illustrations assist users understand context and guide users to the right direction. Illustrations are supportive, so it should be obvious but not aggressive. +- Our illustrations assist users in understanding context and guide users in the right direction. Illustrations are supportive, so they should be obvious but not aggressive. ## Style #### Shapes -- All illustrations are geometric rather than organic. -- The illustrations are made by circles, rectangles, squares, and triangles. +- All illustrations are geometric rather than organic. +- The illustrations are made by circles, rectangles, squares, and triangles. Example for geometric #### Stroke - Standard border thickness: **4px** -- Depends on different situations, border thickness can be changed to **3px**. For example, when the illustration size is small, the illustration with 4px border thickness would look tight. In this case, the border thickness can be changed to 3px. +- Depending on the situation, border thickness can be changed to **3px**. For example, when the illustration size is small, an illustration with 4px border thickness would look tight. In this case, the border thickness can be changed to 3px. - We use **rounded caps** and **rounded corner**. | Do | Don't | -| -------- | -------- | +| -------- | -------- | | Do: caps and corner | Don't: caps and corner | #### Radius - Standard corner radius: **10px** -- Depends on different situations, corner radius can be changed to **5px**. For example, when the illustration size is small, the illustration with 10px corner radius would be over-rounded. In this case, the corner radius can be changed to 5px. +- Depending on the situation, corner radius can be changed to **5px**. For example, when the illustration size is small, an illustration with 10px corner radius would be over-rounded. In this case, the corner radius can be changed to 5px. -Example for border radius +Example for border radius #### Colors palette -For consistency, we suggest to pick the colors from the color palette. +For consistency, we recommend choosing colors from our color palette. | Orange | Purple | Grey | | -------- | -------- | -------- | @@ -50,7 +50,5 @@ For consistency, we suggest to pick the colors from the color palette. --- | Orange | Purple | -| -------- | -------- | -| Palette - Orange | Palette - Purple | - - +| -------- | -------- | +| Palette - Orange | Palette - Purple | diff --git a/doc/development/ux_guide/img/illustrations-palette-oragne.png b/doc/development/ux_guide/img/illustrations-palette-oragne.png index 58df4459c24..15f35912646 100755 Binary files a/doc/development/ux_guide/img/illustrations-palette-oragne.png and b/doc/development/ux_guide/img/illustrations-palette-oragne.png differ diff --git a/doc/development/ux_guide/img/illustrations-palette-purple.png b/doc/development/ux_guide/img/illustrations-palette-purple.png index da5c1e245c9..e0f5839705e 100755 Binary files a/doc/development/ux_guide/img/illustrations-palette-purple.png and b/doc/development/ux_guide/img/illustrations-palette-purple.png differ -- cgit v1.2.1 From 05ddd46c8646a82647a525933c59cf80887e8e4a Mon Sep 17 00:00:00 2001 From: Hazel Date: Wed, 9 Aug 2017 14:29:38 +0800 Subject: Add size part to the guideline --- doc/development/ux_guide/illustrations.md | 31 ++++++++++++++++++++- .../img/illustration-size-large-horizontal.png | Bin 0 -> 55272 bytes .../img/illustration-size-large-vertical.png | Bin 0 -> 59217 bytes .../ux_guide/img/illustration-size-medium.png | Bin 0 -> 20994 bytes .../ux_guide/img/illustration-size-small.png | Bin 0 -> 43536 bytes 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100755 doc/development/ux_guide/img/illustration-size-large-horizontal.png create mode 100644 doc/development/ux_guide/img/illustration-size-large-vertical.png create mode 100755 doc/development/ux_guide/img/illustration-size-medium.png create mode 100644 doc/development/ux_guide/img/illustration-size-small.png diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index b9c98277120..818076900a6 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -31,13 +31,38 @@ The illustrations should always align with topics and goals in specific context. | -------- | -------- | | Do: caps and corner | Don't: caps and corner | - #### Radius - Standard corner radius: **10px** - Depending on the situation, corner radius can be changed to **5px**. For example, when the illustration size is small, an illustration with 10px corner radius would be over-rounded. In this case, the corner radius can be changed to 5px. Example for border radius +#### Size +Depends on the situation, the illustration size can be the 3 types below: + +**Large** +* Use case: Empty states, error pages(e.g. 404, 403) +* For vertical layout, the illustration should not larger than **430*300 px**. +* For horizontal layout, the illustration should not larger than **430*380 px** + +| Vertocal layout | Horizontal layout | +| --------------- | ----------------- | +| | + +**Medium** +* Use case: Banner +* The illustration should not larger than **240*160 px** +* The illustration should keep simple and clear. We recommend not including too many elements in the medium size illustration. + + + +**Small** +* Use case: Graphics for explanatory text, graphics for status +* The illustration should not larger than **160*90 px** +* The illustration should keep simple and clear. We recommend not including too many elements in the small size illustration. + + + #### Colors palette For consistency, we recommend choosing colors from our color palette. @@ -47,6 +72,10 @@ For consistency, we recommend choosing colors from our color palette. | Orange | Purple | Grey | | #FC6D26 | #6B4FBB | #EEEEEE | +#### Don't +- Don't include the typography in the illustration. +- Don't include tanuki in the illustration. If necessary, we recommend having tanuki monochromatic. + --- | Orange | Purple | diff --git a/doc/development/ux_guide/img/illustration-size-large-horizontal.png b/doc/development/ux_guide/img/illustration-size-large-horizontal.png new file mode 100755 index 00000000000..8aa835adccc Binary files /dev/null and b/doc/development/ux_guide/img/illustration-size-large-horizontal.png differ diff --git a/doc/development/ux_guide/img/illustration-size-large-vertical.png b/doc/development/ux_guide/img/illustration-size-large-vertical.png new file mode 100644 index 00000000000..813b6a065e5 Binary files /dev/null and b/doc/development/ux_guide/img/illustration-size-large-vertical.png differ diff --git a/doc/development/ux_guide/img/illustration-size-medium.png b/doc/development/ux_guide/img/illustration-size-medium.png new file mode 100755 index 00000000000..55cfe1dcb91 Binary files /dev/null and b/doc/development/ux_guide/img/illustration-size-medium.png differ diff --git a/doc/development/ux_guide/img/illustration-size-small.png b/doc/development/ux_guide/img/illustration-size-small.png new file mode 100644 index 00000000000..0124f58f48e Binary files /dev/null and b/doc/development/ux_guide/img/illustration-size-small.png differ -- cgit v1.2.1 From 8d84b7c439f719ca772f6b645d704f2568ac8652 Mon Sep 17 00:00:00 2001 From: Hazel Date: Wed, 16 Aug 2017 12:49:45 +0800 Subject: Add the situation of illustration on mobile --- doc/development/ux_guide/illustrations.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index 818076900a6..65497e50d8a 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -63,6 +63,9 @@ Depends on the situation, the illustration size can be the 3 types below: +**Illustration on mobile** +- Keep the proportions in original ratio. + #### Colors palette For consistency, we recommend choosing colors from our color palette. -- cgit v1.2.1 From dc3450d311890dd3284528d3ce25bd9c5375bed2 Mon Sep 17 00:00:00 2001 From: Hazel Date: Mon, 21 Aug 2017 14:19:26 +0800 Subject: Fix typo errors --- doc/development/ux_guide/illustrations.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/development/ux_guide/illustrations.md b/doc/development/ux_guide/illustrations.md index 65497e50d8a..7e16c300921 100644 --- a/doc/development/ux_guide/illustrations.md +++ b/doc/development/ux_guide/illustrations.md @@ -43,9 +43,9 @@ Depends on the situation, the illustration size can be the 3 types below: **Large** * Use case: Empty states, error pages(e.g. 404, 403) * For vertical layout, the illustration should not larger than **430*300 px**. -* For horizontal layout, the illustration should not larger than **430*380 px** +* For horizontal layout, the illustration should not larger than **430*380 px**. -| Vertocal layout | Horizontal layout | +| Vertical layout | Horizontal layout | | --------------- | ----------------- | | | @@ -57,8 +57,8 @@ Depends on the situation, the illustration size can be the 3 types below: **Small** -* Use case: Graphics for explanatory text, graphics for status -* The illustration should not larger than **160*90 px** +* Use case: Graphics for explanatory text, graphics for status. +* The illustration should not larger than **160*90 px**. * The illustration should keep simple and clear. We recommend not including too many elements in the small size illustration. -- cgit v1.2.1 From 711bb2856884161c5026964292c87984ba78b05c Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 23 Aug 2017 13:23:41 +0200 Subject: Add Page-Title header to tree and blob JSON endpoints --- app/controllers/application_controller.rb | 6 ++++++ app/controllers/projects/blob_controller.rb | 2 ++ app/controllers/projects/tree_controller.rb | 2 ++ app/helpers/page_layout_helper.rb | 2 +- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 97922e39ba8..02c46e551f6 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -25,6 +25,8 @@ class ApplicationController < ActionController::Base around_action :set_locale + after_action :set_page_title_header, if: -> { request.format == :json } + protect_from_forgery with: :exception helper_method :can?, :current_application_settings @@ -335,4 +337,8 @@ class ApplicationController < ActionController::Base sign_in user, store: false end end + + def set_page_title_header + response.headers['Page-Title'] = page_title('GitLab') + end end diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 2b8f3977e6e..183a6f88a6a 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -41,6 +41,8 @@ class Projects::BlobController < Projects::ApplicationController end format.json do + page_title @blob.path, @ref, @project.name_with_namespace + show_json end end diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb index f3784f4e07c..f3719059f88 100644 --- a/app/controllers/projects/tree_controller.rb +++ b/app/controllers/projects/tree_controller.rb @@ -35,6 +35,8 @@ class Projects::TreeController < Projects::ApplicationController end format.json do + page_title @path.presence || _("Files"), @ref, @project.name_with_namespace + # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/38261 Gitlab::GitalyClient.allow_n_plus_1_calls do render json: TreeSerializer.new(project: @project, repository: @repository, ref: @ref).represent(@tree) diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb index 5946c475835..18b9bf214a3 100644 --- a/app/helpers/page_layout_helper.rb +++ b/app/helpers/page_layout_helper.rb @@ -9,7 +9,7 @@ module PageLayoutHelper end # Segments are seperated by middot - @page_title.join(" \u00b7 ") + @page_title.join(" · ") end # Define or get a description for the current page -- cgit v1.2.1 From e44127990413af5d254e69ff94d00625104d0393 Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Tue, 26 Sep 2017 15:52:28 +0200 Subject: Added Page Title setting for files + directories --- app/assets/javascripts/repo/helpers/repo_helper.js | 8 +++++--- app/assets/javascripts/repo/stores/repo_store.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/repo/helpers/repo_helper.js b/app/assets/javascripts/repo/helpers/repo_helper.js index 655e4e7605b..3603a66c6cd 100644 --- a/app/assets/javascripts/repo/helpers/repo_helper.js +++ b/app/assets/javascripts/repo/helpers/repo_helper.js @@ -58,13 +58,13 @@ const RepoHelper = { return langs.find(lang => lang.extensions && lang.extensions.indexOf(`.${ext}`) > -1); }, - setDirectoryOpen(tree) { + setDirectoryOpen(tree, title) { const file = tree; if (!file) return undefined; file.opened = true; file.icon = 'fa-folder-open'; - RepoHelper.updateHistoryEntry(file.url, file.name); + RepoHelper.updateHistoryEntry(file.url, title); return file; }, @@ -135,6 +135,8 @@ const RepoHelper = { return Service.getContent() .then((response) => { const data = response.data; + if (response.headers && response.headers['page-title']) data.pageTitle = response.headers['page-title']; + Store.isTree = RepoHelper.isTree(data); if (!Store.isTree) { if (!file) file = data; @@ -168,7 +170,7 @@ const RepoHelper = { } else { // it's a tree if (!file) Store.isRoot = RepoHelper.isRoot(Service.url); - file = RepoHelper.setDirectoryOpen(file); + file = RepoHelper.setDirectoryOpen(file, data.pageTitle || data.name); const newDirectory = RepoHelper.dataToListOfFiles(data); Store.addFilesToDirectory(file, Store.files, newDirectory); Store.prevURL = Service.blobURLtoParentTree(Service.url); diff --git a/app/assets/javascripts/repo/stores/repo_store.js b/app/assets/javascripts/repo/stores/repo_store.js index 1c0df528aea..b7cf39f0798 100644 --- a/app/assets/javascripts/repo/stores/repo_store.js +++ b/app/assets/javascripts/repo/stores/repo_store.js @@ -84,7 +84,7 @@ const RepoStore = { }).catch(Helper.loadingError); } - if (!file.loading) Helper.updateHistoryEntry(file.url, file.name); + if (!file.loading) Helper.updateHistoryEntry(file.url, file.pageTitle || file.name); RepoStore.binary = file.binary; }, -- cgit v1.2.1 From 5adae3d85b11dcaaab0b16e198051c9c2a9885cd Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 26 Sep 2017 18:05:19 +0200 Subject: Encode Page-Title header as ISO-8859-1 --- app/controllers/application_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 02c46e551f6..771c6f3034a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -339,6 +339,7 @@ class ApplicationController < ActionController::Base end def set_page_title_header - response.headers['Page-Title'] = page_title('GitLab') + # Per https://tools.ietf.org/html/rfc5987, headers need to be ISO-8859-1, not UTF-8 + response.headers['Page-Title'] = page_title('GitLab').encode('ISO-8859-1') end end -- cgit v1.2.1 From ec9003b2658f86134dea44b9d1f1d74866e87434 Mon Sep 17 00:00:00 2001 From: tauriedavis Date: Tue, 26 Sep 2017 15:22:13 -0700 Subject: Add illustration link to ux index page --- doc/development/ux_guide/index.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/development/ux_guide/index.md b/doc/development/ux_guide/index.md index 8a849f239dc..42bcf234e12 100644 --- a/doc/development/ux_guide/index.md +++ b/doc/development/ux_guide/index.md @@ -21,6 +21,11 @@ Guidance on the timing, curving and motion for GitLab. --- +### [Illustrations](illustrations.md) +Guidelines for principals and styles related to illustrations for GitLab. + +--- + ### [Copy](copy.md) Conventions on text and messaging within labels, buttons, and other components. -- cgit v1.2.1 From 3fba557d5c310e1fc4e6866a6a342c40331b3ad2 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Wed, 27 Sep 2017 09:52:03 +0100 Subject: Add static analysis job to find invalid YAML in changelogs When a changelog has invalid YAML (typically, there is an unquoted @ at the start of the author field), then the entry will be discarded. This script checks all unreleased changelogs for validity, and runs as part of the static-analysis step, so the pipeline will fail if this happens in future. --- changelogs/unreleased/lint-changelog-yaml.yml | 5 +++++ scripts/lint-changelog-yaml | 19 +++++++++++++++++++ scripts/static-analysis | 3 ++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/lint-changelog-yaml.yml create mode 100755 scripts/lint-changelog-yaml diff --git a/changelogs/unreleased/lint-changelog-yaml.yml b/changelogs/unreleased/lint-changelog-yaml.yml new file mode 100644 index 00000000000..dcc8bf54827 --- /dev/null +++ b/changelogs/unreleased/lint-changelog-yaml.yml @@ -0,0 +1,5 @@ +--- +title: Detect when changelog entries are invalid +merge_request: +author: +type: other diff --git a/scripts/lint-changelog-yaml b/scripts/lint-changelog-yaml new file mode 100755 index 00000000000..402a0c42bd3 --- /dev/null +++ b/scripts/lint-changelog-yaml @@ -0,0 +1,19 @@ +#!/usr/bin/env ruby + +require 'yaml' + +invalid_changelogs = Dir['changelogs/**/*.yml'].reject do |changelog| + begin + YAML.load_file(changelog) + rescue + end +end + +if invalid_changelogs.any? + puts "Changelogs with invalid YAML found!\n" + puts invalid_changelogs.sort + exit 1 +else + puts "All changelogs are valid YAML.\n" + exit 0 +end diff --git a/scripts/static-analysis b/scripts/static-analysis index 295b6f132c1..aeefb2bc96f 100755 --- a/scripts/static-analysis +++ b/scripts/static-analysis @@ -13,7 +13,8 @@ tasks = [ %w[yarn run eslint], %w[bundle exec rubocop --require rubocop-rspec], %w[scripts/lint-conflicts.sh], - %w[bundle exec rake gettext:lint] + %w[bundle exec rake gettext:lint], + %w[scripts/lint-changelog-yaml] ] failed_tasks = tasks.reduce({}) do |failures, task| -- cgit v1.2.1 From 2d64c8211ab82a0fd60907cd3046b6ae72e616d0 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Wed, 27 Sep 2017 09:59:25 +0100 Subject: Manually add CHANGELOG entry for !13325 This was discarded from the initial compilation because it had invalid YAML. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c671f8d53a..9f3bc4a1212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,8 @@ entry. - [FIXED] Fixed merge request changes bar jumping. - [FIXED] Improve migrations using triggers. - [FIXED] Fix ConvDev Index nav item and Monitoring submenu regression. +- [FIXED] disabling notifications globally now properly turns off group/project added + emails !13325 - [DEPRECATED] Deprecate custom SSH client configuration for the git user. !13930 - [CHANGED] allow all users to delete their account. !13636 (Jacopo Beschi @jacopo-beschi) - [CHANGED] Use full path of project's avatar in webhooks. !13649 (Vitaliy @blackst0ne Klachkov) -- cgit v1.2.1 From f984d35f1cd9407f33a6be2d5be8d8ad4be790dd Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Wed, 27 Sep 2017 10:01:34 +0100 Subject: Fix invalid changelog entries --- changelogs/unreleased/13711-allow-same-period-housekeeping.yml | 2 +- .../unreleased/36953-add-gitLab-pages-version-to-admin-dashboard.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/changelogs/unreleased/13711-allow-same-period-housekeeping.yml b/changelogs/unreleased/13711-allow-same-period-housekeeping.yml index 6749e22cf6a..607a8683aff 100644 --- a/changelogs/unreleased/13711-allow-same-period-housekeeping.yml +++ b/changelogs/unreleased/13711-allow-same-period-housekeeping.yml @@ -2,5 +2,5 @@ title: Allow to use same periods for different housekeeping tasks (effectively skipping the lesser task) merge_request: 13711 -author: @cernvcs +author: cernvcs type: added diff --git a/changelogs/unreleased/36953-add-gitLab-pages-version-to-admin-dashboard.yml b/changelogs/unreleased/36953-add-gitLab-pages-version-to-admin-dashboard.yml index 680ef0cef92..9ac4a0ae7f3 100644 --- a/changelogs/unreleased/36953-add-gitLab-pages-version-to-admin-dashboard.yml +++ b/changelogs/unreleased/36953-add-gitLab-pages-version-to-admin-dashboard.yml @@ -1,5 +1,5 @@ --- title: Add GitLab-Pages version to Admin Dashboard merge_request: 14040 -author: @travismiller +author: travismiller type: added -- cgit v1.2.1 From 05844d8b471b98c6b3251006aebfc78b97d88ac6 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 27 Sep 2017 16:22:12 +0100 Subject: Fixed breadcrumb title not linking This fixes the breadcrumb titles not having links. This was a regression in the updated breadcrumbs introduced in 10.0. This introduces the link for all pages rather than selectively doing it. This will cover issues, merge requests, pipelines, jobs etc. Closes #38059 --- app/helpers/breadcrumbs_helper.rb | 6 +----- app/views/layouts/nav/_breadcrumbs.html.haml | 2 +- changelogs/unreleased/breadcrumb-item-links.yml | 5 +++++ spec/features/issues_spec.rb | 8 ++++++++ 4 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 changelogs/unreleased/breadcrumb-item-links.yml diff --git a/app/helpers/breadcrumbs_helper.rb b/app/helpers/breadcrumbs_helper.rb index ee1b7ed083e..87d2a47f6cb 100644 --- a/app/helpers/breadcrumbs_helper.rb +++ b/app/helpers/breadcrumbs_helper.rb @@ -10,11 +10,7 @@ module BreadcrumbsHelper def breadcrumb_title_link return @breadcrumb_link if @breadcrumb_link - if controller.available_action?(:index) - url_for(action: "index") - else - request.path - end + request.path end def breadcrumb_title(title) diff --git a/app/views/layouts/nav/_breadcrumbs.html.haml b/app/views/layouts/nav/_breadcrumbs.html.haml index 7bd3f5306a2..002922e13f1 100644 --- a/app/views/layouts/nav/_breadcrumbs.html.haml +++ b/app/views/layouts/nav/_breadcrumbs.html.haml @@ -16,5 +16,5 @@ = breadcrumb_list_item link_to(extra[:text], extra[:link]) = render "layouts/nav/breadcrumbs/collapsed_dropdown", location: :after %li - %h2.breadcrumbs-sub-title= @breadcrumb_title + %h2.breadcrumbs-sub-title= link_to @breadcrumb_title, breadcrumb_title_link = yield :header_content diff --git a/changelogs/unreleased/breadcrumb-item-links.yml b/changelogs/unreleased/breadcrumb-item-links.yml new file mode 100644 index 00000000000..9b66456efca --- /dev/null +++ b/changelogs/unreleased/breadcrumb-item-links.yml @@ -0,0 +1,5 @@ +--- +title: Fixed issue/merge request breadcrumb titles not having links +merge_request: +author: +type: fixed diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb index fb763c93c66..b4222edbcd0 100644 --- a/spec/features/issues_spec.rb +++ b/spec/features/issues_spec.rb @@ -131,6 +131,14 @@ describe 'Issues' do end describe 'Issue info' do + it 'links to current issue in breadcrubs' do + issue = create(:issue, project: project) + + visit project_issue_path(project, issue) + + expect(find('.breadcrumbs-sub-title a')[:href]).to end_with(issue_path(issue)) + end + it 'excludes award_emoji from comment count' do issue = create(:issue, author: user, assignees: [user], project: project, title: 'foobar') create(:award_emoji, awardable: issue) -- cgit v1.2.1 From d0737b18856170d054c9235cd285d3eb5e45056b Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 28 Sep 2017 09:30:33 +0100 Subject: spec fixes --- spec/features/projects/wiki/user_updates_wiki_page_spec.rb | 2 +- spec/features/projects/wiki/user_views_wiki_page_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/features/projects/wiki/user_updates_wiki_page_spec.rb b/spec/features/projects/wiki/user_updates_wiki_page_spec.rb index 1cf14204159..949d90a50ff 100644 --- a/spec/features/projects/wiki/user_updates_wiki_page_spec.rb +++ b/spec/features/projects/wiki/user_updates_wiki_page_spec.rb @@ -40,7 +40,7 @@ describe 'User updates wiki page' do expect(current_path).to include('one/two/three-test') expect(find('.wiki-pages')).to have_content('Three') - click_on('Three') + first(:link, text: 'Three').click expect(find('.nav-text')).to have_content('Three') diff --git a/spec/features/projects/wiki/user_views_wiki_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_page_spec.rb index d201d4f6b98..49ba2969ef0 100644 --- a/spec/features/projects/wiki/user_views_wiki_page_spec.rb +++ b/spec/features/projects/wiki/user_views_wiki_page_spec.rb @@ -34,7 +34,7 @@ describe 'User views a wiki page' do it 'shows the history of a page that has a path', :js do expect(current_path).to include('one/two/three-test') - click_on('Three') + first(:link, text: 'Three').click click_on('Page history') expect(current_path).to include('one/two/three-test') @@ -48,7 +48,7 @@ describe 'User views a wiki page' do expect(current_path).to include('one/two/three-test') expect(find('.wiki-pages')).to have_content('Three') - click_on('Three') + first(:link, text: 'Three').click expect(find('.nav-text')).to have_content('Three') -- cgit v1.2.1 From abcfdd5c17020abbcb3f39eaa976cb49a0917a2a Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Thu, 28 Sep 2017 12:09:08 +0200 Subject: Add index for merge_requests.merge_commit_sha This is a composite index on (target_project_id, merge_commit_sha, id) that allows queries such as the following to use a full backwards index scan: SELECT "merge_requests".* FROM "merge_requests" WHERE "merge_requests"."deleted_at" IS NULL AND "merge_requests"."target_project_id" = 13083 AND "merge_requests"."merge_commit_sha" = 'e80a893ff0ea8466099f6478183631af55933db2' ORDER BY "merge_requests"."id" DESC LIMIT 1; Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/38507 --- ...te-index-on-merge-requests-merge-commit-sha.yml | 5 ++++ ...ite_index_on_merge_requests_merge_commit_sha.rb | 33 ++++++++++++++++++++++ db/schema.rb | 3 +- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/add-composite-index-on-merge-requests-merge-commit-sha.yml create mode 100644 db/migrate/20170928100231_add_composite_index_on_merge_requests_merge_commit_sha.rb diff --git a/changelogs/unreleased/add-composite-index-on-merge-requests-merge-commit-sha.yml b/changelogs/unreleased/add-composite-index-on-merge-requests-merge-commit-sha.yml new file mode 100644 index 00000000000..9a600282716 --- /dev/null +++ b/changelogs/unreleased/add-composite-index-on-merge-requests-merge-commit-sha.yml @@ -0,0 +1,5 @@ +--- +title: Add index for merge_requests.merge_commit_sha +merge_request: +author: +type: other diff --git a/db/migrate/20170928100231_add_composite_index_on_merge_requests_merge_commit_sha.rb b/db/migrate/20170928100231_add_composite_index_on_merge_requests_merge_commit_sha.rb new file mode 100644 index 00000000000..9f02daf04c1 --- /dev/null +++ b/db/migrate/20170928100231_add_composite_index_on_merge_requests_merge_commit_sha.rb @@ -0,0 +1,33 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddCompositeIndexOnMergeRequestsMergeCommitSha < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + # The default index name is too long for PostgreSQL and would thus be + # truncated. + INDEX_NAME = 'index_merge_requests_on_tp_id_and_merge_commit_sha_and_id' + + COLUMNS = [:target_project_id, :merge_commit_sha, :id] + + disable_ddl_transaction! + + def up + return if index_is_present? + + add_concurrent_index(:merge_requests, COLUMNS, name: INDEX_NAME) + end + + def down + return unless index_is_present? + + remove_concurrent_index(:merge_requests, COLUMNS, name: INDEX_NAME) + end + + def index_is_present? + index_exists?(:merge_requests, COLUMNS, name: INDEX_NAME) + end +end diff --git a/db/schema.rb b/db/schema.rb index 330336e8e61..e6200cfccd6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170921115009) do +ActiveRecord::Schema.define(version: 20170928100231) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -895,6 +895,7 @@ ActiveRecord::Schema.define(version: 20170921115009) do add_index "merge_requests", ["source_project_id", "source_branch"], name: "index_merge_requests_on_source_project_id_and_source_branch", using: :btree add_index "merge_requests", ["target_branch"], name: "index_merge_requests_on_target_branch", using: :btree add_index "merge_requests", ["target_project_id", "iid"], name: "index_merge_requests_on_target_project_id_and_iid", unique: true, using: :btree + add_index "merge_requests", ["target_project_id", "merge_commit_sha", "id"], name: "index_merge_requests_on_tp_id_and_merge_commit_sha_and_id", using: :btree add_index "merge_requests", ["title"], name: "index_merge_requests_on_title", using: :btree add_index "merge_requests", ["title"], name: "index_merge_requests_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"} -- cgit v1.2.1 From 9cd87f6fa9be629018f11420ed7e70d9ac4e5804 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Thu, 14 Sep 2017 15:29:26 +0100 Subject: Add lazy_load option to participant avatar helper --- app/helpers/projects_helper.rb | 7 +++++-- app/views/shared/issuable/_participants.html.haml | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 21fb17e06d6..4c0cce54527 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -21,11 +21,14 @@ module ProjectsHelper classes = %W[avatar avatar-inline s#{opts[:size]}] classes << opts[:avatar_class] if opts[:avatar_class] - image_tag(avatar_icon(author, opts[:size]), width: opts[:size], class: classes, alt: '') + avatar = avatar_icon(author, opts[:size]) + src = opts[:lazy_load] ? nil : avatar + + image_tag(src, width: opts[:size], class: classes, alt: '', "data-src" => avatar) end def link_to_member(project, author, opts = {}, &block) - default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name", tooltip: false } + default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name", tooltip: false, lazy_load: false } opts = default_opts.merge(opts) return "(deleted)" unless author diff --git a/app/views/shared/issuable/_participants.html.haml b/app/views/shared/issuable/_participants.html.haml index 8a71819aa8e..d2b62557e03 100644 --- a/app/views/shared/issuable/_participants.html.haml +++ b/app/views/shared/issuable/_participants.html.haml @@ -11,7 +11,7 @@ .hide-collapsed.participants-list - participants.each do |participant| .participants-author.js-participants-author - = link_to_member(@project, participant, name: false, size: 24) + = link_to_member(@project, participant, name: false, size: 24, lazy_load: true) - if participants_extra > 0 .hide-collapsed.participants-more %a.js-participants-more{ href: "#", data: { original_text: "+ #{participants_size - 7} more", less_text: "- show less" } } -- cgit v1.2.1 From 94749a45b792c18c6dbf4a59e30c145d1aa825d9 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Thu, 14 Sep 2017 15:30:00 +0100 Subject: Trigger load of lazy images when opening sidebar, or clicking 'more participants' --- app/assets/javascripts/issuable_context.js | 5 ++++- app/assets/javascripts/right_sidebar.js | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/issuable_context.js b/app/assets/javascripts/issuable_context.js index 70c364e51fe..0a8bab6ee66 100644 --- a/app/assets/javascripts/issuable_context.js +++ b/app/assets/javascripts/issuable_context.js @@ -70,7 +70,10 @@ const PARTICIPANTS_ROW_COUNT = 7; } else { $(this).text(originalText); } - return $(".js-participants-hidden").toggle(); + + $(".js-participants-hidden").toggle(); + + gl.lazyLoader.loadCheck(); }; return IssuableContext; diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js index a4eae135403..c06b8b6efe6 100644 --- a/app/assets/javascripts/right_sidebar.js +++ b/app/assets/javascripts/right_sidebar.js @@ -45,8 +45,10 @@ import Cookies from 'js-cookie'; $('.page-with-sidebar').removeClass('right-sidebar-collapsed').addClass('right-sidebar-expanded'); } if (!triggered) { - return Cookies.set("collapsed_gutter", $('.right-sidebar').hasClass('right-sidebar-collapsed')); + Cookies.set("collapsed_gutter", $('.right-sidebar').hasClass('right-sidebar-collapsed')); } + console.log('loadCheck') + gl.lazyLoader.loadCheck(); }); return $(document).off('click', '.js-issuable-todo').on('click', '.js-issuable-todo', this.toggleTodo); }; -- cgit v1.2.1 From ae36ee6a149e532d594ef89195e8aebd257e0c66 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Mon, 18 Sep 2017 12:36:27 +0100 Subject: Conditionally call loadCheck if lazyLoader is present --- app/assets/javascripts/issuable_context.js | 2 +- app/assets/javascripts/right_sidebar.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/issuable_context.js b/app/assets/javascripts/issuable_context.js index 0a8bab6ee66..9a9382a8d54 100644 --- a/app/assets/javascripts/issuable_context.js +++ b/app/assets/javascripts/issuable_context.js @@ -73,7 +73,7 @@ const PARTICIPANTS_ROW_COUNT = 7; $(".js-participants-hidden").toggle(); - gl.lazyLoader.loadCheck(); + if (gl.lazyLoader) gl.lazyLoader.loadCheck(); }; return IssuableContext; diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js index c06b8b6efe6..7a987fe336b 100644 --- a/app/assets/javascripts/right_sidebar.js +++ b/app/assets/javascripts/right_sidebar.js @@ -47,8 +47,7 @@ import Cookies from 'js-cookie'; if (!triggered) { Cookies.set("collapsed_gutter", $('.right-sidebar').hasClass('right-sidebar-collapsed')); } - console.log('loadCheck') - gl.lazyLoader.loadCheck(); + if (gl.lazyLoader) gl.lazyLoader.loadCheck(); }); return $(document).off('click', '.js-issuable-todo').on('click', '.js-issuable-todo', this.toggleTodo); }; -- cgit v1.2.1 From 0269e8c5ef8966b84399376ae57567072f594070 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Tue, 19 Sep 2017 11:25:13 +0100 Subject: Add participants spec --- .../shared/issuable/_participants.html.haml.rb | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 spec/views/shared/issuable/_participants.html.haml.rb diff --git a/spec/views/shared/issuable/_participants.html.haml.rb b/spec/views/shared/issuable/_participants.html.haml.rb new file mode 100644 index 00000000000..6bc95846f63 --- /dev/null +++ b/spec/views/shared/issuable/_participants.html.haml.rb @@ -0,0 +1,41 @@ +require 'spec_helper' +require 'nokogiri' + +def expect_lazy_load_image(author) + avatar = author.find('img') + + expect(avatar[:src]).to eql?('data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==') + expect(avatar[:"data-src"]).to exist +end + +describe 'shared/issuable/_participants.html.haml' do + let(:project) { create(:project) } + let(:participants) { create_list(:user, 10) } + + before do + allow(view).to receive_messages(project: project, + participants: participants) + end + + it 'displays' do + render 'shared/issuable/participants' + + html = Nokogiri::HTML(rendered) + + authors = html.css('.participants-author') + p authors + p authors.size + visible_authors = authors[0..6] + hidden_authors = authors[7..-1] + + visible_authors.each do |author| + expect(author).not_to have_selector('js-participants-hidden') + expect_lazy_load_image(author) + end + + hidden_authors.each do |author| + expect(author).to have_selector('js-participants-hidden') + expect_lazy_load_image(author) + end + end +end -- cgit v1.2.1 From 38c7229156aae6d5635a1a1ac5851563d2a8989d Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Wed, 20 Sep 2017 17:18:10 +0100 Subject: Update projects_helper_spec --- spec/helpers/projects_helper_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index 7ded95d01af..641971485de 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -200,13 +200,13 @@ describe ProjectsHelper do end it 'returns image tag for member avatar' do - expect(helper).to receive(:image_tag).with(expected, { width: 16, class: ["avatar", "avatar-inline", "s16"], alt: "" }) + expect(helper).to receive(:image_tag).with(expected, { width: 16, class: ["avatar", "avatar-inline", "s16"], alt: "", "data-src" => anything }) helper.link_to_member_avatar(user) end it 'returns image tag with avatar class' do - expect(helper).to receive(:image_tag).with(expected, { width: 16, class: ["avatar", "avatar-inline", "s16", "any-avatar-class"], alt: "" }) + expect(helper).to receive(:image_tag).with(expected, { width: 16, class: ["avatar", "avatar-inline", "s16", "any-avatar-class"], alt: "", "data-src" => anything }) helper.link_to_member_avatar(user, avatar_class: "any-avatar-class") end -- cgit v1.2.1 From 5629d468782d1c414d33c8221467c06b13cb9b66 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Wed, 20 Sep 2017 17:18:23 +0100 Subject: Finish _participants view spec --- .../shared/issuable/_participants.html.haml.rb | 29 ++++++---------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/spec/views/shared/issuable/_participants.html.haml.rb b/spec/views/shared/issuable/_participants.html.haml.rb index 6bc95846f63..0a123e83e2e 100644 --- a/spec/views/shared/issuable/_participants.html.haml.rb +++ b/spec/views/shared/issuable/_participants.html.haml.rb @@ -1,41 +1,26 @@ require 'spec_helper' require 'nokogiri' -def expect_lazy_load_image(author) - avatar = author.find('img') - - expect(avatar[:src]).to eql?('data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==') - expect(avatar[:"data-src"]).to exist -end - describe 'shared/issuable/_participants.html.haml' do let(:project) { create(:project) } - let(:participants) { create_list(:user, 10) } + let(:participants) { create_list(:user, 100) } before do allow(view).to receive_messages(project: project, participants: participants) end - it 'displays' do + it 'renders lazy loaded avatars' do render 'shared/issuable/participants' html = Nokogiri::HTML(rendered) - authors = html.css('.participants-author') - p authors - p authors.size - visible_authors = authors[0..6] - hidden_authors = authors[7..-1] - - visible_authors.each do |author| - expect(author).not_to have_selector('js-participants-hidden') - expect_lazy_load_image(author) - end + avatars = html.css('.participants-author img') - hidden_authors.each do |author| - expect(author).to have_selector('js-participants-hidden') - expect_lazy_load_image(author) + avatars.each do |avatar| + expect(avatar[:class]).to include('lazy') + expect(avatar[:src]).to eql('data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==') + expect(avatar[:"data-src"]).to match('http://www.gravatar.com/avatar/') end end end -- cgit v1.2.1 From 06903810807db76505ab13b8c8de8e2fd1b16968 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Fri, 22 Sep 2017 09:11:40 +0100 Subject: Add issauble_context_spec --- spec/javascripts/issuable_context_spec.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 spec/javascripts/issuable_context_spec.js diff --git a/spec/javascripts/issuable_context_spec.js b/spec/javascripts/issuable_context_spec.js new file mode 100644 index 00000000000..469a7e0633f --- /dev/null +++ b/spec/javascripts/issuable_context_spec.js @@ -0,0 +1,31 @@ +import '~/issuable_context'; + +fdescribe('IssuableContext', () => { + describe('toggleHiddenParticipants', () => { + beforeEach(() => { + + }); + + fit('calls loadCheck if lazyLoader is set', () => { + gl.lazyLoader = jasmine.createSpyObj('lazyLoader', ['loadCheck']); + const event = {}; + + IssuableContext.prototype.toggleHiddenParticipants(event); + + expect(gl.lazyLoader.loadCheck).toHaveBeenCalled(); + }); + + it('does not call loadCheck if lazyLoader is not set', () => { + gl.lazyLoader = undefined; + const event = {}; + + IssuableContext.prototype.toggleHiddenParticipants(event); + + expect(gl.lazyLoader.loadCheck).not.toHaveBeenCalled(); + }); + + afterEach(() => { + gl.lazyLoader = undefined; + }); + }); +}); -- cgit v1.2.1 From baa08b56570643c04fa82958509e41ccbe87219f Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Mon, 25 Sep 2017 11:48:16 +0100 Subject: Finish issuable_context_spec --- spec/javascripts/issuable_context_spec.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/spec/javascripts/issuable_context_spec.js b/spec/javascripts/issuable_context_spec.js index 469a7e0633f..d913ba53d45 100644 --- a/spec/javascripts/issuable_context_spec.js +++ b/spec/javascripts/issuable_context_spec.js @@ -1,27 +1,24 @@ +/* global IssuableContext */ import '~/issuable_context'; -fdescribe('IssuableContext', () => { +describe('IssuableContext', () => { describe('toggleHiddenParticipants', () => { - beforeEach(() => { + const event = jasmine.createSpyObj('event', ['preventDefault']); - }); - - fit('calls loadCheck if lazyLoader is set', () => { + it('calls loadCheck if lazyLoader is set', () => { gl.lazyLoader = jasmine.createSpyObj('lazyLoader', ['loadCheck']); - const event = {}; IssuableContext.prototype.toggleHiddenParticipants(event); expect(gl.lazyLoader.loadCheck).toHaveBeenCalled(); }); - it('does not call loadCheck if lazyLoader is not set', () => { + it('does not throw if lazyLoader is not set', () => { gl.lazyLoader = undefined; - const event = {}; - IssuableContext.prototype.toggleHiddenParticipants(event); + const toggle = IssuableContext.prototype.toggleHiddenParticipants.bind(null, event); - expect(gl.lazyLoader.loadCheck).not.toHaveBeenCalled(); + expect(toggle).not.toThrow(); }); afterEach(() => { -- cgit v1.2.1 From 68269d7a40220343cc551fa05ab4def288ee4434 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Thu, 28 Sep 2017 13:12:38 +0100 Subject: issuable_context_spec review changes --- spec/javascripts/issuable_context_spec.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/javascripts/issuable_context_spec.js b/spec/javascripts/issuable_context_spec.js index d913ba53d45..d1e0eb64e58 100644 --- a/spec/javascripts/issuable_context_spec.js +++ b/spec/javascripts/issuable_context_spec.js @@ -5,6 +5,10 @@ describe('IssuableContext', () => { describe('toggleHiddenParticipants', () => { const event = jasmine.createSpyObj('event', ['preventDefault']); + afterEach(() => { + gl.lazyLoader = undefined; + }); + it('calls loadCheck if lazyLoader is set', () => { gl.lazyLoader = jasmine.createSpyObj('lazyLoader', ['loadCheck']); @@ -13,16 +17,12 @@ describe('IssuableContext', () => { expect(gl.lazyLoader.loadCheck).toHaveBeenCalled(); }); - it('does not throw if lazyLoader is not set', () => { + it('does not throw if lazyLoader is not defined', () => { gl.lazyLoader = undefined; const toggle = IssuableContext.prototype.toggleHiddenParticipants.bind(null, event); expect(toggle).not.toThrow(); }); - - afterEach(() => { - gl.lazyLoader = undefined; - }); }); }); -- cgit v1.2.1 From ba76ddf28140021c9d06b1389f215bc5fccf7cd2 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Thu, 28 Sep 2017 13:27:52 +0100 Subject: Only trigger loadCheck on open toggle, not close. Update specs and add right_sidebar_spec test for additions --- app/assets/javascripts/issuable_context.js | 4 +- app/assets/javascripts/right_sidebar.js | 43 ++++++----- spec/javascripts/issuable_context_spec.js | 6 ++ spec/javascripts/right_sidebar_spec.js | 116 ++++++++++++++++++----------- 4 files changed, 104 insertions(+), 65 deletions(-) diff --git a/app/assets/javascripts/issuable_context.js b/app/assets/javascripts/issuable_context.js index 9a9382a8d54..1d305f1eb2f 100644 --- a/app/assets/javascripts/issuable_context.js +++ b/app/assets/javascripts/issuable_context.js @@ -67,13 +67,13 @@ const PARTICIPANTS_ROW_COUNT = 7; originalText = $(this).data("original-text"); if (currentText === originalText) { $(this).text(lessText); + + if (gl.lazyLoader) gl.lazyLoader.loadCheck(); } else { $(this).text(originalText); } $(".js-participants-hidden").toggle(); - - if (gl.lazyLoader) gl.lazyLoader.loadCheck(); }; return IssuableContext; diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js index 7a987fe336b..a41548bd694 100644 --- a/app/assets/javascripts/right_sidebar.js +++ b/app/assets/javascripts/right_sidebar.js @@ -29,29 +29,32 @@ import Cookies from 'js-cookie'; $('.dropdown').on('loading.gl.dropdown', this.sidebarDropdownLoading); $('.dropdown').on('loaded.gl.dropdown', this.sidebarDropdownLoaded); - $document.on('click', '.js-sidebar-toggle', function(e, triggered) { - var $allGutterToggleIcons, $this, $thisIcon; - e.preventDefault(); - $this = $(this); - $thisIcon = $this.find('i'); - $allGutterToggleIcons = $('.js-sidebar-toggle i'); - if ($thisIcon.hasClass('fa-angle-double-right')) { - $allGutterToggleIcons.removeClass('fa-angle-double-right').addClass('fa-angle-double-left'); - $('aside.right-sidebar').removeClass('right-sidebar-expanded').addClass('right-sidebar-collapsed'); - $('.page-with-sidebar').removeClass('right-sidebar-expanded').addClass('right-sidebar-collapsed'); - } else { - $allGutterToggleIcons.removeClass('fa-angle-double-left').addClass('fa-angle-double-right'); - $('aside.right-sidebar').removeClass('right-sidebar-collapsed').addClass('right-sidebar-expanded'); - $('.page-with-sidebar').removeClass('right-sidebar-collapsed').addClass('right-sidebar-expanded'); - } - if (!triggered) { - Cookies.set("collapsed_gutter", $('.right-sidebar').hasClass('right-sidebar-collapsed')); - } - if (gl.lazyLoader) gl.lazyLoader.loadCheck(); - }); + $document.on('click', '.js-sidebar-toggle', this.sidebarToggleClicked); return $(document).off('click', '.js-issuable-todo').on('click', '.js-issuable-todo', this.toggleTodo); }; + Sidebar.prototype.sidebarToggleClicked = function (e, triggered) { + var $allGutterToggleIcons, $this, $thisIcon; + e.preventDefault(); + $this = $(this); + $thisIcon = $this.find('i'); + $allGutterToggleIcons = $('.js-sidebar-toggle i'); + if ($thisIcon.hasClass('fa-angle-double-right')) { + $allGutterToggleIcons.removeClass('fa-angle-double-right').addClass('fa-angle-double-left'); + $('aside.right-sidebar').removeClass('right-sidebar-expanded').addClass('right-sidebar-collapsed'); + $('.page-with-sidebar').removeClass('right-sidebar-expanded').addClass('right-sidebar-collapsed'); + } else { + $allGutterToggleIcons.removeClass('fa-angle-double-left').addClass('fa-angle-double-right'); + $('aside.right-sidebar').removeClass('right-sidebar-collapsed').addClass('right-sidebar-expanded'); + $('.page-with-sidebar').removeClass('right-sidebar-collapsed').addClass('right-sidebar-expanded'); + + if (gl.lazyLoader) gl.lazyLoader.loadCheck(); + } + if (!triggered) { + Cookies.set("collapsed_gutter", $('.right-sidebar').hasClass('right-sidebar-collapsed')); + } + }; + Sidebar.prototype.toggleTodo = function(e) { var $btnText, $this, $todoLoading, ajaxType, url; $this = $(e.currentTarget); diff --git a/spec/javascripts/issuable_context_spec.js b/spec/javascripts/issuable_context_spec.js index d1e0eb64e58..bcb2b7b24a0 100644 --- a/spec/javascripts/issuable_context_spec.js +++ b/spec/javascripts/issuable_context_spec.js @@ -1,10 +1,16 @@ /* global IssuableContext */ import '~/issuable_context'; +import $ from 'jquery'; describe('IssuableContext', () => { describe('toggleHiddenParticipants', () => { const event = jasmine.createSpyObj('event', ['preventDefault']); + beforeEach(() => { + spyOn($.fn, 'data').and.returnValue('data'); + spyOn($.fn, 'text').and.returnValue('data'); + }); + afterEach(() => { gl.lazyLoader = undefined; }); diff --git a/spec/javascripts/right_sidebar_spec.js b/spec/javascripts/right_sidebar_spec.js index f2072a6f350..5505f983d71 100644 --- a/spec/javascripts/right_sidebar_spec.js +++ b/spec/javascripts/right_sidebar_spec.js @@ -32,56 +32,86 @@ import '~/right_sidebar'; }; describe('RightSidebar', function() { - var fixtureName = 'issues/open-issue.html.raw'; - preloadFixtures(fixtureName); - loadJSONFixtures('todos/todos.json'); - - beforeEach(function() { - loadFixtures(fixtureName); - this.sidebar = new Sidebar; - $aside = $('.right-sidebar'); - $page = $('.page-with-sidebar'); - $icon = $aside.find('i'); - $toggle = $aside.find('.js-sidebar-toggle'); - return $labelsIcon = $aside.find('.sidebar-collapsed-icon'); - }); - it('should expand/collapse the sidebar when arrow is clicked', function() { - assertSidebarState('expanded'); - $toggle.click(); - assertSidebarState('collapsed'); - $toggle.click(); - assertSidebarState('expanded'); - }); - it('should float over the page and when sidebar icons clicked', function() { - $labelsIcon.click(); - return assertSidebarState('expanded'); - }); - it('should collapse when the icon arrow clicked while it is floating on page', function() { - $labelsIcon.click(); - assertSidebarState('expanded'); - $toggle.click(); - return assertSidebarState('collapsed'); + describe('fixture tests', () => { + var fixtureName = 'issues/open-issue.html.raw'; + preloadFixtures(fixtureName); + loadJSONFixtures('todos/todos.json'); + + beforeEach(function() { + loadFixtures(fixtureName); + this.sidebar = new Sidebar; + $aside = $('.right-sidebar'); + $page = $('.page-with-sidebar'); + $icon = $aside.find('i'); + $toggle = $aside.find('.js-sidebar-toggle'); + return $labelsIcon = $aside.find('.sidebar-collapsed-icon'); + }); + it('should expand/collapse the sidebar when arrow is clicked', function() { + assertSidebarState('expanded'); + $toggle.click(); + assertSidebarState('collapsed'); + $toggle.click(); + assertSidebarState('expanded'); + }); + it('should float over the page and when sidebar icons clicked', function() { + $labelsIcon.click(); + return assertSidebarState('expanded'); + }); + it('should collapse when the icon arrow clicked while it is floating on page', function() { + $labelsIcon.click(); + assertSidebarState('expanded'); + $toggle.click(); + return assertSidebarState('collapsed'); + }); + + it('should broadcast todo:toggle event when add todo clicked', function() { + var todos = getJSONFixture('todos/todos.json'); + spyOn(jQuery, 'ajax').and.callFake(function() { + var d = $.Deferred(); + var response = todos; + d.resolve(response); + return d.promise(); + }); + + var todoToggleSpy = spyOnEvent(document, 'todo:toggle'); + + $('.issuable-sidebar-header .js-issuable-todo').click(); + + expect(todoToggleSpy.calls.count()).toEqual(1); + }); + + it('should not hide collapsed icons', () => { + [].forEach.call(document.querySelectorAll('.sidebar-collapsed-icon'), (el) => { + expect(el.querySelector('.fa, svg').classList.contains('hidden')).toBeFalsy(); + }); + }); }); - it('should broadcast todo:toggle event when add todo clicked', function() { - var todos = getJSONFixture('todos/todos.json'); - spyOn(jQuery, 'ajax').and.callFake(function() { - var d = $.Deferred(); - var response = todos; - d.resolve(response); - return d.promise(); + describe('sidebarToggleClicked', () => { + const event = jasmine.createSpyObj('event', ['preventDefault']); + + beforeEach(() => { + spyOn($.fn, 'hasClass').and.returnValue(false); + }); + + afterEach(() => { + gl.lazyLoader = undefined; }); - var todoToggleSpy = spyOnEvent(document, 'todo:toggle'); + it('calls loadCheck if lazyLoader is set', () => { + gl.lazyLoader = jasmine.createSpyObj('lazyLoader', ['loadCheck']); - $('.issuable-sidebar-header .js-issuable-todo').click(); + Sidebar.prototype.sidebarToggleClicked(event); - expect(todoToggleSpy.calls.count()).toEqual(1); - }); + expect(gl.lazyLoader.loadCheck).toHaveBeenCalled(); + }); + + it('does not throw if lazyLoader is not defined', () => { + gl.lazyLoader = undefined; + + const toggle = Sidebar.prototype.sidebarToggleClicked.bind(null, event); - it('should not hide collapsed icons', () => { - [].forEach.call(document.querySelectorAll('.sidebar-collapsed-icon'), (el) => { - expect(el.querySelector('.fa, svg').classList.contains('hidden')).toBeFalsy(); + expect(toggle).not.toThrow(); }); }); }); -- cgit v1.2.1 From 92410a1401f8684ad5567fad085e4d389250b5f8 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Thu, 28 Sep 2017 13:34:28 +0100 Subject: Added changelog --- ...66-issue-sidebar-don-t-render-participants-in-collapsed-state.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelogs/unreleased/34366-issue-sidebar-don-t-render-participants-in-collapsed-state.yml diff --git a/changelogs/unreleased/34366-issue-sidebar-don-t-render-participants-in-collapsed-state.yml b/changelogs/unreleased/34366-issue-sidebar-don-t-render-participants-in-collapsed-state.yml new file mode 100644 index 00000000000..d34e685b5f5 --- /dev/null +++ b/changelogs/unreleased/34366-issue-sidebar-don-t-render-participants-in-collapsed-state.yml @@ -0,0 +1,5 @@ +--- +title: Load sidebar participants avatars only when visible +merge_request: 14270 +author: +type: other -- cgit v1.2.1 From 59f36b4cce4888903820a6d434463b397cfa386c Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Thu, 28 Sep 2017 15:43:52 +0200 Subject: Updated All Navigation Icons to Sprite_Icons --- app/assets/images/icons.json | 2 +- app/assets/images/icons.svg | 2 +- app/assets/images/sprite.symbol.html | 3297 -------------------- app/assets/stylesheets/framework/gitlab-theme.scss | 6 +- app/assets/stylesheets/framework/header.scss | 9 +- app/assets/stylesheets/framework/images.scss | 2 + app/assets/stylesheets/framework/new-nav.scss | 13 +- app/assets/stylesheets/framework/new-sidebar.scss | 40 +- app/assets/stylesheets/pages/search.scss | 10 +- app/helpers/breadcrumbs_helper.rb | 2 +- app/helpers/icons_helper.rb | 4 +- app/views/layouts/_search.html.haml | 4 +- app/views/layouts/header/_default.html.haml | 14 +- app/views/layouts/header/_new_dropdown.haml | 4 +- app/views/layouts/nav/_dashboard.html.haml | 6 +- .../nav/breadcrumbs/_collapsed_dropdown.html.haml | 2 +- app/views/layouts/nav/sidebar/_admin.html.haml | 3 +- app/views/layouts/nav/sidebar/_profile.html.haml | 2 +- app/views/shared/_sidebar_toggle_button.html.haml | 6 +- yarn.lock | 2 +- 20 files changed, 65 insertions(+), 3365 deletions(-) delete mode 100644 app/assets/images/sprite.symbol.html diff --git a/app/assets/images/icons.json b/app/assets/images/icons.json index e5da75faf38..6b8f85e37fd 100644 --- a/app/assets/images/icons.json +++ b/app/assets/images/icons.json @@ -1 +1 @@ -{"iconCount":134,"icons":["abuse","account","admin","angle-double-left","angle-down","angle-left","angle-right","angle-up","appearance","applications","approval","arrow-right","assignee","bold","book","branch","calendar","cancel","chevron-down","chevron-left","chevron-right","chevron-up","clock","code","comment-dots","comment-next","comment","comments","commit","credit-card","disk","doc_code","doc_image","doc_text","download","duplicate","earth","eye-slash","eye","file-additions","file-deletion","file-modified","filter","folder","fork","geo-nodes","git-merge","group","history","home","hook","issue-block","issue-child","issue-close","issue-duplicate","issue-new","issue-open-m","issue-open","issue-parent","issues","key-2","key","label","labels","leave","level-up","license","link","list-bulleted","list-numbered","location-dot","location","lock-open","lock","log","mail","merge-request-close-m","merge-request-close","messages","mobile-issue-close","monitor","more","notifications-off","notifications","overview","pencil","pipeline","play","plus-square-o","plus-square","plus","preferences","profile","project","push-rules","question-o","question","quote","redo","remove","repeat","retry","scale","screen-full","screen-normal","search","settings","shield","slight-frown","slight-smile","smile","smiley","snippet","spam","star-o","star","stop","talic","task-done","template","thump-down","thump-up","timer","todo-add","todo-done","token","unapproval","unassignee","unlink","user","users","volume-up","warning","work"]} \ No newline at end of file +{"iconCount":135,"spriteSize":58718,"icons":["abuse","account","admin","angle-double-left","angle-double-right","angle-down","angle-left","angle-right","angle-up","appearance","applications","approval","arrow-right","assignee","bold","book","branch","calendar","cancel","chevron-down","chevron-left","chevron-right","chevron-up","clock","close","code","comment-dots","comment-next","comment","comments","commit","credit-card","disk","doc_code","doc_image","doc_text","download","duplicate","earth","eye-slash","eye","file-additions","file-deletion","file-modified","filter","folder","fork","geo-nodes","git-merge","group","history","home","hook","issue-block","issue-child","issue-close","issue-duplicate","issue-new","issue-open-m","issue-open","issue-parent","issues","key-2","key","label","labels","leave","level-up","license","link","list-bulleted","list-numbered","location-dot","location","lock-open","lock","log","mail","merge-request-close","messages","mobile-issue-close","monitor","more","notifications-off","notifications","overview","pencil","pipeline","play","plus-square-o","plus-square","plus","preferences","profile","project","push-rules","question-o","question","quote","redo","remove","repeat","retry","scale","screen-full","screen-normal","search","settings","shield","slight-frown","slight-smile","smile","smiley","snippet","spam","star-o","star","stop","talic","task-done","template","thump-down","thump-up","timer","todo-add","todo-done","token","unapproval","unassignee","unlink","user","users","volume-up","warning","work"]} \ No newline at end of file diff --git a/app/assets/images/icons.svg b/app/assets/images/icons.svg index 5c3a9962bd3..30cb2109ec2 100644 --- a/app/assets/images/icons.svg +++ b/app/assets/images/icons.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/images/sprite.symbol.html b/app/assets/images/sprite.symbol.html deleted file mode 100644 index d928d3f73b8..00000000000 --- a/app/assets/images/sprite.symbol.html +++ /dev/null @@ -1,3297 +0,0 @@ - - - - - - - - SVG <symbol> sprite preview | svg-sprite - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

SVG <symbol> sprite preview

-

This preview features two methods of using the generated sprite in conjunction with inline SVG. Please have a look at the HTML source for further details and be aware of the following constraints:

-
    -
  • Your browser has to support inline SVG for these techniques to work.
  • -
  • The embedded sprite (A) slightly differs from the generated external one. Please see the documentation for details on how to create such an embeddable sprite.
  • -
  • Internet Explorer up to version 11 doesn't support external sprites for use with inline SVG. For IE 9-11, you may polyfill this functionality with SVG for Everybody.
  • -
-
-
- - - -

A) Inline SVG with embedded sprite

-
    - -
  • -
    - - - - - - -
    -

    abuse

    -
  • -
  • -
    - - - - -
    -

    account

    -
  • -
  • -
    - - - - - - -
    -

    admin

    -
  • -
  • -
    - - - - - - -
    -

    angle-double-left

    -
  • -
  • -
    - - - - - - -
    -

    angle-down

    -
  • -
  • -
    - - - - - - -
    -

    angle-left

    -
  • -
  • -
    - - - - - - -
    -

    angle-right

    -
  • -
  • -
    - - - - - - -
    -

    angle-up

    -
  • -
  • -
    - - - - - - -
    -

    appearance

    -
  • -
  • -
    - - - - - - -
    -

    applications

    -
  • -
  • -
    - - - - - - -
    -

    approval

    -
  • -
  • -
    - - - - - - -
    -

    arrow-right

    -
  • -
  • -
    - - - - - - -
    -

    assignee

    -
  • -
  • -
    - - - - - - -
    -

    bold

    -
  • -
  • -
    - - - - - - -
    -

    book

    -
  • -
  • -
    - - - - - - -
    -

    branch

    -
  • -
  • -
    - - - - - - -
    -

    calendar

    -
  • -
  • -
    - - - - - - -
    -

    cancel

    -
  • -
  • -
    - - - - - - -
    -

    chevron-down

    -
  • -
  • -
    - - - - - - -
    -

    chevron-left

    -
  • -
  • -
    - - - - - - -
    -

    chevron-right

    -
  • -
  • -
    - - - - - - -
    -

    chevron-up

    -
  • -
  • -
    - - - - - - -
    -

    clock

    -
  • -
  • -
    - - - - - - -
    -

    code

    -
  • -
  • -
    - - - - - - -
    -

    comment

    -
  • -
  • -
    - - - - - - -
    -

    comment-dots

    -
  • -
  • -
    - - - - - - -
    -

    comment-next

    -
  • -
  • -
    - - - - - - -
    -

    comments

    -
  • -
  • -
    - - - - - - -
    -

    commit

    -
  • -
  • -
    - - - - - - -
    -

    credit-card

    -
  • -
  • -
    - - - - - - -
    -

    disk

    -
  • -
  • -
    - - - - - - -
    -

    doc_code

    -
  • -
  • -
    - - - - - - -
    -

    doc_image

    -
  • -
  • -
    - - - - - - -
    -

    doc_text

    -
  • -
  • -
    - - - - - - -
    -

    download

    -
  • -
  • -
    - - - - - - -
    -

    duplicate

    -
  • -
  • -
    - - - - - - -
    -

    earth

    -
  • -
  • -
    - - - - - - -
    -

    eye

    -
  • -
  • -
    - - - - - - -
    -

    eye-slash

    -
  • -
  • -
    - - - - - - -
    -

    file-additions

    -
  • -
  • -
    - - - - - - -
    -

    file-deletion

    -
  • -
  • -
    - - - - - - -
    -

    file-modified

    -
  • -
  • -
    - - - - - - -
    -

    filter

    -
  • -
  • -
    - - - - - - -
    -

    folder

    -
  • -
  • -
    - - - - - - -
    -

    fork

    -
  • -
  • -
    - - - - - - -
    -

    git-merge

    -
  • -
  • -
    - - - - - - -
    -

    group

    -
  • -
  • -
    - - - - - - -
    -

    history

    -
  • -
  • -
    - - - - - - -
    -

    home

    -
  • -
  • -
    - - - - - - -
    -

    hook

    -
  • -
  • -
    - - - - - - -
    -

    issue-block

    -
  • -
  • -
    - - - - - - -
    -

    issue-child

    -
  • -
  • -
    - - - - - - -
    -

    issue-close

    -
  • -
  • -
    - - - - - - -
    -

    issue-duplicate

    -
  • -
  • -
    - - - - - - -
    -

    issue-new

    -
  • -
  • -
    - - - - - - -
    -

    issue-open

    -
  • -
  • -
    - - - - - - -
    -

    issue-open-m

    -
  • -
  • -
    - - - - - - -
    -

    issue-parent

    -
  • -
  • -
    - - - - - - -
    -

    issues

    -
  • -
  • -
    - - - - - - -
    -

    key

    -
  • -
  • -
    - - - - - - -
    -

    key-2

    -
  • -
  • -
    - - - - - - -
    -

    label

    -
  • -
  • -
    - - - - - - -
    -

    labels

    -
  • -
  • -
    - - - - - - -
    -

    leave

    -
  • -
  • -
    - - - - - - -
    -

    level-up

    -
  • -
  • -
    - - - - - - -
    -

    license

    -
  • -
  • -
    - - - - - - -
    -

    link

    -
  • -
  • -
    - - - - - - -
    -

    list-bulleted

    -
  • -
  • -
    - - - - - - -
    -

    list-numbered

    -
  • -
  • -
    - - - - - - -
    -

    location

    -
  • -
  • -
    - - - - - - -
    -

    location-dot

    -
  • -
  • -
    - - - - - - -
    -

    lock

    -
  • -
  • -
    - - - - - - -
    -

    lock-open

    -
  • -
  • -
    - - - - - - -
    -

    log

    -
  • -
  • -
    - - - - - - -
    -

    mail

    -
  • -
  • -
    - - - - - - -
    -

    merge-request-close

    -
  • -
  • -
    - - - - - - -
    -

    merge-request-close-m

    -
  • -
  • -
    - - - - - - -
    -

    messages

    -
  • -
  • -
    - - - - - - -
    -

    mobile-issue-close

    -
  • -
  • -
    - - - - - - -
    -

    monitor

    -
  • -
  • -
    - - - - - - -
    -

    more

    -
  • -
  • -
    - - - - - - -
    -

    notifications

    -
  • -
  • -
    - - - - - - -
    -

    notifications-off

    -
  • -
  • -
    - - - - - - -
    -

    overview

    -
  • -
  • -
    - - - - - - -
    -

    pencil

    -
  • -
  • -
    - - - - - - -
    -

    pipeline

    -
  • -
  • -
    - - - - - - -
    -

    play

    -
  • -
  • -
    - - - - - - -
    -

    plus

    -
  • -
  • -
    - - - - - - -
    -

    plus-square

    -
  • -
  • -
    - - - - - - -
    -

    plus-square-o

    -
  • -
  • -
    - - - - - - -
    -

    preferences

    -
  • -
  • -
    - - - - - - -
    -

    profile

    -
  • -
  • -
    - - - - - - -
    -

    project

    -
  • -
  • -
    - - - - - - -
    -

    push-rules

    -
  • -
  • -
    - - - - - - -
    -

    question

    -
  • -
  • -
    - - - - - - -
    -

    question-o

    -
  • -
  • -
    - - - - - - -
    -

    quote

    -
  • -
  • -
    - - - - - - -
    -

    redo

    -
  • -
  • -
    - - - - - - -
    -

    remove

    -
  • -
  • -
    - - - - - - -
    -

    repeat

    -
  • -
  • -
    - - - - - - -
    -

    retry

    -
  • -
  • -
    - - - - - - -
    -

    scale

    -
  • -
  • -
    - - - - - - -
    -

    screen-full

    -
  • -
  • -
    - - - - - - -
    -

    screen-normal

    -
  • -
  • -
    - - - - - - -
    -

    search

    -
  • -
  • -
    - - - - - - -
    -

    settings

    -
  • -
  • -
    - - - - - - -
    -

    shield

    -
  • -
  • -
    - - - - - - -
    -

    slight-frown

    -
  • -
  • -
    - - - - - - -
    -

    slight-smile

    -
  • -
  • -
    - - - - - - -
    -

    smile

    -
  • -
  • -
    - - - - - - -
    -

    smiley

    -
  • -
  • -
    - - - - - - -
    -

    snippet

    -
  • -
  • -
    - - - - - - -
    -

    spam

    -
  • -
  • -
    - - - - - - -
    -

    star

    -
  • -
  • -
    - - - - - - -
    -

    star-o

    -
  • -
  • -
    - - - - - - -
    -

    stop

    -
  • -
  • -
    - - - - - - -
    -

    talic

    -
  • -
  • -
    - - - - - - -
    -

    task-done

    -
  • -
  • -
    - - - - - - -
    -

    template

    -
  • -
  • -
    - - - - - - -
    -

    thump-down

    -
  • -
  • -
    - - - - - - -
    -

    thump-up

    -
  • -
  • -
    - - - - - - -
    -

    timer

    -
  • -
  • -
    - - - - - - -
    -

    todo-add

    -
  • -
  • -
    - - - - - - -
    -

    todo-done

    -
  • -
  • -
    - - - - - - -
    -

    token

    -
  • -
  • -
    - - - - - - -
    -

    unapproval

    -
  • -
  • -
    - - - - - - -
    -

    unassignee

    -
  • -
  • -
    - - - - - - -
    -

    unlink

    -
  • -
  • -
    - - - - - - -
    -

    user

    -
  • -
  • -
    - - - - - - -
    -

    users

    -
  • -
  • -
    - - - - - - -
    -

    volume-up

    -
  • -
  • -
    - - - - - - -
    -

    warning

    -
  • -
  • -
    - - - - - - -
    -

    work

    -
  • -
- - - -
-
- - - -

B) Inline SVG with external sprite (IE 9-11 with polyfill only)

-
    - -
  • -
    - - - - - - -
    -

    abuse

    -
  • -
  • -
    - - - - -
    -

    account

    -
  • -
  • -
    - - - - - - -
    -

    admin

    -
  • -
  • -
    - - - - - - -
    -

    angle-double-left

    -
  • -
  • -
    - - - - - - -
    -

    angle-down

    -
  • -
  • -
    - - - - - - -
    -

    angle-left

    -
  • -
  • -
    - - - - - - -
    -

    angle-right

    -
  • -
  • -
    - - - - - - -
    -

    angle-up

    -
  • -
  • -
    - - - - - - -
    -

    appearance

    -
  • -
  • -
    - - - - - - -
    -

    applications

    -
  • -
  • -
    - - - - - - -
    -

    approval

    -
  • -
  • -
    - - - - - - -
    -

    arrow-right

    -
  • -
  • -
    - - - - - - -
    -

    assignee

    -
  • -
  • -
    - - - - - - -
    -

    bold

    -
  • -
  • -
    - - - - - - -
    -

    book

    -
  • -
  • -
    - - - - - - -
    -

    branch

    -
  • -
  • -
    - - - - - - -
    -

    calendar

    -
  • -
  • -
    - - - - - - -
    -

    cancel

    -
  • -
  • -
    - - - - - - -
    -

    chevron-down

    -
  • -
  • -
    - - - - - - -
    -

    chevron-left

    -
  • -
  • -
    - - - - - - -
    -

    chevron-right

    -
  • -
  • -
    - - - - - - -
    -

    chevron-up

    -
  • -
  • -
    - - - - - - -
    -

    clock

    -
  • -
  • -
    - - - - - - -
    -

    code

    -
  • -
  • -
    - - - - - - -
    -

    comment

    -
  • -
  • -
    - - - - - - -
    -

    comment-dots

    -
  • -
  • -
    - - - - - - -
    -

    comment-next

    -
  • -
  • -
    - - - - - - -
    -

    comments

    -
  • -
  • -
    - - - - - - -
    -

    commit

    -
  • -
  • -
    - - - - - - -
    -

    credit-card

    -
  • -
  • -
    - - - - - - -
    -

    disk

    -
  • -
  • -
    - - - - - - -
    -

    doc_code

    -
  • -
  • -
    - - - - - - -
    -

    doc_image

    -
  • -
  • -
    - - - - - - -
    -

    doc_text

    -
  • -
  • -
    - - - - - - -
    -

    download

    -
  • -
  • -
    - - - - - - -
    -

    duplicate

    -
  • -
  • -
    - - - - - - -
    -

    earth

    -
  • -
  • -
    - - - - - - -
    -

    eye

    -
  • -
  • -
    - - - - - - -
    -

    eye-slash

    -
  • -
  • -
    - - - - - - -
    -

    file-additions

    -
  • -
  • -
    - - - - - - -
    -

    file-deletion

    -
  • -
  • -
    - - - - - - -
    -

    file-modified

    -
  • -
  • -
    - - - - - - -
    -

    filter

    -
  • -
  • -
    - - - - - - -
    -

    folder

    -
  • -
  • -
    - - - - - - -
    -

    fork

    -
  • -
  • -
    - - - - - - -
    -

    git-merge

    -
  • -
  • -
    - - - - - - -
    -

    group

    -
  • -
  • -
    - - - - - - -
    -

    history

    -
  • -
  • -
    - - - - - - -
    -

    home

    -
  • -
  • -
    - - - - - - -
    -

    hook

    -
  • -
  • -
    - - - - - - -
    -

    issue-block

    -
  • -
  • -
    - - - - - - -
    -

    issue-child

    -
  • -
  • -
    - - - - - - -
    -

    issue-close

    -
  • -
  • -
    - - - - - - -
    -

    issue-duplicate

    -
  • -
  • -
    - - - - - - -
    -

    issue-new

    -
  • -
  • -
    - - - - - - -
    -

    issue-open

    -
  • -
  • -
    - - - - - - -
    -

    issue-open-m

    -
  • -
  • -
    - - - - - - -
    -

    issue-parent

    -
  • -
  • -
    - - - - - - -
    -

    issues

    -
  • -
  • -
    - - - - - - -
    -

    key

    -
  • -
  • -
    - - - - - - -
    -

    key-2

    -
  • -
  • -
    - - - - - - -
    -

    label

    -
  • -
  • -
    - - - - - - -
    -

    labels

    -
  • -
  • -
    - - - - - - -
    -

    leave

    -
  • -
  • -
    - - - - - - -
    -

    level-up

    -
  • -
  • -
    - - - - - - -
    -

    license

    -
  • -
  • -
    - - - - - - -
    -

    link

    -
  • -
  • -
    - - - - - - -
    -

    list-bulleted

    -
  • -
  • -
    - - - - - - -
    -

    list-numbered

    -
  • -
  • -
    - - - - - - -
    -

    location

    -
  • -
  • -
    - - - - - - -
    -

    location-dot

    -
  • -
  • -
    - - - - - - -
    -

    lock

    -
  • -
  • -
    - - - - - - -
    -

    lock-open

    -
  • -
  • -
    - - - - - - -
    -

    log

    -
  • -
  • -
    - - - - - - -
    -

    mail

    -
  • -
  • -
    - - - - - - -
    -

    merge-request-close

    -
  • -
  • -
    - - - - - - -
    -

    merge-request-close-m

    -
  • -
  • -
    - - - - - - -
    -

    messages

    -
  • -
  • -
    - - - - - - -
    -

    mobile-issue-close

    -
  • -
  • -
    - - - - - - -
    -

    monitor

    -
  • -
  • -
    - - - - - - -
    -

    more

    -
  • -
  • -
    - - - - - - -
    -

    notifications

    -
  • -
  • -
    - - - - - - -
    -

    notifications-off

    -
  • -
  • -
    - - - - - - -
    -

    overview

    -
  • -
  • -
    - - - - - - -
    -

    pencil

    -
  • -
  • -
    - - - - - - -
    -

    pipeline

    -
  • -
  • -
    - - - - - - -
    -

    play

    -
  • -
  • -
    - - - - - - -
    -

    plus

    -
  • -
  • -
    - - - - - - -
    -

    plus-square

    -
  • -
  • -
    - - - - - - -
    -

    plus-square-o

    -
  • -
  • -
    - - - - - - -
    -

    preferences

    -
  • -
  • -
    - - - - - - -
    -

    profile

    -
  • -
  • -
    - - - - - - -
    -

    project

    -
  • -
  • -
    - - - - - - -
    -

    push-rules

    -
  • -
  • -
    - - - - - - -
    -

    question

    -
  • -
  • -
    - - - - - - -
    -

    question-o

    -
  • -
  • -
    - - - - - - -
    -

    quote

    -
  • -
  • -
    - - - - - - -
    -

    redo

    -
  • -
  • -
    - - - - - - -
    -

    remove

    -
  • -
  • -
    - - - - - - -
    -

    repeat

    -
  • -
  • -
    - - - - - - -
    -

    retry

    -
  • -
  • -
    - - - - - - -
    -

    scale

    -
  • -
  • -
    - - - - - - -
    -

    screen-full

    -
  • -
  • -
    - - - - - - -
    -

    screen-normal

    -
  • -
  • -
    - - - - - - -
    -

    search

    -
  • -
  • -
    - - - - - - -
    -

    settings

    -
  • -
  • -
    - - - - - - -
    -

    shield

    -
  • -
  • -
    - - - - - - -
    -

    slight-frown

    -
  • -
  • -
    - - - - - - -
    -

    slight-smile

    -
  • -
  • -
    - - - - - - -
    -

    smile

    -
  • -
  • -
    - - - - - - -
    -

    smiley

    -
  • -
  • -
    - - - - - - -
    -

    snippet

    -
  • -
  • -
    - - - - - - -
    -

    spam

    -
  • -
  • -
    - - - - - - -
    -

    star

    -
  • -
  • -
    - - - - - - -
    -

    star-o

    -
  • -
  • -
    - - - - - - -
    -

    stop

    -
  • -
  • -
    - - - - - - -
    -

    talic

    -
  • -
  • -
    - - - - - - -
    -

    task-done

    -
  • -
  • -
    - - - - - - -
    -

    template

    -
  • -
  • -
    - - - - - - -
    -

    thump-down

    -
  • -
  • -
    - - - - - - -
    -

    thump-up

    -
  • -
  • -
    - - - - - - -
    -

    timer

    -
  • -
  • -
    - - - - - - -
    -

    todo-add

    -
  • -
  • -
    - - - - - - -
    -

    todo-done

    -
  • -
  • -
    - - - - - - -
    -

    token

    -
  • -
  • -
    - - - - - - -
    -

    unapproval

    -
  • -
  • -
    - - - - - - -
    -

    unassignee

    -
  • -
  • -
    - - - - - - -
    -

    unlink

    -
  • -
  • -
    - - - - - - -
    -

    user

    -
  • -
  • -
    - - - - - - -
    -

    users

    -
  • -
  • -
    - - - - - - -
    -

    volume-up

    -
  • -
  • -
    - - - - - - -
    -

    warning

    -
  • -
  • -
    - - - - - - -
    -

    work

    -
  • -
- - - -
-
-

Generated at Tue, 12 Sep 2017 09:08:46 GMT by svg-sprite.

-
- - diff --git a/app/assets/stylesheets/framework/gitlab-theme.scss b/app/assets/stylesheets/framework/gitlab-theme.scss index 0d1c04026b8..6b69e8018be 100644 --- a/app/assets/stylesheets/framework/gitlab-theme.scss +++ b/app/assets/stylesheets/framework/gitlab-theme.scss @@ -126,7 +126,7 @@ .search-input-wrap { .search-icon, .clear-icon { - color: rgba($color-200, .8); + fill: rgba($color-200, .8); } } @@ -141,7 +141,7 @@ .search-input-wrap { .search-icon { - color: rgba($color-200, .8); + fill: rgba($color-200, .8); } } } @@ -252,7 +252,7 @@ body { .search-input-wrap { .search-icon { - color: $theme-gray-200; + fill: $theme-gray-200; } .search-input { diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss index ab3c34df1fb..d932ea8794f 100644 --- a/app/assets/stylesheets/framework/header.scss +++ b/app/assets/stylesheets/framework/header.scss @@ -109,8 +109,7 @@ header { .user-counter { svg { - height: 16px; - width: 23px; + margin-right: 3px; } } @@ -133,16 +132,16 @@ header { } &.navbar-gitlab-new { - .fa-times { + .close-icon { display: none; } .menu-expanded { - .fa-ellipsis-v { + .more-icon { display: none; } - .fa-times { + .close-icon { display: block; } } diff --git a/app/assets/stylesheets/framework/images.scss b/app/assets/stylesheets/framework/images.scss index 60d61c68d63..59bfc5a8d77 100644 --- a/app/assets/stylesheets/framework/images.scss +++ b/app/assets/stylesheets/framework/images.scss @@ -27,7 +27,9 @@ } svg { + &.s8 { @include svg-size(8px); } &.s16 { @include svg-size(16px); } + &.s18 { @include svg-size(18px); } &.s24 { @include svg-size(24px); } &.s32 { @include svg-size(32px); } &.s48 { @include svg-size(48px); } diff --git a/app/assets/stylesheets/framework/new-nav.scss b/app/assets/stylesheets/framework/new-nav.scss index 81022d4af2a..5e4619638e2 100644 --- a/app/assets/stylesheets/framework/new-nav.scss +++ b/app/assets/stylesheets/framework/new-nav.scss @@ -122,15 +122,22 @@ header.navbar-gitlab-new { min-width: 45px; padding: 4px $gl-padding; margin-right: -7px; - font-size: 14px; text-align: center; color: currentColor; + svg { + fill: currentColor; + } + &:hover, &:focus, &.active { color: currentColor; background-color: transparent; + + svg { + fill: currentColor; + } } } @@ -279,10 +286,6 @@ header.navbar-gitlab-new { } } -.admin-icon i { - font-size: 18px; -} - .caret-down { height: 11px; width: 11px; diff --git a/app/assets/stylesheets/framework/new-sidebar.scss b/app/assets/stylesheets/framework/new-sidebar.scss index 3f1cb97aebc..ccbacc463b3 100644 --- a/app/assets/stylesheets/framework/new-sidebar.scss +++ b/app/assets/stylesheets/framework/new-sidebar.scss @@ -56,8 +56,8 @@ $new-sidebar-collapsed-width: 50px; color: $hover-color; .settings-avatar { - i { - color: $hover-color; + svg { + fill: $hover-color; } } } @@ -76,12 +76,9 @@ $new-sidebar-collapsed-width: 50px; .settings-avatar { background-color: $white-light; - i { - font-size: 20px; - width: 100%; - color: $gl-text-color-secondary; - text-align: center; - align-self: center; + svg { + fill: $gl-text-color-secondary; + margin: auto; } } @@ -177,16 +174,16 @@ $new-sidebar-collapsed-width: 50px; .nav-icon-container { display: flex; margin-right: 8px; - - svg { - height: 16px; - width: 16px; - } } .fly-out-top-item { display: none; } + + svg { + height: 16px; + width: 16px; + } } .nav-sidebar-inner-scroll { @@ -354,18 +351,22 @@ $new-sidebar-collapsed-width: 50px; display: flex; align-items: center; - i { - font-size: 20px; + svg { + fill: $gl-text-color-secondary; margin-right: 8px; } - .fa-angle-double-right { + .icon-angle-double-right { display: none; } &:hover { background-color: $border-color; color: $gl-text-color; + + svg { + fill: $gl-text-color; + } } } @@ -407,15 +408,16 @@ $new-sidebar-collapsed-width: 50px; .toggle-sidebar-button { width: $new-sidebar-collapsed-width - 2px; - padding: 16px 18px; + padding: 16px 16px; .collapse-text, - .fa-angle-double-left { + .icon-angle-double-left { display: none; } - .fa-angle-double-right { + .icon-angle-double-right { display: block; + margin: 0; } } } diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss index 2fa710a05b5..89ebe3f9917 100644 --- a/app/assets/stylesheets/pages/search.scss +++ b/app/assets/stylesheets/pages/search.scss @@ -81,17 +81,10 @@ input[type="checkbox"]:hover { .clear-icon { position: absolute; right: 5px; - top: 0; - - &::before { - font-family: FontAwesome; - font-weight: $gl-font-weight-normal; - font-style: normal; - } + top: 4px; } .search-icon { - @extend .fa-search; transition: color $default-transition-duration; -webkit-user-select: none; -moz-user-select: none; @@ -99,7 +92,6 @@ input[type="checkbox"]:hover { } .clear-icon { - @extend .fa-times; display: none; } diff --git a/app/helpers/breadcrumbs_helper.rb b/app/helpers/breadcrumbs_helper.rb index ee1b7ed083e..adf39380b8e 100644 --- a/app/helpers/breadcrumbs_helper.rb +++ b/app/helpers/breadcrumbs_helper.rb @@ -25,7 +25,7 @@ module BreadcrumbsHelper def breadcrumb_list_item(link) content_tag "li" do - link + icon("angle-right", class: "breadcrumbs-list-angle") + link + sprite_icon("angle-right", size: 8, css_class: "breadcrumbs-list-angle") end end diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb index 08e6443bd0f..ec779c1c447 100644 --- a/app/helpers/icons_helper.rb +++ b/app/helpers/icons_helper.rb @@ -24,9 +24,9 @@ module IconsHelper end def sprite_icon(icon_name, size: nil, css_class: nil) - css_classes = size ? "s#{size}" : nil + css_classes = size ? "s#{size}" : "" css_classes << " #{css_class}" unless css_class.blank? - content_tag(:svg, content_tag(:use, "", { "xlink:href" => "#{image_path('icons.svg')}##{icon_name}" } ), class: css_classes) + content_tag(:svg, content_tag(:use, "", { "xlink:href" => "#{image_path('icons.svg')}##{icon_name}" } ), class: css_classes.empty? ? nil : css_classes) end def audit_icon(names, options = {}) diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml index cd7a47da4a1..29387d6627e 100644 --- a/app/views/layouts/_search.html.haml +++ b/app/views/layouts/_search.html.haml @@ -21,8 +21,8 @@ %a Loading... = dropdown_loading - %i.search-icon - %i.clear-icon.js-clear-input + = sprite_icon('search', size: 16, css_class: 'search-icon') + = sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input') = hidden_field_tag :group_id, @group.try(:id), class: 'js-search-group-options', data: group_data_attrs diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index d8fc371497d..9f77e72751a 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -22,29 +22,29 @@ = render 'layouts/search' unless current_controller?(:search) %li.visible-sm-inline-block.visible-xs-inline-block = link_to search_path, title: 'Search', aria: { label: "Search" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = icon('search') + = sprite_icon('search', size: 16) - if current_user %li.user-counter = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'dashboard-shortcuts-issues', aria: { label: "Issues" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = custom_icon('issues') + = sprite_icon('issues', size: 16) - issues_count = assigned_issuables_count(:issues) %span.badge.issues-count{ class: ('hidden' if issues_count.zero?) } = number_with_delimiter(issues_count) %li.user-counter = link_to assigned_mrs_dashboard_path, title: 'Merge requests', class: 'dashboard-shortcuts-merge_requests', aria: { label: "Merge requests" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = custom_icon('mr_bold') + = sprite_icon('git-merge', size: 16) - merge_requests_count = assigned_issuables_count(:merge_requests) %span.badge.merge-requests-count{ class: ('hidden' if merge_requests_count.zero?) } = number_with_delimiter(merge_requests_count) %li.user-counter = link_to dashboard_todos_path, title: 'Todos', aria: { label: "Todos" }, class: 'shortcuts-todos', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = custom_icon('todo_done') + = sprite_icon('todo-done', size: 16) %span.badge.todos-count{ class: ('hidden' if todos_pending_count.zero?) } = todos_count_format(todos_pending_count) %li.header-user.dropdown = link_to current_user, class: user_dropdown_class, data: { toggle: "dropdown" } do = image_tag avatar_icon(current_user, 23), width: 23, height: 23, class: "header-user-avatar" - = custom_icon('caret_down') + = sprite_icon('angle-down', css_class: 'caret-down') .dropdown-menu-nav.dropdown-menu-align-right %ul %li.current-user @@ -73,7 +73,7 @@ %button.navbar-toggle.hidden-sm.hidden-md.hidden-lg{ type: 'button' } %span.sr-only Toggle navigation - = icon('ellipsis-v', class: 'js-navbar-toggle-right') - = icon('times', class: 'js-navbar-toggle-left') + = sprite_icon('more', size: 16, css_class: 'more-icon js-navbar-toggle-right') + = sprite_icon('close', size: 16, css_class: 'close-icon js-navbar-toggle-left') = render 'shared/outdated_browser' diff --git a/app/views/layouts/header/_new_dropdown.haml b/app/views/layouts/header/_new_dropdown.haml index 63d1c077ecd..088f2785092 100644 --- a/app/views/layouts/header/_new_dropdown.haml +++ b/app/views/layouts/header/_new_dropdown.haml @@ -1,7 +1,7 @@ %li.header-new.dropdown = link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip", title: "New...", ref: 'tooltip', aria: { label: "New..." }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body' } do - = custom_icon('plus_square') - = custom_icon('caret_down') + = sprite_icon('plus-square', size: 16) + = sprite_icon('angle-down', css_class: 'caret-down') .dropdown-menu-nav.dropdown-menu-align-right %ul - if @group&.persisted? diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index c254ee02dd8..e0d8d9cb402 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -2,7 +2,7 @@ = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: { id: 'nav-projects-dropdown', class: "home dropdown header-projects" }) do %a{ href: "#", data: { toggle: "dropdown" } } Projects - = custom_icon('caret_down') + = sprite_icon('angle-down', css_class: 'caret-down') .dropdown-menu.projects-dropdown-menu = render "layouts/nav/projects_dropdown/show" @@ -25,7 +25,7 @@ %li.header-more.dropdown.hidden-lg %a{ href: "#", data: { toggle: "dropdown" } } More - = custom_icon('caret_down') + = sprite_icon('angle-down', css_class: 'caret-down') .dropdown-menu %ul = nav_link(controller: ['dashboard/groups', 'explore/groups'], html_options: { class: "visible-xs" }) do @@ -54,7 +54,7 @@ - if current_user.admin? = nav_link(controller: 'admin/dashboard') do = link_to admin_root_path, class: 'admin-icon', title: 'Admin area', aria: { label: "Admin area" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = icon('wrench fw') + = sprite_icon('admin', size: 18) - if Gitlab::Sherlock.enabled? %li = link_to sherlock_transactions_path, class: 'admin-icon', title: 'Sherlock Transactions', diff --git a/app/views/layouts/nav/breadcrumbs/_collapsed_dropdown.html.haml b/app/views/layouts/nav/breadcrumbs/_collapsed_dropdown.html.haml index 28022eebb19..610ff9001f7 100644 --- a/app/views/layouts/nav/breadcrumbs/_collapsed_dropdown.html.haml +++ b/app/views/layouts/nav/breadcrumbs/_collapsed_dropdown.html.haml @@ -4,7 +4,7 @@ %li.dropdown %button.text-expander.has-tooltip.js-breadcrumbs-collapsed-expander{ type: "button", data: { toggle: "dropdown", container: "body" }, "aria-label": button_tooltip, title: button_tooltip } = icon("ellipsis-h") - = icon("angle-right", class: "breadcrumbs-list-angle") + = sprite_icon("angle-right", css_class: "breadcrumbs-list-angle") .dropdown-menu %ul - @breadcrumb_dropdown_links[dropdown_location].each_with_index do |link, index| diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml index 9eef006b6a8..0d0543860dc 100644 --- a/app/views/layouts/nav/sidebar/_admin.html.haml +++ b/app/views/layouts/nav/sidebar/_admin.html.haml @@ -3,7 +3,7 @@ .context-header = link_to admin_root_path, title: 'Admin Overview' do .avatar-container.s40.settings-avatar - = icon('wrench') + =sprite_icon('admin', size: 24) .sidebar-context-title Admin Area %ul.sidebar-top-level-items = nav_link(controller: %w(dashboard admin projects users groups jobs runners cohorts conversational_development_index), html_options: {class: 'home'}) do @@ -12,7 +12,6 @@ = sprite_icon('overview') %span.nav-item-name Overview - %ul.sidebar-sub-level-items = nav_link(controller: %w(dashboard admin projects users groups jobs runners cohorts conversational_development_index), html_options: { class: "fly-out-top-item" } ) do = link_to admin_root_path do diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml index a015c94c60e..458b5010d36 100644 --- a/app/views/layouts/nav/sidebar/_profile.html.haml +++ b/app/views/layouts/nav/sidebar/_profile.html.haml @@ -3,7 +3,7 @@ .context-header = link_to profile_path, title: 'Profile Settings' do .avatar-container.s40.settings-avatar - = icon('user') + = sprite_icon('user', size: 24) .sidebar-context-title User Settings %ul.sidebar-top-level-items = nav_link(path: 'profiles#show', html_options: {class: 'home'}) do diff --git a/app/views/shared/_sidebar_toggle_button.html.haml b/app/views/shared/_sidebar_toggle_button.html.haml index eb5ddb0dde4..2530db986e0 100644 --- a/app/views/shared/_sidebar_toggle_button.html.haml +++ b/app/views/shared/_sidebar_toggle_button.html.haml @@ -1,8 +1,8 @@ %a.toggle-sidebar-button.js-toggle-sidebar{ role: "button", type: "button", title: "Toggle sidebar" } - = icon('angle-double-left') - = icon('angle-double-right') + = sprite_icon('angle-double-left', css_class: 'icon-angle-double-left') + = sprite_icon('angle-double-right', css_class: 'icon-angle-double-right') %span.collapse-text Collapse sidebar = button_tag class: 'close-nav-button', type: 'button' do - = icon ('times') + = sprite_icon('close', size: 16) %span.collapse-text Close sidebar diff --git a/yarn.lock b/yarn.lock index c95dd6433ca..ae86887630b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2714,7 +2714,7 @@ getpass@^0.1.1: "gitlab-svgs@https://gitlab.com/gitlab-org/gitlab-svgs.git": version "1.0.2" - resolved "https://gitlab.com/gitlab-org/gitlab-svgs.git#7f36f3951dd08904761780da48efcd639f34c3af" + resolved "https://gitlab.com/gitlab-org/gitlab-svgs.git#e7621d7b028607ae9c69f8b496cd49b42fe607e4" glob-base@^0.3.0: version "0.3.0" -- cgit v1.2.1 From 74bf6b20bdc977969ccae0a29f675763141fbd73 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 28 Sep 2017 09:58:45 -0400 Subject: Remove target ref switcher. --- app/views/projects/tree/_tree_header.html.haml | 4 ---- app/views/shared/_target_switcher.html.haml | 16 ---------------- 2 files changed, 20 deletions(-) delete mode 100644 app/views/shared/_target_switcher.html.haml diff --git a/app/views/projects/tree/_tree_header.html.haml b/app/views/projects/tree/_tree_header.html.haml index 853e2a6e7ec..6cddc38d11a 100644 --- a/app/views/projects/tree/_tree_header.html.haml +++ b/app/views/projects/tree/_tree_header.html.haml @@ -1,10 +1,6 @@ .tree-ref-container .tree-ref-holder = render 'shared/ref_switcher', destination: 'tree', path: @path - - if show_new_repo? - .tree-ref-target-holder.js-tree-ref-target-holder - = icon('long-arrow-right', title: 'to target branch') - = render 'shared/target_switcher', destination: 'tree', path: @path - unless show_new_repo? = render 'projects/tree/old_tree_header' diff --git a/app/views/shared/_target_switcher.html.haml b/app/views/shared/_target_switcher.html.haml deleted file mode 100644 index bbe9692a7da..00000000000 --- a/app/views/shared/_target_switcher.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -- dropdown_toggle_text = @ref || @project.default_branch -= form_tag nil, method: :get, class: "project-refs-form project-refs-target-form" do - = hidden_field_tag :destination, destination - - if defined?(path) - = hidden_field_tag :path, path - - @options && @options.each do |key, value| - = hidden_field_tag key, value, id: nil - .dropdown - = dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_project_path(@project, find: ['branches']), field_name: 'ref', input_field_name: 'new-branch', submit_form_on_click: true, visit: false }, { toggle_class: "js-project-refs-dropdown" } - .dropdown-menu.dropdown-menu-selectable.git-revision-dropdown{ class: ("dropdown-menu-align-right" if local_assigns[:align_right]) } - = dropdown_title _("Create a new branch") - = dropdown_input _("Create a new branch") - = dropdown_title _("Select existing branch"), options: {close: false} - = dropdown_filter _("Search branches and tags") - = dropdown_content - = dropdown_loading -- cgit v1.2.1 From e0df4a9eb19fb9a65ab5b560672c2a9903dddae3 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 28 Sep 2017 10:05:38 -0400 Subject: Removes the target branch and only uses the source branch. --- app/assets/javascripts/repo/components/repo_commit_section.vue | 4 ++-- app/assets/javascripts/repo/components/repo_edit_button.vue | 10 ---------- app/assets/javascripts/repo/index.js | 3 --- app/assets/javascripts/repo/stores/repo_store.js | 1 - 4 files changed, 2 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/repo/components/repo_commit_section.vue b/app/assets/javascripts/repo/components/repo_commit_section.vue index 1282828b504..7e4ba11c9f3 100644 --- a/app/assets/javascripts/repo/components/repo_commit_section.vue +++ b/app/assets/javascripts/repo/components/repo_commit_section.vue @@ -37,7 +37,7 @@ export default { content: f.newContent, })); const payload = { - branch: Store.targetBranch, + branch: Store.currentBranch, commit_message: commitMessage, actions, }; @@ -105,7 +105,7 @@ export default {
- {{targetBranch}} + {{currentBranch}}
diff --git a/app/assets/javascripts/repo/components/repo_edit_button.vue b/app/assets/javascripts/repo/components/repo_edit_button.vue index 29b76975561..353142edeb7 100644 --- a/app/assets/javascripts/repo/components/repo_edit_button.vue +++ b/app/assets/javascripts/repo/components/repo_edit_button.vue @@ -26,16 +26,6 @@ export default { this.editMode = !this.editMode; Store.toggleBlobView(); }, - toggleProjectRefsForm() { - $('.project-refs-form').toggleClass('disabled', this.editMode); - $('.js-tree-ref-target-holder').toggle(this.editMode); - }, - }, - - watch: { - editMode() { - this.toggleProjectRefsForm(); - }, }, }; diff --git a/app/assets/javascripts/repo/index.js b/app/assets/javascripts/repo/index.js index 6c1d468e937..b32939336c0 100644 --- a/app/assets/javascripts/repo/index.js +++ b/app/assets/javascripts/repo/index.js @@ -11,9 +11,6 @@ function initDropdowns() { } function addEventsForNonVueEls() { - $(document).on('change', '.dropdown', () => { - Store.targetBranch = $('.project-refs-target-form input[name="ref"]').val(); - }); window.onbeforeunload = function confirmUnload(e) { const hasChanged = Store.openedFiles diff --git a/app/assets/javascripts/repo/stores/repo_store.js b/app/assets/javascripts/repo/stores/repo_store.js index 1c0df528aea..c9b0413e745 100644 --- a/app/assets/javascripts/repo/stores/repo_store.js +++ b/app/assets/javascripts/repo/stores/repo_store.js @@ -32,7 +32,6 @@ const RepoStore = { isCommitable: false, binary: false, currentBranch: '', - targetBranch: 'new-branch', commitMessage: '', binaryTypes: { png: false, -- cgit v1.2.1 From 2b407b914056a934107c4d57749d2c9864d075e5 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Thu, 28 Sep 2017 17:24:24 +0100 Subject: Fixes data parameter not being sent in ajax request for jobs log --- app/assets/javascripts/build.js | 2 +- changelogs/unreleased/38528-build-url.yml | 5 +++++ spec/javascripts/build_spec.js | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/38528-build-url.yml diff --git a/app/assets/javascripts/build.js b/app/assets/javascripts/build.js index 286a758b8a9..3d27a3544eb 100644 --- a/app/assets/javascripts/build.js +++ b/app/assets/javascripts/build.js @@ -167,7 +167,7 @@ window.Build = (function () { Build.prototype.getBuildTrace = function () { return $.ajax({ url: `${this.pageUrl}/trace.json`, - data: this.state, + data: { state: this.state }, }) .done((log) => { setCiStatusFavicon(`${this.pageUrl}/status.json`); diff --git a/changelogs/unreleased/38528-build-url.yml b/changelogs/unreleased/38528-build-url.yml new file mode 100644 index 00000000000..357b9aacea8 --- /dev/null +++ b/changelogs/unreleased/38528-build-url.yml @@ -0,0 +1,5 @@ +--- +title: Fixes data parameter not being sent in ajax request for jobs log +merge_request: +author: +type: fixed diff --git a/spec/javascripts/build_spec.js b/spec/javascripts/build_spec.js index 35149611095..d5b0f23e7b7 100644 --- a/spec/javascripts/build_spec.js +++ b/spec/javascripts/build_spec.js @@ -289,4 +289,18 @@ describe('Build', () => { }); }); }); + + describe('getBuildTrace', () => { + it('should request build trace with state parameter', (done) => { + spyOn(jQuery, 'ajax').and.callThrough(); + new Build(); + + setTimeout(() => { + expect(jQuery.ajax).toHaveBeenCalledWith( + { url: `${BUILD_URL}/trace.json`, data: { state: '' } }, + ); + done(); + }, 0); + }); + }); }); -- cgit v1.2.1 From 4683034b4ffead30485ac1b1b8c4a626c03cf1ce Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 28 Sep 2017 17:46:19 +0100 Subject: Tweaked the first time contributor tooltip text Removes the text `Handle with care` as it sounds condescending. --- app/views/projects/notes/_actions.html.haml | 2 +- locale/gitlab.pot | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/projects/notes/_actions.html.haml b/app/views/projects/notes/_actions.html.haml index ab87b5e0005..4961835f12a 100644 --- a/app/views/projects/notes/_actions.html.haml +++ b/app/views/projects/notes/_actions.html.haml @@ -1,6 +1,6 @@ - access = note_max_access_for_user(note) - if note.has_special_role?(Note::SpecialRole::FIRST_TIME_CONTRIBUTOR) - %span.note-role.note-role-special.has-tooltip{ title: _("This is the author's first Merge Request to this project. Handle with care.") } + %span.note-role.note-role-special.has-tooltip{ title: _("This is the author's first Merge Request to this project.") } = issuable_first_contribution_icon - if access.nonzero? %span.note-role.note-role-access= Gitlab::Access.human_access(access) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 600432be3bf..ff6c8fa07a7 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -1382,7 +1382,7 @@ msgstr "" msgid "There are problems accessing Git storage: " msgstr "" -msgid "This is the author's first Merge Request to this project. Handle with care." +msgid "This is the author's first Merge Request to this project." msgstr "" msgid "This means you can not push code until you create an empty repository or import existing one." -- cgit v1.2.1 From 8326f585da3863e1176dd6086cf4993376b72d6c Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Thu, 28 Sep 2017 19:31:33 +0200 Subject: Fixed CSS Lint Error --- app/assets/stylesheets/framework/new-sidebar.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/framework/new-sidebar.scss b/app/assets/stylesheets/framework/new-sidebar.scss index ccbacc463b3..8332cec2962 100644 --- a/app/assets/stylesheets/framework/new-sidebar.scss +++ b/app/assets/stylesheets/framework/new-sidebar.scss @@ -408,7 +408,7 @@ $new-sidebar-collapsed-width: 50px; .toggle-sidebar-button { width: $new-sidebar-collapsed-width - 2px; - padding: 16px 16px; + padding: 16px; .collapse-text, .icon-angle-double-left { -- cgit v1.2.1 From cd6f683e63cb32f8804041cc3637a0d498421a18 Mon Sep 17 00:00:00 2001 From: James Ramsay Date: Wed, 27 Sep 2017 13:13:29 -0400 Subject: Add translatable strings to wiki pages --- app/views/projects/wikis/_form.html.haml | 22 ++-- app/views/projects/wikis/_main_links.html.haml | 6 +- app/views/projects/wikis/_new.html.haml | 11 +- .../projects/wikis/_pages_wiki_page.html.haml | 2 +- app/views/projects/wikis/_sidebar.html.haml | 4 +- app/views/projects/wikis/edit.html.haml | 19 ++- app/views/projects/wikis/empty.html.haml | 6 +- app/views/projects/wikis/git_access.html.haml | 14 +-- app/views/projects/wikis/history.html.haml | 14 +-- app/views/projects/wikis/pages.html.haml | 8 +- app/views/projects/wikis/show.html.haml | 14 +-- locale/gitlab.pot | 130 ++++++++++++++++++++- 12 files changed, 186 insertions(+), 64 deletions(-) diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml index e5a1fccf9ba..4e265bf733a 100644 --- a/app/views/projects/wikis/_form.html.haml +++ b/app/views/projects/wikis/_form.html.haml @@ -1,4 +1,5 @@ -- commit_message = @page.persisted? ? "Update #{@page.title}" : "Create #{@page.title}" +- commit_message = @page.persisted? ? s_("WikiPageEdit|Update %{page_title}") : s_("WikiPageCreate|Create %{page_title}") +- commit_message = commit_message % { page_title: @page.title } = form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal wiki-form common-note-form prepend-top-default js-quick-submit' } do |f| = form_errors(@page) @@ -12,13 +13,13 @@ .form-group .col-sm-12= f.label :format, class: 'control-label-full-width' .col-sm-12 - = f.select :format, options_for_select(ProjectWiki::MARKUPS, {selected: @page.format}), {}, class: "form-control" + = f.select :format, options_for_select(ProjectWiki::MARKUPS, {selected: @page.format}), {}, class: 'form-control' .form-group .col-sm-12= f.label :content, class: 'control-label-full-width' .col-sm-12 = render layout: 'projects/md_preview', locals: { url: project_wiki_preview_markdown_path(@project, @page.slug) } do - = render 'projects/zen', f: f, attr: :content, classes: 'note-textarea', placeholder: 'Write your content or drag files here...' + = render 'projects/zen', f: f, attr: :content, classes: 'note-textarea', placeholder: s_("WikiPage|Write your content or drag files here...") = render 'shared/notes/hints' .clearfix @@ -26,12 +27,11 @@ .help-block = succeed '.' do - To link to a (new) page, simply type - %code [Link Title](page-slug) + = (s_("WikiMarkdownTip|To link to a (new) page, simply type %{link_example}") % { link_example: '[Link Title](page-slug)' }).html_safe = succeed '.' do - More examples are in the - = link_to 'documentation', help_page_path("user/markdown", anchor: "wiki-specific-markdown") + - markdown_link = link_to s_("WikiMarkdownDocs|documentation"), help_page_path('user/markdown', anchor: 'wiki-specific-markdown') + = (s_("WikiMarkdownDocs|More examples are in the %{docs_link}") % { docs_link: markdown_link }).html_safe .form-group .col-sm-12= f.label :commit_message, class: 'control-label-full-width' @@ -39,10 +39,10 @@ .form-actions - if @page && @page.persisted? - = f.submit 'Save changes', class: "btn-save btn" + = f.submit _("Save changes"), class: 'btn-save btn' .pull-right - = link_to "Cancel", project_wiki_path(@project, @page), class: "btn btn-cancel btn-grouped" + = link_to _("Cancel"), project_wiki_path(@project, @page), class: 'btn btn-cancel btn-grouped' - else - = f.submit 'Create page', class: "btn-create btn" + = f.submit s_("Wiki|Create page"), class: 'btn-create btn' .pull-right - = link_to "Cancel", project_wiki_path(@project, :home), class: "btn btn-cancel" + = link_to _("Cancel"), project_wiki_path(@project, :home), class: 'btn btn-cancel' diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml index 3bbd8042c3a..cadda0a33c2 100644 --- a/app/views/projects/wikis/_main_links.html.haml +++ b/app/views/projects/wikis/_main_links.html.haml @@ -1,9 +1,9 @@ - if (@page && @page.persisted?) - if can?(current_user, :create_wiki, @project) = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do - New page + = s_("Wiki|New page") = link_to project_wiki_history_path(@project, @page), class: "btn" do - Page history + = s_("Wiki|Page history") - if can?(current_user, :create_wiki, @project) && @page.latest? = link_to project_wiki_edit_path(@project, @page), class: "btn js-wiki-edit" do - Edit + = _("Edit") diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml index 13dd8461433..06a3cac12d5 100644 --- a/app/views/projects/wikis/_new.html.haml +++ b/app/views/projects/wikis/_new.html.haml @@ -3,16 +3,15 @@ .modal-content .modal-header %a.close{ href: "#", "data-dismiss" => "modal" } × - %h3.page-title New Wiki Page + %h3.page-title= s_("WikiNewPageTitle|New Wiki Page") .modal-body %form.new-wiki-page .form-group = label_tag :new_wiki_path do - %span Page slug - = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => project_wikis_path(@project), autofocus: true + %span= s_("WikiPage|Page slug") + = text_field_tag :new_wiki_path, nil, placeholder: s_("WikiNewPagePlaceholder|how-to-setup"), class: 'form-control', required: true, :'data-wikis-path' => project_wikis_path(@project), autofocus: true %span.new-wiki-page-slug-tip = icon('lightbulb-o') - Tip: You can specify the full path for the new file. - We will automatically create any missing directories. + = s_("WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories.") .form-actions - = button_tag 'Create page', class: 'build-new-wiki btn btn-create' + = button_tag s_("Wiki|Create page"), class: "build-new-wiki btn btn-create" diff --git a/app/views/projects/wikis/_pages_wiki_page.html.haml b/app/views/projects/wikis/_pages_wiki_page.html.haml index 7c2f562d422..0a1ccbc5f1c 100644 --- a/app/views/projects/wikis/_pages_wiki_page.html.haml +++ b/app/views/projects/wikis/_pages_wiki_page.html.haml @@ -2,4 +2,4 @@ = link_to wiki_page.title, project_wiki_path(@project, wiki_page) %small (#{wiki_page.format}) .pull-right - %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} + %small= (s_("Last edited %{date}") % { date: time_ago_with_tooltip(wiki_page.commit.authored_date) }).html_safe diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml index f7283ae4739..5b781294d68 100644 --- a/app/views/projects/wikis/_sidebar.html.haml +++ b/app/views/projects/wikis/_sidebar.html.haml @@ -8,7 +8,7 @@ = link_to git_access_url, class: active_nav_link?(path: 'wikis#git_access') ? 'active' : '' do = succeed ' ' do = icon('cloud-download') - Clone repository + = _("Clone repository") .blocks-container .block.block-first @@ -17,6 +17,6 @@ .block = link_to project_wikis_pages_path(@project), class: 'btn btn-block' do - More Pages + = s_("Wiki|More Pages") = render 'projects/wikis/new' diff --git a/app/views/projects/wikis/edit.html.haml b/app/views/projects/wikis/edit.html.haml index 8fd60216536..0d77e5bd16d 100644 --- a/app/views/projects/wikis/edit.html.haml +++ b/app/views/projects/wikis/edit.html.haml @@ -1,11 +1,10 @@ - @content_class = "limit-container-width limit-container-width-sm" unless fluid_layout -- page_title "Edit", @page.title.capitalize, "Wiki" +- page_title _("Edit"), @page.title.capitalize, _("Wiki") - if @conflict .alert.alert-danger - Someone edited the page the same time you did. Please check out - = link_to "the page", project_wiki_path(@project, @page), target: "_blank" - and make sure your changes will not unintentionally remove theirs. + - page_link = link_to s_("WikiPageConflictMessage|the page"), project_wiki_path(@project, @page), target: "_blank" + = (s_("WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs.") % { page_link: page_link }).html_safe .wiki-page-header.has-sidebar-toggle %button.btn.btn-default.sidebar-toggle.js-sidebar-wiki-toggle{ role: "button", type: "button" } @@ -20,20 +19,20 @@ %span.light · - if @page.persisted? - Edit Page + = s_("Wiki|Edit Page") - else - Create Page + = s_("Wiki|Create Page") .nav-controls - if can?(current_user, :create_wiki, @project) = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do - New page + = s_("Wiki|New page") - if @page.persisted? = link_to project_wiki_history_path(@project, @page), class: "btn" do - Page history + = s_("Wiki|Page history") - if can?(current_user, :admin_wiki, @project) - = link_to project_wiki_path(@project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-danger" do - Delete + = link_to project_wiki_path(@project, @page), data: { confirm: s_("WikiPageConfirmDelete|Are you sure you want to delete this page?")}, method: :delete, class: "btn btn-danger" do + = _("Delete") = render 'form' diff --git a/app/views/projects/wikis/empty.html.haml b/app/views/projects/wikis/empty.html.haml index 7dfa405d063..911e1339541 100644 --- a/app/views/projects/wikis/empty.html.haml +++ b/app/views/projects/wikis/empty.html.haml @@ -1,6 +1,6 @@ -- page_title "Wiki" +- page_title _("Wiki") -%h3.page-title Empty page +%h3.page-title= _("Wiki|Empty page") %hr .error_message - You are not allowed to create wiki pages + = s_("WikiEmptyPageError|You are not allowed to create wiki pages") diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml index e740fb93ea4..10dbbc0e42c 100644 --- a/app/views/projects/wikis/git_access.html.haml +++ b/app/views/projects/wikis/git_access.html.haml @@ -1,36 +1,34 @@ - @content_class = "limit-container-width limit-container-width-sm" unless fluid_layout -- page_title "Git Access", "Wiki" +- page_title s_("WikiClone|Git Access"), _("Wiki") .wiki-page-header.has-sidebar-toggle %button.btn.btn-default.visible-xs.visible-sm.pull-right.sidebar-toggle.js-sidebar-wiki-toggle{ role: "button", type: "button" } = icon('angle-double-left') .git-access-header - Clone repository + = _("Clone repository") %strong= @project_wiki.full_path = render "shared/clone_panel", project: @project_wiki .wiki-git-access - %h3 Install Gollum + %h3= s_("WikiClone|Install Gollum") %pre.dark :preserve gem install gollum %p - It is recommended to install - %code github-markdown - so that GFM features render locally: + = (s_("WikiClone|It is recommended to install %{markdown} so that GFM features render locally:") % { markdown: "github-markdown" }).html_safe %pre.dark :preserve gem install github-markdown - %h3 Clone your wiki + %h3= s_("WikiClone|Clone your wiki") %pre.dark :preserve git clone #{ content_tag(:span, h(default_url_to_repo(@project_wiki)), class: 'clone')} cd #{h @project_wiki.path} - %h3 Start Gollum and edit locally + %h3= s_("WikiClone|Start Gollum and edit locally") %pre.dark :preserve gollum diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index 306feeff259..bc1ab5065e4 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -1,4 +1,4 @@ -- page_title "History", @page.title.capitalize, "Wiki" +- page_title _("History"), @page.title.capitalize, _("Wiki") .wiki-page-header.has-sidebar-toggle %button.btn.btn-default.sidebar-toggle.js-sidebar-wiki-toggle{ role: "button", type: "button" } @@ -9,17 +9,17 @@ = link_to @page.title.capitalize, project_wiki_path(@project, @page) %span.light · - History + = _("History") .table-holder %table.table %thead %tr - %th Page version - %th Author - %th Commit Message - %th Last updated - %th Format + %th= s_("Wiki|Page version") + %th= _("Author") + %th= _("Commit Message") + %th= _("Last updated") + %th= _("Format") %tbody - @page.versions.each_with_index do |version, index| - commit = version diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index d533c611a38..aeef64fd7eb 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -1,19 +1,19 @@ - @no_container = true - add_to_breadcrumbs "Wiki", get_project_wiki_path(@project) -- breadcrumb_title "Pages" -- page_title "Pages", "Wiki" +- breadcrumb_title s_("Wiki|Pages") +- page_title s_("Wiki|Pages"), _("Wiki") %div{ class: container_class } .wiki-page-header .nav-text %h2.wiki-page-title - Wiki Pages + = s_("Wiki|Wiki Pages") .nav-controls = link_to project_wikis_git_access_path(@project), class: 'btn' do = icon('cloud-download') - Clone repository + = _("Clone repository") %ul.wiki-pages-list.content-list = render @wiki_entries, context: 'pages' diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index b066a812ec8..62c18cc4582 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -1,8 +1,8 @@ - @content_class = "limit-container-width limit-container-width-sm" unless fluid_layout - breadcrumb_title @page.title.capitalize - wiki_breadcrumb_dropdown_links(@page.slug) -- page_title @page.title.capitalize, "Wiki" -- add_to_breadcrumbs "Wiki", get_project_wiki_path(@project) +- page_title @page.title.capitalize, _("Wiki") +- add_to_breadcrumbs _("Wiki"), get_project_wiki_path(@project) .wiki-page-header.has-sidebar-toggle %button.btn.btn-default.sidebar-toggle.js-sidebar-wiki-toggle{ role: "button", type: "button" } @@ -11,9 +11,7 @@ .nav-text %h2.wiki-page-title= @page.title.capitalize %span.wiki-last-edit-by - Last edited by - %strong - #{@page.commit.author.name} + = (_("Last edited by %{name}") % { name: "#{@page.commit.author.name}" }).html_safe #{time_ago_with_tooltip(@page.commit.authored_date)} .nav-controls @@ -21,8 +19,10 @@ - if @page.historical? .warning_message - This is an old version of this page. - You can view the #{link_to "most recent version", project_wiki_path(@project, @page)} or browse the #{link_to "history", project_wiki_history_path(@project, @page)}. + = s_("WikiHistoricalPage|This is an old version of this page.") + - most_recent_link = link_to s_("WikiHistoricalPage|most recent version"), project_wiki_path(@project, @page) + - history_link = link_to s_("WikiHistoricalPage|history"), project_wiki_history_path(@project, @page) + = (s_("WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}.") % { most_recent_link: most_recent_link, history_link: history_link }).html_safe .wiki-holder.prepend-top-default.append-bottom-default .wiki diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 600432be3bf..9104c279c9b 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-27 15:43+0100\n" -"PO-Revision-Date: 2017-09-27 15:43+0100\n" +"POT-Creation-Date: 2017-09-28 13:28-0400\n" +"PO-Revision-Date: 2017-09-28 13:28-0400\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" @@ -134,6 +134,9 @@ msgstr "" msgid "Authentication Log" msgstr "" +msgid "Author" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." msgstr "" @@ -361,6 +364,9 @@ msgstr "" msgid "CiStatus|running" msgstr "" +msgid "Clone repository" +msgstr "" + msgid "Comments" msgstr "" @@ -369,6 +375,9 @@ msgid_plural "Commits" msgstr[0] "" msgstr[1] "" +msgid "Commit Message" +msgstr "" + msgid "Commit duration in minutes for last 30 commits" msgstr "" @@ -610,6 +619,9 @@ msgstr[1] "" msgid "ForkedFromProjectPath|Forked from" msgstr "" +msgid "Format" +msgstr "" + msgid "From issue creation until deploy to production" msgstr "" @@ -673,6 +685,9 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" +msgid "History" +msgstr "" + msgid "Housekeeping successfully started" msgstr "" @@ -720,6 +735,15 @@ msgstr "" msgid "Last commit" msgstr "" +msgid "Last edited %{date}" +msgstr "" + +msgid "Last edited by %{name}" +msgstr "" + +msgid "Last updated" +msgstr "" + msgid "LastPushEvent|You pushed to" msgstr "" @@ -1141,6 +1165,9 @@ msgstr "" msgid "SSH Keys" msgstr "" +msgid "Save changes" +msgstr "" + msgid "Save pipeline schedule" msgstr "" @@ -1590,6 +1617,105 @@ msgstr "" msgid "Wiki" msgstr "" +msgid "WikiClone|Clone your wiki" +msgstr "" + +msgid "WikiClone|Git Access" +msgstr "" + +msgid "WikiClone|Install Gollum" +msgstr "" + +msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" +msgstr "" + +msgid "WikiClone|Start Gollum and edit locally" +msgstr "" + +msgid "WikiEmptyPageError|You are not allowed to create wiki pages" +msgstr "" + +msgid "WikiHistoricalPage|This is an old version of this page." +msgstr "" + +msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." +msgstr "" + +msgid "WikiHistoricalPage|history" +msgstr "" + +msgid "WikiHistoricalPage|most recent version" +msgstr "" + +msgid "WikiMarkdownDocs|More examples are in the %{docs_link}" +msgstr "" + +msgid "WikiMarkdownDocs|documentation" +msgstr "" + +msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}" +msgstr "" + +msgid "WikiNewPagePlaceholder|how-to-setup" +msgstr "" + +msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories." +msgstr "" + +msgid "WikiNewPageTitle|New Wiki Page" +msgstr "" + +msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?" +msgstr "" + +msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs." +msgstr "" + +msgid "WikiPageConflictMessage|the page" +msgstr "" + +msgid "WikiPageCreate|Create %{page_title}" +msgstr "" + +msgid "WikiPageEdit|Update %{page_title}" +msgstr "" + +msgid "WikiPage|Page slug" +msgstr "" + +msgid "WikiPage|Write your content or drag files here..." +msgstr "" + +msgid "Wiki|Create Page" +msgstr "" + +msgid "Wiki|Create page" +msgstr "" + +msgid "Wiki|Edit Page" +msgstr "" + +msgid "Wiki|Empty page" +msgstr "" + +msgid "Wiki|More Pages" +msgstr "" + +msgid "Wiki|New page" +msgstr "" + +msgid "Wiki|Page history" +msgstr "" + +msgid "Wiki|Page version" +msgstr "" + +msgid "Wiki|Pages" +msgstr "" + +msgid "Wiki|Wiki Pages" +msgstr "" + msgid "Withdraw Access Request" msgstr "" -- cgit v1.2.1 From 494926a1fb2f21f30b945095b06d5f4fa913300e Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Thu, 28 Sep 2017 11:25:39 -0700 Subject: Add active states to nav bar counters --- app/views/layouts/header/_default.html.haml | 6 +++--- changelogs/unreleased/37335-counter-active-state.yml | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/37335-counter-active-state.yml diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index d8fc371497d..aefed985af4 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -24,19 +24,19 @@ = link_to search_path, title: 'Search', aria: { label: "Search" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = icon('search') - if current_user - %li.user-counter + = nav_link(path: 'dashboard#issues', html_options: { class: "user-counter" }) do = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'dashboard-shortcuts-issues', aria: { label: "Issues" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = custom_icon('issues') - issues_count = assigned_issuables_count(:issues) %span.badge.issues-count{ class: ('hidden' if issues_count.zero?) } = number_with_delimiter(issues_count) - %li.user-counter + = nav_link(path: 'dashboard#merge_requests', html_options: { class: "user-counter" }) do = link_to assigned_mrs_dashboard_path, title: 'Merge requests', class: 'dashboard-shortcuts-merge_requests', aria: { label: "Merge requests" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = custom_icon('mr_bold') - merge_requests_count = assigned_issuables_count(:merge_requests) %span.badge.merge-requests-count{ class: ('hidden' if merge_requests_count.zero?) } = number_with_delimiter(merge_requests_count) - %li.user-counter + = nav_link(controller: 'dashboard/todos', html_options: { class: "user-counter" }) do = link_to dashboard_todos_path, title: 'Todos', aria: { label: "Todos" }, class: 'shortcuts-todos', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = custom_icon('todo_done') %span.badge.todos-count{ class: ('hidden' if todos_pending_count.zero?) } diff --git a/changelogs/unreleased/37335-counter-active-state.yml b/changelogs/unreleased/37335-counter-active-state.yml new file mode 100644 index 00000000000..a9632201a89 --- /dev/null +++ b/changelogs/unreleased/37335-counter-active-state.yml @@ -0,0 +1,5 @@ +--- +title: Add active states to nav bar counters +merge_request: +author: +type: changed -- cgit v1.2.1 From 79119348fa768a02efd49e5f5788b52e3b421b1b Mon Sep 17 00:00:00 2001 From: Victor Wu Date: Thu, 28 Sep 2017 20:22:35 +0000 Subject: Update CONTRIBUTING.md --- CONTRIBUTING.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfb2ce0099a..03521c321a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,7 @@ _This notice should stay as the first item in the CONTRIBUTING.md file._ Thank you for your interest in contributing to GitLab. This guide details how to contribute to GitLab in a way that is efficient for everyone. -Looking for something to work on? Look for the label [Accepting Merge Requests](#i-want-to-contribute). +Looking for something to work on? Look for issues with the label [Accepting Merge Requests](#i-want-to-contribute). GitLab comes into two flavors, GitLab Community Edition (CE) our free and open source edition, and GitLab Enterprise Edition (EE) which is our commercial @@ -101,7 +101,7 @@ the remaining issues on the GitHub issue tracker. ## I want to contribute! If you want to contribute to GitLab, but are not sure where to start, -look for [issues with the label `Accepting Merge Requests` and weight < 5][accepting-mrs-weight]. +look for [issues with the label `Accepting Merge Requests` and small weight][accepting-mrs-weight]. These issues will be of reasonable size and challenge, for anyone to start contributing to GitLab. @@ -209,8 +209,7 @@ We add the ~"Accepting Merge Requests" label to: - Low priority ~bug issues (i.e. we do not add it to the bugs that we want to solve in the ~"Next Patch Release") -- Small ~"feature proposal" that do not need ~UX / ~"Product work", or for which -the ~UX / ~"Product work" is already done +- Small ~"feature proposal" - Small ~"technical debt" issues After adding the ~"Accepting Merge Requests" label, we try to estimate the @@ -223,6 +222,13 @@ know how difficult the issue is. Additionally: - We encourage people that have never contributed to any open source project to look for ["Accepting Merge Requests" issues with a weight of 1][firt-timers] +If you've decided that you would like to work on an issue, please @-mention +the [appropriate product manager](https://about.gitlab.com/handbook/product/#who-to-talk-to-for-what) +as soon as possible. The product manager will then pull in appropriate GitLab team +members to further discuss scope, design, and technical considerations. This will +ensure that that your contribution is aligned with the GitLab product and minimize +any rework and delay in getting it merged into master. + [up-for-grabs]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=Accepting+Merge+Requests&scope=all&sort=weight_asc&state=opened [firt-timers]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name%5B%5D=Accepting+Merge+Requests&scope=all&sort=upvotes_desc&state=opened&weight=1 -- cgit v1.2.1 From e97e130e47daaa24507fd402584e2e0e0690bfe9 Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Thu, 28 Sep 2017 23:30:45 +0200 Subject: Fixed another linting error this time HAML --- app/views/layouts/nav/sidebar/_admin.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml index 0d0543860dc..0ec07605631 100644 --- a/app/views/layouts/nav/sidebar/_admin.html.haml +++ b/app/views/layouts/nav/sidebar/_admin.html.haml @@ -3,7 +3,7 @@ .context-header = link_to admin_root_path, title: 'Admin Overview' do .avatar-container.s40.settings-avatar - =sprite_icon('admin', size: 24) + = sprite_icon('admin', size: 24) .sidebar-context-title Admin Area %ul.sidebar-top-level-items = nav_link(controller: %w(dashboard admin projects users groups jobs runners cohorts conversational_development_index), html_options: {class: 'home'}) do -- cgit v1.2.1 From 3944e16b4bd716fd1f317c89c2c0910de76a2c33 Mon Sep 17 00:00:00 2001 From: Ahmad Sherif Date: Wed, 20 Sep 2017 12:11:51 +0200 Subject: Migrate Git::Repository#rm_tag to Gitaly Closes gitaly#562 --- GITALY_SERVER_VERSION | 2 +- Gemfile | 2 +- Gemfile.lock | 4 ++-- lib/gitlab/git/repository.rb | 12 +++++++++++- lib/gitlab/gitaly_client/operation_service.rb | 24 ++++++++++++++++++++++++ lib/gitlab/gitaly_client/util.rb | 10 ++++++++++ spec/features/tags/master_deletes_tag_spec.rb | 27 +++++++++++++++++++++------ spec/lib/gitlab/workhorse_spec.rb | 3 ++- spec/models/repository_spec.rb | 18 ++++++++++++++---- 9 files changed, 86 insertions(+), 16 deletions(-) create mode 100644 lib/gitlab/gitaly_client/operation_service.rb diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 9b0025a7850..787ffc30a81 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -0.40.0 +0.42.0 diff --git a/Gemfile b/Gemfile index b58632d3542..b9b9b345dfe 100644 --- a/Gemfile +++ b/Gemfile @@ -398,7 +398,7 @@ group :ed25519 do end # Gitaly GRPC client -gem 'gitaly-proto', '~> 0.33.0', require: 'gitaly' +gem 'gitaly-proto', '~> 0.37.0', require: 'gitaly' gem 'toml-rb', '~> 0.3.15', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 3313a687ff0..dbcf3177f6e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -275,7 +275,7 @@ GEM po_to_json (>= 1.0.0) rails (>= 3.2.0) gherkin-ruby (0.3.2) - gitaly-proto (0.33.0) + gitaly-proto (0.37.0) google-protobuf (~> 3.1) grpc (~> 1.0) github-linguist (4.7.6) @@ -1025,7 +1025,7 @@ DEPENDENCIES gettext (~> 3.2.2) gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails_js (~> 1.2.0) - gitaly-proto (~> 0.33.0) + gitaly-proto (~> 0.37.0) github-linguist (~> 4.7.0) gitlab-flowdock-git-hook (~> 1.0.1) gitlab-markup (~> 1.6.2) diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 616b075c087..e9edcf02af1 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -661,7 +661,13 @@ module Gitlab end def rm_tag(tag_name, user:) - OperationService.new(user, self).rm_tag(find_tag(tag_name)) + gitaly_migrate(:operation_user_delete_tag) do |is_enabled| + if is_enabled + gitaly_operations_client.rm_tag(tag_name, user) + else + Gitlab::Git::OperationService.new(user, self).rm_tag(find_tag(tag_name)) + end + end end def find_tag(name) @@ -1033,6 +1039,10 @@ module Gitlab Gitlab::GitalyClient::Util.repository(@storage, @relative_path) end + def gitaly_operations_client + @gitaly_operations_client ||= Gitlab::GitalyClient::OperationService.new(self) + end + def gitaly_ref_client @gitaly_ref_client ||= Gitlab::GitalyClient::RefService.new(self) end diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb new file mode 100644 index 00000000000..cdb37e96057 --- /dev/null +++ b/lib/gitlab/gitaly_client/operation_service.rb @@ -0,0 +1,24 @@ +module Gitlab + module GitalyClient + class OperationService + def initialize(repository) + @gitaly_repo = repository.gitaly_repository + @repository = repository + end + + def rm_tag(tag_name, user) + request = Gitaly::UserDeleteTagRequest.new( + repository: @gitaly_repo, + tag_name: GitalyClient.encode(tag_name), + user: Util.gitaly_user(user) + ) + + response = GitalyClient.call(@repository.storage, :operation_service, :user_delete_tag, request) + + if pre_receive_error = response.pre_receive_error.presence + raise Gitlab::Git::HooksService::PreReceiveError, pre_receive_error + end + end + end + end +end diff --git a/lib/gitlab/gitaly_client/util.rb b/lib/gitlab/gitaly_client/util.rb index 8fc937496af..554166a8a9e 100644 --- a/lib/gitlab/gitaly_client/util.rb +++ b/lib/gitlab/gitaly_client/util.rb @@ -10,6 +10,16 @@ module Gitlab git_alternate_object_directories: Array.wrap(Gitlab::Git::Env['GIT_ALTERNATE_OBJECT_DIRECTORIES']) ) end + + def gitaly_user(gitlab_user) + return unless gitlab_user + + Gitaly::User.new( + gl_id: Gitlab::GlId.gl_id(gitlab_user), + name: GitalyClient.encode(gitlab_user.name), + email: GitalyClient.encode(gitlab_user.email) + ) + end end end end diff --git a/spec/features/tags/master_deletes_tag_spec.rb b/spec/features/tags/master_deletes_tag_spec.rb index d6a6b8fc7d5..80750c904b5 100644 --- a/spec/features/tags/master_deletes_tag_spec.rb +++ b/spec/features/tags/master_deletes_tag_spec.rb @@ -35,15 +35,30 @@ feature 'Master deletes tag' do end context 'when pre-receive hook fails', js: true do - before do - allow_any_instance_of(Gitlab::Git::HooksService).to receive(:execute) - .and_raise(Gitlab::Git::HooksService::PreReceiveError, 'Do not delete tags') + context 'when Gitaly operation_user_delete_tag feature is enabled' do + before do + allow_any_instance_of(Gitlab::GitalyClient::OperationService).to receive(:rm_tag) + .and_raise(Gitlab::Git::HooksService::PreReceiveError, 'Do not delete tags') + end + + scenario 'shows the error message' do + delete_first_tag + + expect(page).to have_content('Do not delete tags') + end end - scenario 'shows the error message' do - delete_first_tag + context 'when Gitaly operation_user_delete_tag feature is disabled', skip_gitaly_mock: true do + before do + allow_any_instance_of(Gitlab::Git::HooksService).to receive(:execute) + .and_raise(Gitlab::Git::HooksService::PreReceiveError, 'Do not delete tags') + end + + scenario 'shows the error message' do + delete_first_tag - expect(page).to have_content('Do not delete tags') + expect(page).to have_content('Do not delete tags') + end end end diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb index 699184ad9fe..a333ae33972 100644 --- a/spec/lib/gitlab/workhorse_spec.rb +++ b/spec/lib/gitlab/workhorse_spec.rb @@ -218,7 +218,8 @@ describe Gitlab::Workhorse do storage_name: 'default', relative_path: project.full_path + '.git', git_object_directory: '', - git_alternate_object_directories: [] + git_alternate_object_directories: [], + gl_repository: '' } } expect(subject).to include(repo_param) diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 76bb658b10d..036545a5563 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1682,12 +1682,22 @@ describe Repository, models: true do end describe '#rm_tag' do - it 'removes a tag' do - expect(repository).to receive(:before_remove_tag) + shared_examples 'removing tag' do + it 'removes a tag' do + expect(repository).to receive(:before_remove_tag) - repository.rm_tag(create(:user), 'v1.1.0') + repository.rm_tag(build_stubbed(:user), 'v1.1.0') - expect(repository.find_tag('v1.1.0')).to be_nil + expect(repository.find_tag('v1.1.0')).to be_nil + end + end + + context 'when Gitaly operation_user_delete_tag feature is enabled' do + it_behaves_like 'removing tag' + end + + context 'when Gitaly operation_user_delete_tag feature is disabled', skip_gitaly_mock: true do + it_behaves_like 'removing tag' end end -- cgit v1.2.1 From 4f5be9ec7bfd4813eaac630c9232cd5335a5076b Mon Sep 17 00:00:00 2001 From: Ahmad Sherif Date: Mon, 25 Sep 2017 22:01:04 +0200 Subject: Migrate Gitlab::Git::Repository#add_tag to Gitaly Closes gitaly#601 --- app/services/tags/create_service.rb | 2 +- lib/gitlab/git/repository.rb | 51 ++++++++++++++++++--------- lib/gitlab/gitaly_client/operation_service.rb | 21 +++++++++++ lib/gitlab/gitaly_client/ref_service.rb | 14 +------- lib/gitlab/gitaly_client/util.rb | 14 ++++++++ spec/models/repository_spec.rb | 50 +++++++++++++++----------- spec/services/tags/create_service_spec.rb | 2 +- 7 files changed, 101 insertions(+), 53 deletions(-) diff --git a/app/services/tags/create_service.rb b/app/services/tags/create_service.rb index b3f4a72d6fe..cc76d0df3a1 100644 --- a/app/services/tags/create_service.rb +++ b/app/services/tags/create_service.rb @@ -11,7 +11,7 @@ module Tags begin new_tag = repository.add_tag(current_user, tag_name, target, message) - rescue Rugged::TagError + rescue Gitlab::Git::Repository::TagExistsError return error("Tag #{tag_name} already exists") rescue Gitlab::Git::HooksService::PreReceiveError => ex return error(ex.message) diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 32370a8f0e1..6d710ffe2bb 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -20,6 +20,7 @@ module Gitlab GitError = Class.new(StandardError) DeleteBranchError = Class.new(StandardError) CreateTreeError = Class.new(StandardError) + TagExistsError = Class.new(StandardError) class << self # Unlike `new`, `create` takes the storage path, not the storage name @@ -646,24 +647,13 @@ module Gitlab end def add_tag(tag_name, user:, target:, message: nil) - target_object = Ref.dereference_object(lookup(target)) - raise InvalidRef.new("target not found: #{target}") unless target_object - - user = Gitlab::Git::User.from_gitlab(user) unless user.respond_to?(:gl_id) - - options = nil # Use nil, not the empty hash. Rugged cares about this. - if message - options = { - message: message, - tagger: Gitlab::Git.committer_hash(email: user.email, name: user.name) - } + gitaly_migrate(:operation_user_add_tag) do |is_enabled| + if is_enabled + gitaly_add_tag(tag_name, user: user, target: target, message: message) + else + rugged_add_tag(tag_name, user: user, target: target, message: message) + end end - - OperationService.new(user, self).add_tag(tag_name, target_object.oid, options) - - find_tag(tag_name) - rescue Rugged::ReferenceError => ex - raise InvalidRef, ex end def rm_branch(branch_name, user:) @@ -1392,6 +1382,33 @@ module Gitlab false end + def gitaly_add_tag(tag_name, user:, target:, message: nil) + gitaly_operations_client.add_tag(tag_name, user, target, message) + end + + def rugged_add_tag(tag_name, user:, target:, message: nil) + target_object = Ref.dereference_object(lookup(target)) + raise InvalidRef.new("target not found: #{target}") unless target_object + + user = Gitlab::Git::User.from_gitlab(user) unless user.respond_to?(:gl_id) + + options = nil # Use nil, not the empty hash. Rugged cares about this. + if message + options = { + message: message, + tagger: Gitlab::Git.committer_hash(email: user.email, name: user.name) + } + end + + Gitlab::Git::OperationService.new(user, self).add_tag(tag_name, target_object.oid, options) + + find_tag(tag_name) + rescue Rugged::ReferenceError => ex + raise InvalidRef, ex + rescue Rugged::TagError + raise TagExistsError + end + def rugged_create_branch(ref, start_point) rugged_ref = rugged.branches.create(ref, start_point) target_commit = Gitlab::Git::Commit.find(self, rugged_ref.target) diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb index cdb37e96057..2d5440e7ea8 100644 --- a/lib/gitlab/gitaly_client/operation_service.rb +++ b/lib/gitlab/gitaly_client/operation_service.rb @@ -19,6 +19,27 @@ module Gitlab raise Gitlab::Git::HooksService::PreReceiveError, pre_receive_error end end + + def add_tag(tag_name, user, target, message) + request = Gitaly::UserCreateTagRequest.new( + repository: @gitaly_repo, + user: Util.gitaly_user(user), + tag_name: GitalyClient.encode(tag_name), + target_revision: GitalyClient.encode(target), + message: GitalyClient.encode(message.to_s) + ) + + response = GitalyClient.call(@repository.storage, :operation_service, :user_create_tag, request) + if pre_receive_error = response.pre_receive_error.presence + raise Gitlab::Git::HooksService::PreReceiveError, pre_receive_error + elsif response.exists + raise Gitlab::Git::Repository::TagExistsError + end + + Util.gitlab_tag_from_gitaly_tag(@repository, response.tag) + rescue GRPC::FailedPrecondition => e + raise Gitlab::Git::Repository::InvalidRef, e + end end end end diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb index 8ef873d5848..b0c73395cb1 100644 --- a/lib/gitlab/gitaly_client/ref_service.rb +++ b/lib/gitlab/gitaly_client/ref_service.rb @@ -155,19 +155,7 @@ module Gitlab def consume_tags_response(response) response.flat_map do |message| - message.tags.map do |gitaly_tag| - if gitaly_tag.target_commit.present? - gitaly_commit = Gitlab::Git::Commit.decorate(@repository, gitaly_tag.target_commit) - end - - Gitlab::Git::Tag.new( - @repository, - encode!(gitaly_tag.name.dup), - gitaly_tag.id, - gitaly_commit, - encode!(gitaly_tag.message.chomp) - ) - end + message.tags.map { |gitaly_tag| Util.gitlab_tag_from_gitaly_tag(@repository, gitaly_tag) } end end diff --git a/lib/gitlab/gitaly_client/util.rb b/lib/gitlab/gitaly_client/util.rb index 554166a8a9e..2fb5875a7a2 100644 --- a/lib/gitlab/gitaly_client/util.rb +++ b/lib/gitlab/gitaly_client/util.rb @@ -20,6 +20,20 @@ module Gitlab email: GitalyClient.encode(gitlab_user.email) ) end + + def gitlab_tag_from_gitaly_tag(repository, gitaly_tag) + if gitaly_tag.target_commit.present? + commit = Gitlab::Git::Commit.decorate(repository, gitaly_tag.target_commit) + end + + Gitlab::Git::Tag.new( + repository, + Gitlab::EncodingHelper.encode!(gitaly_tag.name.dup), + gitaly_tag.id, + commit, + Gitlab::EncodingHelper.encode!(gitaly_tag.message.chomp) + ) + end end end end diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index e63977adec8..525c4027e5f 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1617,27 +1617,41 @@ describe Repository do end describe '#add_tag' do - context 'with a valid target' do - let(:user) { build_stubbed(:user) } + let(:user) { build_stubbed(:user) } - it 'creates the tag using rugged' do - expect(repository.rugged.tags).to receive(:create) - .with('8.5', repository.commit('master').id, - hash_including(message: 'foo', - tagger: hash_including(name: user.name, email: user.email))) - .and_call_original + shared_examples 'adding tag' do + context 'with a valid target' do + it 'creates the tag' do + repository.add_tag(user, '8.5', 'master', 'foo') - repository.add_tag(user, '8.5', 'master', 'foo') - end + tag = repository.find_tag('8.5') + expect(tag).to be_present + expect(tag.message).to eq('foo') + expect(tag.dereferenced_target.id).to eq(repository.commit('master').id) + end - it 'returns a Gitlab::Git::Tag object' do - tag = repository.add_tag(user, '8.5', 'master', 'foo') + it 'returns a Gitlab::Git::Tag object' do + tag = repository.add_tag(user, '8.5', 'master', 'foo') + + expect(tag).to be_a(Gitlab::Git::Tag) + end + end - expect(tag).to be_a(Gitlab::Git::Tag) + context 'with an invalid target' do + it 'returns false' do + expect(repository.add_tag(user, '8.5', 'bar', 'foo')).to be false + end end + end - it 'passes commit SHA to pre-receive and update hooks,\ - and tag SHA to post-receive hook' do + context 'when Gitaly operation_user_add_tag feature is enabled' do + it_behaves_like 'adding tag' + end + + context 'when Gitaly operation_user_add_tag feature is disabled', skip_gitaly_mock: true do + it_behaves_like 'adding tag' + + it 'passes commit SHA to pre-receive and update hooks and tag SHA to post-receive hook' do pre_receive_hook = Gitlab::Git::Hook.new('pre-receive', project) update_hook = Gitlab::Git::Hook.new('update', project) post_receive_hook = Gitlab::Git::Hook.new('post-receive', project) @@ -1662,12 +1676,6 @@ describe Repository do .with(anything, anything, tag_sha, anything) end end - - context 'with an invalid target' do - it 'returns false' do - expect(repository.add_tag(user, '8.5', 'bar', 'foo')).to be false - end - end end describe '#rm_branch' do diff --git a/spec/services/tags/create_service_spec.rb b/spec/services/tags/create_service_spec.rb index 57013b54560..e7e9080b6b0 100644 --- a/spec/services/tags/create_service_spec.rb +++ b/spec/services/tags/create_service_spec.rb @@ -28,7 +28,7 @@ describe Tags::CreateService do it 'returns an error' do expect(repository).to receive(:add_tag) .with(user, 'v1.1.0', 'master', 'Foo') - .and_raise(Rugged::TagError) + .and_raise(Gitlab::Git::Repository::TagExistsError) response = service.execute('v1.1.0', 'master', 'Foo') -- cgit v1.2.1 From 42218fcaa73c1f19d548b88dfe2aabb296d8e423 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 28 Sep 2017 21:24:14 -0400 Subject: Fix karma test --- spec/javascripts/repo/components/repo_edit_button_spec.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/javascripts/repo/components/repo_edit_button_spec.js b/spec/javascripts/repo/components/repo_edit_button_spec.js index 29dc2d21e4b..411514009dc 100644 --- a/spec/javascripts/repo/components/repo_edit_button_spec.js +++ b/spec/javascripts/repo/components/repo_edit_button_spec.js @@ -21,13 +21,11 @@ describe('RepoEditButton', () => { expect(vm.$el.textContent).toMatch('Edit'); spyOn(vm, 'editCancelClicked').and.callThrough(); - spyOn(vm, 'toggleProjectRefsForm'); vm.$el.click(); Vue.nextTick(() => { expect(vm.editCancelClicked).toHaveBeenCalled(); - expect(vm.toggleProjectRefsForm).toHaveBeenCalled(); expect(vm.$el.textContent).toMatch('Cancel edit'); done(); }); -- cgit v1.2.1 From a94f2ea915f9a15c8d9ce1a7d7b5fbe6b76fee40 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 28 Sep 2017 21:38:14 -0400 Subject: Fix static analysis. --- app/assets/javascripts/repo/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/repo/index.js b/app/assets/javascripts/repo/index.js index b32939336c0..7d0123e3d3a 100644 --- a/app/assets/javascripts/repo/index.js +++ b/app/assets/javascripts/repo/index.js @@ -11,7 +11,6 @@ function initDropdowns() { } function addEventsForNonVueEls() { - window.onbeforeunload = function confirmUnload(e) { const hasChanged = Store.openedFiles .some(file => file.changed); -- cgit v1.2.1 From 0647484c616398858e4c04a577fb557d34685895 Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Fri, 29 Sep 2017 09:59:09 +0200 Subject: Added Test for PageTitle / Removed Gitlab Part from TItle --- app/assets/javascripts/repo/helpers/repo_helper.js | 2 +- spec/javascripts/repo/components/repo_file_spec.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/repo/helpers/repo_helper.js b/app/assets/javascripts/repo/helpers/repo_helper.js index 3603a66c6cd..8498be3ac92 100644 --- a/app/assets/javascripts/repo/helpers/repo_helper.js +++ b/app/assets/javascripts/repo/helpers/repo_helper.js @@ -257,7 +257,7 @@ const RepoHelper = { history.pushState({ key: RepoHelper.key }, '', url); if (title) { - document.title = `${title} · GitLab`; + document.title = `${title}`; } }, diff --git a/spec/javascripts/repo/components/repo_file_spec.js b/spec/javascripts/repo/components/repo_file_spec.js index 518a2d25ecf..f3f4fb94839 100644 --- a/spec/javascripts/repo/components/repo_file_spec.js +++ b/spec/javascripts/repo/components/repo_file_spec.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import repoFile from '~/repo/components/repo_file.vue'; +import RepoStore from '~/repo/stores/repo_store'; describe('RepoFile', () => { const updated = 'updated'; @@ -7,12 +8,14 @@ describe('RepoFile', () => { icon: 'icon', url: 'url', name: 'name', + pageTitle: 'pageTitle', lastCommitMessage: 'message', lastCommitUpdate: Date.now(), level: 10, }; const activeFile = { url: 'url', + pageTitle: 'pageTitle', }; function createComponent(propsData) { @@ -32,6 +35,7 @@ describe('RepoFile', () => { file, activeFile, }); + RepoStore.setActiveFiles(activeFile); const name = vm.$el.querySelector('.repo-file-name'); const fileIcon = vm.$el.querySelector('.file-icon'); @@ -40,6 +44,7 @@ describe('RepoFile', () => { expect(name.title).toEqual(file.url); expect(name.href).toMatch(`/${file.url}`); expect(name.textContent.trim()).toEqual(file.name); + expect(document.title.trim()).toEqual(file.pageTitle); expect(vm.$el.querySelector('.commit-message').textContent.trim()).toBe(file.lastCommitMessage); expect(vm.$el.querySelector('.commit-update').textContent.trim()).toBe(updated); expect(fileIcon.classList.contains(file.icon)).toBeTruthy(); -- cgit v1.2.1 From 333cb069afbef282618464206d8af50e8fd46cf7 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 28 Sep 2017 16:13:21 +0100 Subject: Fixed anchored content not being scrolled into view Correctly scrolls anchored content into view when the user loads the page. This is most obvious when the user loads a link note in a merge request & the page does not scroll down to the note. Closes #38326 --- app/assets/javascripts/lib/utils/common_utils.js | 27 +++++------ spec/javascripts/lib/utils/common_utils_spec.js | 60 ++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js index ea2d61af9be..423a25fbdfa 100644 --- a/app/assets/javascripts/lib/utils/common_utils.js +++ b/app/assets/javascripts/lib/utils/common_utils.js @@ -71,6 +71,7 @@ export const handleLocationHash = () => { // This is required to handle non-unicode characters in hash hash = decodeURIComponent(hash); + const target = document.getElementById(hash) || document.getElementById(`user-content-${hash}`); const fixedTabs = document.querySelector('.js-tabs-affix'); const fixedDiffStats = document.querySelector('.js-diff-files-changed.is-stuck'); const fixedNav = document.querySelector('.navbar-gitlab'); @@ -78,25 +79,19 @@ export const handleLocationHash = () => { let adjustment = 0; if (fixedNav) adjustment -= fixedNav.offsetHeight; - // scroll to user-generated markdown anchor if we cannot find a match - if (document.getElementById(hash) === null) { - const target = document.getElementById(`user-content-${hash}`); - if (target && target.scrollIntoView) { - target.scrollIntoView(true); - window.scrollBy(0, adjustment); - } - } else { - // only adjust for fixedTabs when not targeting user-generated content - if (fixedTabs) { - adjustment -= fixedTabs.offsetHeight; - } + if (target && target.scrollIntoView) { + target.scrollIntoView(true); + } - if (fixedDiffStats) { - adjustment -= fixedDiffStats.offsetHeight; - } + if (fixedTabs) { + adjustment -= fixedTabs.offsetHeight; + } - window.scrollBy(0, adjustment); + if (fixedDiffStats) { + adjustment -= fixedDiffStats.offsetHeight; } + + window.scrollBy(0, adjustment); }; // Check if element scrolled into viewport from above or below diff --git a/spec/javascripts/lib/utils/common_utils_spec.js b/spec/javascripts/lib/utils/common_utils_spec.js index 787b405de47..03c02ea06a8 100644 --- a/spec/javascripts/lib/utils/common_utils_spec.js +++ b/spec/javascripts/lib/utils/common_utils_spec.js @@ -84,6 +84,66 @@ describe('common_utils', () => { expectGetElementIdToHaveBeenCalledWith('definição'); expectGetElementIdToHaveBeenCalledWith('user-content-definição'); }); + + it('scrolls element into view', () => { + document.body.innerHTML += ` +
+
+
+
+ `; + const elTop = document.getElementById('test').getBoundingClientRect().top; + + window.history.pushState({}, null, '#test'); + commonUtils.handleLocationHash(); + + expectGetElementIdToHaveBeenCalledWith('test'); + expect(window.scrollY).toBe(elTop); + + document.getElementById('parent').remove(); + }); + + it('scrolls user content element into view', () => { + document.body.innerHTML += ` +
+
+
+
+ `; + const elTop = document.getElementById('user-content-test').getBoundingClientRect().top; + + window.history.pushState({}, null, '#test'); + commonUtils.handleLocationHash(); + + expectGetElementIdToHaveBeenCalledWith('test'); + expectGetElementIdToHaveBeenCalledWith('user-content-test'); + expect(window.scrollY).toBe(elTop); + + document.getElementById('parent').remove(); + }); + + it('scrolls to element with offset from navbar', () => { + spyOn(window, 'scrollBy').and.callThrough(); + document.body.innerHTML += ` +
+ +
+
+
+ `; + + const elTop = document.getElementById('user-content-test').getBoundingClientRect().top; + + window.history.pushState({}, null, '#test'); + commonUtils.handleLocationHash(); + + expectGetElementIdToHaveBeenCalledWith('test'); + expectGetElementIdToHaveBeenCalledWith('user-content-test'); + expect(window.scrollY).toBe(elTop - 50); + expect(window.scrollBy).toHaveBeenCalledWith(0, -50); + + document.getElementById('parent').remove(); + }); }); describe('setParamInURL', () => { -- cgit v1.2.1 From 2c9ca4f1e021c15224eeeb21f1e8594924773572 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 28 Sep 2017 16:16:22 +0100 Subject: CHANGELOG item --- changelogs/unreleased/hash-mr-scroll-load.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelogs/unreleased/hash-mr-scroll-load.yml diff --git a/changelogs/unreleased/hash-mr-scroll-load.yml b/changelogs/unreleased/hash-mr-scroll-load.yml new file mode 100644 index 00000000000..7e3965add03 --- /dev/null +++ b/changelogs/unreleased/hash-mr-scroll-load.yml @@ -0,0 +1,5 @@ +--- +title: Fixed notes not being scrolled to in merge requests +merge_request: +author: +type: fixed -- cgit v1.2.1 From 6e6e0c045368ab40f1a7c39d15a234ef509b9155 Mon Sep 17 00:00:00 2001 From: Fabio Busatto Date: Fri, 29 Sep 2017 08:38:45 +0000 Subject: Fix Auto DevOps banner feature flag --- doc/topics/autodevops/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md index 0b7c11ea700..5561784ed0b 100644 --- a/doc/topics/autodevops/index.md +++ b/doc/topics/autodevops/index.md @@ -511,7 +511,7 @@ sudo gitlab-rails console Then run: ```ruby -Feature.get(:auto_devops_banner_disabled).disable +Feature.get(:auto_devops_banner_disabled).enable ``` Or through the HTTP API with an admin access token: -- cgit v1.2.1 From d729aa73836c4b74b09a8b84ad97694ee858f34c Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 29 Sep 2017 09:40:21 +0100 Subject: spec fix --- spec/javascripts/lib/utils/common_utils_spec.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/spec/javascripts/lib/utils/common_utils_spec.js b/spec/javascripts/lib/utils/common_utils_spec.js index 03c02ea06a8..f86f2f260c3 100644 --- a/spec/javascripts/lib/utils/common_utils_spec.js +++ b/spec/javascripts/lib/utils/common_utils_spec.js @@ -92,13 +92,12 @@ describe('common_utils', () => {
`; - const elTop = document.getElementById('test').getBoundingClientRect().top; window.history.pushState({}, null, '#test'); commonUtils.handleLocationHash(); expectGetElementIdToHaveBeenCalledWith('test'); - expect(window.scrollY).toBe(elTop); + expect(window.scrollY).toBe(document.getElementById('test').offsetTop); document.getElementById('parent').remove(); }); @@ -110,14 +109,13 @@ describe('common_utils', () => {
`; - const elTop = document.getElementById('user-content-test').getBoundingClientRect().top; window.history.pushState({}, null, '#test'); commonUtils.handleLocationHash(); expectGetElementIdToHaveBeenCalledWith('test'); expectGetElementIdToHaveBeenCalledWith('user-content-test'); - expect(window.scrollY).toBe(elTop); + expect(window.scrollY).toBe(document.getElementById('user-content-test').offsetTop); document.getElementById('parent').remove(); }); @@ -132,14 +130,12 @@ describe('common_utils', () => { `; - const elTop = document.getElementById('user-content-test').getBoundingClientRect().top; - window.history.pushState({}, null, '#test'); commonUtils.handleLocationHash(); expectGetElementIdToHaveBeenCalledWith('test'); expectGetElementIdToHaveBeenCalledWith('user-content-test'); - expect(window.scrollY).toBe(elTop - 50); + expect(window.scrollY).toBe(document.getElementById('user-content-test').offsetTop - 50); expect(window.scrollBy).toHaveBeenCalledWith(0, -50); document.getElementById('parent').remove(); -- cgit v1.2.1 From 8585ae61e730a48fc0688417b24279c48b59dada Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 28 Sep 2017 11:44:33 +0100 Subject: Fix fork button being disabled for users who can fork to group Previously the fork button was disabled for all users if they have exceeded their project limit. This fixes that by changing the check to see if the user can fork to a group instead of their own namespace. This behaviour is already possible by visiting the new fork page directly, so this just fixes the button being disabled. Closes #38462 --- app/assets/javascripts/dispatcher.js | 5 +- app/assets/javascripts/main.js | 1 - app/assets/javascripts/project_fork.js | 19 +++----- app/assets/stylesheets/pages/projects.scss | 11 ++++- app/views/projects/buttons/_fork.html.haml | 9 ++-- app/views/projects/forks/new.html.haml | 11 +++-- .../unreleased/fork-btn-enabled-user-groups.yml | 5 ++ spec/features/projects/fork_spec.rb | 57 ++++++++++++++++++++++ 8 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 changelogs/unreleased/fork-btn-enabled-user-groups.yml create mode 100644 spec/features/projects/fork_spec.rb diff --git a/app/assets/javascripts/dispatcher.js b/app/assets/javascripts/dispatcher.js index 31214818496..bbaa4e4d91e 100644 --- a/app/assets/javascripts/dispatcher.js +++ b/app/assets/javascripts/dispatcher.js @@ -14,7 +14,6 @@ /* global NotificationsDropdown */ /* global GroupAvatar */ /* global LineHighlighter */ -/* global ProjectFork */ /* global BuildArtifacts */ /* global GroupsSelect */ /* global Search */ @@ -476,7 +475,9 @@ import { ajaxGet, convertPermissionToBoolean } from './lib/utils/common_utils'; shortcut_handler = true; break; case 'projects:forks:new': - new ProjectFork(); + import(/* webpackChunkName: 'project_fork' */ './project_fork') + .then(fork => fork.default()) + .catch(() => {}); break; case 'projects:artifacts:browse': new ShortcutsNavigation(); diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js index 3b8e2c5b2f3..24abc5c5c9e 100644 --- a/app/assets/javascripts/main.js +++ b/app/assets/javascripts/main.js @@ -124,7 +124,6 @@ import './preview_markdown'; import './project'; import './project_avatar'; import './project_find_file'; -import './project_fork'; import './project_import'; import './project_label_subscription'; import './project_new'; diff --git a/app/assets/javascripts/project_fork.js b/app/assets/javascripts/project_fork.js index 47197db39d3..68cf47fd54e 100644 --- a/app/assets/javascripts/project_fork.js +++ b/app/assets/javascripts/project_fork.js @@ -1,13 +1,8 @@ -/* eslint-disable func-names, space-before-function-paren, wrap-iife, prefer-arrow-callback, max-len */ -(function() { - this.ProjectFork = (function() { - function ProjectFork() { - $('.fork-thumbnail a').on('click', function() { - $('.fork-namespaces').hide(); - return $('.save-project-loader').show(); - }); - } +export default () => { + $('.fork-thumbnail a').on('click', function forkThumbnailClicked() { + if ($(this).hasClass('disabled')) return false; - return ProjectFork; - })(); -}).call(window); + $('.fork-namespaces').hide(); + return $('.save-project-loader').show(); + }); +}; diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 6400b72742c..1f7b6703909 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -516,7 +516,7 @@ a.deploy-project-label { text-align: center; width: 169px; - &:hover, + &:hover:not(.disabled), &.forked { background-color: $row-hover; border-color: $row-hover-border; @@ -543,6 +543,15 @@ a.deploy-project-label { padding-top: $gl-padding; color: $gl-text-color; + &.disabled { + opacity: .3; + cursor: not-allowed; + + &:hover { + text-decoration: none; + } + } + .caption { min-height: 30px; padding: $gl-padding 0; diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml index f45cc7f0f45..840b5ce1f84 100644 --- a/app/views/projects/buttons/_fork.html.haml +++ b/app/views/projects/buttons/_fork.html.haml @@ -4,12 +4,11 @@ = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: _('Go to your fork'), class: 'btn has-tooltip' do = custom_icon('icon_fork') %span= s_('GoToYourFork|Fork') - - elsif !current_user.can_create_project? - = link_to new_project_fork_path(@project), title: _('You have reached your project limit'), class: 'btn has-tooltip disabled' do - = custom_icon('icon_fork') - %span= s_('CreateNewFork|Fork') - else - = link_to new_project_fork_path(@project), class: 'btn' do + - can_fork = current_user.can_create_project? || current_user.manageable_namespaces.count > 1 + = link_to new_project_fork_path(@project), + class: "btn btn-default #{'has-tooltip disabled' unless can_fork}", + title: (_('You have reached your project limit') unless can_fork) do = custom_icon('icon_fork') %span= s_('CreateNewFork|Fork') .count-with-arrow diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index 0f36e1a7353..008de97d6d3 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -1,4 +1,5 @@ - page_title "Fork project" +- can_create_project = current_user.can_create_project? .row.prepend-top-default .col-lg-3 @@ -13,7 +14,7 @@ - if @namespaces.present? %label.label-light %span - Click to fork the project to a user or group + #{ "Click to fork the project to a #{'user or' if can_create_project} group" } - @namespaces.in_groups_of(6, false) do |group| .row - group.each do |namespace| @@ -29,8 +30,12 @@ .caption = namespace.human_name - else - .fork-thumbnail - = link_to project_forks_path(@project, namespace_key: namespace.id), method: "POST" do + - is_disabled = namespace.kind === 'user' && !can_create_project + .fork-thumbnail{ class: ("disabled" if is_disabled) } + = link_to project_forks_path(@project, namespace_key: namespace.id), + method: "POST", + class: ("disabled has-tooltip" if is_disabled), + title: (_('You have reached your project limit') if is_disabled) do - if /no_((\w*)_)*avatar/.match(avatar) .no-avatar = icon 'question' diff --git a/changelogs/unreleased/fork-btn-enabled-user-groups.yml b/changelogs/unreleased/fork-btn-enabled-user-groups.yml new file mode 100644 index 00000000000..3bd7581a961 --- /dev/null +++ b/changelogs/unreleased/fork-btn-enabled-user-groups.yml @@ -0,0 +1,5 @@ +--- +title: Fixed fork button being disabled for users who can fork to a group +merge_request: +author: +type: fixed diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb new file mode 100644 index 00000000000..e10d29e5eea --- /dev/null +++ b/spec/features/projects/fork_spec.rb @@ -0,0 +1,57 @@ +require 'spec_helper' + +describe 'Project fork' do + let(:user) { create(:user) } + let(:project) { create(:project, :public, :repository) } + + before do + sign_in user + end + + it 'allows user to fork project' do + visit project_path(project) + + expect(page).not_to have_css('a.disabled', text: 'Fork') + end + + it 'disables fork button when user has exceeded project limit' do + user.projects_limit = 0 + user.save! + + visit project_path(project) + + expect(page).to have_css('a.disabled', text: 'Fork') + end + + context 'master in group' do + before do + group = create(:group) + group.add_master(user) + end + + it 'allows user to fork project to group or to user namespace' do + visit project_path(project) + + expect(page).not_to have_css('a.disabled', text: 'Fork') + + click_link 'Fork' + + expect(page).to have_css('.fork-thumbnail', count: 2) + expect(page).not_to have_css('.fork-thumbnail.disabled') + end + + it 'allows user to fork project to group and not user when exceeded project limit' do + user.projects_limit = 0 + user.save! + + visit project_path(project) + + expect(page).not_to have_css('a.disabled', text: 'Fork') + + click_link 'Fork' + + expect(page).to have_css('.fork-thumbnail', count: 2) + expect(page).to have_css('.fork-thumbnail.disabled') + end + end +end -- cgit v1.2.1 From 917194153f066556e0ebff92f9c1486144948535 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Fri, 18 Aug 2017 12:33:29 +0100 Subject: Insert at most 1,000 rows at once in MR diff background migration We were hitting the statement timeout for very large MR diffs. Now we insert at most 1,000 rows to `merge_request_diff_commits` in a single statement, or 100 rows to `merge_request_diff_files`. --- .../deserialize_merge_request_diffs_and_commits.rb | 12 ++++++-- ...rialize_merge_request_diffs_and_commits_spec.rb | 32 ++++++++++++++++++++-- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb b/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb index 3fde1b09efb..6f1fd0a333d 100644 --- a/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb +++ b/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb @@ -8,6 +8,7 @@ module Gitlab end BUFFER_ROWS = 1000 + DIFF_FILE_BUFFER_ROWS = 100 def perform(start_id, stop_id) merge_request_diffs = MergeRequestDiff @@ -26,7 +27,7 @@ module Gitlab if diff_ids.length > BUFFER_ROWS || commit_rows.length > BUFFER_ROWS || - file_rows.length > BUFFER_ROWS + file_rows.length > DIFF_FILE_BUFFER_ROWS flush_buffers! end @@ -46,8 +47,13 @@ module Gitlab def flush_buffers! if diff_ids.any? MergeRequestDiff.transaction do - Gitlab::Database.bulk_insert('merge_request_diff_commits', commit_rows) - Gitlab::Database.bulk_insert('merge_request_diff_files', file_rows) + commit_rows.each_slice(BUFFER_ROWS).each do |commit_rows_slice| + Gitlab::Database.bulk_insert('merge_request_diff_commits', commit_rows_slice) + end + + file_rows.each_slice(DIFF_FILE_BUFFER_ROWS).each do |file_rows_slice| + Gitlab::Database.bulk_insert('merge_request_diff_files', file_rows_slice) + end MergeRequestDiff.where(id: diff_ids).update_all(st_commits: nil, st_diffs: nil) end diff --git a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb index c0427639746..117a6f8a5bb 100644 --- a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb +++ b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb @@ -70,8 +70,8 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits do before do merge_request.reload_diff(true) - convert_to_yaml(start_id, merge_request_diff.commits, merge_request_diff.diffs) - convert_to_yaml(stop_id, updated_merge_request_diff.commits, updated_merge_request_diff.diffs) + convert_to_yaml(start_id, merge_request_diff.commits, diffs_to_hashes(merge_request_diff.merge_request_diff_files)) + convert_to_yaml(stop_id, updated_merge_request_diff.commits, diffs_to_hashes(updated_merge_request_diff.merge_request_diff_files)) MergeRequestDiffCommit.delete_all MergeRequestDiffFile.delete_all @@ -80,6 +80,8 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits do context 'when BUFFER_ROWS is exceeded' do before do stub_const("#{described_class}::BUFFER_ROWS", 1) + + allow(Gitlab::Database).to receive(:bulk_insert).and_call_original end it 'updates and continues' do @@ -87,6 +89,32 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits do subject.perform(start_id, stop_id) end + + it 'inserts commit rows in chunks of BUFFER_ROWS' do + # There are 29 commits in each diff, so we should have slices of 20 + 9 + 20 + 9. + stub_const("#{described_class}::BUFFER_ROWS", 20) + + expect(Gitlab::Database).to receive(:bulk_insert) + .with('merge_request_diff_commits', anything) + .exactly(4) + .times + .and_call_original + + subject.perform(start_id, stop_id) + end + + it 'inserts diff rows in chunks of DIFF_FILE_BUFFER_ROWS' do + # There are 20 files in each diff, so we should have slices of 20 + 20. + stub_const("#{described_class}::DIFF_FILE_BUFFER_ROWS", 20) + + expect(Gitlab::Database).to receive(:bulk_insert) + .with('merge_request_diff_files', anything) + .exactly(2) + .times + .and_call_original + + subject.perform(start_id, stop_id) + end end context 'when BUFFER_ROWS is not exceeded' do -- cgit v1.2.1 From 705a840d2e78bdb506575b0dc66677ae2fcad95e Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Fri, 29 Sep 2017 12:02:43 +0200 Subject: Not the Test will also work with other tests before --- app/assets/javascripts/repo/helpers/repo_helper.js | 2 +- spec/javascripts/repo/components/repo_file_spec.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/repo/helpers/repo_helper.js b/app/assets/javascripts/repo/helpers/repo_helper.js index 8498be3ac92..b5134c32711 100644 --- a/app/assets/javascripts/repo/helpers/repo_helper.js +++ b/app/assets/javascripts/repo/helpers/repo_helper.js @@ -257,7 +257,7 @@ const RepoHelper = { history.pushState({ key: RepoHelper.key }, '', url); if (title) { - document.title = `${title}`; + document.title = title; } }, diff --git a/spec/javascripts/repo/components/repo_file_spec.js b/spec/javascripts/repo/components/repo_file_spec.js index f3f4fb94839..c25e63b6dfc 100644 --- a/spec/javascripts/repo/components/repo_file_spec.js +++ b/spec/javascripts/repo/components/repo_file_spec.js @@ -14,7 +14,7 @@ describe('RepoFile', () => { level: 10, }; const activeFile = { - url: 'url', + url: 'activeUrl', pageTitle: 'pageTitle', }; @@ -31,11 +31,11 @@ describe('RepoFile', () => { }); it('renders link, icon, name and last commit details', () => { + RepoStore.setActiveFiles(activeFile); const vm = createComponent({ file, activeFile, }); - RepoStore.setActiveFiles(activeFile); const name = vm.$el.querySelector('.repo-file-name'); const fileIcon = vm.$el.querySelector('.file-icon'); @@ -44,7 +44,7 @@ describe('RepoFile', () => { expect(name.title).toEqual(file.url); expect(name.href).toMatch(`/${file.url}`); expect(name.textContent.trim()).toEqual(file.name); - expect(document.title.trim()).toEqual(file.pageTitle); + expect(document.title.trim()).toEqual(activeFile.pageTitle); expect(vm.$el.querySelector('.commit-message').textContent.trim()).toBe(file.lastCommitMessage); expect(vm.$el.querySelector('.commit-update').textContent.trim()).toBe(updated); expect(fileIcon.classList.contains(file.icon)).toBeTruthy(); -- cgit v1.2.1 From 5c17fe58fba1cb7f8c5edb336b4de0feaa6254ea Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Fri, 29 Sep 2017 12:41:00 +0200 Subject: FIxed the clearing icon + jumping of fluid nav bar --- app/assets/javascripts/search_autocomplete.js | 1 + app/assets/stylesheets/framework/new-nav.scss | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js index 38c9a71dd20..f15452ec683 100644 --- a/app/assets/javascripts/search_autocomplete.js +++ b/app/assets/javascripts/search_autocomplete.js @@ -287,6 +287,7 @@ import { isInGroupsPage, isInProjectPage, getGroupSlug, getProjectSlug } from '. onClearInputClick(e) { e.preventDefault(); + this.wrap.toggleClass('has-value', !!e.target.value); return this.searchInput.val('').focus(); } diff --git a/app/assets/stylesheets/framework/new-nav.scss b/app/assets/stylesheets/framework/new-nav.scss index 5e4619638e2..3abf3e4ac7d 100644 --- a/app/assets/stylesheets/framework/new-nav.scss +++ b/app/assets/stylesheets/framework/new-nav.scss @@ -120,7 +120,7 @@ header.navbar-gitlab-new { .container-fluid { .navbar-toggle { min-width: 45px; - padding: 4px $gl-padding; + padding: 0 $gl-padding; margin-right: -7px; text-align: center; color: currentColor; -- cgit v1.2.1 From 1507ff8ab7d6f59b58978ad7385cb74603002409 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Tue, 26 Sep 2017 15:09:37 +0100 Subject: Make MR diff background migration less likely to time out This version does not use transactions, but individual statements. As we have unique constraints on the target tables for the inserts, we can just ignore uniqueness violations there (as long as we always insert the same batch size, in the same order). This means the spec now must use truncation, not a transaction, as the uniqueness violation means that the whole transaction for that spec would be invalid, which isn't what we'd want. In real-world use, this isn't run in a transaction anyway. This commit also wraps unhandled exceptions, for easier finding in Sentry, and logs with a consistent format, for easier searching. --- .../deserialize_merge_request_diffs_and_commits.rb | 34 ++++++-- ...rialize_merge_request_diffs_and_commits_spec.rb | 98 +++++++++++++++++----- 2 files changed, 101 insertions(+), 31 deletions(-) diff --git a/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb b/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb index 6f1fd0a333d..8e5c95f2287 100644 --- a/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb +++ b/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits.rb @@ -3,6 +3,12 @@ module Gitlab class DeserializeMergeRequestDiffsAndCommits attr_reader :diff_ids, :commit_rows, :file_rows + class Error < StandardError + def backtrace + cause.backtrace + end + end + class MergeRequestDiff < ActiveRecord::Base self.table_name = 'merge_request_diffs' end @@ -34,6 +40,10 @@ module Gitlab end flush_buffers! + rescue => e + Rails.logger.info("#{self.class.name}: failed for IDs #{merge_request_diffs.map(&:id)} with #{e.class.name}") + + raise Error.new(e.inspect) end private @@ -46,22 +56,28 @@ module Gitlab def flush_buffers! if diff_ids.any? - MergeRequestDiff.transaction do - commit_rows.each_slice(BUFFER_ROWS).each do |commit_rows_slice| - Gitlab::Database.bulk_insert('merge_request_diff_commits', commit_rows_slice) - end - - file_rows.each_slice(DIFF_FILE_BUFFER_ROWS).each do |file_rows_slice| - Gitlab::Database.bulk_insert('merge_request_diff_files', file_rows_slice) - end + commit_rows.each_slice(BUFFER_ROWS).each do |commit_rows_slice| + bulk_insert('merge_request_diff_commits', commit_rows_slice) + end - MergeRequestDiff.where(id: diff_ids).update_all(st_commits: nil, st_diffs: nil) + file_rows.each_slice(DIFF_FILE_BUFFER_ROWS).each do |file_rows_slice| + bulk_insert('merge_request_diff_files', file_rows_slice) end + + MergeRequestDiff.where(id: diff_ids).update_all(st_commits: nil, st_diffs: nil) end reset_buffers! end + def bulk_insert(table, rows) + Gitlab::Database.bulk_insert(table, rows) + rescue ActiveRecord::RecordNotUnique + ids = rows.map { |row| row[:merge_request_diff_id] }.uniq.sort + + Rails.logger.info("#{self.class.name}: rows inserted twice for IDs #{ids}") + end + def single_diff_rows(merge_request_diff) sha_attribute = Gitlab::Database::ShaAttribute.new commits = YAML.load(merge_request_diff.st_commits) rescue [] diff --git a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb index 117a6f8a5bb..d2e7243ee05 100644 --- a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb +++ b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb @@ -1,9 +1,9 @@ require 'spec_helper' -describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits do +describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits, :truncate do describe '#perform' do - set(:merge_request) { create(:merge_request) } - set(:merge_request_diff) { merge_request.merge_request_diff } + let(:merge_request) { create(:merge_request) } + let(:merge_request_diff) { merge_request.merge_request_diff } let(:updated_merge_request_diff) { MergeRequestDiff.find(merge_request_diff.id) } def diffs_to_hashes(diffs) @@ -84,12 +84,6 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits do allow(Gitlab::Database).to receive(:bulk_insert).and_call_original end - it 'updates and continues' do - expect(described_class::MergeRequestDiff).to receive(:transaction).twice - - subject.perform(start_id, stop_id) - end - it 'inserts commit rows in chunks of BUFFER_ROWS' do # There are 29 commits in each diff, so we should have slices of 20 + 9 + 20 + 9. stub_const("#{described_class}::BUFFER_ROWS", 20) @@ -119,27 +113,87 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits do context 'when BUFFER_ROWS is not exceeded' do it 'only updates once' do - expect(described_class::MergeRequestDiff).to receive(:transaction).once + expect(Gitlab::Database).to receive(:bulk_insert) + .with('merge_request_diff_commits', anything) + .once + .and_call_original + + expect(Gitlab::Database).to receive(:bulk_insert) + .with('merge_request_diff_files', anything) + .once + .and_call_original subject.perform(start_id, stop_id) end end - end - context 'when the merge request diff update fails' do - before do - allow(described_class::MergeRequestDiff) - .to receive(:update_all).and_raise(ActiveRecord::Rollback) - end + context 'when some rows were already inserted due to a previous failure' do + before do + subject.perform(start_id, stop_id) - it 'does not add any diff commits' do - expect { subject.perform(merge_request_diff.id, merge_request_diff.id) } - .not_to change { MergeRequestDiffCommit.count } + convert_to_yaml(start_id, merge_request_diff.commits, diffs_to_hashes(merge_request_diff.merge_request_diff_files)) + convert_to_yaml(stop_id, updated_merge_request_diff.commits, diffs_to_hashes(updated_merge_request_diff.merge_request_diff_files)) + end + + it 'does not raise' do + expect { subject.perform(start_id, stop_id) }.not_to raise_exception + end + + it 'logs a message' do + expect(Rails.logger).to receive(:info) + .with( + a_string_matching(described_class.name).and(matching([start_id, stop_id].inspect)) + ) + .twice + + subject.perform(start_id, stop_id) + end + + it 'ends up with the correct rows' do + expect(updated_merge_request_diff.commits.count).to eq(29) + expect(updated_merge_request_diff.raw_diffs.count).to eq(20) + end end - it 'does not add any diff files' do - expect { subject.perform(merge_request_diff.id, merge_request_diff.id) } - .not_to change { MergeRequestDiffFile.count } + context 'when the merge request diff update fails' do + let(:exception) { ActiveRecord::RecordNotFound } + + let(:perform_ignoring_exceptions) do + begin + subject.perform(start_id, stop_id) + rescue described_class::Error + end + end + + before do + allow_any_instance_of(described_class::MergeRequestDiff::ActiveRecord_Relation) + .to receive(:update_all).and_raise(exception) + end + + it 'raises an error' do + expect { subject.perform(start_id, stop_id) } + .to raise_exception(described_class::Error) + end + + it 'logs the error' do + expect(Rails.logger).to receive(:info).with( + a_string_matching(described_class.name) + .and(matching([start_id, stop_id].inspect)) + .and(matching(exception.name)) + ) + + perform_ignoring_exceptions + end + + it 'still adds diff commits' do + expect { perform_ignoring_exceptions } + .to change { MergeRequestDiffCommit.count } + end + + it 'still adds diff files' do + expect { perform_ignoring_exceptions } + .to change { MergeRequestDiffFile.count } + end end end -- cgit v1.2.1 From 472be7fe611b726c065cc384259b75bb894ce19b Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Tue, 26 Sep 2017 15:26:26 +0100 Subject: Reschedule merge request diff background migration The first attempt didn't migrate all rows on GitLab.com, due to a couple of issues: 1. Some rows in merge_request_diffs had truly huge numbers of commits and diffs serialised - one in particular had 26,000 commits! 2. The jobs were sometimes on Sidekiq hosts with frequent OOM errors, leading to the job being lost. The previous commit adds more logging, and a more robust insertion method. This commit reschedules the jobs, with a generous pause between each. --- ...anceling-statement-due-to-statement-timeout.yml | 6 +++ ...edule_merge_request_diff_migrations_take_two.rb | 32 ++++++++++++ ..._merge_request_diff_migrations_take_two_spec.rb | 59 ++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 changelogs/unreleased/36631-activerecord-statementinvalid-pg-querycanceled-error-canceling-statement-due-to-statement-timeout.yml create mode 100644 db/post_migrate/20170926150348_schedule_merge_request_diff_migrations_take_two.rb create mode 100644 spec/migrations/schedule_merge_request_diff_migrations_take_two_spec.rb diff --git a/changelogs/unreleased/36631-activerecord-statementinvalid-pg-querycanceled-error-canceling-statement-due-to-statement-timeout.yml b/changelogs/unreleased/36631-activerecord-statementinvalid-pg-querycanceled-error-canceling-statement-due-to-statement-timeout.yml new file mode 100644 index 00000000000..a2e1d07158b --- /dev/null +++ b/changelogs/unreleased/36631-activerecord-statementinvalid-pg-querycanceled-error-canceling-statement-due-to-statement-timeout.yml @@ -0,0 +1,6 @@ +--- +title: Reschedule merge request diff background migrations to catch failures from + 9.5 run +merge_request: +author: +type: fixed diff --git a/db/post_migrate/20170926150348_schedule_merge_request_diff_migrations_take_two.rb b/db/post_migrate/20170926150348_schedule_merge_request_diff_migrations_take_two.rb new file mode 100644 index 00000000000..5732cb85ea5 --- /dev/null +++ b/db/post_migrate/20170926150348_schedule_merge_request_diff_migrations_take_two.rb @@ -0,0 +1,32 @@ +class ScheduleMergeRequestDiffMigrationsTakeTwo < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + BATCH_SIZE = 500 + MIGRATION = 'DeserializeMergeRequestDiffsAndCommits' + DELAY_INTERVAL = 10.minutes + + disable_ddl_transaction! + + class MergeRequestDiff < ActiveRecord::Base + self.table_name = 'merge_request_diffs' + + include ::EachBatch + + default_scope { where('st_commits IS NOT NULL OR st_diffs IS NOT NULL') } + end + + # By this point, we assume ScheduleMergeRequestDiffMigrations - the first + # version of this - has already run. On GitLab.com, we have ~220k un-migrated + # rows, but these rows will, in general, take a long time. + # + # With a gap of 10 minutes per batch, and 500 rows per batch, these migrations + # are scheduled over 220_000 / 500 / 6 ~= 74 hours, which is a little over + # three days. + def up + queue_background_migration_jobs_by_range_at_intervals(MergeRequestDiff, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE) + end + + def down + end +end diff --git a/spec/migrations/schedule_merge_request_diff_migrations_take_two_spec.rb b/spec/migrations/schedule_merge_request_diff_migrations_take_two_spec.rb new file mode 100644 index 00000000000..4ab1bb67058 --- /dev/null +++ b/spec/migrations/schedule_merge_request_diff_migrations_take_two_spec.rb @@ -0,0 +1,59 @@ +require 'spec_helper' +require Rails.root.join('db', 'post_migrate', '20170926150348_schedule_merge_request_diff_migrations_take_two') + +describe ScheduleMergeRequestDiffMigrationsTakeTwo, :migration, :sidekiq do + matcher :be_scheduled_migration do |time, *expected| + match do |migration| + BackgroundMigrationWorker.jobs.any? do |job| + job['args'] == [migration, expected] && + job['at'].to_i == time.to_i + end + end + + failure_message do |migration| + "Migration `#{migration}` with args `#{expected.inspect}` not scheduled!" + end + end + + let(:merge_request_diffs) { table(:merge_request_diffs) } + let(:merge_requests) { table(:merge_requests) } + let(:projects) { table(:projects) } + + before do + stub_const("#{described_class.name}::BATCH_SIZE", 1) + + projects.create!(id: 1, name: 'gitlab', path: 'gitlab') + + merge_requests.create!(id: 1, target_project_id: 1, source_project_id: 1, target_branch: 'feature', source_branch: 'master') + + merge_request_diffs.create!(id: 1, merge_request_id: 1, st_commits: YAML.dump([]), st_diffs: nil) + merge_request_diffs.create!(id: 2, merge_request_id: 1, st_commits: nil, st_diffs: YAML.dump([])) + merge_request_diffs.create!(id: 3, merge_request_id: 1, st_commits: nil, st_diffs: nil) + merge_request_diffs.create!(id: 4, merge_request_id: 1, st_commits: YAML.dump([]), st_diffs: YAML.dump([])) + end + + it 'correctly schedules background migrations' do + Sidekiq::Testing.fake! do + Timecop.freeze do + migrate! + + expect(described_class::MIGRATION).to be_scheduled_migration(10.minutes.from_now, 1, 1) + expect(described_class::MIGRATION).to be_scheduled_migration(20.minutes.from_now, 2, 2) + expect(described_class::MIGRATION).to be_scheduled_migration(30.minutes.from_now, 4, 4) + expect(BackgroundMigrationWorker.jobs.size).to eq 3 + end + end + end + + it 'migrates the data' do + Sidekiq::Testing.inline! do + non_empty = 'st_commits IS NOT NULL OR st_diffs IS NOT NULL' + + expect(merge_request_diffs.where(non_empty).count).to eq 3 + + migrate! + + expect(merge_request_diffs.where(non_empty).count).to eq 0 + end + end +end -- cgit v1.2.1 From 93aa6d04c2e81193d7833890d2281fc1df7d7129 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 29 Sep 2017 12:14:39 +0100 Subject: moved fork checks into policies --- app/policies/global_policy.rb | 6 ++++++ app/policies/namespace_policy.rb | 4 ++++ app/views/projects/buttons/_fork.html.haml | 6 +++--- app/views/projects/forks/new.html.haml | 11 +++++------ spec/policies/global_policy_spec.rb | 23 +++++++++++++++++++++++ spec/policies/namespace_policy_spec.rb | 20 ++++++++++++++++++++ 6 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 spec/policies/namespace_policy_spec.rb diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb index 8f7c01bb71f..64e550d19d0 100644 --- a/app/policies/global_policy.rb +++ b/app/policies/global_policy.rb @@ -11,6 +11,8 @@ class GlobalPolicy < BasePolicy with_options scope: :user, score: 0 condition(:access_locked) { @user.access_locked? } + condition(:can_create_fork, scope: :user) { @user.manageable_namespaces.any? { |namespace| @user.can?(:create_projects, namespace) } } + rule { anonymous }.policy do prevent :log_in prevent :access_api @@ -40,6 +42,10 @@ class GlobalPolicy < BasePolicy enable :create_group end + rule { can_create_fork }.policy do + enable :create_fork + end + rule { access_locked }.policy do prevent :log_in end diff --git a/app/policies/namespace_policy.rb b/app/policies/namespace_policy.rb index 85b67f0a237..92213f0155e 100644 --- a/app/policies/namespace_policy.rb +++ b/app/policies/namespace_policy.rb @@ -1,10 +1,14 @@ class NamespacePolicy < BasePolicy rule { anonymous }.prevent_all + condition(:personal_project, scope: :subject) { @subject.kind == 'user' } + condition(:can_create_personal_project, scope: :user) { @user.can_create_project? } condition(:owner) { @subject.owner == @user } rule { owner | admin }.policy do enable :create_projects enable :admin_namespace end + + rule { personal_project & ~can_create_personal_project }.prevent :create_projects end diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml index 840b5ce1f84..f880556a9f7 100644 --- a/app/views/projects/buttons/_fork.html.haml +++ b/app/views/projects/buttons/_fork.html.haml @@ -5,10 +5,10 @@ = custom_icon('icon_fork') %span= s_('GoToYourFork|Fork') - else - - can_fork = current_user.can_create_project? || current_user.manageable_namespaces.count > 1 + - can_create_fork = current_user.can?(:create_fork) = link_to new_project_fork_path(@project), - class: "btn btn-default #{'has-tooltip disabled' unless can_fork}", - title: (_('You have reached your project limit') unless can_fork) do + class: "btn btn-default #{'has-tooltip disabled' unless can_create_fork}", + title: (_('You have reached your project limit') unless can_create_fork) do = custom_icon('icon_fork') %span= s_('CreateNewFork|Fork') .count-with-arrow diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index 008de97d6d3..906774a21e3 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -1,5 +1,4 @@ - page_title "Fork project" -- can_create_project = current_user.can_create_project? .row.prepend-top-default .col-lg-3 @@ -14,7 +13,7 @@ - if @namespaces.present? %label.label-light %span - #{ "Click to fork the project to a #{'user or' if can_create_project} group" } + Click to fork the project - @namespaces.in_groups_of(6, false) do |group| .row - group.each do |namespace| @@ -30,12 +29,12 @@ .caption = namespace.human_name - else - - is_disabled = namespace.kind === 'user' && !can_create_project - .fork-thumbnail{ class: ("disabled" if is_disabled) } + - can_create_project = current_user.can?(:create_projects, namespace) + .fork-thumbnail{ class: ("disabled" unless can_create_project) } = link_to project_forks_path(@project, namespace_key: namespace.id), method: "POST", - class: ("disabled has-tooltip" if is_disabled), - title: (_('You have reached your project limit') if is_disabled) do + class: ("disabled has-tooltip" unless can_create_project), + title: (_('You have reached your project limit') unless can_create_project) do - if /no_((\w*)_)*avatar/.match(avatar) .no-avatar = icon 'question' diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb index 983f0e52d31..5b8cf2e6ab5 100644 --- a/spec/policies/global_policy_spec.rb +++ b/spec/policies/global_policy_spec.rb @@ -52,6 +52,29 @@ describe GlobalPolicy do end end + describe "create fork" do + context "when user has not exceeded project limit" do + it { is_expected.to be_allowed(:create_fork) } + end + + context "when user has exceeded project limit" do + let(:current_user) { create(:user, projects_limit: 0) } + + it { is_expected.not_to be_allowed(:create_fork) } + end + + context "when user is a master in a group" do + let(:group) { create(:group) } + let(:current_user) { create(:user, projects_limit: 0) } + + before do + group.add_master(current_user) + end + + it { is_expected.to be_allowed(:create_fork) } + end + end + describe 'custom attributes' do context 'regular user' do it { is_expected.not_to be_allowed(:read_custom_attribute) } diff --git a/spec/policies/namespace_policy_spec.rb b/spec/policies/namespace_policy_spec.rb new file mode 100644 index 00000000000..e52ff02e5f0 --- /dev/null +++ b/spec/policies/namespace_policy_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe NamespacePolicy do + let(:current_user) { create(:user) } + let(:namespace) { current_user.namespace } + + subject { described_class.new(current_user, namespace) } + + context "create projects" do + context "user namespace" do + it { is_expected.to be_allowed(:create_projects) } + end + + context "user who has exceeded project limit" do + let(:current_user) { create(:user, projects_limit: 0) } + + it { is_expected.not_to be_allowed(:create_projects) } + end + end +end -- cgit v1.2.1 From 8bac6e41ef1568b5b46a92a2279b4fb488ae73bc Mon Sep 17 00:00:00 2001 From: "Lin Jen-Shin (godfat)" Date: Fri, 29 Sep 2017 11:18:58 +0000 Subject: Fix notes type created from import --- .../unreleased/38432-fix-notes-type-for-import.yml | 6 ++++ ...318_update_legacy_diff_notes_type_for_import.rb | 16 +++++++++ .../20170927112319_update_notes_type_for_import.rb | 16 +++++++++ lib/github/import.rb | 41 +++------------------- lib/github/import/issue.rb | 13 +++++++ lib/github/import/legacy_diff_note.rb | 12 +++++++ lib/github/import/merge_request.rb | 13 +++++++ lib/github/import/note.rb | 13 +++++++ spec/lib/github/import/legacy_diff_note_spec.rb | 9 +++++ spec/lib/github/import/note_spec.rb | 9 +++++ ...pdate_legacy_diff_notes_type_for_import_spec.rb | 22 ++++++++++++ .../update_notes_type_for_import_spec.rb | 22 ++++++++++++ 12 files changed, 155 insertions(+), 37 deletions(-) create mode 100644 changelogs/unreleased/38432-fix-notes-type-for-import.yml create mode 100644 db/post_migrate/20170927112318_update_legacy_diff_notes_type_for_import.rb create mode 100644 db/post_migrate/20170927112319_update_notes_type_for_import.rb create mode 100644 lib/github/import/issue.rb create mode 100644 lib/github/import/legacy_diff_note.rb create mode 100644 lib/github/import/merge_request.rb create mode 100644 lib/github/import/note.rb create mode 100644 spec/lib/github/import/legacy_diff_note_spec.rb create mode 100644 spec/lib/github/import/note_spec.rb create mode 100644 spec/migrations/update_legacy_diff_notes_type_for_import_spec.rb create mode 100644 spec/migrations/update_notes_type_for_import_spec.rb diff --git a/changelogs/unreleased/38432-fix-notes-type-for-import.yml b/changelogs/unreleased/38432-fix-notes-type-for-import.yml new file mode 100644 index 00000000000..db8371f4420 --- /dev/null +++ b/changelogs/unreleased/38432-fix-notes-type-for-import.yml @@ -0,0 +1,6 @@ +--- +title: Fix notes type created from import. This should fix some missing notes issues + from imported projects +merge_request: 14524 +author: +type: fixed diff --git a/db/post_migrate/20170927112318_update_legacy_diff_notes_type_for_import.rb b/db/post_migrate/20170927112318_update_legacy_diff_notes_type_for_import.rb new file mode 100644 index 00000000000..a238216253b --- /dev/null +++ b/db/post_migrate/20170927112318_update_legacy_diff_notes_type_for_import.rb @@ -0,0 +1,16 @@ +class UpdateLegacyDiffNotesTypeForImport < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + update_column_in_batches(:notes, :type, 'LegacyDiffNote') do |table, query| + query.where(table[:type].eq('Github::Import::LegacyDiffNote')) + end + end + + def down + end +end diff --git a/db/post_migrate/20170927112319_update_notes_type_for_import.rb b/db/post_migrate/20170927112319_update_notes_type_for_import.rb new file mode 100644 index 00000000000..1e70acd9868 --- /dev/null +++ b/db/post_migrate/20170927112319_update_notes_type_for_import.rb @@ -0,0 +1,16 @@ +class UpdateNotesTypeForImport < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + update_column_in_batches(:notes, :type, 'Note') do |table, query| + query.where(table[:type].eq('Github::Import::Note')) + end + end + + def down + end +end diff --git a/lib/github/import.rb b/lib/github/import.rb index f5f62dc8b6f..c0cd8382875 100644 --- a/lib/github/import.rb +++ b/lib/github/import.rb @@ -1,46 +1,13 @@ require_relative 'error' +require_relative 'import/issue' +require_relative 'import/legacy_diff_note' +require_relative 'import/merge_request' +require_relative 'import/note' module Github class Import include Gitlab::ShellAdapter - class MergeRequest < ::MergeRequest - self.table_name = 'merge_requests' - - self.reset_callbacks :create - self.reset_callbacks :save - self.reset_callbacks :commit - self.reset_callbacks :update - self.reset_callbacks :validate - end - - class Issue < ::Issue - self.table_name = 'issues' - - self.reset_callbacks :save - self.reset_callbacks :create - self.reset_callbacks :commit - self.reset_callbacks :update - self.reset_callbacks :validate - end - - class Note < ::Note - self.table_name = 'notes' - - self.reset_callbacks :save - self.reset_callbacks :commit - self.reset_callbacks :update - self.reset_callbacks :validate - end - - class LegacyDiffNote < ::LegacyDiffNote - self.table_name = 'notes' - - self.reset_callbacks :commit - self.reset_callbacks :update - self.reset_callbacks :validate - end - attr_reader :project, :repository, :repo, :repo_url, :wiki_url, :options, :errors, :cached, :verbose diff --git a/lib/github/import/issue.rb b/lib/github/import/issue.rb new file mode 100644 index 00000000000..171f0872666 --- /dev/null +++ b/lib/github/import/issue.rb @@ -0,0 +1,13 @@ +module Github + class Import + class Issue < ::Issue + self.table_name = 'issues' + + self.reset_callbacks :save + self.reset_callbacks :create + self.reset_callbacks :commit + self.reset_callbacks :update + self.reset_callbacks :validate + end + end +end diff --git a/lib/github/import/legacy_diff_note.rb b/lib/github/import/legacy_diff_note.rb new file mode 100644 index 00000000000..18adff560b6 --- /dev/null +++ b/lib/github/import/legacy_diff_note.rb @@ -0,0 +1,12 @@ +module Github + class Import + class LegacyDiffNote < ::LegacyDiffNote + self.table_name = 'notes' + self.store_full_sti_class = false + + self.reset_callbacks :commit + self.reset_callbacks :update + self.reset_callbacks :validate + end + end +end diff --git a/lib/github/import/merge_request.rb b/lib/github/import/merge_request.rb new file mode 100644 index 00000000000..c258e5d5e0e --- /dev/null +++ b/lib/github/import/merge_request.rb @@ -0,0 +1,13 @@ +module Github + class Import + class MergeRequest < ::MergeRequest + self.table_name = 'merge_requests' + + self.reset_callbacks :create + self.reset_callbacks :save + self.reset_callbacks :commit + self.reset_callbacks :update + self.reset_callbacks :validate + end + end +end diff --git a/lib/github/import/note.rb b/lib/github/import/note.rb new file mode 100644 index 00000000000..8cf4f30e6b7 --- /dev/null +++ b/lib/github/import/note.rb @@ -0,0 +1,13 @@ +module Github + class Import + class Note < ::Note + self.table_name = 'notes' + self.store_full_sti_class = false + + self.reset_callbacks :save + self.reset_callbacks :commit + self.reset_callbacks :update + self.reset_callbacks :validate + end + end +end diff --git a/spec/lib/github/import/legacy_diff_note_spec.rb b/spec/lib/github/import/legacy_diff_note_spec.rb new file mode 100644 index 00000000000..8c50b46cacb --- /dev/null +++ b/spec/lib/github/import/legacy_diff_note_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Github::Import::LegacyDiffNote do + describe '#type' do + it 'returns the original note type' do + expect(described_class.new.type).to eq('LegacyDiffNote') + end + end +end diff --git a/spec/lib/github/import/note_spec.rb b/spec/lib/github/import/note_spec.rb new file mode 100644 index 00000000000..fcdccd9e097 --- /dev/null +++ b/spec/lib/github/import/note_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe Github::Import::Note do + describe '#type' do + it 'returns the original note type' do + expect(described_class.new.type).to eq('Note') + end + end +end diff --git a/spec/migrations/update_legacy_diff_notes_type_for_import_spec.rb b/spec/migrations/update_legacy_diff_notes_type_for_import_spec.rb new file mode 100644 index 00000000000..d625b60ff50 --- /dev/null +++ b/spec/migrations/update_legacy_diff_notes_type_for_import_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' +require Rails.root.join('db', 'post_migrate', '20170927112318_update_legacy_diff_notes_type_for_import.rb') + +describe UpdateLegacyDiffNotesTypeForImport, :migration do + let(:notes) { table(:notes) } + + before do + notes.inheritance_column = nil + + notes.create(type: 'Note') + notes.create(type: 'LegacyDiffNote') + notes.create(type: 'Github::Import::Note') + notes.create(type: 'Github::Import::LegacyDiffNote') + end + + it 'updates the notes type' do + migrate! + + expect(notes.pluck(:type)) + .to contain_exactly('Note', 'Github::Import::Note', 'LegacyDiffNote', 'LegacyDiffNote') + end +end diff --git a/spec/migrations/update_notes_type_for_import_spec.rb b/spec/migrations/update_notes_type_for_import_spec.rb new file mode 100644 index 00000000000..06195d970d8 --- /dev/null +++ b/spec/migrations/update_notes_type_for_import_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' +require Rails.root.join('db', 'post_migrate', '20170927112319_update_notes_type_for_import.rb') + +describe UpdateNotesTypeForImport, :migration do + let(:notes) { table(:notes) } + + before do + notes.inheritance_column = nil + + notes.create(type: 'Note') + notes.create(type: 'LegacyDiffNote') + notes.create(type: 'Github::Import::Note') + notes.create(type: 'Github::Import::LegacyDiffNote') + end + + it 'updates the notes type' do + migrate! + + expect(notes.pluck(:type)) + .to contain_exactly('Note', 'Note', 'LegacyDiffNote', 'Github::Import::LegacyDiffNote') + end +end -- cgit v1.2.1 From ef22b0dc813b9e1579ac4f25de2eaf8bf66a8236 Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Fri, 29 Sep 2017 13:43:39 +0200 Subject: Title has now its own test --- spec/javascripts/repo/components/repo_file_spec.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/spec/javascripts/repo/components/repo_file_spec.js b/spec/javascripts/repo/components/repo_file_spec.js index c25e63b6dfc..f15633bd8b9 100644 --- a/spec/javascripts/repo/components/repo_file_spec.js +++ b/spec/javascripts/repo/components/repo_file_spec.js @@ -8,14 +8,17 @@ describe('RepoFile', () => { icon: 'icon', url: 'url', name: 'name', - pageTitle: 'pageTitle', lastCommitMessage: 'message', lastCommitUpdate: Date.now(), level: 10, }; const activeFile = { - url: 'activeUrl', pageTitle: 'pageTitle', + url: 'url', + }; + const otherFile = { + html: '

html

', + pageTitle: 'otherpageTitle', }; function createComponent(propsData) { @@ -31,7 +34,6 @@ describe('RepoFile', () => { }); it('renders link, icon, name and last commit details', () => { - RepoStore.setActiveFiles(activeFile); const vm = createComponent({ file, activeFile, @@ -44,7 +46,6 @@ describe('RepoFile', () => { expect(name.title).toEqual(file.url); expect(name.href).toMatch(`/${file.url}`); expect(name.textContent.trim()).toEqual(file.name); - expect(document.title.trim()).toEqual(activeFile.pageTitle); expect(vm.$el.querySelector('.commit-message').textContent.trim()).toBe(file.lastCommitMessage); expect(vm.$el.querySelector('.commit-update').textContent.trim()).toBe(updated); expect(fileIcon.classList.contains(file.icon)).toBeTruthy(); @@ -65,6 +66,12 @@ describe('RepoFile', () => { expect(vm.$el.querySelector('.fa-spin.fa-spinner')).toBeFalsy(); }); + it('sets the document title correctly', () => { + RepoStore.setActiveFiles(otherFile); + + expect(document.title.trim()).toEqual(otherFile.pageTitle); + }); + it('renders a spinner if the file is loading', () => { file.loading = true; const vm = createComponent({ -- cgit v1.2.1 From 387975fe1ae3d099fa737c13cf533ad9664beb2e Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Fri, 29 Sep 2017 14:07:43 +0100 Subject: Improves UX of autodevops popover to match gpg one --- app/assets/javascripts/pipelines/components/pipeline_url.vue | 4 ++-- changelogs/unreleased/38582-popover-badge.yml | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/38582-popover-badge.yml diff --git a/app/assets/javascripts/pipelines/components/pipeline_url.vue b/app/assets/javascripts/pipelines/components/pipeline_url.vue index f0b44dfa6d8..76b97af39f1 100644 --- a/app/assets/javascripts/pipelines/components/pipeline_url.vue +++ b/app/assets/javascripts/pipelines/components/pipeline_url.vue @@ -28,8 +28,7 @@ popoverOptions() { return { html: true, - delay: { hide: 600 }, - trigger: 'hover', + trigger: 'focus', placement: 'top', title: '
This pipeline makes use of a predefined CI/CD configuration enabled by Auto DevOps.
', content: `Learn more about Auto DevOps`, @@ -75,6 +74,7 @@ diff --git a/changelogs/unreleased/38582-popover-badge.yml b/changelogs/unreleased/38582-popover-badge.yml new file mode 100644 index 00000000000..ccec679a13f --- /dev/null +++ b/changelogs/unreleased/38582-popover-badge.yml @@ -0,0 +1,5 @@ +--- +title: Improves UX of autodevops popover to match gpg one +merge_request: +author: +type: fixed -- cgit v1.2.1 From 403712f06e776d7c2d97dd094fe55871a3137b8a Mon Sep 17 00:00:00 2001 From: "Jacob Vosmaer (GitLab)" Date: Fri, 29 Sep 2017 13:08:44 +0000 Subject: Make Repository#has_visible_content more efficient --- app/models/repository.rb | 9 ++----- lib/gitlab/git/repository.rb | 26 ++++++++++++++++++- lib/gitlab/gitaly_client/ref_service.rb | 8 ++++++ spec/lib/gitlab/git/repository_spec.rb | 34 +++++++++++++++++++++++++ spec/models/repository_spec.rb | 30 ++++++++++++++-------- spec/workers/git_garbage_collect_worker_spec.rb | 6 ++--- 6 files changed, 91 insertions(+), 22 deletions(-) diff --git a/app/models/repository.rb b/app/models/repository.rb index f0de2697dfc..1f4df50a913 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -91,12 +91,6 @@ class Repository ) end - # we need to have this method here because it is not cached in ::Git and - # the method is called multiple times for every request - def has_visible_content? - branch_count > 0 - end - def inspect "#<#{self.class.name}:#{@disk_path}>" end @@ -523,9 +517,10 @@ class Repository delegate :tag_names, to: :raw_repository cache_method :tag_names, fallback: [] - delegate :branch_count, :tag_count, to: :raw_repository + delegate :branch_count, :tag_count, :has_visible_content?, to: :raw_repository cache_method :branch_count, fallback: 0 cache_method :tag_count, fallback: 0 + cache_method :has_visible_content?, fallback: false def avatar # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/38327 diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 6d710ffe2bb..449fb9d9c63 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -192,6 +192,28 @@ module Gitlab end end + def has_local_branches? + gitaly_migrate(:has_local_branches) do |is_enabled| + if is_enabled + gitaly_ref_client.has_local_branches? + else + has_local_branches_rugged? + end + end + end + + def has_local_branches_rugged? + rugged.branches.each(:local).any? do |ref| + begin + ref.name && ref.target # ensures the branch is valid + + true + rescue Rugged::ReferenceError + false + end + end + end + # Returns the number of valid tags def tag_count gitaly_migrate(:tag_names) do |is_enabled| @@ -1037,7 +1059,9 @@ module Gitlab # This method return true if repository contains some content visible in project page. # def has_visible_content? - branch_count > 0 + return @has_visible_content if defined?(@has_visible_content) + + @has_visible_content = has_local_branches? end def gitaly_repository diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb index b0c73395cb1..8214b7d63fa 100644 --- a/lib/gitlab/gitaly_client/ref_service.rb +++ b/lib/gitlab/gitaly_client/ref_service.rb @@ -57,6 +57,14 @@ module Gitlab branch_names.count end + # TODO implement a more efficient RPC for this https://gitlab.com/gitlab-org/gitaly/issues/616 + def has_local_branches? + request = Gitaly::FindAllBranchNamesRequest.new(repository: @gitaly_repo) + response = GitalyClient.call(@storage, :ref_service, :find_all_branch_names, request).first + + response&.names.present? + end + def local_branches(sort_by: nil) request = Gitaly::FindLocalBranchesRequest.new(repository: @gitaly_repo) request.sort_by = sort_by_param(sort_by) if sort_by diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 5effaf2b043..a0482e30a33 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -389,6 +389,40 @@ describe Gitlab::Git::Repository, seed_helper: true do end end + describe '#has_local_branches?' do + shared_examples 'check for local branches' do + it { expect(repository.has_local_branches?).to eq(true) } + + context 'mutable' do + let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') } + + after do + ensure_seeds + end + + it 'returns false when there are no branches' do + # Sanity check + expect(repository.has_local_branches?).to eq(true) + + FileUtils.rm_rf(File.join(repository.path, 'packed-refs')) + heads_dir = File.join(repository.path, 'refs/heads') + FileUtils.rm_rf(heads_dir) + FileUtils.mkdir_p(heads_dir) + + expect(repository.has_local_branches?).to eq(false) + end + end + end + + context 'with gitaly' do + it_behaves_like 'check for local branches' + end + + context 'without gitaly', skip_gitaly_mock: true do + it_behaves_like 'check for local branches' + end + end + describe "#delete_branch" do shared_examples "deleting a branch" do let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') } diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 525c4027e5f..ab81d39691b 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1131,21 +1131,31 @@ describe Repository do end describe '#has_visible_content?' do - subject { repository.has_visible_content? } + before do + # If raw_repository.has_visible_content? gets called more than once then + # caching is broken. We don't want that. + expect(repository.raw_repository).to receive(:has_visible_content?) + .once + .and_return(result) + end - describe 'when there are no branches' do - before do - allow(repository.raw_repository).to receive(:branch_count).and_return(0) - end + context 'when true' do + let(:result) { true } - it { is_expected.to eq(false) } + it 'returns true and caches it' do + expect(repository.has_visible_content?).to eq(true) + # Second call hits the cache + expect(repository.has_visible_content?).to eq(true) + end end - describe 'when there are branches' do - it 'returns true' do - expect(repository.raw_repository).to receive(:branch_count).and_return(3) + context 'when false' do + let(:result) { false } - expect(subject).to eq(true) + it 'returns false and caches it' do + expect(repository.has_visible_content?).to eq(false) + # Second call hits the cache + expect(repository.has_visible_content?).to eq(false) end end end diff --git a/spec/workers/git_garbage_collect_worker_spec.rb b/spec/workers/git_garbage_collect_worker_spec.rb index f7b67b8efc6..ab656d619f4 100644 --- a/spec/workers/git_garbage_collect_worker_spec.rb +++ b/spec/workers/git_garbage_collect_worker_spec.rb @@ -32,7 +32,7 @@ describe GitGarbageCollectWorker do expect_any_instance_of(Repository).to receive(:after_create_branch).and_call_original expect_any_instance_of(Repository).to receive(:branch_names).and_call_original expect_any_instance_of(Repository).to receive(:has_visible_content?).and_call_original - expect_any_instance_of(Gitlab::Git::Repository).to receive(:branch_count).and_call_original + expect_any_instance_of(Gitlab::Git::Repository).to receive(:has_visible_content?).and_call_original subject.perform(project.id, :gc, lease_key, lease_uuid) end @@ -47,7 +47,6 @@ describe GitGarbageCollectWorker do expect(subject).not_to receive(:command) expect_any_instance_of(Repository).not_to receive(:after_create_branch).and_call_original expect_any_instance_of(Repository).not_to receive(:branch_names).and_call_original - expect_any_instance_of(Repository).not_to receive(:branch_count).and_call_original expect_any_instance_of(Repository).not_to receive(:has_visible_content?).and_call_original subject.perform(project.id, :gc, lease_key, lease_uuid) @@ -78,7 +77,7 @@ describe GitGarbageCollectWorker do expect_any_instance_of(Repository).to receive(:after_create_branch).and_call_original expect_any_instance_of(Repository).to receive(:branch_names).and_call_original expect_any_instance_of(Repository).to receive(:has_visible_content?).and_call_original - expect_any_instance_of(Gitlab::Git::Repository).to receive(:branch_count).and_call_original + expect_any_instance_of(Gitlab::Git::Repository).to receive(:has_visible_content?).and_call_original subject.perform(project.id) end @@ -93,7 +92,6 @@ describe GitGarbageCollectWorker do expect(subject).not_to receive(:command) expect_any_instance_of(Repository).not_to receive(:after_create_branch).and_call_original expect_any_instance_of(Repository).not_to receive(:branch_names).and_call_original - expect_any_instance_of(Repository).not_to receive(:branch_count).and_call_original expect_any_instance_of(Repository).not_to receive(:has_visible_content?).and_call_original subject.perform(project.id) -- cgit v1.2.1 From e73c9ddc9e7c3191e5d16e7c42fb39867b38862b Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Fri, 29 Sep 2017 15:24:16 +0100 Subject: Extend changelog checker to test file extensions Changelogs without a .yml extension won't be picked up, and will be ignored completely, so fail the pipeline when one of those is found. --- scripts/lint-changelog-yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/lint-changelog-yaml b/scripts/lint-changelog-yaml index 402a0c42bd3..cce5f1c7667 100755 --- a/scripts/lint-changelog-yaml +++ b/scripts/lint-changelog-yaml @@ -2,7 +2,10 @@ require 'yaml' -invalid_changelogs = Dir['changelogs/**/*.yml'].reject do |changelog| +invalid_changelogs = Dir['changelogs/**/*'].reject do |changelog| + next true if changelog =~ /(archive\.md|unreleased(-ee)?)$/ + next false unless changelog.end_with?('.yml') + begin YAML.load_file(changelog) rescue @@ -10,7 +13,7 @@ invalid_changelogs = Dir['changelogs/**/*.yml'].reject do |changelog| end if invalid_changelogs.any? - puts "Changelogs with invalid YAML found!\n" + puts "Invalid changelogs found!\n" puts invalid_changelogs.sort exit 1 else -- cgit v1.2.1 From 1bb332ceb3643f7b129eb3674d1de3c402bbf2cb Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Fri, 29 Sep 2017 15:32:01 +0100 Subject: Remove changelogs with invalid extensions All of these were in past releases, so missed their chance to be included in the main changelog :-( --- changelogs/unreleased/12673-fix_v3_project_hooks_build_events | 4 ---- .../unreleased/12892-reset-css-text-align-to-initial-for-rtl.md | 4 ---- .../22619-add-an-email-address-to-unsubscribe-list-header-in-email | 4 ---- changelogs/unreleased/26908-make-timelogs-use-foreign-keys | 4 ---- changelogs/unreleased/32340-correct-jobs-api-documentation | 4 ---- changelogs/unreleased/35942-api-binary-encoding.yaml | 3 --- .../add-mock-deployment-and-monitoring-service-for-development.yaml | 4 ---- changelogs/unreleased/repository-name-emojis | 4 ---- 8 files changed, 31 deletions(-) delete mode 100644 changelogs/unreleased/12673-fix_v3_project_hooks_build_events delete mode 100644 changelogs/unreleased/12892-reset-css-text-align-to-initial-for-rtl.md delete mode 100644 changelogs/unreleased/22619-add-an-email-address-to-unsubscribe-list-header-in-email delete mode 100644 changelogs/unreleased/26908-make-timelogs-use-foreign-keys delete mode 100644 changelogs/unreleased/32340-correct-jobs-api-documentation delete mode 100644 changelogs/unreleased/35942-api-binary-encoding.yaml delete mode 100644 changelogs/unreleased/add-mock-deployment-and-monitoring-service-for-development.yaml delete mode 100644 changelogs/unreleased/repository-name-emojis diff --git a/changelogs/unreleased/12673-fix_v3_project_hooks_build_events b/changelogs/unreleased/12673-fix_v3_project_hooks_build_events deleted file mode 100644 index 59bc646406f..00000000000 --- a/changelogs/unreleased/12673-fix_v3_project_hooks_build_events +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Fix v3 api project_hooks POST and PUT operations for build_events" -merge_request: 12673 -author: Richard Clamp diff --git a/changelogs/unreleased/12892-reset-css-text-align-to-initial-for-rtl.md b/changelogs/unreleased/12892-reset-css-text-align-to-initial-for-rtl.md deleted file mode 100644 index 87e95240bba..00000000000 --- a/changelogs/unreleased/12892-reset-css-text-align-to-initial-for-rtl.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "reset text-align to initial to let elements with dir="auto" align texts to right in RTL languages ( default is left )" -merge_request: 12892 -author: goshhob diff --git a/changelogs/unreleased/22619-add-an-email-address-to-unsubscribe-list-header-in-email b/changelogs/unreleased/22619-add-an-email-address-to-unsubscribe-list-header-in-email deleted file mode 100644 index f4011b756a5..00000000000 --- a/changelogs/unreleased/22619-add-an-email-address-to-unsubscribe-list-header-in-email +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Handle unsubscribe from email notifications via replying to reply+%{key}+unsubscribe@ address -merge_request: 6597 -author: diff --git a/changelogs/unreleased/26908-make-timelogs-use-foreign-keys b/changelogs/unreleased/26908-make-timelogs-use-foreign-keys deleted file mode 100644 index 0e8f7093b34..00000000000 --- a/changelogs/unreleased/26908-make-timelogs-use-foreign-keys +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Refactor Timelogs structure to use foreign keys. -merge_request: 8769 -author: diff --git a/changelogs/unreleased/32340-correct-jobs-api-documentation b/changelogs/unreleased/32340-correct-jobs-api-documentation deleted file mode 100644 index 4ada62356eb..00000000000 --- a/changelogs/unreleased/32340-correct-jobs-api-documentation +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Correction to documention for manual steps on the Jobs API" -merge_request: 11411 -author: Zac Sturgess \ No newline at end of file diff --git a/changelogs/unreleased/35942-api-binary-encoding.yaml b/changelogs/unreleased/35942-api-binary-encoding.yaml deleted file mode 100644 index 4f7960d860e..00000000000 --- a/changelogs/unreleased/35942-api-binary-encoding.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: "Fix API to serve binary diffs that are treated as text." -merge_request: 14038 diff --git a/changelogs/unreleased/add-mock-deployment-and-monitoring-service-for-development.yaml b/changelogs/unreleased/add-mock-deployment-and-monitoring-service-for-development.yaml deleted file mode 100644 index 4c81d21a94b..00000000000 --- a/changelogs/unreleased/add-mock-deployment-and-monitoring-service-for-development.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Added mock deployment and monitoring service with environments fixtures -merge_request: -author: diff --git a/changelogs/unreleased/repository-name-emojis b/changelogs/unreleased/repository-name-emojis deleted file mode 100644 index fe52df8eedc..00000000000 --- a/changelogs/unreleased/repository-name-emojis +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Added ability to put emojis into repository name -merge_request: 7420 -author: Vincent Composieux -- cgit v1.2.1 From 4a17ac29b8f33f23d90b1a883467fac4737c3759 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Fri, 29 Sep 2017 20:36:44 +0530 Subject: Use `simple=true` for projects API for better performance --- app/assets/javascripts/projects_dropdown/service/projects_service.js | 2 +- spec/javascripts/projects_dropdown/service/projects_service_spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/projects_dropdown/service/projects_service.js b/app/assets/javascripts/projects_dropdown/service/projects_service.js index fad956b4c26..9cbd8f21f2a 100644 --- a/app/assets/javascripts/projects_dropdown/service/projects_service.js +++ b/app/assets/javascripts/projects_dropdown/service/projects_service.js @@ -19,7 +19,7 @@ export default class ProjectsService { getSearchedProjects(searchQuery) { return this.projectsPath.get({ - simple: false, + simple: true, per_page: 20, membership: !!gon.current_user_id, order_by: 'last_activity_at', diff --git a/spec/javascripts/projects_dropdown/service/projects_service_spec.js b/spec/javascripts/projects_dropdown/service/projects_service_spec.js index d5dd8b3449a..cfd1bb7d24f 100644 --- a/spec/javascripts/projects_dropdown/service/projects_service_spec.js +++ b/spec/javascripts/projects_dropdown/service/projects_service_spec.js @@ -34,7 +34,7 @@ describe('ProjectsService', () => { const searchQuery = 'lab'; const queryParams = { - simple: false, + simple: true, per_page: 20, membership: true, order_by: 'last_activity_at', -- cgit v1.2.1 From 4775b93fbd5895820efa62ff12024c47d3a13153 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Fri, 29 Sep 2017 20:45:23 +0530 Subject: Add changelog entry --- changelogs/unreleased/38052-use-simple-api-for-projects.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelogs/unreleased/38052-use-simple-api-for-projects.yml diff --git a/changelogs/unreleased/38052-use-simple-api-for-projects.yml b/changelogs/unreleased/38052-use-simple-api-for-projects.yml new file mode 100644 index 00000000000..49c7485861e --- /dev/null +++ b/changelogs/unreleased/38052-use-simple-api-for-projects.yml @@ -0,0 +1,5 @@ +--- +title: Use `simple=true` for projects API in Projects dropdown for better search performance +merge_request: +author: +type: other -- cgit v1.2.1 From e5fecc3a377c458e49751e3d2eacfb52972e59c6 Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Thu, 28 Sep 2017 19:07:22 +0200 Subject: Create repositories via Gitaly --- Gemfile | 2 +- Gemfile.lock | 4 +-- app/models/project.rb | 2 +- app/models/project_wiki.rb | 2 +- lib/gitlab/git/repository.rb | 7 ++-- lib/gitlab/gitaly_client/repository_service.rb | 5 +++ lib/gitlab/shell.rb | 16 +++++++-- lib/tasks/gitlab/shell.rake | 2 +- spec/lib/gitlab/shell_spec.rb | 46 ++++++++++++++++--------- spec/lib/gitlab/workhorse_spec.rb | 11 +++--- spec/models/project_spec.rb | 6 ++-- spec/services/projects/create_service_spec.rb | 5 +-- spec/services/projects/fork_service_spec.rb | 5 +-- spec/services/projects/transfer_service_spec.rb | 7 ++-- spec/services/projects/update_service_spec.rb | 5 +-- 15 files changed, 77 insertions(+), 48 deletions(-) diff --git a/Gemfile b/Gemfile index b9b9b345dfe..9a760134679 100644 --- a/Gemfile +++ b/Gemfile @@ -398,7 +398,7 @@ group :ed25519 do end # Gitaly GRPC client -gem 'gitaly-proto', '~> 0.37.0', require: 'gitaly' +gem 'gitaly-proto', '~> 0.38.0', require: 'gitaly' gem 'toml-rb', '~> 0.3.15', require: false diff --git a/Gemfile.lock b/Gemfile.lock index dbcf3177f6e..03ffb880fc9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -275,7 +275,7 @@ GEM po_to_json (>= 1.0.0) rails (>= 3.2.0) gherkin-ruby (0.3.2) - gitaly-proto (0.37.0) + gitaly-proto (0.38.0) google-protobuf (~> 3.1) grpc (~> 1.0) github-linguist (4.7.6) @@ -1025,7 +1025,7 @@ DEPENDENCIES gettext (~> 3.2.2) gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails_js (~> 1.2.0) - gitaly-proto (~> 0.37.0) + gitaly-proto (~> 0.38.0) github-linguist (~> 4.7.0) gitlab-flowdock-git-hook (~> 1.0.1) gitlab-markup (~> 1.6.2) diff --git a/app/models/project.rb b/app/models/project.rb index 9b10401f5b8..bb3f74c4b89 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1035,7 +1035,7 @@ class Project < ActiveRecord::Base # Forked import is handled asynchronously return if forked? && !force - if gitlab_shell.add_repository(repository_storage_path, disk_path) + if gitlab_shell.add_repository(repository_storage, disk_path) repository.after_create true else diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index 698fdf7a20c..c4cc1c1cf22 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -174,7 +174,7 @@ class ProjectWiki private def init_repo(disk_path) - gitlab_shell.add_repository(project.repository_storage_path, disk_path) + gitlab_shell.add_repository(project.repository_storage, disk_path) end def commit_details(action, message = nil, title = nil) diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 449fb9d9c63..ef76245a608 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -23,11 +23,8 @@ module Gitlab TagExistsError = Class.new(StandardError) class << self - # Unlike `new`, `create` takes the storage path, not the storage name - def create(storage_path, name, bare: true, symlink_hooks_to: nil) - repo_path = File.join(storage_path, name) - repo_path += '.git' unless repo_path.end_with?('.git') - + # Unlike `new`, `create` takes the repository path + def create(repo_path, bare: true, symlink_hooks_to: nil) FileUtils.mkdir_p(repo_path, mode: 0770) # Equivalent to `git --git-path=#{repo_path} init [--bare]` diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb index 177a1284f38..fdf912214e0 100644 --- a/lib/gitlab/gitaly_client/repository_service.rb +++ b/lib/gitlab/gitaly_client/repository_service.rb @@ -53,6 +53,11 @@ module Gitlab GitalyClient.call(@storage, :repository_service, :fetch_remote, request) end + + def create_repository + request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo) + GitalyClient.call(@storage, :repository_service, :create_repository, request) + end end end end diff --git a/lib/gitlab/shell.rb b/lib/gitlab/shell.rb index 81ecdf43ef9..a99f8e2b5f8 100644 --- a/lib/gitlab/shell.rb +++ b/lib/gitlab/shell.rb @@ -65,7 +65,7 @@ module Gitlab # Init new repository # - # storage - project's storage path + # storage - project's storage name # name - project path with namespace # # Ex. @@ -73,7 +73,19 @@ module Gitlab # # Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/387 def add_repository(storage, name) - Gitlab::Git::Repository.create(storage, name, bare: true, symlink_hooks_to: gitlab_shell_hooks_path) + relative_path = name.dup + relative_path << '.git' unless relative_path.end_with?('.git') + + gitaly_migrate(:create_repository) do |is_enabled| + if is_enabled + repository = Gitlab::Git::Repository.new(storage, relative_path, '') + repository.gitaly_repository_client.create_repository + true + else + repo_path = File.join(Gitlab.config.repositories.storages[storage]['path'], relative_path) + Gitlab::Git::Repository.create(repo_path, bare: true, symlink_hooks_to: gitlab_shell_hooks_path) + end + end rescue => err Rails.logger.error("Failed to add repository #{storage}/#{name}: #{err}") false diff --git a/lib/tasks/gitlab/shell.rake b/lib/tasks/gitlab/shell.rake index 42825f29e32..0e6aed32c52 100644 --- a/lib/tasks/gitlab/shell.rake +++ b/lib/tasks/gitlab/shell.rake @@ -79,7 +79,7 @@ namespace :gitlab do if File.exist?(path_to_repo) print '-' else - if Gitlab::Shell.new.add_repository(project.repository_storage_path, + if Gitlab::Shell.new.add_repository(project.repository_storage, project.disk_path) print '.' else diff --git a/spec/lib/gitlab/shell_spec.rb b/spec/lib/gitlab/shell_spec.rb index 8edf83864da..be11647415e 100644 --- a/spec/lib/gitlab/shell_spec.rb +++ b/spec/lib/gitlab/shell_spec.rb @@ -126,30 +126,42 @@ describe Gitlab::Shell do end describe '#add_repository' do - it 'creates a repository' do - created_path = File.join(TestEnv.repos_path, 'project', 'path.git') - hooks_path = File.join(created_path, 'hooks') + shared_examples '#add_repository' do + let(:repository_storage) { 'default' } + let(:repository_storage_path) { Gitlab.config.repositories.storages[repository_storage]['path'] } + let(:repo_name) { 'project/path' } + let(:created_path) { File.join(repository_storage_path, repo_name + '.git') } - begin - result = gitlab_shell.add_repository(TestEnv.repos_path, 'project/path') - - repo_stat = File.stat(created_path) rescue nil - hooks_stat = File.lstat(hooks_path) rescue nil - hooks_dir = File.realpath(hooks_path) - ensure + after do FileUtils.rm_rf(created_path) end - expect(result).to be_truthy - expect(repo_stat.mode & 0o777).to eq(0o770) - expect(hooks_stat.symlink?).to be_truthy - expect(hooks_dir).to eq(gitlab_shell_hooks_path) + it 'creates a repository' do + expect(gitlab_shell.add_repository(repository_storage, repo_name)).to be_truthy + + expect(File.stat(created_path).mode & 0o777).to eq(0o770) + + hooks_path = File.join(created_path, 'hooks') + expect(File.lstat(hooks_path)).to be_symlink + expect(File.realpath(hooks_path)).to eq(gitlab_shell_hooks_path) + end + + it 'returns false when the command fails' do + FileUtils.mkdir_p(File.dirname(created_path)) + # This file will block the creation of the repo's .git directory. That + # should cause #add_repository to fail. + FileUtils.touch(created_path) + + expect(gitlab_shell.add_repository(repository_storage, repo_name)).to be_falsy + end end - it 'returns false when the command fails' do - expect(FileUtils).to receive(:mkdir_p).and_raise(Errno::EEXIST) + context 'with gitlay' do + it_behaves_like '#add_repository' + end - expect(gitlab_shell.add_repository('current/storage', 'project/path')).to be_falsy + context 'without gitaly', skip_gitaly_mock: true do + it_behaves_like '#add_repository' end end diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb index a333ae33972..5708aa6754f 100644 --- a/spec/lib/gitlab/workhorse_spec.rb +++ b/spec/lib/gitlab/workhorse_spec.rb @@ -214,15 +214,12 @@ describe Gitlab::Workhorse do end it 'includes a Repository param' do - repo_param = { Repository: { + repo_param = { storage_name: 'default', - relative_path: project.full_path + '.git', - git_object_directory: '', - git_alternate_object_directories: [], - gl_repository: '' - } } + relative_path: project.full_path + '.git' + } - expect(subject).to include(repo_param) + expect(subject[:Repository]).to include(repo_param) end context "when git_upload_pack action is passed" do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 3ca88071ced..868a843ab0a 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1303,7 +1303,7 @@ describe Project do context 'using a regular repository' do it 'creates the repository' do expect(shell).to receive(:add_repository) - .with(project.repository_storage_path, project.disk_path) + .with(project.repository_storage, project.disk_path) .and_return(true) expect(project.repository).to receive(:after_create) @@ -1313,7 +1313,7 @@ describe Project do it 'adds an error if the repository could not be created' do expect(shell).to receive(:add_repository) - .with(project.repository_storage_path, project.disk_path) + .with(project.repository_storage, project.disk_path) .and_return(false) expect(project.repository).not_to receive(:after_create) @@ -1370,7 +1370,7 @@ describe Project do .and_return(false) expect(shell).to receive(:add_repository) - .with(project.repository_storage_path, project.disk_path) + .with(project.repository_storage, project.disk_path) .and_return(true) project.ensure_repository diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 5da634e2fb1..c2ec805ea99 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -156,10 +156,11 @@ describe Projects::CreateService, '#execute' do } end - let(:repository_storage_path) { Gitlab.config.repositories.storages['default']['path'] } + let(:repository_storage) { 'default' } + let(:repository_storage_path) { Gitlab.config.repositories.storages[repository_storage]['path'] } before do - gitlab_shell.add_repository(repository_storage_path, "#{user.namespace.full_path}/existing") + gitlab_shell.add_repository(repository_storage, "#{user.namespace.full_path}/existing") end after do diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb index a6e0364d44c..fa9d6969830 100644 --- a/spec/services/projects/fork_service_spec.rb +++ b/spec/services/projects/fork_service_spec.rb @@ -76,10 +76,11 @@ describe Projects::ForkService do end context 'repository already exists' do - let(:repository_storage_path) { Gitlab.config.repositories.storages['default']['path'] } + let(:repository_storage) { 'default' } + let(:repository_storage_path) { Gitlab.config.repositories.storages[repository_storage]['path'] } before do - gitlab_shell.add_repository(repository_storage_path, "#{@to_user.namespace.full_path}/#{@from_project.path}") + gitlab_shell.add_repository(repository_storage, "#{@to_user.namespace.full_path}/#{@from_project.path}") end after do diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index a14ed526f68..2459f371a91 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -121,11 +121,14 @@ describe Projects::TransferService do end context 'namespace which contains orphan repository with same projects path name' do - let(:repository_storage_path) { Gitlab.config.repositories.storages['default']['path'] } + let(:repository_storage) { 'default' } + let(:repository_storage_path) { Gitlab.config.repositories.storages[repository_storage]['path'] } before do group.add_owner(user) - gitlab_shell.add_repository(repository_storage_path, "#{group.full_path}/#{project.path}") + unless gitlab_shell.add_repository(repository_storage, "#{group.full_path}/#{project.path}") + raise 'failed to add repository' + end @result = transfer_project(project, user, group) end diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index c551083ac90..4873e967535 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -149,10 +149,11 @@ describe Projects::UpdateService, '#execute' do end context 'when renaming a project' do - let(:repository_storage_path) { Gitlab.config.repositories.storages['default']['path'] } + let(:repository_storage) { 'default' } + let(:repository_storage_path) { Gitlab.config.repositories.storages[repository_storage]['path'] } before do - gitlab_shell.add_repository(repository_storage_path, "#{user.namespace.full_path}/existing") + gitlab_shell.add_repository(repository_storage, "#{user.namespace.full_path}/existing") end after do -- cgit v1.2.1 From 3040b994df0de7b6a6c4159a887fe7c8733bbb4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Fri, 29 Sep 2017 13:14:08 +0200 Subject: Ensure no exception is raised when Raven tries to get the current user in API context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- .../38571-fix-exception-in-raven-report.yml | 6 ++++++ lib/api/helpers.rb | 8 +++++--- spec/requests/api/helpers_spec.rb | 21 +++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/38571-fix-exception-in-raven-report.yml diff --git a/changelogs/unreleased/38571-fix-exception-in-raven-report.yml b/changelogs/unreleased/38571-fix-exception-in-raven-report.yml new file mode 100644 index 00000000000..62e3b8d304c --- /dev/null +++ b/changelogs/unreleased/38571-fix-exception-in-raven-report.yml @@ -0,0 +1,6 @@ +--- +title: Ensure no exception is raised when Raven tries to get the current user in API + context +merge_request: 14580 +author: +type: fixed diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 1e8475ba3ec..4964a76bef6 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -464,10 +464,12 @@ module API header(*Gitlab::Workhorse.send_artifacts_entry(build, entry)) end - # The Grape Error Middleware only has access to env but no params. We workaround this by - # defining a method that returns the right value. + # The Grape Error Middleware only has access to `env` but not `params` nor + # `request`. We workaround this by defining methods that returns the right + # values. def define_params_for_grape_middleware - self.define_singleton_method(:params) { Rack::Request.new(env).params.symbolize_keys } + self.define_singleton_method(:request) { Rack::Request.new(env) } + self.define_singleton_method(:params) { request.params.symbolize_keys } end # We could get a Grape or a standard Ruby exception. We should only report anything that diff --git a/spec/requests/api/helpers_spec.rb b/spec/requests/api/helpers_spec.rb index 98c49d3364c..060c8902471 100644 --- a/spec/requests/api/helpers_spec.rb +++ b/spec/requests/api/helpers_spec.rb @@ -480,6 +480,27 @@ describe API::Helpers do handle_api_exception(exception) end + + context 'with a personal access token given' do + let(:token) { create(:personal_access_token, scopes: ['api'], user: user) } + + # Regression test for https://gitlab.com/gitlab-org/gitlab-ce/issues/38571 + it 'does not raise an additional exception because of missing `request`' do + # We need to stub at a lower level than #sentry_enabled? otherwise + # Sentry is not enabled when the request below is made, and the test + # would pass even without the fix + expect(Gitlab::Sentry).to receive(:enabled?).twice.and_return(true) + expect(ProjectsFinder).to receive(:new).and_raise('Runtime Error!') + + get api('/projects', personal_access_token: token) + + # The 500 status is expected as we're testing a case where an exception + # is raised, but Grape shouldn't raise an additional exception + expect(response).to have_gitlab_http_status(500) + expect(json_response['message']).not_to include("undefined local variable or method `request'") + expect(json_response['message']).to start_with("\nRuntimeError (Runtime Error!):") + end + end end describe '.authenticate_non_get!' do -- cgit v1.2.1 From 1d40639ec721c12dba928f73f64dd1bab04fda1b Mon Sep 17 00:00:00 2001 From: Victor Wu Date: Fri, 29 Sep 2017 17:52:32 +0000 Subject: Update CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 03521c321a1..6b261bd5938 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -229,6 +229,10 @@ members to further discuss scope, design, and technical considerations. This wil ensure that that your contribution is aligned with the GitLab product and minimize any rework and delay in getting it merged into master. +GitLab team members who apply the ~"Accepting Merge Requests" label to an issue +should update the issue description with a responsible product manager, inviting +any potential community contributor to @-mention per above. + [up-for-grabs]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=Accepting+Merge+Requests&scope=all&sort=weight_asc&state=opened [firt-timers]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name%5B%5D=Accepting+Merge+Requests&scope=all&sort=upvotes_desc&state=opened&weight=1 -- cgit v1.2.1 From aedcaba4940be089d409b9bf27cf3a30f8460e8c Mon Sep 17 00:00:00 2001 From: James Ramsay Date: Fri, 29 Sep 2017 14:02:27 -0400 Subject: Fix incorrectly aligned last updated time --- app/assets/javascripts/repo/components/repo_file.vue | 2 +- app/assets/javascripts/repo/components/repo_sidebar.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/repo/components/repo_file.vue b/app/assets/javascripts/repo/components/repo_file.vue index 20ebf840774..8b9cbd23456 100644 --- a/app/assets/javascripts/repo/components/repo_file.vue +++ b/app/assets/javascripts/repo/components/repo_file.vue @@ -95,7 +95,7 @@ export default RepoFile; - + diff --git a/app/assets/javascripts/repo/components/repo_sidebar.vue b/app/assets/javascripts/repo/components/repo_sidebar.vue index dc1bda95a01..1e40814b95f 100644 --- a/app/assets/javascripts/repo/components/repo_sidebar.vue +++ b/app/assets/javascripts/repo/components/repo_sidebar.vue @@ -75,7 +75,7 @@ export default { Name Last Commit - Last Update + Last Update -- cgit v1.2.1 From 999b7e553b1e1e04c2be4289b94557813f140cfe Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 21 Sep 2017 16:40:17 -0400 Subject: remove unused from_gitaly method --- lib/gitlab/git/user.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/gitlab/git/user.rb b/lib/gitlab/git/user.rb index ea634d39668..e142992f324 100644 --- a/lib/gitlab/git/user.rb +++ b/lib/gitlab/git/user.rb @@ -7,10 +7,6 @@ module Gitlab new(gitlab_user.name, gitlab_user.email, Gitlab::GlId.gl_id(gitlab_user)) end - def self.from_gitaly(gitaly_user) - new(gitaly_user.name, gitaly_user.email, gitaly_user.gl_id) - end - def initialize(name, email, gl_id) @name = name @email = email -- cgit v1.2.1 From dbcf48af8b21c0f1e54b73ea421911028081e1c1 Mon Sep 17 00:00:00 2001 From: David Turner Date: Wed, 2 Aug 2017 14:14:50 -0400 Subject: Add username as GL_USERNAME in hooks (http) When calling pre-receive, post-receive, and update hooks, add the GitLab username as the GL_USERNAME environment variable. This patch only handles cases where pushes are over http, or via the web interface. Later, we will address the ssh case. --- changelogs/unreleased/remote_user.yml | 4 ++++ lib/gitlab/git/hook.rb | 18 ++++++++++++------ lib/gitlab/git/hooks_service.rb | 15 ++++++++------- lib/gitlab/git/user.rb | 9 +++++---- spec/lib/gitlab/git/hook_spec.rb | 8 +++++--- spec/lib/gitlab/git/hooks_service_spec.rb | 2 +- spec/lib/gitlab/git/user_spec.rb | 18 ++++++++++-------- spec/lib/gitlab/workhorse_spec.rb | 14 ++++++++++++-- spec/models/repository_spec.rb | 6 +++--- 9 files changed, 60 insertions(+), 34 deletions(-) create mode 100644 changelogs/unreleased/remote_user.yml diff --git a/changelogs/unreleased/remote_user.yml b/changelogs/unreleased/remote_user.yml new file mode 100644 index 00000000000..75a941fa95f --- /dev/null +++ b/changelogs/unreleased/remote_user.yml @@ -0,0 +1,4 @@ +--- +title: Add username as GL_USERNAME in hooks +merge_request: +author: diff --git a/lib/gitlab/git/hook.rb b/lib/gitlab/git/hook.rb index 208e4bbaf60..8ccb3e64636 100644 --- a/lib/gitlab/git/hook.rb +++ b/lib/gitlab/git/hook.rb @@ -22,22 +22,22 @@ module Gitlab File.exist?(path) end - def trigger(gl_id, oldrev, newrev, ref) + def trigger(gl_id, gl_username, oldrev, newrev, ref) return [true, nil] unless exists? Bundler.with_clean_env do case name when "pre-receive", "post-receive" - call_receive_hook(gl_id, oldrev, newrev, ref) + call_receive_hook(gl_id, gl_username, oldrev, newrev, ref) when "update" - call_update_hook(gl_id, oldrev, newrev, ref) + call_update_hook(gl_id, gl_username, oldrev, newrev, ref) end end end private - def call_receive_hook(gl_id, oldrev, newrev, ref) + def call_receive_hook(gl_id, gl_username, oldrev, newrev, ref) changes = [oldrev, newrev, ref].join(" ") exit_status = false @@ -45,6 +45,7 @@ module Gitlab vars = { 'GL_ID' => gl_id, + 'GL_USERNAME' => gl_username, 'PWD' => repo_path, 'GL_PROTOCOL' => GL_PROTOCOL, 'GL_REPOSITORY' => repository.gl_repository @@ -80,9 +81,14 @@ module Gitlab [exit_status, exit_message] end - def call_update_hook(gl_id, oldrev, newrev, ref) + def call_update_hook(gl_id, gl_username, oldrev, newrev, ref) Dir.chdir(repo_path) do - stdout, stderr, status = Open3.capture3({ 'GL_ID' => gl_id }, path, ref, oldrev, newrev) + stdout, stderr, status = Open3.capture3( + { + 'GL_ID' => gl_id, + 'GL_USERNAME' => gl_username + }, + path, ref, oldrev, newrev) [status.success?, (stderr.presence || stdout).gsub(/\R/, "
").html_safe] end end diff --git a/lib/gitlab/git/hooks_service.rb b/lib/gitlab/git/hooks_service.rb index ea8a87a1290..c327e9b1616 100644 --- a/lib/gitlab/git/hooks_service.rb +++ b/lib/gitlab/git/hooks_service.rb @@ -5,12 +5,13 @@ module Gitlab attr_accessor :oldrev, :newrev, :ref - def execute(committer, repository, oldrev, newrev, ref) - @repository = repository - @gl_id = committer.gl_id - @oldrev = oldrev - @newrev = newrev - @ref = ref + def execute(pusher, repository, oldrev, newrev, ref) + @repository = repository + @gl_id = pusher.gl_id + @gl_username = pusher.name + @oldrev = oldrev + @newrev = newrev + @ref = ref %w(pre-receive update).each do |hook_name| status, message = run_hook(hook_name) @@ -29,7 +30,7 @@ module Gitlab def run_hook(name) hook = Gitlab::Git::Hook.new(name, @repository) - hook.trigger(@gl_id, oldrev, newrev, ref) + hook.trigger(@gl_id, @gl_username, oldrev, newrev, ref) end end end diff --git a/lib/gitlab/git/user.rb b/lib/gitlab/git/user.rb index e142992f324..cb1af5f3b7c 100644 --- a/lib/gitlab/git/user.rb +++ b/lib/gitlab/git/user.rb @@ -1,20 +1,21 @@ module Gitlab module Git class User - attr_reader :name, :email, :gl_id + attr_reader :username, :name, :email, :gl_id def self.from_gitlab(gitlab_user) - new(gitlab_user.name, gitlab_user.email, Gitlab::GlId.gl_id(gitlab_user)) + new(gitlab_user.username, gitlab_user.name, gitlab_user.email, Gitlab::GlId.gl_id(gitlab_user)) end - def initialize(name, email, gl_id) + def initialize(username, name, email, gl_id) + @username = username @name = name @email = email @gl_id = gl_id end def ==(other) - [name, email, gl_id] == [other.name, other.email, other.gl_id] + [username, name, email, gl_id] == [other.username, other.name, other.email, other.gl_id] end end end diff --git a/spec/lib/gitlab/git/hook_spec.rb b/spec/lib/gitlab/git/hook_spec.rb index 0ff4f3bd105..2fe1f5603ce 100644 --- a/spec/lib/gitlab/git/hook_spec.rb +++ b/spec/lib/gitlab/git/hook_spec.rb @@ -14,6 +14,7 @@ describe Gitlab::Git::Hook do let(:repo_path) { repository.path } let(:user) { create(:user) } let(:gl_id) { Gitlab::GlId.gl_id(user) } + let(:gl_username) { user.username } def create_hook(name) FileUtils.mkdir_p(File.join(repo_path, 'hooks')) @@ -42,6 +43,7 @@ describe Gitlab::Git::Hook do let(:env) do { 'GL_ID' => gl_id, + 'GL_USERNAME' => gl_username, 'PWD' => repo_path, 'GL_PROTOCOL' => 'web', 'GL_REPOSITORY' => gl_repository @@ -59,7 +61,7 @@ describe Gitlab::Git::Hook do .with(env, hook_path, chdir: repo_path).and_call_original end - status, errors = hook.trigger(gl_id, blank, blank, ref) + status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref) expect(status).to be true expect(errors).to be_blank end @@ -72,7 +74,7 @@ describe Gitlab::Git::Hook do blank = Gitlab::Git::BLANK_SHA ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch' - status, errors = hook.trigger(gl_id, blank, blank, ref) + status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref) expect(status).to be false expect(errors).to eq("error message from the hook
error message from the hook line 2
") end @@ -86,7 +88,7 @@ describe Gitlab::Git::Hook do blank = Gitlab::Git::BLANK_SHA ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch' - status, errors = hook.trigger(gl_id, blank, blank, ref) + status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref) expect(status).to be true expect(errors).to be_nil end diff --git a/spec/lib/gitlab/git/hooks_service_spec.rb b/spec/lib/gitlab/git/hooks_service_spec.rb index d4d75b66659..51e4e3fdad1 100644 --- a/spec/lib/gitlab/git/hooks_service_spec.rb +++ b/spec/lib/gitlab/git/hooks_service_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Gitlab::Git::HooksService, seed_helper: true do - let(:user) { Gitlab::Git::User.new('Jane Doe', 'janedoe@example.com', 'user-456') } + let(:user) { Gitlab::Git::User.new('janedoe', 'Jane Doe', 'janedoe@example.com', 'user-456') } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, 'project-123') } let(:service) { described_class.new } diff --git a/spec/lib/gitlab/git/user_spec.rb b/spec/lib/gitlab/git/user_spec.rb index 0ebcecb26c0..ab64b041187 100644 --- a/spec/lib/gitlab/git/user_spec.rb +++ b/spec/lib/gitlab/git/user_spec.rb @@ -1,22 +1,24 @@ require 'spec_helper' describe Gitlab::Git::User do + let(:username) { 'janedo' } let(:name) { 'Jane Doe' } let(:email) { 'janedoe@example.com' } let(:gl_id) { 'user-123' } - subject { described_class.new(name, email, gl_id) } + subject { described_class.new(username, name, email, gl_id) } describe '#==' do - def eq_other(name, email, gl_id) - eq(described_class.new(name, email, gl_id)) + def eq_other(username, name, email, gl_id) + eq(described_class.new(username, name, email, gl_id)) end - it { expect(subject).to eq_other(name, email, gl_id) } + it { expect(subject).to eq_other(username, name, email, gl_id) } - it { expect(subject).not_to eq_other(nil, nil, nil) } - it { expect(subject).not_to eq_other(name + 'x', email, gl_id) } - it { expect(subject).not_to eq_other(name, email + 'x', gl_id) } - it { expect(subject).not_to eq_other(name, email, gl_id + 'x') } + it { expect(subject).not_to eq_other(nil, nil, nil, nil) } + it { expect(subject).not_to eq_other(username + 'x', name, email, gl_id) } + it { expect(subject).not_to eq_other(username, name + 'x', email, gl_id) } + it { expect(subject).not_to eq_other(username, name, email + 'x', gl_id) } + it { expect(subject).not_to eq_other(username, name, email, gl_id + 'x') } end end diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb index 5708aa6754f..e56e2df8376 100644 --- a/spec/lib/gitlab/workhorse_spec.rb +++ b/spec/lib/gitlab/workhorse_spec.rb @@ -182,7 +182,12 @@ describe Gitlab::Workhorse do let(:repo_path) { repository.path_to_repo } let(:action) { 'info_refs' } let(:params) do - { GL_ID: "user-#{user.id}", GL_REPOSITORY: "project-#{project.id}", RepoPath: repo_path } + { + GL_ID: "user-#{user.id}", + GL_USERNAME: user.username, + GL_REPOSITORY: "project-#{project.id}", + RepoPath: repo_path + } end subject { described_class.git_http_ok(repository, false, user, action) } @@ -191,7 +196,12 @@ describe Gitlab::Workhorse do context 'when is_wiki' do let(:params) do - { GL_ID: "user-#{user.id}", GL_REPOSITORY: "wiki-#{project.id}", RepoPath: repo_path } + { + GL_ID: "user-#{user.id}", + GL_USERNAME: user.username, + GL_REPOSITORY: "wiki-#{project.id}", + RepoPath: repo_path + } end subject { described_class.git_http_ok(repository, true, user, action) } diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index ab81d39691b..869cf51f6a2 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1679,11 +1679,11 @@ describe Repository do tag_sha = tag.target expect(pre_receive_hook).to have_received(:trigger) - .with(anything, anything, commit_sha, anything) + .with(anything, anything, anything, commit_sha, anything) expect(update_hook).to have_received(:trigger) - .with(anything, anything, commit_sha, anything) + .with(anything, anything, anything, commit_sha, anything) expect(post_receive_hook).to have_received(:trigger) - .with(anything, anything, tag_sha, anything) + .with(anything, anything, anything, tag_sha, anything) end end end -- cgit v1.2.1 From 01ce58bde4ddb9bdf3c54dbd2cc65f7a6b81661e Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 3 Aug 2017 14:38:33 -0400 Subject: add username to authorized result, so that gitlab-shell can pass it to hooks --- GITLAB_SHELL_VERSION | 3 ++- lib/api/internal.rb | 7 +++++++ lib/gitlab/git/hook.rb | 11 +++++------ lib/gitlab/workhorse.rb | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index da902181863..5508e17c23b 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1,2 @@ -5.9.2 +5.9.3 + diff --git a/lib/api/internal.rb b/lib/api/internal.rb index a0557a609ca..6e78ac2c903 100644 --- a/lib/api/internal.rb +++ b/lib/api/internal.rb @@ -31,6 +31,12 @@ module API protocol = params[:protocol] actor.update_last_used_at if actor.is_a?(Key) + user = + if actor.is_a?(Key) + actor.user + else + actor + end access_checker_klass = wiki? ? Gitlab::GitAccessWiki : Gitlab::GitAccess access_checker = access_checker_klass @@ -47,6 +53,7 @@ module API { status: true, gl_repository: gl_repository, + gl_username: user&.username, repository_path: repository_path, gitaly: gitaly_payload(params[:action]) } diff --git a/lib/gitlab/git/hook.rb b/lib/gitlab/git/hook.rb index 8ccb3e64636..e29a1f7afa1 100644 --- a/lib/gitlab/git/hook.rb +++ b/lib/gitlab/git/hook.rb @@ -83,12 +83,11 @@ module Gitlab def call_update_hook(gl_id, gl_username, oldrev, newrev, ref) Dir.chdir(repo_path) do - stdout, stderr, status = Open3.capture3( - { - 'GL_ID' => gl_id, - 'GL_USERNAME' => gl_username - }, - path, ref, oldrev, newrev) + env = { + 'GL_ID' => gl_id, + 'GL_USERNAME' => gl_username + } + stdout, stderr, status = Open3.capture3(env, path, ref, oldrev, newrev) [status.success?, (stderr.presence || stdout).gsub(/\R/, "
").html_safe] end end diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb index 17550cf9074..45f246242f1 100644 --- a/lib/gitlab/workhorse.rb +++ b/lib/gitlab/workhorse.rb @@ -22,9 +22,9 @@ module Gitlab params = { GL_ID: Gitlab::GlId.gl_id(user), GL_REPOSITORY: Gitlab::GlRepository.gl_repository(project, is_wiki), + GL_USERNAME: user&.username, RepoPath: repo_path } - server = { address: Gitlab::GitalyClient.address(project.repository_storage), token: Gitlab::GitalyClient.token(project.repository_storage) -- cgit v1.2.1 From f3f304dc06231b7fb5af71607a5a61574bd9a0ac Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Fri, 29 Sep 2017 15:10:36 -0700 Subject: Ensure all refs are restored on a restore from backup To restore all refs from a bundle, we need to use the --mirror option to ensure that all refs are properly restored. Without this, refs such as `refs/merge-requests/X` and `refs/keep-around/Y` would be omitted, which exposed a bug as described in https://gitlab.com/gitlab-org/gitlab-ce/issues/38319#note_41648608. Closes #38352 --- changelogs/unreleased/sh-restore-all-refs-backup.yml | 5 +++++ lib/backup/repository.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/sh-restore-all-refs-backup.yml diff --git a/changelogs/unreleased/sh-restore-all-refs-backup.yml b/changelogs/unreleased/sh-restore-all-refs-backup.yml new file mode 100644 index 00000000000..eaac0c71dd0 --- /dev/null +++ b/changelogs/unreleased/sh-restore-all-refs-backup.yml @@ -0,0 +1,5 @@ +--- +title: Ensure all refs are restored on a restore from backup +merge_request: +author: +type: fixed diff --git a/lib/backup/repository.rb b/lib/backup/repository.rb index 4e92be85110..3ad09a1b421 100644 --- a/lib/backup/repository.rb +++ b/lib/backup/repository.rb @@ -78,7 +78,7 @@ module Backup project.ensure_storage_path_exists cmd = if File.exist?(path_to_project_bundle) - %W(#{Gitlab.config.git.bin_path} clone --bare #{path_to_project_bundle} #{path_to_project_repo}) + %W(#{Gitlab.config.git.bin_path} clone --bare --mirror #{path_to_project_bundle} #{path_to_project_repo}) else %W(#{Gitlab.config.git.bin_path} init --bare #{path_to_project_repo}) end -- cgit v1.2.1 From 80957f7404d6741427dc225aba4df2d000fa129f Mon Sep 17 00:00:00 2001 From: Ben Bodenmiller Date: Sat, 30 Sep 2017 03:02:42 +0000 Subject: remove period [skip ci] --- doc/user/admin_area/monitoring/health_check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/user/admin_area/monitoring/health_check.md b/doc/user/admin_area/monitoring/health_check.md index 70934f9960a..843fb4ce26b 100644 --- a/doc/user/admin_area/monitoring/health_check.md +++ b/doc/user/admin_area/monitoring/health_check.md @@ -18,7 +18,7 @@ traffic until the system is ready or restart the container as needed. To access monitoring resources, the client IP needs to be included in a whitelist. -[Read how to add IPs to a whitelist for the monitoring endpoints.][admin]. +[Read how to add IPs to a whitelist for the monitoring endpoints][admin]. ## Using the endpoint -- cgit v1.2.1 From a97ff8aae09054f1394da18097bacb5b10a5d809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= Date: Wed, 20 Sep 2017 19:28:57 -0300 Subject: Add a factory for `Gitaly::GitCommit`s --- spec/factories/gitaly/commit.rb | 17 +++++++++++++++++ spec/factories/gitaly/commit_author.rb | 9 +++++++++ spec/lib/gitlab/git/commit_spec.rb | 32 +++++--------------------------- 3 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 spec/factories/gitaly/commit.rb create mode 100644 spec/factories/gitaly/commit_author.rb diff --git a/spec/factories/gitaly/commit.rb b/spec/factories/gitaly/commit.rb new file mode 100644 index 00000000000..e7966cee77b --- /dev/null +++ b/spec/factories/gitaly/commit.rb @@ -0,0 +1,17 @@ +FactoryGirl.define do + sequence(:gitaly_commit_id) { Digest::SHA1.hexdigest(Time.now.to_f.to_s) } + + factory :gitaly_commit, class: Gitaly::GitCommit do + skip_create + + id { generate(:gitaly_commit_id) } + parent_ids do + ids = [generate(:gitaly_commit_id), generate(:gitaly_commit_id)] + Google::Protobuf::RepeatedField.new(:string, ids) + end + subject { "My commit" } + body { subject + "\nMy body" } + author { build(:gitaly_commit_author) } + committer { build(:gitaly_commit_author) } + end +end diff --git a/spec/factories/gitaly/commit_author.rb b/spec/factories/gitaly/commit_author.rb new file mode 100644 index 00000000000..341873a2002 --- /dev/null +++ b/spec/factories/gitaly/commit_author.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :gitaly_commit_author, class: Gitaly::CommitAuthor do + skip_create + + name { generate(:name) } + email { generate(:email) } + date { Google::Protobuf::Timestamp.new(seconds: Time.now.to_i) } + end +end diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb index a3dff6d0d4b..3815055139a 100644 --- a/spec/lib/gitlab/git/commit_spec.rb +++ b/spec/lib/gitlab/git/commit_spec.rb @@ -65,34 +65,12 @@ describe Gitlab::Git::Commit, seed_helper: true do end describe "Commit info from gitaly commit" do - let(:id) { 'f00' } - let(:parent_ids) { %w(b45 b46) } let(:subject) { "My commit".force_encoding('ASCII-8BIT') } let(:body) { subject + "My body".force_encoding('ASCII-8BIT') } - let(:committer) do - Gitaly::CommitAuthor.new( - name: generate(:name), - email: generate(:email), - date: Google::Protobuf::Timestamp.new(seconds: 123) - ) - end - let(:author) do - Gitaly::CommitAuthor.new( - name: generate(:name), - email: generate(:email), - date: Google::Protobuf::Timestamp.new(seconds: 456) - ) - end - let(:gitaly_commit) do - Gitaly::GitCommit.new( - id: id, - subject: subject, - body: body, - author: author, - committer: committer, - parent_ids: parent_ids - ) - end + let(:gitaly_commit) { build(:gitaly_commit, subject: subject, body: body) } + let(:id) { gitaly_commit.id } + let(:committer) { gitaly_commit.committer } + let(:author) { gitaly_commit.author } let(:commit) { described_class.new(repository, gitaly_commit) } it { expect(commit.short_id).to eq(id[0..10]) } @@ -104,7 +82,7 @@ describe Gitlab::Git::Commit, seed_helper: true do it { expect(commit.author_name).to eq(author.name) } it { expect(commit.committer_name).to eq(committer.name) } it { expect(commit.committer_email).to eq(committer.email) } - it { expect(commit.parent_ids).to eq(parent_ids) } + it { expect(commit.parent_ids).to eq(gitaly_commit.parent_ids) } context 'no body' do let(:body) { "".force_encoding('ASCII-8BIT') } -- cgit v1.2.1 From 16f850033fa557d86e5f561001f5f67e17a132bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= Date: Wed, 20 Sep 2017 19:33:56 -0300 Subject: Populate `Gitlay::Repository`'s `gl_repository` field --- lib/gitlab/git/repository.rb | 2 +- lib/gitlab/gitaly_client/util.rb | 3 ++- spec/lib/gitlab/gitaly_client/util_spec.rb | 43 ++++++++++++++++++++++++++++++ spec/lib/gitlab/workhorse_spec.rb | 3 ++- 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 spec/lib/gitlab/gitaly_client/util_spec.rb diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index ef76245a608..9ea5ed04b13 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -1062,7 +1062,7 @@ module Gitlab end def gitaly_repository - Gitlab::GitalyClient::Util.repository(@storage, @relative_path) + Gitlab::GitalyClient::Util.repository(@storage, @relative_path, @gl_repository) end def gitaly_operations_client diff --git a/lib/gitlab/gitaly_client/util.rb b/lib/gitlab/gitaly_client/util.rb index 2fb5875a7a2..da43c616b94 100644 --- a/lib/gitlab/gitaly_client/util.rb +++ b/lib/gitlab/gitaly_client/util.rb @@ -2,10 +2,11 @@ module Gitlab module GitalyClient module Util class << self - def repository(repository_storage, relative_path) + def repository(repository_storage, relative_path, gl_repository) Gitaly::Repository.new( storage_name: repository_storage, relative_path: relative_path, + gl_repository: gl_repository, git_object_directory: Gitlab::Git::Env['GIT_OBJECT_DIRECTORY'].to_s, git_alternate_object_directories: Array.wrap(Gitlab::Git::Env['GIT_ALTERNATE_OBJECT_DIRECTORIES']) ) diff --git a/spec/lib/gitlab/gitaly_client/util_spec.rb b/spec/lib/gitlab/gitaly_client/util_spec.rb new file mode 100644 index 00000000000..498f6886bee --- /dev/null +++ b/spec/lib/gitlab/gitaly_client/util_spec.rb @@ -0,0 +1,43 @@ +require 'spec_helper' + +describe Gitlab::GitalyClient::Util do + describe '.repository' do + let(:repository_storage) { 'default' } + let(:relative_path) { 'my/repo.git' } + let(:gl_repository) { 'project-1' } + let(:git_object_directory) { '.git/objects' } + let(:git_alternate_object_directory) { '/dir/one:/dir/two' } + + subject do + described_class.repository(repository_storage, relative_path, gl_repository) + end + + it 'creates a Gitaly::Repository with the given data' do + expect(Gitlab::Git::Env).to receive(:[]).with('GIT_OBJECT_DIRECTORY') + .and_return(git_object_directory) + expect(Gitlab::Git::Env).to receive(:[]).with('GIT_ALTERNATE_OBJECT_DIRECTORIES') + .and_return(git_alternate_object_directory) + + expect(subject).to be_a(Gitaly::Repository) + expect(subject.storage_name).to eq(repository_storage) + expect(subject.relative_path).to eq(relative_path) + expect(subject.gl_repository).to eq(gl_repository) + expect(subject.git_object_directory).to eq(git_object_directory) + expect(subject.git_alternate_object_directories).to eq([git_alternate_object_directory]) + end + end + + describe '.gitaly_user' do + let(:user) { create(:user) } + let(:gl_id) { Gitlab::GlId.gl_id(user) } + + subject { described_class.gitaly_user(user) } + + it 'creates a Gitaly::User from a GitLab user' do + expect(subject).to be_a(Gitaly::User) + expect(subject.name).to eq(user.name) + expect(subject.email).to eq(user.email) + expect(subject.gl_id).to eq(gl_id) + end + end +end diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb index 5708aa6754f..5f4d69224eb 100644 --- a/spec/lib/gitlab/workhorse_spec.rb +++ b/spec/lib/gitlab/workhorse_spec.rb @@ -216,7 +216,8 @@ describe Gitlab::Workhorse do it 'includes a Repository param' do repo_param = { storage_name: 'default', - relative_path: project.full_path + '.git' + relative_path: project.full_path + '.git', + gl_repository: "project-#{project.id}" } expect(subject[:Repository]).to include(repo_param) -- cgit v1.2.1 From fa5f0164eba8a03ba4fa1403849f3996577fd2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= Date: Wed, 20 Sep 2017 19:34:30 -0300 Subject: Implement OperationService.UserAddBranch Gitaly RPC --- lib/gitlab/git/repository.rb | 34 ++++++++-- lib/gitlab/gitaly_client/operation_service.rb | 20 ++++++ .../gitlab/gitaly_client/operation_service_spec.rb | 55 ++++++++++++++++ spec/models/repository_spec.rb | 75 ++++++++++++++-------- 4 files changed, 152 insertions(+), 32 deletions(-) create mode 100644 spec/lib/gitlab/gitaly_client/operation_service_spec.rb diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 9ea5ed04b13..22b735c6f7b 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -656,13 +656,13 @@ module Gitlab end def add_branch(branch_name, user:, target:) - target_object = Ref.dereference_object(lookup(target)) - raise InvalidRef.new("target not found: #{target}") unless target_object - - OperationService.new(user, self).add_branch(branch_name, target_object.oid) - find_branch(branch_name) - rescue Rugged::ReferenceError => ex - raise InvalidRef, ex + gitaly_migrate(:operation_user_create_branch) do |is_enabled| + if is_enabled + gitaly_add_branch(branch_name, user, target) + else + rugged_add_branch(branch_name, user, target) + end + end end def add_tag(tag_name, user:, target:, message: nil) @@ -1081,6 +1081,10 @@ module Gitlab @gitaly_repository_client ||= Gitlab::GitalyClient::RepositoryService.new(self) end + def gitaly_operation_client + @gitaly_operation_client ||= Gitlab::GitalyClient::OperationService.new(self) + end + def gitaly_migrate(method, status: Gitlab::GitalyClient::MigrationStatus::OPT_IN, &block) Gitlab::GitalyClient.migrate(method, status: status, &block) rescue GRPC::NotFound => e @@ -1472,6 +1476,22 @@ module Gitlab file.write(gitattributes_content) end end + + def gitaly_add_branch(branch_name, user, target) + gitaly_operation_client.user_create_branch(branch_name, user, target) + rescue GRPC::FailedPrecondition => ex + raise InvalidRef, ex + end + + def rugged_add_branch(branch_name, user, target) + target_object = Ref.dereference_object(lookup(target)) + raise InvalidRef.new("target not found: #{target}") unless target_object + + OperationService.new(user, self).add_branch(branch_name, target_object.oid) + find_branch(branch_name) + rescue Rugged::ReferenceError + raise InvalidRef, ex + end end end end diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb index 2d5440e7ea8..46bd5c18603 100644 --- a/lib/gitlab/gitaly_client/operation_service.rb +++ b/lib/gitlab/gitaly_client/operation_service.rb @@ -40,6 +40,26 @@ module Gitlab rescue GRPC::FailedPrecondition => e raise Gitlab::Git::Repository::InvalidRef, e end + + def user_create_branch(branch_name, user, start_point) + request = Gitaly::UserCreateBranchRequest.new( + repository: @gitaly_repo, + branch_name: GitalyClient.encode(branch_name), + user: Util.gitaly_user(user), + start_point: GitalyClient.encode(start_point) + ) + response = GitalyClient.call(@repository.storage, :operation_service, + :user_create_branch, request) + if response.pre_receive_error.present? + raise Gitlab::Git::HooksService::PreReceiveError.new(response.pre_receive_error) + end + + branch = response.branch + return nil unless branch + + target_commit = Gitlab::Git::Commit.decorate(@repository, branch.target_commit) + Gitlab::Git::Branch.new(@repository, branch.name, target_commit.id, target_commit) + end end end end diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb new file mode 100644 index 00000000000..769b14687ac --- /dev/null +++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb @@ -0,0 +1,55 @@ +require 'spec_helper' + +describe Gitlab::GitalyClient::OperationService do + let(:project) { create(:project) } + let(:repository) { project.repository.raw } + let(:client) { described_class.new(repository) } + + describe '#user_create_branch' do + let(:user) { create(:user) } + let(:gitaly_user) { Gitlab::GitalyClient::Util.gitaly_user(user) } + let(:branch_name) { 'new' } + let(:start_point) { 'master' } + let(:request) do + Gitaly::UserCreateBranchRequest.new( + repository: repository.gitaly_repository, + branch_name: branch_name, + start_point: start_point, + user: gitaly_user + ) + end + let(:gitaly_commit) { build(:gitaly_commit) } + let(:commit_id) { gitaly_commit.id } + let(:gitaly_branch) do + Gitaly::Branch.new(name: branch_name, target_commit: gitaly_commit) + end + let(:response) { Gitaly::UserCreateBranchResponse.new(branch: gitaly_branch) } + let(:commit) { Gitlab::Git::Commit.new(repository, gitaly_commit) } + + subject { client.user_create_branch(branch_name, user, start_point) } + + it 'sends a user_create_branch message and returns a Gitlab::git::Branch' do + expect_any_instance_of(Gitaly::OperationService::Stub) + .to receive(:user_create_branch).with(request, kind_of(Hash)) + .and_return(response) + + expect(subject.name).to eq(branch_name) + expect(subject.dereferenced_target).to eq(commit) + end + + context "when pre_receive_error is present" do + let(:response) do + Gitaly::UserCreateBranchResponse.new(pre_receive_error: "something failed") + end + + it "throws a PreReceive exception" do + expect_any_instance_of(Gitaly::OperationService::Stub) + .to receive(:user_create_branch).with(request, kind_of(Hash)) + .and_return(response) + + expect { subject }.to raise_error( + Gitlab::Git::HooksService::PreReceiveError, "something failed") + end + end + end +end diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index ab81d39691b..7b562583f37 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -815,45 +815,70 @@ describe Repository do end describe '#add_branch' do - context 'when pre hooks were successful' do - it 'runs without errors' do - hook = double(trigger: [true, nil]) - expect(Gitlab::Git::Hook).to receive(:new).exactly(3).times.and_return(hook) + let(:branch_name) { 'new_feature' } + let(:target) { 'master' } - expect { repository.add_branch(user, 'new_feature', 'master') }.not_to raise_error - end + subject { repository.add_branch(user, branch_name, target) } - it 'creates the branch' do - allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil]) + context 'with Gitaly enabled' do + it "calls Gitaly's OperationService" do + expect_any_instance_of(Gitlab::GitalyClient::OperationService) + .to receive(:user_create_branch).with(branch_name, user, target) + .and_return(nil) - branch = repository.add_branch(user, 'new_feature', 'master') + subject + end - expect(branch.name).to eq('new_feature') + it 'creates_the_branch' do + expect(subject.name).to eq(branch_name) + expect(repository.find_branch(branch_name)).not_to be_nil end - it 'calls the after_create_branch hook' do - expect(repository).to receive(:after_create_branch) + context 'with a non-existing target' do + let(:target) { 'fake-target' } - repository.add_branch(user, 'new_feature', 'master') + it "returns false and doesn't create the branch" do + expect(subject).to be(false) + expect(repository.find_branch(branch_name)).to be_nil + end end end - context 'when pre hooks failed' do - it 'gets an error' do - allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, '']) + context 'with Gitaly disabled', skip_gitaly_mock: true do + context 'when pre hooks were successful' do + it 'runs without errors' do + hook = double(trigger: [true, nil]) + expect(Gitlab::Git::Hook).to receive(:new).exactly(3).times.and_return(hook) - expect do - repository.add_branch(user, 'new_feature', 'master') - end.to raise_error(Gitlab::Git::HooksService::PreReceiveError) + expect { subject }.not_to raise_error + end + + it 'creates the branch' do + allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil]) + + expect(subject.name).to eq(branch_name) + end + + it 'calls the after_create_branch hook' do + expect(repository).to receive(:after_create_branch) + + subject + end end - it 'does not create the branch' do - allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, '']) + context 'when pre hooks failed' do + it 'gets an error' do + allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, '']) - expect do - repository.add_branch(user, 'new_feature', 'master') - end.to raise_error(Gitlab::Git::HooksService::PreReceiveError) - expect(repository.find_branch('new_feature')).to be_nil + expect { subject }.to raise_error(Gitlab::Git::HooksService::PreReceiveError) + end + + it 'does not create the branch' do + allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, '']) + + expect { subject }.to raise_error(Gitlab::Git::HooksService::PreReceiveError) + expect(repository.find_branch(branch_name)).to be_nil + end end end end -- cgit v1.2.1 From 018771516ea360bdc02cdc6659a0fd5c881c7350 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Fri, 29 Sep 2017 21:21:31 -0700 Subject: Fix Admin -> License selector for GitLab QA specs Closes gitlab-qa#68 --- qa/qa/page/admin/menu.rb | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/qa/qa/page/admin/menu.rb b/qa/qa/page/admin/menu.rb index b01a4e10f93..f4619042e34 100644 --- a/qa/qa/page/admin/menu.rb +++ b/qa/qa/page/admin/menu.rb @@ -3,15 +3,10 @@ module QA module Admin class Menu < Page::Base def go_to_license - within_middle_menu { click_link 'License' } - end - - private - - def within_middle_menu - page.within('.nav-control') do - yield - end + link = find_link 'License' + # Click space to scroll this link into the view + link.send_keys(:space) + link.click end end end -- cgit v1.2.1 From 98bfbd49ac3be6a767ab19ac5c6a89eb090ee3ab Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Sat, 30 Sep 2017 02:28:47 -0400 Subject: updates --- doc/install/kubernetes/gitlab_chart.md | 9 ++++++--- doc/install/kubernetes/index.md | 12 +++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/doc/install/kubernetes/gitlab_chart.md b/doc/install/kubernetes/gitlab_chart.md index 177124c8291..ddfd47df099 100644 --- a/doc/install/kubernetes/gitlab_chart.md +++ b/doc/install/kubernetes/gitlab_chart.md @@ -1,8 +1,13 @@ # GitLab Helm Chart > **Note**: -* This chart will be replaced by the [gitlab-omnibus](gitlab_omnibus.md) chart, once it supports [additional configuration options](https://gitlab.com/charts/charts.gitlab.io/issues/68). +* This chart will be replaced by the [gitlab-omnibus](gitlab_omnibus.md) chart, once it supports [additional configuration options](https://gitlab.com/charts/charts.gitlab.io/issues/68). For more information on available charts, please see our [overview](index.md#chart-overview). * These charts have been tested on Google Container Engine and Azure Container Service. Other Kubernetes installations may work as well, if not please [open an issue](https://gitlab.com/charts/charts.gitlab.io/issues). + +For more information on available GitLab Helm Charts, please see our [overview](index.md#chart-overview). + +## Introduction + The `gitlab` Helm chart deploys just GitLab into your Kubernetes cluster, and offers extensive configuration options. This chart requires advanced knowledge of Kubernetes to successfully use. For most deployments we **strongly recommended** the [gitlab-omnibus](gitlab_omnibus.md) chart, which will replace this chart once it supports [additional configuration options](https://gitlab.com/charts/charts.gitlab.io/issues/68). Due to the difficulty in supporting upgrades to the `omnibus-gitlab` chart, migrating will require exporting data out of this instance and importing it into the new deployment. This chart includes the following: @@ -15,8 +20,6 @@ This chart includes the following: - Optional PostgreSQL deployment using the [PostgreSQL Chart](https://github.com/kubernetes/charts/tree/master/stable/postgresql) (defaults to enabled) - Optional Ingress (defaults to disabled) -For more information on available GitLab Helm Charts, please see our [overview](index.md#chart-overview). - ## Prerequisites - _At least_ 3 GB of RAM available on your cluster. 41GB of storage and 2 CPU are also required. diff --git a/doc/install/kubernetes/index.md b/doc/install/kubernetes/index.md index 467d5b92e0c..f7720998e62 100644 --- a/doc/install/kubernetes/index.md +++ b/doc/install/kubernetes/index.md @@ -9,8 +9,8 @@ should be deployed, upgraded, and configured. ## Chart Overview -* **[GitLab-Omnibus](#gitlab-omnibus-chart-recommended)**: The best way to run GitLab on Kubernetes today. It is suited for small to medium deployments, and is in beta while support for backups and other features are added. -* **[Upcoming Cloud Native Charts](#upcoming-cloud-native-helm-charts)**: The next generation of charts, currently in development. Will support large deployments, with horizontal scaling of individual GitLab components. +* **[GitLab-Omnibus](gitlab_omnibus.md)**: The best way to run GitLab on Kubernetes today. It is suited for small to medium deployments, and is in beta while support for backups and other features are added. +* **[Cloud Native Charts](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md)**: The next generation of charts, currently in development. Will support large deployments, with horizontal scaling of individual GitLab components. * Other Charts * [GitLab Runner Chart](#gitlab-runner-chart): For deploying just the GitLab Runner. * [Advanced GitLab Installation](#advanced-gitlab-installation): Provides additional deployment options, but provides less functionality out-of-the-box. It's beta, no longer actively developed, and will be deprecated by [gitlab-omnibus](#gitlab-omnibus-chart-recommended) once it supports these options. @@ -25,9 +25,9 @@ Once the [cloud native charts](#upcoming-cloud-native-helm-charts) are ready for Learn more about the [gitlab-omnibus chart.](gitlab_omnibus.md) -## Upcoming Cloud Native Charts +## Cloud Native Charts -GitLab is working towards building a [cloud native deployment method](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md). A key part of this effort is to isolate each service into its [own Docker container and Helm chart](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/2420), rather than utilizing the all-in-one container image of the [current charts](#official-gitlab-helm-charts-recommended). +GitLab is working towards building a [cloud native GitLab chart](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md). A key part of this effort is to isolate each service into its [own Docker container and Helm chart](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/2420), rather than utilizing the all-in-one container image of the [current charts](#official-gitlab-helm-charts-recommended). By offering individual containers and charts, we will be able to provide a number of benefits: * Easier horizontal scaling of each service, @@ -37,6 +37,8 @@ By offering individual containers and charts, we will be able to provide a numbe This is a large project and will be worked on over the span of multiple releases. For the most up-to-date status and release information, please see our [tracking issue](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/2420). We do not expect these to be production ready before the second half of 2018. +Learn more about the [cloud native GitLab chart.](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md) + ## Other Charts ### GitLab Runner Chart @@ -55,7 +57,7 @@ Learn more about the [gitlab chart.](gitlab_chart.md) ### Community Contributed Charts -The community has also [contributed GitLab charts](https://github.com/kubernetes/charts/tree/master/stable/gitlab-ce) to the [Helm Stable Repository](https://github.com/kubernetes/charts#repository-structure). These charts should be considered [deprecated](https://github.com/kubernetes/charts/issues/1138) in favor of the [official Charts](#official-gitlab-helm-charts-recommended). +The community has also contributed GitLab [CE]((https://github.com/kubernetes/charts/tree/master/stable/gitlab-ce)) and [EE]((https://github.com/kubernetes/charts/tree/master/stable/gitlab-ce)) charts to the [Helm Stable Repository](https://github.com/kubernetes/charts#repository-structure). These charts should be considered [deprecated](https://github.com/kubernetes/charts/issues/1138) in favor of the [official Charts](gitlab_omnibus.md). [chart]: https://github.com/kubernetes/charts [helm]: https://github.com/kubernetes/helm/blob/master/README.md -- cgit v1.2.1 From 5d46236f7615859ddc1c3591169e1d0dd39b4597 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Fri, 29 Sep 2017 23:38:12 -0700 Subject: Add GitLab QA documentation [ci skip] --- qa/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/qa/README.md b/qa/README.md index b6b5a76f1d3..e0ebb53a2e9 100644 --- a/qa/README.md +++ b/qa/README.md @@ -16,3 +16,22 @@ against any existing instance. 1. When we release a new version of GitLab, we build a Docker images for it. 1. Along with GitLab Docker Images we also build and publish GitLab QA images. 1. GitLab QA project uses these images to execute integration tests. + +## How can I use it? + +You can use GitLab QA to exercise tests on any live instance! For example, the +follow call would login to the local GitLab instance and run all specs in +`qa/specs/features`: + +``` +GITLAB_USERNAME='root' GITLAB_PASSWORD='5iveL!fe' bin/qa Test::Instance http://localhost +``` + +You can also supply a specific tests to run as another parameter. For example, to +test the EE license specs, you can run: + +``` +EE_LICENSE="" GITLAB_USERNAME='root' GITLAB_PASSWORD='5iveL!fe' bin/qa Test::Instance http://localhost qa/ee +``` + +All [supported environment variables are here](https://gitlab.com/gitlab-org/gitlab-qa#supported-environment-variables). -- cgit v1.2.1 From 2146d6253fadfec82e58d66e59b9ec50fdf3d761 Mon Sep 17 00:00:00 2001 From: Andrew Newdigate Date: Sat, 30 Sep 2017 16:26:23 +0000 Subject: Add environment variable to bypass n+1 --- doc/development/gitaly.md | 32 +++++++++++++++++++++++++++++++- lib/gitlab/gitaly_client.rb | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md index f0be3a6b141..e41d258bec6 100644 --- a/doc/development/gitaly.md +++ b/doc/development/gitaly.md @@ -12,6 +12,7 @@ status of the migration. Gitaly makes heavy use of [feature flags](feature_flags.md). Each Rugged-to-Gitaly migration goes through a [series of phases](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/MIGRATION_PROCESS.md): + * **Opt-In**: by default the Rugged implementation is used. * Production instances can choose to enable the Gitaly endpoint by enabling the feature flag. * For testing purposes, you may wish to enable all feature flags by default. This can be done by exporting the following @@ -19,7 +20,7 @@ Each Rugged-to-Gitaly migration goes through a [series of phases](https://gitlab * On developer instances (ie, when `Rails.env.development?` is true), the Gitaly endpoint is enabled by default, but can be _disabled_ using feature flags. * **Opt-Out**: by default, the Gitaly endpoint is used, but the feature can be explicitly disabled using the feature flag. -* **Madatory**: The migration is complete and cannot be disabled. The old codepath is removed. +* **Mandatory**: The migration is complete and cannot be disabled. The old codepath is removed. ### Enabling and Disabling Feature @@ -49,6 +50,35 @@ If your test-suite is failing with Gitaly issues, as a first step, try running: rm -rf tmp/tests/gitaly ``` +## `TooManyInvocationsError` errors + +During development and testing, you may experience `Gitlab::GitalyClient::TooManyInvocationsError` failures. +The `GitalyClient` will attempt to block against potential n+1 issues by raising this error +when Gitaly is called more than 30 times in a single Rails request or Sidekiq execution. + +As a temporary measure, export `GITALY_DISABLE_REQUEST_LIMITS=1` to suppress the error. This will disable the n+1 detection +in your development environment. + +Please raise an issue in the GitLab CE or EE repositories to report the issue. Include the labels ~Gitaly +~performance ~"technical debt". Please ensure that the issue contains the full stack trace and error message of the +`TooManyInvocationsError`. Also include any known failing tests if possible. + +Isolate the source of the n+1 problem. This will normally be a loop that results in Gitaly being called for each +element in an array. If you are unable to isolate the problem, please contact a member +of the [Gitaly Team](https://gitlab.com/groups/gl-gitaly/group_members) for assistance. + +Once the source has been found, wrap it in an `allow_n_plus_1_calls` block, as follows: + +```ruby +# n+1: link to n+1 issue +Gitlab::GitalyClient.allow_n_plus_1_calls do + # original code + commits.each { |commit| ... } +end +``` + +Once the code is wrapped in this block, this code-path will be excluded from n+1 detection. + --- [Return to Development documentation](README.md) diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb index 955d2307f88..e75e0500ed8 100644 --- a/lib/gitlab/gitaly_client.rb +++ b/lib/gitlab/gitaly_client.rb @@ -151,7 +151,7 @@ module Gitlab actual_call_count = increment_call_count("gitaly_#{call_site}_actual") # Do no enforce limits in production - return if Rails.env.production? + return if Rails.env.production? || ENV["GITALY_DISABLE_REQUEST_LIMITS"] # Check if this call is nested within a allow_n_plus_1_calls # block and skip check if it is -- cgit v1.2.1 From 654b635c584b63f817f542f73a036c6093560dab Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Sat, 30 Sep 2017 13:32:39 -0400 Subject: Fix dead link --- doc/install/kubernetes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/install/kubernetes/index.md b/doc/install/kubernetes/index.md index f7720998e62..ce87608c242 100644 --- a/doc/install/kubernetes/index.md +++ b/doc/install/kubernetes/index.md @@ -57,7 +57,7 @@ Learn more about the [gitlab chart.](gitlab_chart.md) ### Community Contributed Charts -The community has also contributed GitLab [CE]((https://github.com/kubernetes/charts/tree/master/stable/gitlab-ce)) and [EE]((https://github.com/kubernetes/charts/tree/master/stable/gitlab-ce)) charts to the [Helm Stable Repository](https://github.com/kubernetes/charts#repository-structure). These charts should be considered [deprecated](https://github.com/kubernetes/charts/issues/1138) in favor of the [official Charts](gitlab_omnibus.md). +The community has also contributed GitLab [CE](https://github.com/kubernetes/charts/tree/master/stable/gitlab-ce) and [EE](https://github.com/kubernetes/charts/tree/master/stable/gitlab-ee) charts to the [Helm Stable Repository](https://github.com/kubernetes/charts#repository-structure). These charts should be considered [deprecated](https://github.com/kubernetes/charts/issues/1138) in favor of the [official Charts](gitlab_omnibus.md). [chart]: https://github.com/kubernetes/charts [helm]: https://github.com/kubernetes/helm/blob/master/README.md -- cgit v1.2.1 From 1c46d27d9e2a15b483b3bdafdc81f292886f4fd9 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Sat, 30 Sep 2017 13:35:13 -0400 Subject: updates --- doc/install/kubernetes/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/install/kubernetes/index.md b/doc/install/kubernetes/index.md index ce87608c242..e79b8b2d759 100644 --- a/doc/install/kubernetes/index.md +++ b/doc/install/kubernetes/index.md @@ -12,8 +12,8 @@ should be deployed, upgraded, and configured. * **[GitLab-Omnibus](gitlab_omnibus.md)**: The best way to run GitLab on Kubernetes today. It is suited for small to medium deployments, and is in beta while support for backups and other features are added. * **[Cloud Native Charts](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md)**: The next generation of charts, currently in development. Will support large deployments, with horizontal scaling of individual GitLab components. * Other Charts - * [GitLab Runner Chart](#gitlab-runner-chart): For deploying just the GitLab Runner. - * [Advanced GitLab Installation](#advanced-gitlab-installation): Provides additional deployment options, but provides less functionality out-of-the-box. It's beta, no longer actively developed, and will be deprecated by [gitlab-omnibus](#gitlab-omnibus-chart-recommended) once it supports these options. + * [GitLab Runner Chart](gitlab_runner_chart.md): For deploying just the GitLab Runner. + * [Advanced GitLab Installation](gitlab_chart.md): Provides additional deployment options, but provides less functionality out-of-the-box. It's beta, no longer actively developed, and will be deprecated by [gitlab-omnibus](#gitlab-omnibus-chart-recommended) once it supports these options. * [Community Contributed Charts](#community-contributed-charts): Community contributed charts, deprecated by the official GitLab charts. ## GitLab-Omnibus Chart (Recommended) @@ -25,7 +25,7 @@ Once the [cloud native charts](#upcoming-cloud-native-helm-charts) are ready for Learn more about the [gitlab-omnibus chart.](gitlab_omnibus.md) -## Cloud Native Charts +## Cloud Native GitLab Chart GitLab is working towards building a [cloud native GitLab chart](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md). A key part of this effort is to isolate each service into its [own Docker container and Helm chart](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/2420), rather than utilizing the all-in-one container image of the [current charts](#official-gitlab-helm-charts-recommended). -- cgit v1.2.1 From 2420ff749f8844b5b81cb67a55e3b488769a9842 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Sat, 30 Sep 2017 13:48:35 -0400 Subject: minor cleanup --- doc/install/kubernetes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/install/kubernetes/index.md b/doc/install/kubernetes/index.md index e79b8b2d759..90b9e98455a 100644 --- a/doc/install/kubernetes/index.md +++ b/doc/install/kubernetes/index.md @@ -10,7 +10,7 @@ should be deployed, upgraded, and configured. ## Chart Overview * **[GitLab-Omnibus](gitlab_omnibus.md)**: The best way to run GitLab on Kubernetes today. It is suited for small to medium deployments, and is in beta while support for backups and other features are added. -* **[Cloud Native Charts](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md)**: The next generation of charts, currently in development. Will support large deployments, with horizontal scaling of individual GitLab components. +* **[Cloud Native GitLab Chart](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md)**: The next generation of charts, currently in development. Will support large deployments, with horizontal scaling of individual GitLab components. * Other Charts * [GitLab Runner Chart](gitlab_runner_chart.md): For deploying just the GitLab Runner. * [Advanced GitLab Installation](gitlab_chart.md): Provides additional deployment options, but provides less functionality out-of-the-box. It's beta, no longer actively developed, and will be deprecated by [gitlab-omnibus](#gitlab-omnibus-chart-recommended) once it supports these options. -- cgit v1.2.1 From a7ad2fc608a9387858869c10b826093a13cdf3ef Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Thu, 28 Sep 2017 10:50:24 +0000 Subject: Merge branch 'master-i18n' into 'master' New Crowdin translations See merge request gitlab-org/gitlab-ee!2947 --- locale/bg/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/de/gitlab.po | 392 ++++++++++++++++++++++++++++++++------ locale/eo/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/es/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/fr/gitlab.po | 508 ++++++++++++++++++++++++++++++++++++++----------- locale/it/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/ja/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/ko/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/nl_NL/gitlab.po | 428 +++++++++++++++++++++++++++++++++-------- locale/pt_BR/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/ru/gitlab.po | 470 +++++++++++++++++++++++++++++++++++---------- locale/uk/gitlab.po | 474 +++++++++++++++++++++++++++++++++++---------- locale/zh_CN/gitlab.po | 396 ++++++++++++++++++++++++++++++++------ locale/zh_HK/gitlab.po | 334 +++++++++++++++++++++++++++++--- locale/zh_TW/gitlab.po | 356 ++++++++++++++++++++++++++++++---- 15 files changed, 4918 insertions(+), 778 deletions(-) diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index 9d90f4ed5b1..38d63315fdc 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:22-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:45-0400\n" "Last-Translator: gitlab \n" "Language-Team: Bulgarian\n" "Language: bg_BG\n" @@ -29,6 +29,9 @@ msgstr[1] "%s подавания бяха пропуснати, за да не msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} подаде %{commit_timeago}" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "" @@ -51,6 +54,9 @@ msgid_plural "%d pipelines" msgstr[0] "1 схема" msgstr[1] "%d схеми" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Набор от графики относно непрекъснатата интеграция" @@ -93,7 +99,7 @@ msgstr "Добавяне на нова папка" msgid "All" msgstr "" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -117,10 +123,34 @@ msgstr "" msgid "Are you sure?" msgstr "" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Прикачете файл чрез влачене и пускане или %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,6 +207,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "Клон" @@ -194,6 +227,90 @@ msgstr "Превключване на клона" msgid "Branches" msgstr "Клонове" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Преглед на папката" @@ -337,9 +454,6 @@ msgstr "Подадено от" msgid "Compare" msgstr "Сравнение" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Ръководство за сътрудничество" @@ -489,6 +603,9 @@ msgstr "Редактиране на плана %{id} за схема" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "" @@ -516,6 +633,9 @@ msgstr "Всеки месец (на 1-во число, в 4 ч. сутринта msgid "Every week (Sundays at 4:00am)" msgstr "Всяка седмица (в неделя, в 4 ч. сутринта)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Собственикът не може да бъде променен" @@ -572,7 +692,28 @@ msgstr "Към Вашето разклонение" msgid "GoToYourFork|Fork" msgstr "Разклонение" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -593,12 +734,6 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" -msgid "Home" -msgstr "Начало" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "Освежаването започна успешно" @@ -620,6 +755,9 @@ msgstr "" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "Изключено" @@ -684,6 +822,9 @@ msgstr "" msgid "Merge events" msgstr "" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -812,6 +953,18 @@ msgstr "" msgid "Owner" msgstr "Собственик" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -917,10 +1070,7 @@ msgstr "с етапи" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -953,12 +1103,6 @@ msgstr "Връзката към изнесените данни на проек msgid "Project export started. A download link will be sent by email." msgstr "Изнасянето на проекта започна. Ще получите връзка към данните по е-поща." -msgid "Project home" -msgstr "Начална страница на проекта" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -983,27 +1127,30 @@ msgstr "Етап" msgid "ProjectNetworkGraph|Graph" msgstr "Графика" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "" @@ -1019,6 +1166,9 @@ msgstr "Клонове" msgid "RefSwitcher|Tags" msgstr "Етикети" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Свързани подавания" @@ -1073,6 +1223,9 @@ msgstr "Запазване на плана за схема" msgid "Schedule a new pipeline" msgstr "Създаване на нов план за схема" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Планиране на схемите" @@ -1112,6 +1265,12 @@ msgstr "зададете парола" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показване на %d събитие" @@ -1120,6 +1279,102 @@ msgstr[1] "Показване на %d събития" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "Изходен код" @@ -1132,6 +1387,9 @@ msgstr "" msgid "StarProject|Star" msgstr "Звезда" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Създайте %{new_merge_request} с тези промени" @@ -1141,6 +1399,9 @@ msgstr "" msgid "Switch branch/tag" msgstr "Преминаване към клон/етикет" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "Етикет" @@ -1206,6 +1467,9 @@ msgstr "Стойността, която се намира в средата н msgid "There are problems accessing Git storage: " msgstr "" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Това означава, че няма да можете да изпращате код, докато не създадете празно хранилище или не внесете съществуващо такова." @@ -1381,9 +1645,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "Използване на глобалната Ви настройка за известията" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Преглед на отворената заявка за сливане" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Вътрешен" @@ -1456,6 +1726,12 @@ msgstr "Няма да можете да изтегляте или изпраща msgid "Your name" msgstr "Вашето име" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "ден" diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po index 19961043ede..fc3c60166b7 100644 --- a/locale/de/gitlab.po +++ b/locale/de/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:22-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:45-0400\n" "Last-Translator: gitlab \n" "Language-Team: German\n" "Language: de_DE\n" @@ -18,8 +18,8 @@ msgstr "" msgid "%d commit" msgid_plural "%d commits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d Commit" +msgstr[1] "%d Commits" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." @@ -27,6 +27,9 @@ msgstr[0] "%s zusätzlicher Commit wurde ausgelassen um Leistungsprobleme zu ver msgstr[1] "%s zusätzliche Commits wurden ausgelassen um Leistungsprobleme zu verhindern." msgid "%{commit_author_link} committed %{commit_timeago}" +msgstr "%{commit_author_link} hat %{commit_timeago} committet" + +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." @@ -40,8 +43,8 @@ msgstr "%{number_of_failures} von %{maximum_failures} Fehlschlägen. GitLab wird msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%{storage_name}: fehlgeschlagener Speicherzugriff auf Host:" +msgstr[1] "%{storage_name}: %{failed_attempts} fehlgeschlagene Speicherzugriffe:" msgid "(checkout the %{link} for information on how to install it)." msgstr "(beachte die Informationen zur Installation auf %{link})." @@ -51,6 +54,9 @@ msgid_plural "%d pipelines" msgstr[0] "" msgstr[1] "" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Eine Sammlung von Graphen bezüglich kontinuierlicher Integration" @@ -67,13 +73,13 @@ msgid "Access to failing storages has been temporarily disabled to allow the mou msgstr "Zugriff auf fehlerhafte Speicher wurde vorübergehend deaktiviert, um die Wiederherstellung zu ermöglichen. Für den zukünftigen Zugriff, behebe bitte das Problem und setze danach die Speicherinformationen zurück." msgid "Account" -msgstr "" +msgstr "Konto" msgid "Active" msgstr "Aktiv" msgid "Activity" -msgstr "" +msgstr "Aktivität" msgid "Add Changelog" msgstr "Änderungsliste hinzufügen " @@ -93,8 +99,8 @@ msgstr "Erstelle eine neues Verzeichnis" msgid "All" msgstr "Alle" -msgid "Appearances" -msgstr "Erscheinungsbild" +msgid "Appearance" +msgstr "" msgid "Applications" msgstr "Anwendungen" @@ -117,10 +123,34 @@ msgstr "Bist Du sicher, dass Du den Systemüberwachungstoken zurücksetzen wills msgid "Are you sure?" msgstr "Bist Du sicher?" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Datei mittels Drag & Drop oder %{upload_link} hinzufügen" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,10 +207,13 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Zweig" +msgstr[1] "Zweige" msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Branch %{branch_name} wurde erstellt. Um die automatische Bereitstellung einzurichten, wähle eine GitLab CI Yaml Vorlage und committe Deine Änderungen. %{link_to_autodeploy_doc}" @@ -194,6 +227,90 @@ msgstr "Branch wechseln" msgid "Branches" msgstr "" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Verzeichnisse durchsuchen" @@ -210,7 +327,7 @@ msgid "ByAuthor|by" msgstr "von" msgid "CI / CD" -msgstr "" +msgstr "CI / CD" msgid "CI configuration" msgstr "CI-Konfiguration" @@ -240,7 +357,7 @@ msgid "Charts" msgstr "Diagramme" msgid "Chat" -msgstr "" +msgstr "Chat" msgid "Cherry-pick this commit" msgstr "Diesen Commit herauspicken " @@ -307,8 +424,8 @@ msgstr "Kommentare" msgid "Commit" msgid_plural "Commits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Commit" +msgstr[1] "Commits" msgid "Commit duration in minutes for last 30 commits" msgstr "Dauer der Commits in Minuten für die letzten 30 Commits" @@ -323,7 +440,7 @@ msgid "CommitMessage|Add %{file_name}" msgstr "%{file_name} hinzufügen" msgid "Commits" -msgstr "" +msgstr "Commits" msgid "Commits feed" msgstr "Liste der Commits" @@ -337,9 +454,6 @@ msgstr "Committed von" msgid "Compare" msgstr "Vergleichen" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Mitarbeitsanleitung" @@ -442,7 +556,7 @@ msgid "Description" msgstr "Beschreibung" msgid "Details" -msgstr "" +msgstr "Details" msgid "Directory name" msgstr "Verzeichnisname" @@ -489,6 +603,9 @@ msgstr "Pipeline Zeitplan bearbeiten %{id}" msgid "Emails" msgstr "E-Mails" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "Filtere alle" @@ -516,6 +633,9 @@ msgstr "Monatlich (am Ersten um 4:00 Uhr)" msgid "Every week (Sundays at 4:00am)" msgstr "Wöchentlich (Sonntags um 4:00 Uhr)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Wechsel des Besitzers fehlgeschlagen" @@ -572,8 +692,29 @@ msgstr "Gehe zu Deinem Ableger" msgid "GoToYourFork|Fork" msgstr "Ableger" -msgid "Group overview" -msgstr "Gruppen-Übersicht" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" +msgstr "" msgid "Health Check" msgstr "Systemzustand" @@ -593,12 +734,6 @@ msgstr "Keine Probleme erkannt" msgid "HealthCheck|Unhealthy" msgstr "Problematisch" -msgid "Home" -msgstr "Startseite" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "Aufräumen erfolgreich gestartet" @@ -620,6 +755,9 @@ msgstr "Ticketereignisse" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "Deaktiviert" @@ -662,7 +800,7 @@ msgid "Leave project" msgstr "Verlasse das Projekt" msgid "License" -msgstr "Lizenz" +msgstr "" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" @@ -670,7 +808,7 @@ msgstr[0] "Limitiere die Anzeige auf höchstens %d Ereignis" msgstr[1] "Limitiere die Anzeige auf höchstens %d Ereignisse" msgid "Locked Files" -msgstr "Gesperrte Dateien" +msgstr "" msgid "Median" msgstr "Median" @@ -684,14 +822,17 @@ msgstr "" msgid "Merge events" msgstr "Ereignisse zusammenführen" -msgid "Messages" +msgid "Merge request" msgstr "" +msgid "Messages" +msgstr "Nachrichten" + msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "einen SSH Schlüssel hinzufügst" msgid "Monitoring" -msgstr "" +msgstr "Überwachung" msgid "More information is available|here" msgstr "hier" @@ -812,6 +953,18 @@ msgstr "Übersicht" msgid "Owner" msgstr "Besitzer" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "Passwort" @@ -900,7 +1053,7 @@ msgid "Pipelines for last week" msgstr "" msgid "Pipelines for last year" -msgstr "" +msgstr "Pipelines des letzten Jahres" msgid "Pipeline|all" msgstr "Alle" @@ -917,12 +1070,9 @@ msgstr "mit Stages" msgid "Preferences" msgstr "" -msgid "Profile Settings" +msgid "Profile" msgstr "" -msgid "Project" -msgstr "Projekt" - msgid "Project '%{project_name}' queued for deletion." msgstr "Das Projekt '%{project_name}' wurde zur Löschung eingeplant." @@ -953,12 +1103,6 @@ msgstr "Der Link für den Export des Projektes ist abgelaufen. Bitte generiere e msgid "Project export started. A download link will be sent by email." msgstr "Export des Projektes gestartet. Ein Link zum herunterladen wir Dir per E-Mail zugesandt." -msgid "Project home" -msgstr "Startseite des Projektes" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "Abonnieren" @@ -983,27 +1127,30 @@ msgstr "Stage" msgid "ProjectNetworkGraph|Graph" msgstr "Diagramm" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" -msgstr "" +msgstr "ProjectsDropdown | Projekte, die Sie häufig besuchen, werden hier angezeigt" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "Übertragungsereignisse" @@ -1019,6 +1166,9 @@ msgstr "Branches" msgid "RefSwitcher|Tags" msgstr "Tags" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Zugehörige Commits" @@ -1065,7 +1215,7 @@ msgid "Revert this merge request" msgstr "Merge Request zurücksetzen" msgid "SSH Keys" -msgstr "" +msgstr "SSH-Schlüssel" msgid "Save pipeline schedule" msgstr "Zeitplan der Pipeline speichern" @@ -1073,6 +1223,9 @@ msgstr "Zeitplan der Pipeline speichern" msgid "Schedule a new pipeline" msgstr "Plane eine neue Pipeline" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Pipelines planen" @@ -1110,6 +1263,12 @@ msgid "SetPasswordToCloneLink|set a password" msgstr "ein Passwort festlegst" msgid "Settings" +msgstr "Einstellungen" + +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" msgstr "" msgid "Showing %d event" @@ -1120,11 +1279,107 @@ msgstr[1] "Zeige %d Ereignisse" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "Quellcode" msgid "Spam Logs" -msgstr "" +msgstr "Spam-Protokolle" msgid "Specify the following URL during the Runner setup:" msgstr "Lege die folgende URL während des Runner Setups fest:" @@ -1132,6 +1387,9 @@ msgstr "Lege die folgende URL während des Runner Setups fest:" msgid "StarProject|Star" msgstr "Favorisieren" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Beginne einen %{new_merge_request} mit diesen Änderungen" @@ -1141,6 +1399,9 @@ msgstr "Starte den Runner!" msgid "Switch branch/tag" msgstr "Zu Branch/Tag wechseln" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "" @@ -1206,6 +1467,9 @@ msgstr "Der mittlere aller erfassten Werte. Zum Beispiel ist für 3, 5, 9 der Me msgid "There are problems accessing Git storage: " msgstr "Es gibt ein Problem beim Zugriff auf den Gitspeicher:" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Dies bedeutet, dass Du keinen Code übertragen kannst, bevor Du kein leeres Repositorium erstellt oder ein Existierendes importiert hast." @@ -1222,7 +1486,7 @@ msgid "Time until first merge request" msgstr "Zeit bis zum ersten Merge Request" msgid "Timeago|%s days ago" -msgstr "seit %s Tagen" +msgstr "" msgid "Timeago|%s days remaining" msgstr "%s Tage verbleibend" @@ -1231,13 +1495,13 @@ msgid "Timeago|%s hours remaining" msgstr "%s Stunden verbleibend" msgid "Timeago|%s minutes ago" -msgstr "seit %s Minuten " +msgstr "" msgid "Timeago|%s minutes remaining" msgstr "%s Minuten verbleibend" msgid "Timeago|%s months ago" -msgstr "seit %s Monaten" +msgstr "" msgid "Timeago|%s months remaining" msgstr "%s Monate verbleibend" @@ -1246,13 +1510,13 @@ msgid "Timeago|%s seconds remaining" msgstr "%s Sekunden verbleibend" msgid "Timeago|%s weeks ago" -msgstr "seit %s Wochen" +msgstr "" msgid "Timeago|%s weeks remaining" msgstr "%s Wochen verbleibend" msgid "Timeago|%s years ago" -msgstr "seit %s Jahren" +msgstr "" msgid "Timeago|%s years remaining" msgstr "%s Jahre verbleibend" @@ -1381,9 +1645,15 @@ msgstr "Benutze den folgenden Registrierungstoken während des Setups:" msgid "Use your global notification setting" msgstr "Benutze Deine globalen Benachrichtigungseinstellungen" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Zeige offene Merge Requests." +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Intern" @@ -1456,6 +1726,12 @@ msgstr "Du kannst erst mittels SSH übertragen (push) oder abrufen (pull), nachd msgid "Your name" msgstr "Dein Name" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "Tag" diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po index f9f61a109f6..e8c2195e4e3 100644 --- a/locale/eo/gitlab.po +++ b/locale/eo/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:22-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:45-0400\n" "Last-Translator: gitlab \n" "Language-Team: Esperanto\n" "Language: eo_UY\n" @@ -29,6 +29,9 @@ msgstr[1] "%s enmetadoj estis transsaltitaj, por ne troŝarĝi la sistemon." msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} enmetis %{commit_timeago}" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "" @@ -51,6 +54,9 @@ msgid_plural "%d pipelines" msgstr[0] "1 ĉenstablo" msgstr[1] "%d ĉenstabloj" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Aro da diagramoj pri la seninterrompa integrado" @@ -93,7 +99,7 @@ msgstr "Aldoni novan dosierujon" msgid "All" msgstr "" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -117,10 +123,34 @@ msgstr "" msgid "Are you sure?" msgstr "" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Alkroĉu dosieron per ŝovmetado aŭ %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,6 +207,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "Branĉo" @@ -194,6 +227,90 @@ msgstr "Iri al branĉo" msgid "Branches" msgstr "Branĉoj" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Foliumi dosierujon" @@ -337,9 +454,6 @@ msgstr "Enmetita de" msgid "Compare" msgstr "Kompari" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Gvidlinioj por kontribuado" @@ -489,6 +603,9 @@ msgstr "Redakti ĉenstablan planon %{id}" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "" @@ -516,6 +633,9 @@ msgstr "Ĉiumonate (en la 1a de la monato, je 4:00)" msgid "Every week (Sundays at 4:00am)" msgstr "Ĉiusemajne (en dimanĉo, je 4:00)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Ne eblas ŝanĝi la posedanton" @@ -572,7 +692,28 @@ msgstr "Al via disbranĉigo" msgid "GoToYourFork|Fork" msgstr "Disbranĉigo" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -593,12 +734,6 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" -msgid "Home" -msgstr "Hejmo" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "La refreŝigo komenciĝis sukcese" @@ -620,6 +755,9 @@ msgstr "" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "Malŝaltita" @@ -684,6 +822,9 @@ msgstr "" msgid "Merge events" msgstr "" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -812,6 +953,18 @@ msgstr "" msgid "Owner" msgstr "Posedanto" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -917,10 +1070,7 @@ msgstr "kun etapoj" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -953,12 +1103,6 @@ msgstr "La ligilo por la projekta elporto eksvalidiĝis. Bonvolu krei novan elpo msgid "Project export started. A download link will be sent by email." msgstr "La elporto de la projekto komenciĝis. Vi ricevos ligilon per retpoŝto por elŝuti la datenoj." -msgid "Project home" -msgstr "Hejmo de la projekto" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -983,27 +1127,30 @@ msgstr "Etapo" msgid "ProjectNetworkGraph|Graph" msgstr "Grafeo" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "" @@ -1019,6 +1166,9 @@ msgstr "Branĉoj" msgid "RefSwitcher|Tags" msgstr "Etikedoj" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Rilataj enmetadoj" @@ -1073,6 +1223,9 @@ msgstr "Konservi ĉenstablan planon" msgid "Schedule a new pipeline" msgstr "Plani novan ĉenstablon" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Planado de la ĉenstabloj" @@ -1112,6 +1265,12 @@ msgstr "kreos pasvorton" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Estas montrata %d evento" @@ -1120,6 +1279,102 @@ msgstr[1] "Estas montrataj %d eventoj" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "Kodo" @@ -1132,6 +1387,9 @@ msgstr "" msgid "StarProject|Star" msgstr "Steligi" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Kreu %{new_merge_request} kun ĉi tiuj ŝanĝoj" @@ -1141,6 +1399,9 @@ msgstr "" msgid "Switch branch/tag" msgstr "Iri al branĉo/etikedo" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "Etikedo" @@ -1206,6 +1467,9 @@ msgstr "La valoro, kiu troviĝas en la mezo de aro da rigardataj valoroj. Ekzemp msgid "There are problems accessing Git storage: " msgstr "" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Ĉi tiu signifas, ke vi ne povos alpuŝi kodon, antaŭ ol vi kreos malplenan deponejon aŭ enportos jam ekzistantan." @@ -1381,9 +1645,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "Uzi vian ĝeneralan agordon pri la sciigoj" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Vidi la malfermitan peton pri kunfando" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Interna" @@ -1456,6 +1726,12 @@ msgstr "Vi ne povos eltiri aŭ alpuŝi kodon per SSH antaŭ ol vi %{add_ssh_key_ msgid "Your name" msgstr "Via nomo" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "tago" diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po index ccf4b0abf9f..29a010f9428 100644 --- a/locale/es/gitlab.po +++ b/locale/es/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:19-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:43-0400\n" "Last-Translator: gitlab \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -29,6 +29,9 @@ msgstr[1] "%s cambios adicionales han sido omitidos para evitar problemas de ren msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} cambió %{commit_timeago}" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "" @@ -51,6 +54,9 @@ msgid_plural "%d pipelines" msgstr[0] "" msgstr[1] "" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Una colección de gráficos sobre Integración Continua" @@ -93,7 +99,7 @@ msgstr "Agregar nuevo directorio" msgid "All" msgstr "" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -117,10 +123,34 @@ msgstr "" msgid "Are you sure?" msgstr "" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Adjunte un archivo arrastrando & soltando o %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,6 +207,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "Rama" @@ -194,6 +227,90 @@ msgstr "Cambiar rama" msgid "Branches" msgstr "Ramas" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Examinar directorio" @@ -337,9 +454,6 @@ msgstr "Enviado por" msgid "Compare" msgstr "Comparar" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Guía de contribución" @@ -489,6 +603,9 @@ msgstr "Editar Programación del Pipeline %{id}" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "" @@ -516,6 +633,9 @@ msgstr "Todos los meses (el día 1 a las 4:00 am)" msgid "Every week (Sundays at 4:00am)" msgstr "Todas las semanas (domingos a las 4:00 am)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Error al cambiar el propietario" @@ -572,7 +692,28 @@ msgstr "Ir a tu bifurcación" msgid "GoToYourFork|Fork" msgstr "Bifurcación" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -593,12 +734,6 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" -msgid "Home" -msgstr "Inicio" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "Servicio de limpieza iniciado con éxito" @@ -620,6 +755,9 @@ msgstr "" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "Deshabilitado" @@ -684,6 +822,9 @@ msgstr "" msgid "Merge events" msgstr "" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -812,6 +953,18 @@ msgstr "" msgid "Owner" msgstr "Propietario" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -917,10 +1070,7 @@ msgstr "con etapas" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -953,12 +1103,6 @@ msgstr "El enlace de exportación del proyecto ha caducado. Por favor, genera un msgid "Project export started. A download link will be sent by email." msgstr "Se inició la exportación del proyecto. Se enviará un enlace de descarga por correo electrónico." -msgid "Project home" -msgstr "Inicio del proyecto" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -983,27 +1127,30 @@ msgstr "Etapa" msgid "ProjectNetworkGraph|Graph" msgstr "Historial gráfico" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "" @@ -1019,6 +1166,9 @@ msgstr "Ramas" msgid "RefSwitcher|Tags" msgstr "Etiquetas" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Cambios Relacionados" @@ -1073,6 +1223,9 @@ msgstr "Guardar programación del pipeline" msgid "Schedule a new pipeline" msgstr "Programar un nuevo pipeline" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Programación de Pipelines" @@ -1112,6 +1265,12 @@ msgstr "establecer una contraseña" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Mostrando %d evento" @@ -1120,6 +1279,102 @@ msgstr[1] "Mostrando %d eventos" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "Código fuente" @@ -1132,6 +1387,9 @@ msgstr "" msgid "StarProject|Star" msgstr "Destacar" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Iniciar una %{new_merge_request} con estos cambios" @@ -1141,6 +1399,9 @@ msgstr "" msgid "Switch branch/tag" msgstr "Cambiar rama/etiqueta" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "Etiqueta" @@ -1206,6 +1467,9 @@ msgstr "El valor en el punto medio de una serie de valores observados. Por ejemp msgid "There are problems accessing Git storage: " msgstr "" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Esto significa que no puede enviar código hasta que cree un repositorio vacío o importe uno existente." @@ -1381,9 +1645,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "Utiliza tu configuración de notificación global" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Ver solicitud de fusión abierta" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Interno" @@ -1456,6 +1726,12 @@ msgstr "No podrás actualizar o enviar código al proyecto a través de SSH hast msgid "Your name" msgstr "Tu nombre" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "día" diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po index c98156e026e..28d9c6a3e56 100644 --- a/locale/fr/gitlab.po +++ b/locale/fr/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:22-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:45-0400\n" "Last-Translator: gitlab \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -29,27 +29,33 @@ msgstr[1] "%s validations supplémentaires ont été masquées afin d'éviter de msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} a validé %{commit_timeago}" -msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgstr "%{number_of_failures} sur %{maximum_failures} tentative(s). GitLab va vous permettre d'accéder à la prochaine tentative." + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds." -msgstr "" +msgstr "%{number_of_failures} échecs sur %{maximum_failures}. GitLab va bloquer l’accès pendant %{number_of_seconds} secondes." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." -msgstr "" +msgstr "%{number_of_failures} échecs sur %{maximum_failures}. GitLab ne va plus réessayer automatiquement. Réinitialisez les informations de stockage lorsque le problème est résolu." msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%{storage_name} : la tentative d’accès au stockage a échouée sur l’hôte :" +msgstr[1] "%{storage_name} : %{failed_attempts} tentatives d’accès au stockage ont échouées :" msgid "(checkout the %{link} for information on how to install it)." -msgstr "" +msgstr "(Lisez %{link} pour savoir comment l'installer)." msgid "1 pipeline" msgid_plural "%d pipelines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 pipeline" +msgstr[1] "%d pipelines" + +msgid "1st contribution!" +msgstr "" msgid "A collection of graphs regarding Continuous Integration" msgstr "Un ensemble de graphiques concernant l’Intégration Continue (CI)" @@ -58,16 +64,16 @@ msgid "About auto deploy" msgstr "A propos de l'auto-déploiement" msgid "Abuse Reports" -msgstr "" +msgstr "Rapports d’abus" msgid "Access Tokens" -msgstr "" +msgstr "Jetons d'Accès" msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." -msgstr "" +msgstr "L'accès aux stockages défaillants a été temporairement désactivé pour permettre au montage de récupérer. Réinitialiser les informations de stockage dès que le problème est résolu pour permettre l’accès à nouveau." msgid "Account" -msgstr "" +msgstr "Compte" msgid "Active" msgstr "Actif" @@ -91,13 +97,13 @@ msgid "Add new directory" msgstr "Ajouter un nouveau dossier" msgid "All" -msgstr "" +msgstr "Tous" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" -msgstr "" +msgstr "Applications" msgid "Archived project! Repository is read-only" msgstr "Projet archivé ! Le dépôt est en lecture seule" @@ -106,21 +112,45 @@ msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Êtes-vous sûr de vouloir supprimer ce pipeline programmé" msgid "Are you sure you want to discard your changes?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir annuler vos modifications ?" msgid "Are you sure you want to reset registration token?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir réinitialiser le jeton d’inscription ?" msgid "Are you sure you want to reset the health check token?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir réinitialiser le jeton de bilan de santé ?" msgid "Are you sure?" +msgstr "Êtes-vous certain ?" + +msgid "Artifacts" msgstr "" msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Attachez un fichier par glisser & déposer ou %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,10 +207,13 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Branche" +msgstr[1] "Branches" msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "La branche %{branch_name} a été crée. Pour mettre en place le déploiement automatisé, sélectionnez un modèle de fichier Yaml pour l'intégration continue (CI) de GitLab, et validez les modifications. %{link_to_autodeploy_doc}" @@ -192,6 +225,90 @@ msgid "BranchSwitcherTitle|Switch branch" msgstr "Changer de branche" msgid "Branches" +msgstr "Branches" + +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" msgstr "" msgid "Browse Directory" @@ -210,7 +327,7 @@ msgid "ByAuthor|by" msgstr "par" msgid "CI / CD" -msgstr "" +msgstr "Intégration continu / Déploiement continu" msgid "CI configuration" msgstr "Configuration de l'intégration continue (CI)" @@ -219,19 +336,19 @@ msgid "Cancel" msgstr "Annuler" msgid "Cancel edit" -msgstr "" +msgstr "Annuler modification" msgid "ChangeTypeActionLabel|Pick into branch" msgstr "Sélectionner dans la branche" msgid "ChangeTypeActionLabel|Revert in branch" -msgstr "Annuler dans la branche" +msgstr "Défaire dans la branche" msgid "ChangeTypeAction|Cherry-pick" msgstr "Sélectionner" msgid "ChangeTypeAction|Revert" -msgstr "Annuler" +msgstr "Défaire" msgid "Changelog" msgstr "Journal des modifications" @@ -240,7 +357,7 @@ msgid "Charts" msgstr "Graphiques" msgid "Chat" -msgstr "" +msgstr "Chat" msgid "Cherry-pick this commit" msgstr "Sélectionner cette validation" @@ -261,10 +378,10 @@ msgid "CiStatusLabel|manual action" msgstr "action manuelle" msgid "CiStatusLabel|passed" -msgstr "passé" +msgstr "réussi" msgid "CiStatusLabel|passed with warnings" -msgstr "passé avec des avertissements" +msgstr "réussi avec des avertissements" msgid "CiStatusLabel|pending" msgstr "en attente" @@ -279,7 +396,7 @@ msgid "CiStatusText|blocked" msgstr "bloqué" msgid "CiStatusText|canceled" -msgstr "annulé " +msgstr "annulé" msgid "CiStatusText|created" msgstr "créé" @@ -291,7 +408,7 @@ msgid "CiStatusText|manual" msgstr "manuel" msgid "CiStatusText|passed" -msgstr "passé" +msgstr "réussi" msgid "CiStatusText|pending" msgstr "en attente" @@ -303,7 +420,7 @@ msgid "CiStatus|running" msgstr "en cours" msgid "Comments" -msgstr "" +msgstr "Commentaires" msgid "Commit" msgid_plural "Commits" @@ -337,9 +454,6 @@ msgstr "Validé par" msgid "Compare" msgstr "Comparer" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Guilde de contribution" @@ -359,7 +473,7 @@ msgid "Create New Directory" msgstr "Créer un nouveau dossier" msgid "Create a new branch" -msgstr "" +msgstr "Créer une nouvelle branche" msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Créer un jeton d’accès personnel pour votre compte afin de récupérer ou pousser par %{protocol}." @@ -436,19 +550,19 @@ msgstr[0] "Déploiement" msgstr[1] "Déploiements" msgid "Deploy Keys" -msgstr "" +msgstr "Clés de déploiement" msgid "Description" -msgstr "" +msgstr "Description" msgid "Details" -msgstr "" +msgstr "Détails" msgid "Directory name" msgstr "Nom du dossier" msgid "Discard changes" -msgstr "" +msgstr "Supprimer les modifications" msgid "Don't show again" msgstr "Ne plus montrer" @@ -487,25 +601,28 @@ msgid "Edit Pipeline Schedule %{id}" msgstr "Éditer le pipeline programmé %{id}" msgid "Emails" +msgstr "Courriels" + +msgid "Enable in settings" msgstr "" msgid "EventFilterBy|Filter by all" -msgstr "" +msgstr "Aucun filtre" msgid "EventFilterBy|Filter by comments" -msgstr "" +msgstr "Filtrer par commentaires" msgid "EventFilterBy|Filter by issue events" -msgstr "" +msgstr "Filtrer par événements d'incident" msgid "EventFilterBy|Filter by merge events" -msgstr "" +msgstr "Filtrer par événements de fusion" msgid "EventFilterBy|Filter by push events" -msgstr "" +msgstr "Filtrer par événements de poussée" msgid "EventFilterBy|Filter by team" -msgstr "" +msgstr "Filtrer par équipe" msgid "Every day (at 4:00am)" msgstr "Chaque jour (à 4:00 du matin)" @@ -516,6 +633,9 @@ msgstr "Chaque mois (le 1er à 4:00 du matin)" msgid "Every week (Sundays at 4:00am)" msgstr "Chaque semaine (dimanche à 4:00 du matin)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Échec du changement de propriétaire" @@ -555,16 +675,16 @@ msgid "From merge request merge until deploy to production" msgstr "Depuis la fusion de la demande de fusion jusqu'au déploiement en production" msgid "GPG Keys" -msgstr "" +msgstr "Clés GPG" msgid "Geo Nodes" msgstr "" msgid "Git storage health information has been reset" -msgstr "" +msgstr "Les informations de santé du stockage Git ont été réinitialisées" msgid "GitLab Runner section" -msgstr "" +msgstr "Section de Runner GitLab" msgid "Go to your fork" msgstr "Aller à votre fourche" @@ -572,33 +692,48 @@ msgstr "Aller à votre fourche" msgid "GoToYourFork|Fork" msgstr "Fourche" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" -msgid "Health Check" +msgid "GroupSettings|Share with group lock" msgstr "" -msgid "Health information can be retrieved from the following endpoints. More information is available" +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." msgstr "" -msgid "HealthCheck|Access token is" +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." msgstr "" -msgid "HealthCheck|Healthy" +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." msgstr "" -msgid "HealthCheck|No Health Problems Detected" +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." msgstr "" -msgid "HealthCheck|Unhealthy" +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" msgstr "" -msgid "Home" -msgstr "Accueil" - -msgid "Hooks" +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "Health Check" +msgstr "Bilan de santé" + +msgid "Health information can be retrieved from the following endpoints. More information is available" +msgstr "Des informations de santé peuvent être récupérées depuis les adresses suivantes. Plus d’informations" + +msgid "HealthCheck|Access token is" +msgstr "Le jeton d’accès est" + +msgid "HealthCheck|Healthy" +msgstr "En bonne santé" + +msgid "HealthCheck|No Health Problems Detected" +msgstr "Aucun problème détecté" + +msgid "HealthCheck|Unhealthy" +msgstr "En mauvaise santé" + msgid "Housekeeping successfully started" msgstr "Maintenance démarrée avec succès" @@ -606,7 +741,7 @@ msgid "Import repository" msgstr "Importer un dépôt" msgid "Install a Runner compatible with GitLab CI" -msgstr "" +msgstr "Installez un Runner compatible avec l'intégration continue de GitLab" msgid "Interval Pattern" msgstr "Schéma d’intervalle" @@ -615,9 +750,12 @@ msgid "Introducing Cycle Analytics" msgstr "Introduction à l'analyseur de cycle" msgid "Issue events" -msgstr "" +msgstr "Événements de l'incident" msgid "Issues" +msgstr "Incidents" + +msgid "Jobs" msgstr "" msgid "LFSStatus|Disabled" @@ -644,10 +782,10 @@ msgid "Last commit" msgstr "Dernière validation" msgid "LastPushEvent|You pushed to" -msgstr "" +msgstr "Vous avez poussé sur" msgid "LastPushEvent|at" -msgstr "" +msgstr "à" msgid "Learn more in the" msgstr "En apprendre plus dans le" @@ -676,25 +814,28 @@ msgid "Median" msgstr "Médian" msgid "Members" -msgstr "" +msgstr "Membres" msgid "Merge Requests" -msgstr "" +msgstr "Demandes de fusion" msgid "Merge events" +msgstr "Événements de fusion" + +msgid "Merge request" msgstr "" msgid "Messages" -msgstr "" +msgstr "Messages" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "ajouter une clef SSH" msgid "Monitoring" -msgstr "" +msgstr "Surveillance" msgid "More information is available|here" -msgstr "" +msgstr "ici" msgid "New Issue" msgid_plural "New Issues" @@ -795,7 +936,7 @@ msgid "NotificationLevel|Watch" msgstr "Surveillé" msgid "Notifications" -msgstr "" +msgstr "Notifications" msgid "OfSearchInADropdown|Filter" msgstr "Filtre" @@ -804,20 +945,32 @@ msgid "OpenedNDaysAgo|Opened" msgstr "Ouvert" msgid "Options" -msgstr "" +msgstr "Paramètres" msgid "Overview" -msgstr "" +msgstr "Vue d'ensemble" msgid "Owner" msgstr "Propriétaire" -msgid "Password" +msgid "Pagination|Last »" msgstr "" -msgid "Pipeline" +msgid "Pagination|Next" msgstr "" +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + +msgid "Password" +msgstr "Mot de Passe" + +msgid "Pipeline" +msgstr "Pipeline" + msgid "Pipeline Health" msgstr "Santé du Pipeline" @@ -888,19 +1041,19 @@ msgid "PipelineSheduleIntervalPattern|Custom" msgstr "Personnalisé" msgid "Pipelines" -msgstr "" +msgstr "Pipelines" msgid "Pipelines charts" msgstr "Graphique des pipelines" msgid "Pipelines for last month" -msgstr "" +msgstr "Pipelines pour le dernier mois" msgid "Pipelines for last week" -msgstr "" +msgstr "Pipelines pour la dernière semaine" msgid "Pipelines for last year" -msgstr "" +msgstr "Pipelines pour la dernière année" msgid "Pipeline|all" msgstr "Tous" @@ -915,12 +1068,9 @@ msgid "Pipeline|with stages" msgstr "avec les étapes" msgid "Preferences" -msgstr "" - -msgid "Profile Settings" -msgstr "" +msgstr "Préférences" -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -939,7 +1089,7 @@ msgid "Project access must be granted explicitly to each user." msgstr "L’accès au projet doit être explicitement accordé à chaque utilisateur." msgid "Project details" -msgstr "" +msgstr "Détails du projet" msgid "Project export could not be deleted." msgstr "L'export du projet n'a pas pu être supprimé." @@ -953,14 +1103,8 @@ msgstr "Le lien de l’export du projet a expiré. Merci de générer un nouvel msgid "Project export started. A download link will be sent by email." msgstr "L'export du projet a débuté. Un lien de téléchargement sera envoyé par courriel." -msgid "Project home" -msgstr "Accueil du projet" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" -msgstr "" +msgstr "S’abonner" msgid "ProjectFeature|Disabled" msgstr "Désactivé" @@ -983,29 +1127,32 @@ msgstr "Étape" msgid "ProjectNetworkGraph|Graph" msgstr "Graphique " -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" -msgstr "" - -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" +msgstr "Chargement des projets" msgid "ProjectsDropdown|Projects you visit often will appear here" -msgstr "" +msgstr "Les projets que vous visitez souvent apparaîtront ici" msgid "ProjectsDropdown|Search your projects" -msgstr "" +msgstr "Chercher dans vos projets" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." msgstr "" +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "Désolé, aucun projet ne correspond à votre recherche" + msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "Cette fonctionnalité requiert le support du localStorage par votre navigateur" + +msgid "Push Rules" msgstr "" msgid "Push events" -msgstr "" +msgstr "Évènements de poussée" msgid "Read more" msgstr "Lire plus" @@ -1019,6 +1166,9 @@ msgstr "Branches" msgid "RefSwitcher|Tags" msgstr "Étiquettes" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Validations liés" @@ -1044,19 +1194,19 @@ msgid "Remove project" msgstr "Supprimer le projet" msgid "Repository" -msgstr "" +msgstr "Dépôt" msgid "Request Access" msgstr "Demander l'accès" msgid "Reset git storage health information" -msgstr "" +msgstr "Réinitialiser les informations de santé du stockage Git" msgid "Reset health check access token" -msgstr "" +msgstr "Réinitialiser le jeton d’accès au bilan de santé" msgid "Reset runners registration token" -msgstr "" +msgstr "Réinitialiser le jeton d’inscription des Runners" msgid "Revert this commit" msgstr "Annuler cette validation" @@ -1065,7 +1215,7 @@ msgid "Revert this merge request" msgstr "Annuler cette demande de fusion" msgid "SSH Keys" -msgstr "" +msgstr "Clés SSH" msgid "Save pipeline schedule" msgstr "Sauvegarder le pipeline programmé" @@ -1073,6 +1223,9 @@ msgstr "Sauvegarder le pipeline programmé" msgid "Schedule a new pipeline" msgstr "Programmer un nouveau pipeline" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Programmer des pipelines" @@ -1086,13 +1239,13 @@ msgid "Select a timezone" msgstr "Sélectionnez un fuseau horaire" msgid "Select existing branch" -msgstr "" +msgstr "Sélectionnez une branche existante" msgid "Select target branch" msgstr "Sélectionnez une branche cible" msgid "Service Templates" -msgstr "" +msgstr "Modèles de service" msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Définissez un mot de passe pour votre compte pour pouvoir tirer ou pousser par %{protocol}." @@ -1110,6 +1263,12 @@ msgid "SetPasswordToCloneLink|set a password" msgstr "définir un mot de passe" msgid "Settings" +msgstr "Paramètres" + +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" msgstr "" msgid "Showing %d event" @@ -1118,29 +1277,131 @@ msgstr[0] "Affichage de %d évènement" msgstr[1] "Affichage de %d évènements" msgid "Snippets" +msgstr "Extraits de code" + +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" msgstr "" msgid "Source code" msgstr "Code source" msgid "Spam Logs" -msgstr "" +msgstr "Journaux des messages indésirables" msgid "Specify the following URL during the Runner setup:" -msgstr "" +msgstr "Spécifiez l’URL suivante lors de la configuration du Runner :" msgid "StarProject|Star" msgstr "S'abonner" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Créer une %{new_merge_request} avec ces changements" msgid "Start the Runner!" -msgstr "" +msgstr "Démarrer le Runner !" msgid "Switch branch/tag" msgstr "Changer de branche / d'étiquette" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "Étiquette" @@ -1153,7 +1414,7 @@ msgid "Target Branch" msgstr "Branche cible" msgid "Team" -msgstr "" +msgstr "Équipe" msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "L’étape de développement montre le temps entre la première validation et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion." @@ -1204,6 +1465,9 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet msgstr "La valeur située au point médian d’une série de valeur observée. C.à.d., entre 3, 5, 9, le médian est 5. Entre 3, 5, 7, 8, le médian est (5+7)/2 = 6." msgid "There are problems accessing Git storage: " +msgstr "Il y a des difficultés à accéder aux données Git : " + +msgid "This is the author's first Merge Request to this project. Handle with care." msgstr "" msgid "This means you can not push code until you create an empty repository or import existing one." @@ -1376,14 +1640,20 @@ msgid "UploadLink|click to upload" msgstr "Cliquez pour envoyer" msgid "Use the following registration token during setup:" -msgstr "" +msgstr "Utiliser le jeton d’inscription suivant pendant l’installation :" msgid "Use your global notification setting" msgstr "Utiliser vos paramètres de notification globaux" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Afficher la demande de fusion" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Interne" @@ -1403,7 +1673,7 @@ msgid "We don't have enough data to show this stage." msgstr "Nous n'avons pas suffisamment de données pour afficher cette étape." msgid "Wiki" -msgstr "" +msgstr "Wiki" msgid "Withdraw Access Request" msgstr "Retirer la demande d'accès" @@ -1456,6 +1726,12 @@ msgstr "Vous ne pourrez pas récupérer ou pousser de code par SSH tant que vous msgid "Your name" msgstr "Votre nom" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "jour" @@ -1469,6 +1745,6 @@ msgstr "courriels de notification" msgid "parent" msgid_plural "parents" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "parent" +msgstr[1] "parents" diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po index 0249c4fe9eb..804817e96e9 100644 --- a/locale/it/gitlab.po +++ b/locale/it/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:20-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:44-0400\n" "Last-Translator: gitlab \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -29,6 +29,9 @@ msgstr[1] "%s commit aggiuntivi sono stati omessi per evitare degradi di prestaz msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} ha committato %{commit_timeago}" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "" @@ -51,6 +54,9 @@ msgid_plural "%d pipelines" msgstr[0] "" msgstr[1] "" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Un insieme di grafici riguardo la Continuous Integration" @@ -93,7 +99,7 @@ msgstr "Aggiungi una directory (cartella)" msgid "All" msgstr "" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -117,10 +123,34 @@ msgstr "" msgid "Are you sure?" msgstr "" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Aggiungi un file tramite trascina & rilascia ( drag & drop) o %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,6 +207,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "" @@ -194,6 +227,90 @@ msgstr "Cambia branch" msgid "Branches" msgstr "" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Naviga direttori" @@ -337,9 +454,6 @@ msgstr "Committato da " msgid "Compare" msgstr "Confronta" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Guida per contribuire" @@ -489,6 +603,9 @@ msgstr "Cambia programmazione della pipeline %{id}" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "" @@ -516,6 +633,9 @@ msgstr "Ogni primo giorno del mese (alle 4 del mattino)" msgid "Every week (Sundays at 4:00am)" msgstr "Ogni settimana (Di domenica alle 4 del mattino)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Impossibile cambiare owner" @@ -572,7 +692,28 @@ msgstr "Vai il tuo fork" msgid "GoToYourFork|Fork" msgstr "Fork" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -593,12 +734,6 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" -msgid "Home" -msgstr "" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "Housekeeping iniziato con successo" @@ -620,6 +755,9 @@ msgstr "" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "Disabilitato" @@ -684,6 +822,9 @@ msgstr "" msgid "Merge events" msgstr "" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -812,6 +953,18 @@ msgstr "" msgid "Owner" msgstr "" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -917,10 +1070,7 @@ msgstr "con più stadi" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -953,12 +1103,6 @@ msgstr "Il link d'esportazione del progetto è scaduto. Genera una nuova esporta msgid "Project export started. A download link will be sent by email." msgstr "Esportazione del progetto iniziata. Un link di download sarà inviato via email." -msgid "Project home" -msgstr "Home di progetto" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -983,27 +1127,30 @@ msgstr "Stadio" msgid "ProjectNetworkGraph|Graph" msgstr "Grafico" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "" @@ -1019,6 +1166,9 @@ msgstr "Branches" msgid "RefSwitcher|Tags" msgstr "Tags" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Commit correlati" @@ -1073,6 +1223,9 @@ msgstr "Salva pianificazione pipeline" msgid "Schedule a new pipeline" msgstr "Pianifica una nuova Pipeline" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Pianificazione pipelines" @@ -1112,6 +1265,12 @@ msgstr "imposta una password" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Visualizza %d evento" @@ -1120,6 +1279,102 @@ msgstr[1] "Visualizza %d eventi" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "Codice Sorgente" @@ -1132,6 +1387,9 @@ msgstr "" msgid "StarProject|Star" msgstr "Star" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "inizia una %{new_merge_request} con queste modifiche" @@ -1141,6 +1399,9 @@ msgstr "" msgid "Switch branch/tag" msgstr "Cambia branch/tag" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "" @@ -1206,6 +1467,9 @@ msgstr "Il valore falsato nel mezzo di una serie di dati osservati. ES: tra 3,5, msgid "There are problems accessing Git storage: " msgstr "" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Questo significa che non è possibile effettuare push di codice fino a che non crei una repository vuota o ne importi una esistente" @@ -1381,9 +1645,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "Usa le tue impostazioni globali " +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Mostra la richieste di merge aperte" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Interno" @@ -1456,6 +1726,12 @@ msgstr "Non sarai in grado di effettuare push o pull tramite SSH fino a che %{ad msgid "Your name" msgstr "Il tuo nome" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "giorno" diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po index c66dd3c1b6b..2a08abda7ce 100644 --- a/locale/ja/gitlab.po +++ b/locale/ja/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:20-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:44-0400\n" "Last-Translator: gitlab \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -27,6 +27,9 @@ msgstr[0] "パフォーマンス低下を避けるため %s 個のコミット msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_timeago}に%{commit_author_link}がコミットしました。" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "" @@ -47,6 +50,9 @@ msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d 個のパイプライン" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "CIについてのグラフ" @@ -89,7 +95,7 @@ msgstr "新規ディレクトリを追加" msgid "All" msgstr "" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -113,10 +119,34 @@ msgstr "" msgid "Are you sure?" msgstr "" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "ドラッグ&ドロップまたは %{upload_link} でファイルを添付" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -173,6 +203,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "ブランチ" @@ -189,6 +222,90 @@ msgstr "ブランチを切替" msgid "Branches" msgstr "ブランチ" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "ディレクトリを表示" @@ -331,9 +448,6 @@ msgstr "コミット担当者: " msgid "Compare" msgstr "比較" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "貢献者向けガイド" @@ -482,6 +596,9 @@ msgstr "パイプラインスケジュール %{id} を編集" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "" @@ -509,6 +626,9 @@ msgstr "毎月 (1日の午前4:00)" msgid "Every week (Sundays at 4:00am)" msgstr "毎週 (日曜日の午前4:00)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "オーナーを変更できませんでした" @@ -564,7 +684,28 @@ msgstr "自分のフォークへ移動" msgid "GoToYourFork|Fork" msgstr "フォーク" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -585,12 +726,6 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" -msgid "Home" -msgstr "ホーム" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "ハウスキーピングは正常に起動しました。" @@ -612,6 +747,9 @@ msgstr "" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "無効" @@ -674,6 +812,9 @@ msgstr "" msgid "Merge events" msgstr "" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -801,6 +942,18 @@ msgstr "" msgid "Owner" msgstr "オーナー" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -906,10 +1059,7 @@ msgstr "ステージあり" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -942,12 +1092,6 @@ msgstr "プロジェクトのエクスポートリンクは期限切れになり msgid "Project export started. A download link will be sent by email." msgstr "プロジェクトのエクスポートを開始しました。ダウンロードのリンクはメールで送信します" -msgid "Project home" -msgstr "プロジェクトホーム" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -972,27 +1116,30 @@ msgstr "ステージ" msgid "ProjectNetworkGraph|Graph" msgstr "ネットワークグラフ" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "" @@ -1008,6 +1155,9 @@ msgstr "ブランチ" msgid "RefSwitcher|Tags" msgstr "タグ" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "関連するコミット" @@ -1062,6 +1212,9 @@ msgstr "パイプラインスケジュールを保存" msgid "Schedule a new pipeline" msgstr "新しいパイプラインのスケジュールを作成" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "パイプラインスケジューリング" @@ -1101,6 +1254,12 @@ msgstr "パスワードを設定" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "%d のイベントを表示中" @@ -1108,6 +1267,102 @@ msgstr[0] "%d のイベントを表示中" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "ソースコード" @@ -1120,6 +1375,9 @@ msgstr "" msgid "StarProject|Star" msgstr "スターを付ける" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "この変更で %{new_merge_request} を作成する" @@ -1129,6 +1387,9 @@ msgstr "" msgid "Switch branch/tag" msgstr "ブランチ・タグ切り替え" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "タグ" @@ -1193,6 +1454,9 @@ msgstr "得られた一連のデータを小さい順に並べたときに中央 msgid "There are problems accessing Git storage: " msgstr "" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "空レポジトリーを作成または既存レポジトリーをインポートをしなければ、コードのプッシュはできません。" @@ -1366,9 +1630,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "全体通知設定を利用" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "オープンなマージリクエストを表示" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "内部" @@ -1441,6 +1711,12 @@ msgstr "%{add_ssh_key_link} をプロファイルに追加していないので msgid "Your name" msgstr "名前" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "日" diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po index bbf4aa15cd7..de4a13d3765 100644 --- a/locale/ko/gitlab.po +++ b/locale/ko/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:19-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:43-0400\n" "Last-Translator: gitlab \n" "Language-Team: Korean\n" "Language: ko_KR\n" @@ -27,6 +27,9 @@ msgstr[0] "%s 추가 커밋은 성능 이슈를 방지하기 위해 생략되었 msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_timeago} 에 %{commit_author_link} 님이 커밋하였습니다. " +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "%{number_of_failures} / %{maximum_failures} 실패. GitLab 은 다음 시도에서 성공하면 접근을 허용할 것입니다." @@ -47,6 +50,9 @@ msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d 파이프라인" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "지속적인 통합에 관한 그래프 모음" @@ -89,7 +95,7 @@ msgstr "새 디렉토리 추가" msgid "All" msgstr "전체" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -113,10 +119,34 @@ msgstr "헬스 체크 토큰을 초기화 하시겠습니까?" msgid "Are you sure?" msgstr "확실합니까?" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "드래그 & 드롭 또는 %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -173,6 +203,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "브랜치" @@ -189,6 +222,90 @@ msgstr "브랜치 변경" msgid "Branches" msgstr "브랜치" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "디렉토리 찾아보기" @@ -331,9 +448,6 @@ msgstr "커밋한 사용자" msgid "Compare" msgstr "비교" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "기여에 대한 안내" @@ -482,6 +596,9 @@ msgstr "파이프라인 스케줄 편집 %{id}" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "모든 값을 기준으로 필터" @@ -509,6 +626,9 @@ msgstr "매월 (1일 오전 4시)" msgid "Every week (Sundays at 4:00am)" msgstr "매주 (일요일 오전 4시에)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "소유자를 변경하지 못했습니다" @@ -564,7 +684,28 @@ msgstr "당신의 포크로 이동하세요" msgid "GoToYourFork|Fork" msgstr "포크" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -585,12 +726,6 @@ msgstr " 헬스 문제가 발견되지 않았습니다." msgid "HealthCheck|Unhealthy" msgstr "비정상" -msgid "Home" -msgstr "홈" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "Housekeeping이 성공적으로 시작되었습니다" @@ -612,6 +747,9 @@ msgstr "이슈 이벤트" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "Disabled" @@ -674,6 +812,9 @@ msgstr "" msgid "Merge events" msgstr "머지 이벤트" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -801,6 +942,18 @@ msgstr "" msgid "Owner" msgstr "소유자" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -906,10 +1059,7 @@ msgstr "스테이징" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -942,12 +1092,6 @@ msgstr "프로젝트 내보내기 링크가 만료되었습니다. 프로젝트 msgid "Project export started. A download link will be sent by email." msgstr "프로젝트 내보내기가 시작되었습니다. 다운로드 링크는 이메일로 전송됩니다." -msgid "Project home" -msgstr "프로젝트 홈" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "구독" @@ -972,27 +1116,30 @@ msgstr "스테이징" msgid "ProjectNetworkGraph|Graph" msgstr "그래프" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "푸쉬 이벤트" @@ -1008,6 +1155,9 @@ msgstr "브랜치" msgid "RefSwitcher|Tags" msgstr "태그" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "관련 커밋" @@ -1062,6 +1212,9 @@ msgstr "파이프라인 스케줄 저장" msgid "Schedule a new pipeline" msgstr "새로운 파이프라인 스케줄 잡기" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "파이프라인 스케줄링" @@ -1101,6 +1254,12 @@ msgstr "패스워드 설정" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "%d 개의 이벤트 표시 중" @@ -1108,6 +1267,102 @@ msgstr[0] "%d 개의 이벤트 표시 중" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "소스 코드" @@ -1120,6 +1375,9 @@ msgstr "Runner 설정 중 다음 URL을 지정하세요." msgid "StarProject|Star" msgstr "별표" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "이 변경 사항으로 %{new_merge_request} 을 시작하십시오." @@ -1129,6 +1387,9 @@ msgstr "Runner 시작!" msgid "Switch branch/tag" msgstr "스위치 브랜치/태그" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "태그" @@ -1193,6 +1454,9 @@ msgstr "값은 일련의 관측 값 중점에 있습니다. 예를 들어, 3, 5, msgid "There are problems accessing Git storage: " msgstr "git storage에 접근하는데 문제가 발생했습니다. " +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "즉, 빈 저장소를 만들거나 기존 저장소를 가져올 때까지 코드를 Push 할 수 없습니다." @@ -1366,9 +1630,15 @@ msgstr "설정 중에 다음 등록 토큰 이용 : " msgid "Use your global notification setting" msgstr "전체 알림 설정 사용" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "열린 머지 리퀘스트보기" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "내부" @@ -1441,6 +1711,12 @@ msgstr "당신의 프로필에 %{add_ssh_key_link} 를 하기 전에는 SSH를 msgid "Your name" msgstr "귀하의 이름" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "일" diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po index 250d3bd413c..45a444fac43 100644 --- a/locale/nl_NL/gitlab.po +++ b/locale/nl_NL/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:20-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:43-0400\n" "Last-Translator: gitlab \n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -18,17 +18,20 @@ msgstr "" msgid "%d commit" msgid_plural "%d commits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d commit" +msgstr[1] "%d commits" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%s andere commit is weggelaten om prestatieproblemen te voorkomen." +msgstr[1] "%s andere commits zijn weggelaten om prestatieproblemen te voorkomen." msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "" @@ -44,60 +47,63 @@ msgstr[0] "" msgstr[1] "" msgid "(checkout the %{link} for information on how to install it)." -msgstr "" +msgstr "(bekijk de %{link} voor meer info over hoe je het kan installeren)." msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "" msgstr[1] "" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "" msgid "About auto deploy" -msgstr "" +msgstr "Over auto deploy" msgid "Abuse Reports" -msgstr "" +msgstr "Misbruik rapporten" msgid "Access Tokens" -msgstr "" +msgstr "Toegangstokens" msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." msgstr "" msgid "Account" -msgstr "" +msgstr "Account" msgid "Active" -msgstr "" +msgstr "Actief" msgid "Activity" -msgstr "" +msgstr "Activiteit" msgid "Add Changelog" -msgstr "" +msgstr "Changelog toevoegen" msgid "Add Contribution guide" msgstr "" msgid "Add License" -msgstr "" +msgstr "Licentie toevoegen" msgid "Add an SSH key to your profile to pull or push via SSH." msgstr "" msgid "Add new directory" -msgstr "" +msgstr "Nieuwe map toevoegen" msgid "All" -msgstr "" +msgstr "Alles" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" -msgstr "" +msgstr "Applicaties" msgid "Archived project! Repository is read-only" msgstr "" @@ -117,10 +123,34 @@ msgstr "" msgid "Are you sure?" msgstr "" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,6 +207,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "" @@ -192,35 +225,119 @@ msgid "BranchSwitcherTitle|Switch branch" msgstr "" msgid "Branches" +msgstr "Branches" + +msgid "Branches|Cant find HEAD commit for this branch" msgstr "" -msgid "Browse Directory" +msgid "Branches|Compare" msgstr "" -msgid "Browse File" +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" msgstr "" -msgid "Browse Files" +msgid "Branches|Delete branch" msgstr "" -msgid "Browse files" +msgid "Branches|Delete merged branches" msgstr "" -msgid "ByAuthor|by" +msgid "Branches|Delete protected branch" msgstr "" -msgid "CI / CD" +msgid "Branches|Delete protected branch '%{branch_name}'?" msgstr "" -msgid "CI configuration" +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" msgstr "" -msgid "Cancel" +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" msgstr "" -msgid "Cancel edit" +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" msgstr "" +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + +msgid "Browse Directory" +msgstr "Bladeren in map" + +msgid "Browse File" +msgstr "Bekijk bestand" + +msgid "Browse Files" +msgstr "Door bestanden bladeren" + +msgid "Browse files" +msgstr "Door bestanden bladeren" + +msgid "ByAuthor|by" +msgstr "door" + +msgid "CI / CD" +msgstr "CI / CD" + +msgid "CI configuration" +msgstr "CI Configuratie" + +msgid "Cancel" +msgstr "Annuleren" + +msgid "Cancel edit" +msgstr "Bewerken annuleren" + msgid "ChangeTypeActionLabel|Pick into branch" msgstr "" @@ -237,25 +354,25 @@ msgid "Changelog" msgstr "" msgid "Charts" -msgstr "" +msgstr "Grafieken" msgid "Chat" -msgstr "" +msgstr "Chat" msgid "Cherry-pick this commit" -msgstr "" +msgstr "Cherry-pick deze commit" msgid "Cherry-pick this merge request" msgstr "" msgid "CiStatusLabel|canceled" -msgstr "" +msgstr "geannuleerd" msgid "CiStatusLabel|created" -msgstr "" +msgstr "gemaakt" msgid "CiStatusLabel|failed" -msgstr "" +msgstr "mislukt" msgid "CiStatusLabel|manual action" msgstr "" @@ -270,40 +387,40 @@ msgid "CiStatusLabel|pending" msgstr "" msgid "CiStatusLabel|skipped" -msgstr "" +msgstr "overgeslagen" msgid "CiStatusLabel|waiting for manual action" msgstr "" msgid "CiStatusText|blocked" -msgstr "" +msgstr "geblokkeerd" msgid "CiStatusText|canceled" msgstr "" msgid "CiStatusText|created" -msgstr "" +msgstr "gemaakt" msgid "CiStatusText|failed" msgstr "" msgid "CiStatusText|manual" -msgstr "" +msgstr "handmatig" msgid "CiStatusText|passed" -msgstr "" +msgstr "geslaagd" msgid "CiStatusText|pending" msgstr "" msgid "CiStatusText|skipped" -msgstr "" +msgstr "overgeslagen" msgid "CiStatus|running" msgstr "" msgid "Comments" -msgstr "" +msgstr "Opmerkingen" msgid "Commit" msgid_plural "Commits" @@ -317,28 +434,25 @@ msgid "Commit message" msgstr "" msgid "CommitBoxTitle|Commit" -msgstr "" +msgstr "Commit" msgid "CommitMessage|Add %{file_name}" -msgstr "" +msgstr "%{file_name} toevoegen" msgid "Commits" -msgstr "" +msgstr "Commits" msgid "Commits feed" msgstr "" msgid "Commits|History" -msgstr "" +msgstr "Geschiedenis" msgid "Committed by" -msgstr "" +msgstr "Gecommit door" msgid "Compare" -msgstr "" - -msgid "Container Registry" -msgstr "" +msgstr "Vergelijk" msgid "Contribution guide" msgstr "" @@ -365,7 +479,7 @@ msgid "Create a personal access token on your account to pull or push via %{prot msgstr "" msgid "Create directory" -msgstr "" +msgstr "Maak map aan" msgid "Create empty bare repository" msgstr "" @@ -489,6 +603,9 @@ msgstr "" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "" @@ -516,6 +633,9 @@ msgstr "" msgid "Every week (Sundays at 4:00am)" msgstr "" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "" @@ -572,7 +692,28 @@ msgstr "" msgid "GoToYourFork|Fork" msgstr "" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -593,12 +734,6 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" -msgid "Home" -msgstr "" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "" @@ -620,6 +755,9 @@ msgstr "" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "" @@ -684,6 +822,9 @@ msgstr "" msgid "Merge events" msgstr "" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -698,8 +839,8 @@ msgstr "" msgid "New Issue" msgid_plural "New Issues" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Nieuwe issue" +msgstr[1] "Nieuwe issues" msgid "New Pipeline Schedule" msgstr "" @@ -812,6 +953,18 @@ msgstr "" msgid "Owner" msgstr "" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -917,10 +1070,7 @@ msgstr "" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -953,12 +1103,6 @@ msgstr "" msgid "Project export started. A download link will be sent by email." msgstr "" -msgid "Project home" -msgstr "" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -983,27 +1127,30 @@ msgstr "" msgid "ProjectNetworkGraph|Graph" msgstr "" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "" @@ -1019,6 +1166,9 @@ msgstr "" msgid "RefSwitcher|Tags" msgstr "" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "" @@ -1073,6 +1223,9 @@ msgstr "" msgid "Schedule a new pipeline" msgstr "" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "" @@ -1112,6 +1265,12 @@ msgstr "" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "" @@ -1120,6 +1279,102 @@ msgstr[1] "" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "" @@ -1132,6 +1387,9 @@ msgstr "" msgid "StarProject|Star" msgstr "" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "" @@ -1141,6 +1399,9 @@ msgstr "" msgid "Switch branch/tag" msgstr "" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "" @@ -1206,6 +1467,9 @@ msgstr "" msgid "There are problems accessing Git storage: " msgstr "" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "" @@ -1381,9 +1645,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "" @@ -1456,6 +1726,12 @@ msgstr "" msgid "Your name" msgstr "" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "" diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po index 5469f77d950..318c719c2ed 100644 --- a/locale/pt_BR/gitlab.po +++ b/locale/pt_BR/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:18-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:42-0400\n" "Last-Translator: gitlab \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -29,6 +29,9 @@ msgstr[1] "%s commits adicionais foram omitidos para prevenir problemas de perfo msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} fez commit %{commit_timeago}" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "" @@ -51,6 +54,9 @@ msgid_plural "%d pipelines" msgstr[0] "" msgstr[1] "" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Uma coleção de gráficos sobre Integração Contínua" @@ -93,7 +99,7 @@ msgstr "Adicionar novo diretório" msgid "All" msgstr "" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -117,10 +123,34 @@ msgstr "" msgid "Are you sure?" msgstr "" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Para anexar arquivo, arraste e solte ou %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -177,6 +207,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "" @@ -194,6 +227,90 @@ msgstr "Mudar de branch" msgid "Branches" msgstr "" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Navegar no Diretório" @@ -337,9 +454,6 @@ msgstr "Commit feito por" msgid "Compare" msgstr "Comparar" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Guia de contribuição" @@ -489,6 +603,9 @@ msgstr "Alterar Agendamento do Pipeline %{id}" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "" @@ -516,6 +633,9 @@ msgstr "Todos os meses (no dia primeiro às 4:00)" msgid "Every week (Sundays at 4:00am)" msgstr "Toda semana (domingos às 4:00)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Erro ao alterar o proprietário" @@ -572,7 +692,28 @@ msgstr "Ir para seu fork" msgid "GoToYourFork|Fork" msgstr "Fork" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -593,12 +734,6 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" -msgid "Home" -msgstr "Início" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "Manutenção iniciada com sucesso" @@ -620,6 +755,9 @@ msgstr "" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "Desabilitado" @@ -684,6 +822,9 @@ msgstr "" msgid "Merge events" msgstr "" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -812,6 +953,18 @@ msgstr "" msgid "Owner" msgstr "Proprietário" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -917,10 +1070,7 @@ msgstr "com etapas" msgid "Preferences" msgstr "" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -953,12 +1103,6 @@ msgstr "O link para a exportação do projeto expirou. Favor gerar uma nova expo msgid "Project export started. A download link will be sent by email." msgstr "Exportação do projeto iniciada. Um link para baixá-la será enviado por email." -msgid "Project home" -msgstr "Página inicial do projeto" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -983,27 +1127,30 @@ msgstr "Etapa" msgid "ProjectNetworkGraph|Graph" msgstr "Árvore" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "" @@ -1019,6 +1166,9 @@ msgstr "Branches" msgid "RefSwitcher|Tags" msgstr "Tags" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Commits Relacionados" @@ -1073,6 +1223,9 @@ msgstr "Salvar agendamento da pipeline" msgid "Schedule a new pipeline" msgstr "Agendar nova pipeline" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Agendando pipelines" @@ -1112,6 +1265,12 @@ msgstr "defina uma senha" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Mostrando %d evento" @@ -1120,6 +1279,102 @@ msgstr[1] "Mostrando %d eventos" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "Código-fonte" @@ -1132,6 +1387,9 @@ msgstr "" msgid "StarProject|Star" msgstr "Marcar" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Iniciar um %{new_merge_request} a partir dessas alterações" @@ -1141,6 +1399,9 @@ msgstr "" msgid "Switch branch/tag" msgstr "Trocar branch/tag" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "" @@ -1206,6 +1467,9 @@ msgstr "O valor situado no ponto médio de uma série de valores observados. Ex. msgid "There are problems accessing Git storage: " msgstr "" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Isto significa que você não pode entregar código até que crie um repositório vazio ou importe um existente." @@ -1381,9 +1645,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "Utilizar configuração de notificação global" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Ver merge request aberto" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Interno" @@ -1456,6 +1726,12 @@ msgstr "Você não conseguirá fazer pull ou push no projeto via SSH até que a msgid "Your name" msgstr "Seu nome" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "dia" diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po index 808bc9dedce..507dc187cdb 100644 --- a/locale/ru/gitlab.po +++ b/locale/ru/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:19-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:43-0400\n" "Last-Translator: gitlab \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -31,23 +31,26 @@ msgstr[2] "%s добавленные коммиты были исключены msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} коммичено %{commit_timeago}" -msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgstr "%{number_of_failures} из %{maximum_failures} возможных попыток. Вы можете попытаться еще раз." + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds." -msgstr "" +msgstr "%{number_of_failures} из %{maximum_failures} возможных неудачных попыток. GitLab заблокирует доступ на %{number_of_seconds} секунд." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." -msgstr "" +msgstr "%{number_of_failures} из %{maximum_failures} возможных неудачных попыток. GitLab не будет автоматически повторять попытку. Сбросьте информацию хранилища после устранения проблемы." msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%{storage_name}: неудачная попытка доступа к хранилищу на хосте:" +msgstr[1] "%{storage_name}: %{failed_attempts} - неудачные попытки доступа к хранилищу:" +msgstr[2] "%{storage_name}: %{failed_attempts} - неудачные попытки доступа к хранилищу:" msgid "(checkout the %{link} for information on how to install it)." -msgstr "" +msgstr "(перейдите по ссылке %{link} для получения информации об установке)." msgid "1 pipeline" msgid_plural "%d pipelines" @@ -55,23 +58,26 @@ msgstr[0] "1 конвейер" msgstr[1] "%d конвейеры" msgstr[2] "%d конвейеры" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Графики относительно непрерывной интеграции" msgid "About auto deploy" -msgstr "Автоматическое развертывание" +msgstr "Об автоматическом развёртывании" msgid "Abuse Reports" -msgstr "" +msgstr "Отчёты о Жалобах" msgid "Access Tokens" -msgstr "" +msgstr "Токены Доступа" msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." -msgstr "" +msgstr "Доступ к вышедшим из строя хранилищам временно отключен для возможности монтирования в целях восстановления. Сбросьте информацию о хранилищах после устранения проблемы, чтобы разрешить доступ." msgid "Account" -msgstr "" +msgstr "Учетная запись" msgid "Active" msgstr "Активный" @@ -95,13 +101,13 @@ msgid "Add new directory" msgstr "Добавить каталог" msgid "All" -msgstr "" +msgstr "Все" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" -msgstr "" +msgstr "Приложения" msgid "Archived project! Repository is read-only" msgstr "Архивный проект! Репозиторий доступен только для чтения" @@ -113,18 +119,42 @@ msgid "Are you sure you want to discard your changes?" msgstr "Вы уверены, что Вы хотите отменить Ваши изменения?" msgid "Are you sure you want to reset registration token?" -msgstr "" +msgstr "Вы уверены, что Вы хотите сбросить этот ключ регистрации?" msgid "Are you sure you want to reset the health check token?" -msgstr "" +msgstr "Вы уверены, что Вы хотите сбросить этот ключ проверки работоспособности?" msgid "Are you sure?" msgstr "Вы уверены?" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Приложить файл через drag & drop или %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -181,6 +211,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "Ветка" @@ -199,6 +232,90 @@ msgstr "Переключить ветку" msgid "Branches" msgstr "Ветки" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Обзор" @@ -215,7 +332,7 @@ msgid "ByAuthor|by" msgstr "по автору" msgid "CI / CD" -msgstr "" +msgstr "CI / CD" msgid "CI configuration" msgstr "Настройка CI" @@ -245,7 +362,7 @@ msgid "Charts" msgstr "Диаграммы" msgid "Chat" -msgstr "" +msgstr "Чат" msgid "Cherry-pick this commit" msgstr "Подобрать в этом коммите" @@ -343,9 +460,6 @@ msgstr "Фиксировано" msgid "Compare" msgstr "Сравнить" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Руководство участника" @@ -443,13 +557,13 @@ msgstr[1] "Размещение" msgstr[2] "Размещение" msgid "Deploy Keys" -msgstr "" +msgstr "Ключи Развертывания" msgid "Description" msgstr "Описание" msgid "Details" -msgstr "" +msgstr "Подробная информация" msgid "Directory name" msgstr "Каталог" @@ -494,25 +608,28 @@ msgid "Edit Pipeline Schedule %{id}" msgstr "Изменить расписание конвейера %{id}" msgid "Emails" +msgstr "Email-адреса" + +msgid "Enable in settings" msgstr "" msgid "EventFilterBy|Filter by all" -msgstr "" +msgstr "Фильтр по всему" msgid "EventFilterBy|Filter by comments" -msgstr "" +msgstr "Фильтр по комментарию" msgid "EventFilterBy|Filter by issue events" -msgstr "" +msgstr "Фильтр по событиям обсуждений" msgid "EventFilterBy|Filter by merge events" -msgstr "" +msgstr "Фильтр по событиям слияний" msgid "EventFilterBy|Filter by push events" -msgstr "" +msgstr "Фильтр по событиям отправки" msgid "EventFilterBy|Filter by team" -msgstr "" +msgstr "Фильтр по команде" msgid "Every day (at 4:00am)" msgstr "Ежедневно (в 4:00)" @@ -523,6 +640,9 @@ msgstr "Ежемесячно (каждое 1-е число в 4:00)" msgid "Every week (Sundays at 4:00am)" msgstr "Еженедельно (по воскресениями в 4:00)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Не удалось изменить владельца" @@ -563,13 +683,13 @@ msgid "From merge request merge until deploy to production" msgstr "От запроса на слияние до развертывания в рабочей среде" msgid "GPG Keys" -msgstr "" +msgstr "GPG Ключи" msgid "Geo Nodes" msgstr "" msgid "Git storage health information has been reset" -msgstr "" +msgstr "Информация о стабильности Git хранилища была сброшена" msgid "GitLab Runner section" msgstr "Секция Gitlab Runner" @@ -580,33 +700,48 @@ msgstr "Перейти к вашему форку" msgid "GoToYourFork|Fork" msgstr "Форк" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" -msgid "Health Check" +msgid "GroupSettings|Share with group lock" msgstr "" -msgid "Health information can be retrieved from the following endpoints. More information is available" +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." msgstr "" -msgid "HealthCheck|Access token is" +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." msgstr "" -msgid "HealthCheck|Healthy" +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." msgstr "" -msgid "HealthCheck|No Health Problems Detected" +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." msgstr "" -msgid "HealthCheck|Unhealthy" +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" msgstr "" -msgid "Home" -msgstr "Главная" - -msgid "Hooks" +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "Health Check" +msgstr "Проверка работоспособности" + +msgid "Health information can be retrieved from the following endpoints. More information is available" +msgstr "Информация о работоспособности может быть получена из следующих точек подключения. Доступна более подробная информация" + +msgid "HealthCheck|Access token is" +msgstr "Ключ доступа - " + +msgid "HealthCheck|Healthy" +msgstr "Стабильно" + +msgid "HealthCheck|No Health Problems Detected" +msgstr "Проблем работоспособности не обнаружено" + +msgid "HealthCheck|Unhealthy" +msgstr "Нестабильный" + msgid "Housekeeping successfully started" msgstr "Очистка успешно запущена" @@ -623,9 +758,12 @@ msgid "Introducing Cycle Analytics" msgstr "Внедрение Цикла Аналитик" msgid "Issue events" -msgstr "" +msgstr "События задачи" msgid "Issues" +msgstr "Задачи" + +msgid "Jobs" msgstr "" msgid "LFSStatus|Disabled" @@ -635,7 +773,7 @@ msgid "LFSStatus|Enabled" msgstr "Включено" msgid "Labels" -msgstr "" +msgstr "Метки" msgid "Last %d day" msgid_plural "Last %d days" @@ -653,10 +791,10 @@ msgid "Last commit" msgstr "Последний коммит" msgid "LastPushEvent|You pushed to" -msgstr "" +msgstr "Вы отправили в" msgid "LastPushEvent|at" -msgstr "" +msgstr "в" msgid "Learn more in the" msgstr "Узнайте больше в" @@ -686,25 +824,28 @@ msgid "Median" msgstr "Среднее" msgid "Members" -msgstr "" +msgstr "Участники" msgid "Merge Requests" -msgstr "" +msgstr "Запросы на Слияние" msgid "Merge events" +msgstr "События слияний" + +msgid "Merge request" msgstr "" msgid "Messages" -msgstr "" +msgstr "Сообщения" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "добавить ключ SSH" msgid "Monitoring" -msgstr "" +msgstr "Мониторинг" msgid "More information is available|here" -msgstr "" +msgstr "Больше информации доступно|тут" msgid "New Issue" msgid_plural "New Issues" @@ -806,7 +947,7 @@ msgid "NotificationLevel|Watch" msgstr "Отслеживать" msgid "Notifications" -msgstr "" +msgstr "Уведомления" msgid "OfSearchInADropdown|Filter" msgstr "Фильтр" @@ -818,14 +959,26 @@ msgid "Options" msgstr "Настройки" msgid "Overview" -msgstr "" +msgstr "Обзор" msgid "Owner" msgstr "Владелец" -msgid "Password" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" msgstr "" +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + +msgid "Password" +msgstr "Пароль" + msgid "Pipeline" msgstr "Конвейер" @@ -905,13 +1058,13 @@ msgid "Pipelines charts" msgstr "Диаграмма конвейера" msgid "Pipelines for last month" -msgstr "" +msgstr "Конвеер за последний месяц" msgid "Pipelines for last week" -msgstr "" +msgstr "Конвеер за последнюю неделю" msgid "Pipelines for last year" -msgstr "" +msgstr "Конвееры за последний год" msgid "Pipeline|all" msgstr "все" @@ -926,12 +1079,9 @@ msgid "Pipeline|with stages" msgstr "со стадиями" msgid "Preferences" -msgstr "" +msgstr "Предпочтения" -msgid "Profile Settings" -msgstr "" - -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -950,7 +1100,7 @@ msgid "Project access must be granted explicitly to each user." msgstr "Доступ к проекту должен предоставляться явно каждому пользователю." msgid "Project details" -msgstr "" +msgstr "Детали проекта" msgid "Project export could not be deleted." msgstr "Невозможно удалить экспорт проекта." @@ -964,14 +1114,8 @@ msgstr "Истек срок действия ссылки на проект. С msgid "Project export started. A download link will be sent by email." msgstr "Начат экспорт проекта. Ссылка для скачивания будет отправлена по электронной почте." -msgid "Project home" -msgstr "Домашняя страница" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" -msgstr "" +msgstr "Подписаться" msgid "ProjectFeature|Disabled" msgstr "Отключено" @@ -994,35 +1138,38 @@ msgstr "Этап" msgid "ProjectNetworkGraph|Graph" msgstr "Граф" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" -msgstr "" - -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" +msgstr "Загрузка проектов" msgid "ProjectsDropdown|Projects you visit often will appear here" -msgstr "" +msgstr "Проекты, которые вы часто посещаете, будут отображаться здесь" msgid "ProjectsDropdown|Search your projects" -msgstr "" +msgstr "Поиск по вашим проектам" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." msgstr "" +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "К сожалению, по вашему запросу проекты не найдены" + msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "Эта функциональность требует поддержки localStorage в вашем браузере" + +msgid "Push Rules" msgstr "" msgid "Push events" -msgstr "" +msgstr "События отправки" msgid "Read more" msgstr "Подробнее" msgid "Readme" -msgstr "" +msgstr "Инструкция" msgid "RefSwitcher|Branches" msgstr "Ветки" @@ -1030,6 +1177,9 @@ msgstr "Ветки" msgid "RefSwitcher|Tags" msgstr "Теги" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Связанные коммиты" @@ -1055,19 +1205,19 @@ msgid "Remove project" msgstr "Удалить проект" msgid "Repository" -msgstr "" +msgstr "Репозиторий" msgid "Request Access" msgstr "Запрос доступа" msgid "Reset git storage health information" -msgstr "" +msgstr "Сбросить информацию о работоспособности репозитория git" msgid "Reset health check access token" -msgstr "" +msgstr "Сбросить ключ доступа проверки работоспособности" msgid "Reset runners registration token" -msgstr "" +msgstr "Сбросить ключ регистрации Gitlab Runners" msgid "Revert this commit" msgstr "Отменить это изменение" @@ -1076,7 +1226,7 @@ msgid "Revert this merge request" msgstr "Отменить этот запрос на слияние" msgid "SSH Keys" -msgstr "" +msgstr "SSH Ключи" msgid "Save pipeline schedule" msgstr "Сохранить расписание конвейра" @@ -1084,6 +1234,9 @@ msgstr "Сохранить расписание конвейра" msgid "Schedule a new pipeline" msgstr "Расписание нового конвейера" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Планирование конвейеров" @@ -1097,13 +1250,13 @@ msgid "Select a timezone" msgstr "Выбор временной зоны" msgid "Select existing branch" -msgstr "" +msgstr "Выбрать существующую ветвь" msgid "Select target branch" msgstr "Выбор целевой ветки" msgid "Service Templates" -msgstr "" +msgstr "Шаблоны Служб" msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Установите пароль в своем аккаунте, чтобы отправлять или получать код через %{protocol}." @@ -1121,6 +1274,12 @@ msgid "SetPasswordToCloneLink|set a password" msgstr "установить пароль" msgid "Settings" +msgstr "Настройки" + +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" msgstr "" msgid "Showing %d event" @@ -1130,29 +1289,131 @@ msgstr[1] "Показано %d событий" msgstr[2] "Показано %d событий" msgid "Snippets" +msgstr "Сниппеты" + +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" msgstr "" msgid "Source code" msgstr "Исходный код" msgid "Spam Logs" -msgstr "" +msgstr "Спам Логи" msgid "Specify the following URL during the Runner setup:" -msgstr "" +msgstr "Укажите следующий URL во время настройки Gitlab Runner:" msgid "StarProject|Star" msgstr "Отметить" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Начать %{new_merge_request} с этих изменений" msgid "Start the Runner!" -msgstr "" +msgstr "Запустить GitLab Runner!" msgid "Switch branch/tag" msgstr "Переключить ветка/тег" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "Тег" @@ -1166,7 +1427,7 @@ msgid "Target Branch" msgstr "Ветка" msgid "Team" -msgstr "" +msgstr "Команда" msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "На этапе написания кода показывает время первого коммита до создания запроса на слияние. Данные автоматически добавятся после того, как вы создать свой первый запрос на слияние." @@ -1217,6 +1478,9 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet msgstr "Среднее значение в ряду. Пример: между 3, 5, 9, среднее 5, между 3, 5, 7, 8, среднее (5+7)/2 = 6." msgid "There are problems accessing Git storage: " +msgstr "Проблемы с доступом к Git хранилищу: " + +msgid "This is the author's first Merge Request to this project. Handle with care." msgstr "" msgid "This means you can not push code until you create an empty repository or import existing one." @@ -1391,14 +1655,20 @@ msgid "UploadLink|click to upload" msgstr "кликните для загрузки" msgid "Use the following registration token during setup:" -msgstr "" +msgstr "Используйте следующий токен регистрации в процессе установки:" msgid "Use your global notification setting" msgstr "Используются глобальный настройки уведомлений" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Просмотреть открытый запрос на слияние" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Ограниченный" @@ -1418,7 +1688,7 @@ msgid "We don't have enough data to show this stage." msgstr "Информация по этапу отсутствует." msgid "Wiki" -msgstr "" +msgstr "Wiki" msgid "Withdraw Access Request" msgstr "Отменить запрос доступа" @@ -1471,6 +1741,12 @@ msgstr "Вы не сможете получать и отправлять код msgid "Your name" msgstr "Ваше имя" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "день" diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po index 1dc42901daf..ffbbe88cc51 100644 --- a/locale/uk/gitlab.po +++ b/locale/uk/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:20-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:43-0400\n" "Last-Translator: gitlab \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -31,23 +31,26 @@ msgstr[2] "%s доданих коммітів були виключені для msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} комміт %{commit_timeago}" -msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgstr "%{number_of_failures} від %{maximum_failures} невдач. GitLab надасть доступ на наступну спробу." + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds." -msgstr "" +msgstr "%{number_of_failures} із %{maximum_failures} невдач. GitLab заблокує доступ на %{number_of_seconds} секунд." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." -msgstr "" +msgstr "%{number_of_failures} від %{maximum_failures} невдач. GitLab автоматично не повторюватиме спробу. Скиньте інформацію сховища при усуненні проблеми." msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%{storage_name}: спроба невдалого доступу до сховища на хості:" +msgstr[1] "%{storage_name}: %{failed_attempts} невдалі спроби доступу до сховища:" +msgstr[2] "%{storage_name}: %{failed_attempts} невдалих спроб доступу до сховища:" msgid "(checkout the %{link} for information on how to install it)." -msgstr "" +msgstr "(перейдіть за посиланням %{link} для отримання інформації стосовно встановлення)." msgid "1 pipeline" msgid_plural "%d pipelines" @@ -55,6 +58,9 @@ msgstr[0] "1 конвеєр" msgstr[1] "%d конвеєра" msgstr[2] "%d конвеєрів" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "Це набір графічних елементів для безперервної інтеграції" @@ -62,16 +68,16 @@ msgid "About auto deploy" msgstr "Про авто розгортання" msgid "Abuse Reports" -msgstr "" +msgstr "Звіти про зловживання" msgid "Access Tokens" -msgstr "" +msgstr "Токени доступу" msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." -msgstr "" +msgstr "Доступ до помилкових сховищ тимчасово відключений для можливості монтування та відновлення. Скиньте інформацію про сховища після усунення проблеми, щоб дозволити доступ." msgid "Account" -msgstr "" +msgstr "Обліковий запис" msgid "Active" msgstr "Активний" @@ -97,11 +103,11 @@ msgstr "Додати новий каталог" msgid "All" msgstr "Всі" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" -msgstr "" +msgstr "Додатки" msgid "Archived project! Repository is read-only" msgstr "Заархівований проект! Репозиторій доступний лише для читання" @@ -116,15 +122,39 @@ msgid "Are you sure you want to reset registration token?" msgstr "Ви впевнені, що бажаєте скинути реєстраційний токен?" msgid "Are you sure you want to reset the health check token?" -msgstr "" +msgstr "Ви впевнені, що Ви хочете скинути цей ключ перевірки працездатності?" msgid "Are you sure?" +msgstr "Ви впевнені?" + +msgid "Artifacts" msgstr "" msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Прикріпити файл за допомогою перетягування або %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -181,6 +211,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "Гілка" @@ -199,6 +232,90 @@ msgstr "Переключити гілку" msgid "Branches" msgstr "Гілки" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "Переглянути каталог" @@ -215,7 +332,7 @@ msgid "ByAuthor|by" msgstr "від" msgid "CI / CD" -msgstr "" +msgstr "CI / CD" msgid "CI configuration" msgstr "Налаштування CI" @@ -224,7 +341,7 @@ msgid "Cancel" msgstr "Скасувати" msgid "Cancel edit" -msgstr "" +msgstr "Відмінити правку" msgid "ChangeTypeActionLabel|Pick into branch" msgstr "Вибрати в гілці" @@ -245,7 +362,7 @@ msgid "Charts" msgstr "Графіки" msgid "Chat" -msgstr "" +msgstr "Чат" msgid "Cherry-pick this commit" msgstr "Cherry-pick в цьому комміті" @@ -308,7 +425,7 @@ msgid "CiStatus|running" msgstr "виконується" msgid "Comments" -msgstr "" +msgstr "Коментарі" msgid "Commit" msgid_plural "Commits" @@ -343,9 +460,6 @@ msgstr "Комміт від" msgid "Compare" msgstr "Порівняти" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "Керівництво контриб’юторів" @@ -365,7 +479,7 @@ msgid "Create New Directory" msgstr "Створити новий каталог" msgid "Create a new branch" -msgstr "" +msgstr "Створити нову гілку" msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Створити токен доступу для вашого аккауета, щоб відправляти або отримувати через %{protocol}." @@ -443,19 +557,19 @@ msgstr[1] "Розгортання" msgstr[2] "Розгортань" msgid "Deploy Keys" -msgstr "" +msgstr "Ключи для розгортування" msgid "Description" msgstr "Опис" msgid "Details" -msgstr "" +msgstr "Деталі" msgid "Directory name" msgstr "Ім'я каталогу" msgid "Discard changes" -msgstr "" +msgstr "Скасувати зміни" msgid "Don't show again" msgstr "Не показувати знову" @@ -494,25 +608,28 @@ msgid "Edit Pipeline Schedule %{id}" msgstr "Редагувати Розклад Конвеєра %{id}" msgid "Emails" +msgstr "Адреси електронної пошти" + +msgid "Enable in settings" msgstr "" msgid "EventFilterBy|Filter by all" -msgstr "" +msgstr "Всі" msgid "EventFilterBy|Filter by comments" -msgstr "" +msgstr "Коментарю" msgid "EventFilterBy|Filter by issue events" -msgstr "" +msgstr "Проблеми" msgid "EventFilterBy|Filter by merge events" -msgstr "" +msgstr "Запити на злиття" msgid "EventFilterBy|Filter by push events" -msgstr "" +msgstr "По відправленні комміту" msgid "EventFilterBy|Filter by team" -msgstr "" +msgstr "За командою" msgid "Every day (at 4:00am)" msgstr "Кожен день (в 4:00 ранку)" @@ -523,6 +640,9 @@ msgstr "Кожен місяць (1-го числа о 4:00 ранку)" msgid "Every week (Sundays at 4:00am)" msgstr "Щотижня (в неділю о 4:00 ранку)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "Не вдалося змінити власника" @@ -563,16 +683,16 @@ msgid "From merge request merge until deploy to production" msgstr "З об'єднання запиту злиття до розгортання на ПРОД" msgid "GPG Keys" -msgstr "" +msgstr "GPG ключі" msgid "Geo Nodes" msgstr "" msgid "Git storage health information has been reset" -msgstr "" +msgstr "Інформація про статус зберігання Git була скинута" msgid "GitLab Runner section" -msgstr "" +msgstr "Розділ GitLab Runner" msgid "Go to your fork" msgstr "Перейти до вашого форку" @@ -580,33 +700,48 @@ msgstr "Перейти до вашого форку" msgid "GoToYourFork|Fork" msgstr "Форк" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" -msgid "Health Check" +msgid "GroupSettings|Share with group lock" msgstr "" -msgid "Health information can be retrieved from the following endpoints. More information is available" +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." msgstr "" -msgid "HealthCheck|Access token is" +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." msgstr "" -msgid "HealthCheck|Healthy" +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." msgstr "" -msgid "HealthCheck|No Health Problems Detected" +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." msgstr "" -msgid "HealthCheck|Unhealthy" +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" msgstr "" -msgid "Home" -msgstr "Головна" - -msgid "Hooks" +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "Health Check" +msgstr "Перевірки працездатності" + +msgid "Health information can be retrieved from the following endpoints. More information is available" +msgstr "Інформацію про працездатність можна отримати з наступних ендпойнтів. Більше інформації доступно" + +msgid "HealthCheck|Access token is" +msgstr "Токен доступу є" + +msgid "HealthCheck|Healthy" +msgstr "Здоровий" + +msgid "HealthCheck|No Health Problems Detected" +msgstr "Жодних проблем із здоров'ям не виявлено" + +msgid "HealthCheck|Unhealthy" +msgstr "Нездорові" + msgid "Housekeeping successfully started" msgstr "Очищення успішно розпочато" @@ -614,7 +749,7 @@ msgid "Import repository" msgstr "Імпорт репозеторія" msgid "Install a Runner compatible with GitLab CI" -msgstr "" +msgstr "Встановіть Runner, сумісний з GitLab CI" msgid "Interval Pattern" msgstr "Шаблон інтервалу" @@ -623,9 +758,12 @@ msgid "Introducing Cycle Analytics" msgstr "Представляємо аналітику циклу" msgid "Issue events" -msgstr "" +msgstr "Події проблем" msgid "Issues" +msgstr "Проблеми" + +msgid "Jobs" msgstr "" msgid "LFSStatus|Disabled" @@ -635,7 +773,7 @@ msgid "LFSStatus|Enabled" msgstr "Увімкнено" msgid "Labels" -msgstr "" +msgstr "Мітки" msgid "Last %d day" msgid_plural "Last %d days" @@ -653,10 +791,10 @@ msgid "Last commit" msgstr "Останній комміт" msgid "LastPushEvent|You pushed to" -msgstr "" +msgstr "Ви надіслали зміни до" msgid "LastPushEvent|at" -msgstr "" +msgstr "в" msgid "Learn more in the" msgstr "Дізнайтесь більше" @@ -686,25 +824,28 @@ msgid "Median" msgstr "Медіана" msgid "Members" -msgstr "" +msgstr "Користувачі" msgid "Merge Requests" -msgstr "" +msgstr "Запит на злиття" msgid "Merge events" +msgstr "Події запит на злиття" + +msgid "Merge request" msgstr "" msgid "Messages" -msgstr "" +msgstr "Повідомлення" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "не додасте SSH ключ" msgid "Monitoring" -msgstr "" +msgstr "Моніторинг" msgid "More information is available|here" -msgstr "" +msgstr "тут" msgid "New Issue" msgid_plural "New Issues" @@ -806,7 +947,7 @@ msgid "NotificationLevel|Watch" msgstr "Відстежувати" msgid "Notifications" -msgstr "" +msgstr "Сповіщення" msgid "OfSearchInADropdown|Filter" msgstr "Фільтр" @@ -818,14 +959,26 @@ msgid "Options" msgstr "Параметри" msgid "Overview" -msgstr "" +msgstr "Огляд" msgid "Owner" msgstr "Власник" -msgid "Password" +msgid "Pagination|Last »" msgstr "" +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + +msgid "Password" +msgstr "Пароль" + msgid "Pipeline" msgstr "Конвеєр" @@ -905,13 +1058,13 @@ msgid "Pipelines charts" msgstr "Чарти Конвеєрів" msgid "Pipelines for last month" -msgstr "" +msgstr "Конвеєри за останній місяць" msgid "Pipelines for last week" -msgstr "" +msgstr "Конвеєри за останній тиждень" msgid "Pipelines for last year" -msgstr "" +msgstr "Конвеєри за останній рік" msgid "Pipeline|all" msgstr "всі" @@ -926,12 +1079,9 @@ msgid "Pipeline|with stages" msgstr "зі стадіями" msgid "Preferences" -msgstr "" - -msgid "Profile Settings" -msgstr "" +msgstr "Налаштування" -msgid "Project" +msgid "Profile" msgstr "" msgid "Project '%{project_name}' queued for deletion." @@ -950,7 +1100,7 @@ msgid "Project access must be granted explicitly to each user." msgstr "Доступ до проекту повинен надаватися кожному користувачеві." msgid "Project details" -msgstr "" +msgstr "Деталі проекту" msgid "Project export could not be deleted." msgstr "Неможливо видалити експорт проекту." @@ -964,14 +1114,8 @@ msgstr "Закінчився термін дії посилання на про msgid "Project export started. A download link will be sent by email." msgstr "Розпочато експорт проекту. Посилання для скачування буде надіслана електронною поштою." -msgid "Project home" -msgstr "Домашня сторінка проекту" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" -msgstr "" +msgstr "Підписатися" msgid "ProjectFeature|Disabled" msgstr "Вимкнено" @@ -994,29 +1138,32 @@ msgstr "Етап" msgid "ProjectNetworkGraph|Graph" msgstr "Історія" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" -msgstr "" - -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" +msgstr "Завантаження проектів" msgid "ProjectsDropdown|Projects you visit often will appear here" -msgstr "" +msgstr "Проекти, які ви часто відвідуєте, будуть відображені тут" msgid "ProjectsDropdown|Search your projects" -msgstr "" +msgstr "Пошук по ваших проектах" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." msgstr "" +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "На жаль, по вашоу запиту проектів не знайдено" + msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "Ця функція потребує підтримки localStorage вашим браузером" + +msgid "Push Rules" msgstr "" msgid "Push events" -msgstr "" +msgstr "Push події" msgid "Read more" msgstr "Докладніше" @@ -1030,6 +1177,9 @@ msgstr "Гілки" msgid "RefSwitcher|Tags" msgstr "Теги" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "Пов'язані Комміти" @@ -1055,19 +1205,19 @@ msgid "Remove project" msgstr "Видалити проект" msgid "Repository" -msgstr "" +msgstr "Репозиторій" msgid "Request Access" msgstr "Запит доступу" msgid "Reset git storage health information" -msgstr "" +msgstr "Скиньте інформацію про працездатність сховища git" msgid "Reset health check access token" -msgstr "" +msgstr "Скиньте токен доступу для перевірки перевірки працездатності" msgid "Reset runners registration token" -msgstr "" +msgstr "Скинути реєстраційний токен runner-ів" msgid "Revert this commit" msgstr "Скасувати цей комміт" @@ -1076,7 +1226,7 @@ msgid "Revert this merge request" msgstr "Скасувати цей запит на злиття" msgid "SSH Keys" -msgstr "" +msgstr "Ключі SSH" msgid "Save pipeline schedule" msgstr "Зберегти Розклад Конвеєра" @@ -1084,6 +1234,9 @@ msgstr "Зберегти Розклад Конвеєра" msgid "Schedule a new pipeline" msgstr "Розклад нового конвеєра" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "Планування конвеєрів" @@ -1097,13 +1250,13 @@ msgid "Select a timezone" msgstr "Вибрати часовий пояс" msgid "Select existing branch" -msgstr "" +msgstr "Виберіть гілку" msgid "Select target branch" msgstr "Вибір цільової гілки" msgid "Service Templates" -msgstr "" +msgstr "Сервіс шаблонів" msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Встановіть пароль свого облікового запису, щоб відправляти або отримувати код через %{protocol}." @@ -1121,6 +1274,12 @@ msgid "SetPasswordToCloneLink|set a password" msgstr "встановити пароль" msgid "Settings" +msgstr "Налаштування" + +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" msgstr "" msgid "Showing %d event" @@ -1130,29 +1289,131 @@ msgstr[1] "Показано %d події" msgstr[2] "Показано %d подій" msgid "Snippets" +msgstr "Фрагменти" + +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" msgstr "" msgid "Source code" msgstr "Код" msgid "Spam Logs" -msgstr "" +msgstr "Спам-журнал" msgid "Specify the following URL during the Runner setup:" -msgstr "" +msgstr "Зазначте наступний URL під час встановлення Runner-а:" msgid "StarProject|Star" msgstr "Підписатися" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "Почати %{new_merge_request} з цих змін" msgid "Start the Runner!" -msgstr "" +msgstr "Запустіть Runner!" msgid "Switch branch/tag" msgstr "тег" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "Тег" @@ -1166,7 +1427,7 @@ msgid "Target Branch" msgstr "Цільова гілка" msgid "Team" -msgstr "" +msgstr "Команда" msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "На стадії написання коду, показує час першого комміту до створення запиту на об'єднання. Дані будуть автоматично додані після створення вашого першого запиту на об'єднання." @@ -1217,6 +1478,9 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet msgstr "Середнє значення в рядку. Приклад: між 3, 5, 9, середніми 5, між 3, 5, 7, 8, середніми (5 + 7) / 2 = 6." msgid "There are problems accessing Git storage: " +msgstr "Є проблеми з доступом до сховища: " + +msgid "This is the author's first Merge Request to this project. Handle with care." msgstr "" msgid "This means you can not push code until you create an empty repository or import existing one." @@ -1391,14 +1655,20 @@ msgid "UploadLink|click to upload" msgstr "Натисніть, щоб завантажити" msgid "Use the following registration token during setup:" -msgstr "" +msgstr "Використовувати токен під час установки:" msgid "Use your global notification setting" msgstr "Використовуються глобальні налаштування повідомлень" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "Перегляд відкритих запитів на злиття" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "Внутрішній" @@ -1418,7 +1688,7 @@ msgid "We don't have enough data to show this stage." msgstr "Ми не маємо достатньо даних для показу цього етапу." msgid "Wiki" -msgstr "" +msgstr "Wiki" msgid "Withdraw Access Request" msgstr "Скасувати запит доступу" @@ -1471,6 +1741,12 @@ msgstr "Ви не зможете отримувати і відправляти msgid "Your name" msgstr "Ваше ім'я" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "день" diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po index d6f756e813f..4a05b159008 100644 --- a/locale/zh_CN/gitlab.po +++ b/locale/zh_CN/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:21-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:44-0400\n" "Last-Translator: gitlab \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -27,6 +27,9 @@ msgstr[0] "为提高页面加载速度及性能,已省略了 %s 次提交。" msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "由 %{commit_author_link} 提交于 %{commit_timeago}" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "已失败 %{number_of_failures} 次/最多允许失败失败 %{maximum_failures} 次,GitLab 将继续重试。" @@ -47,6 +50,9 @@ msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d 条流水线" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "持续集成数据图" @@ -89,8 +95,8 @@ msgstr "添加目录" msgid "All" msgstr "全部" -msgid "Appearances" -msgstr "外观样式" +msgid "Appearance" +msgstr "" msgid "Applications" msgstr "应用程序" @@ -113,65 +119,92 @@ msgstr "确定要重置健康检查令牌吗?" msgid "Are you sure?" msgstr "确定吗?" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "拖放文件到此处或者 %{upload_link}" -msgid "Authentication log" -msgstr "认证日志" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" +msgstr "" msgid "Billing" -msgstr "账单" +msgstr "" msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." -msgstr "%{group_name} 目前正在使用 %{plan_link} 方案。" +msgstr "" msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." -msgstr "当某些方案当前不可用时自动降级和升级。" +msgstr "" msgid "BillingPlans|Current plan" -msgstr "当前方案" +msgstr "" msgid "BillingPlans|Customer Support" -msgstr "客户支持" +msgstr "" msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." -msgstr "通过阅读%{faq_link} 了解关于每个方案的更多信息。" +msgstr "" msgid "BillingPlans|Manage plan" -msgstr "管理方案" +msgstr "" msgid "BillingPlans|Please contact %{customer_support_link} in that case." -msgstr "在这种情况下,请联系 %{customer_support_link}。" +msgstr "" msgid "BillingPlans|See all %{plan_name} features" -msgstr "查看 %{plan_name} 的所有功能" +msgstr "" msgid "BillingPlans|This group uses the plan associated with its parent group." -msgstr "该群组使用与它的父团队相关联的计划。" +msgstr "" msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." -msgstr "请访问 %{parent_billing_page_link} 的计费方案部分来管理该团队的计费方案,。" +msgstr "" msgid "BillingPlans|Upgrade" -msgstr "升级" +msgstr "" msgid "BillingPlans|You are currently on the %{plan_link} plan." -msgstr "你目前正在使用 %{plan_link} 方案。" +msgstr "" msgid "BillingPlans|frequently asked questions" -msgstr "常见问题" +msgstr "" msgid "BillingPlans|monthly" -msgstr "每月" +msgstr "" msgid "BillingPlans|paid annually at %{price_per_year}" -msgstr "每年支付 %{price_per_year}" +msgstr "" msgid "BillingPlans|per user" -msgstr "每个用户" +msgstr "" msgid "Billinglans|Downgrade" -msgstr "降级" +msgstr "" + +msgid "Board" +msgstr "" msgid "Branch" msgid_plural "Branches" @@ -189,6 +222,90 @@ msgstr "切换分支" msgid "Branches" msgstr "分支" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "浏览目录" @@ -331,9 +448,6 @@ msgstr "提交者:" msgid "Compare" msgstr "比较" -msgid "Container Registry" -msgstr "容器注册表" - msgid "Contribution guide" msgstr "贡献指南" @@ -341,7 +455,7 @@ msgid "Contributors" msgstr "贡献者" msgid "Copy SSH public key to clipboard" -msgstr "将 SSH 公钥复制到剪贴板" +msgstr "" msgid "Copy URL to clipboard" msgstr "复制 URL 到剪贴板" @@ -482,6 +596,9 @@ msgstr "编辑 %{id} 流水线计划" msgid "Emails" msgstr "电子邮件" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "全部" @@ -509,6 +626,9 @@ msgstr "每月执行(每月 1 日凌晨 4 点)" msgid "Every week (Sundays at 4:00am)" msgstr "每周执行(周日凌晨 4 点)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "无法变更所有者" @@ -550,7 +670,7 @@ msgid "GPG Keys" msgstr "GPG 密钥" msgid "Geo Nodes" -msgstr "Geo 节点" +msgstr "" msgid "Git storage health information has been reset" msgstr "Git 存储健康信息已重置" @@ -564,8 +684,29 @@ msgstr "跳转到派生项目" msgid "GoToYourFork|Fork" msgstr "跳转到派生项目" -msgid "Group overview" -msgstr "群组概览" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" +msgstr "" msgid "Health Check" msgstr "健康检查" @@ -585,12 +726,6 @@ msgstr "没有检测到健康问题" msgid "HealthCheck|Unhealthy" msgstr "非健康" -msgid "Home" -msgstr "首页" - -msgid "Hooks" -msgstr "钩子" - msgid "Housekeeping successfully started" msgstr "已开始维护" @@ -612,6 +747,9 @@ msgstr "议题事件" msgid "Issues" msgstr "议题" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "停用" @@ -653,14 +791,14 @@ msgid "Leave project" msgstr "退出项目" msgid "License" -msgstr "许可" +msgstr "" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" msgstr[0] "最多显示 %d 个事件" msgid "Locked Files" -msgstr "锁定的文件" +msgstr "" msgid "Median" msgstr "中位数" @@ -674,6 +812,9 @@ msgstr "合并请求" msgid "Merge events" msgstr "合并事件" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "消息" @@ -801,6 +942,18 @@ msgstr "概览" msgid "Owner" msgstr "所有者" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "密码" @@ -817,7 +970,7 @@ msgid "Pipeline Schedules" msgstr "流水线计划" msgid "Pipeline quota" -msgstr "流水线配额" +msgstr "" msgid "PipelineCharts|Failed:" msgstr "失败:" @@ -906,11 +1059,8 @@ msgstr "于阶段" msgid "Preferences" msgstr "偏好设置" -msgid "Profile Settings" -msgstr "账户设置" - -msgid "Project" -msgstr "项目" +msgid "Profile" +msgstr "" msgid "Project '%{project_name}' queued for deletion." msgstr "项目 '%{project_name}' 已进入删除队列。" @@ -942,12 +1092,6 @@ msgstr "项目导出链接已过期。请从项目设置中重新生成项目导 msgid "Project export started. A download link will be sent by email." msgstr "项目导出已开始。下载链接将通过电子邮件发送。" -msgid "Project home" -msgstr "项目首页" - -msgid "Project overview" -msgstr "项目概览" - msgid "ProjectActivityRSS|Subscribe" msgstr "订阅" @@ -972,25 +1116,28 @@ msgstr "阶段" msgid "ProjectNetworkGraph|Graph" msgstr "分支图" -msgid "Push Rules" -msgstr "推送规则" - -msgid "ProjectsDropdown|Loading projects" +msgid "ProjectsDropdown|Frequently visited" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" +msgid "ProjectsDropdown|Loading projects" +msgstr "加载项目中" msgid "ProjectsDropdown|Projects you visit often will appear here" -msgstr "" +msgstr "您经常访问的项目将出现在这里" msgid "ProjectsDropdown|Search your projects" -msgstr "" +msgstr "搜索您的项目" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." msgstr "" +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "对不起,没有搜索到符合条件的项目" + msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "此功能需要浏览器支持 localStorage" + +msgid "Push Rules" msgstr "" msgid "Push events" @@ -1008,6 +1155,9 @@ msgstr "分支" msgid "RefSwitcher|Tags" msgstr "标签" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "相关的提交" @@ -1062,6 +1212,9 @@ msgstr "保存流水线计划" msgid "Schedule a new pipeline" msgstr "新建流水线计划" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "流水线计划" @@ -1101,6 +1254,12 @@ msgstr "设置密码" msgid "Settings" msgstr "设置" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "显示 %d 个事件" @@ -1108,6 +1267,102 @@ msgstr[0] "显示 %d 个事件" msgid "Snippets" msgstr "代码片段" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "源代码" @@ -1120,6 +1375,9 @@ msgstr "在 Runner 设置时指定以下 URL:" msgid "StarProject|Star" msgstr "星标" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "由此更改 %{new_merge_request}" @@ -1129,6 +1387,9 @@ msgstr "启动 Runner!" msgid "Switch branch/tag" msgstr "切换分支/标签" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "标签" @@ -1193,6 +1454,9 @@ msgstr "中位数是一个数列中最中间的值。例如在 3、5、9 之间 msgid "There are problems accessing Git storage: " msgstr "访问 Git 存储时出现问题:" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "在创建一个空的存储库或导入现有存储库之前,将无法推送代码。" @@ -1366,9 +1630,15 @@ msgstr "在安装过程中使用以下注册令牌:" msgid "Use your global notification setting" msgstr "使用全局通知设置" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "查看待处理的合并请求" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "内部" @@ -1441,6 +1711,12 @@ msgstr "在账号中 %{add_ssh_key_link} 之前将无法通过 SSH 拉取或推 msgid "Your name" msgstr "您的名字" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "天" diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 48b86508d1e..c3b6cc72aed 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:21-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:44-0400\n" "Last-Translator: gitlab \n" "Language-Team: Chinese Traditional, Hong Kong\n" "Language: zh_HK\n" @@ -27,6 +27,9 @@ msgstr[0] "為提高頁面加載速度及性能,已省略了 %s 次提交。" msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "由 %{commit_author_link} 提交於 %{commit_timeago}" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "已失敗 %{number_of_failures} 次,最大失敗 %{maximum_failures} 次,GitLab 將重試。" @@ -47,6 +50,9 @@ msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d 條流水線" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "相關持續集成的圖像集合" @@ -89,7 +95,7 @@ msgstr "添加新目錄" msgid "All" msgstr "全部" -msgid "Appearances" +msgid "Appearance" msgstr "" msgid "Applications" @@ -113,10 +119,34 @@ msgstr "確定要重置健康檢查令牌嗎?" msgid "Are you sure?" msgstr "確定嗎?" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "拖放文件到此處或者 %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -173,6 +203,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "分支" @@ -189,6 +222,90 @@ msgstr "切換分支" msgid "Branches" msgstr "分支" +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "瀏覽目錄" @@ -331,9 +448,6 @@ msgstr "提交者:" msgid "Compare" msgstr "比較" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "貢獻指南" @@ -482,6 +596,9 @@ msgstr "編輯 %{id} 流水線計劃" msgid "Emails" msgstr "" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "全部" @@ -509,6 +626,9 @@ msgstr "每月執行(每月 1 日淩晨 4 點)" msgid "Every week (Sundays at 4:00am)" msgstr "每週執行(周日淩晨 4 點)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "無法變更所有者" @@ -564,7 +684,28 @@ msgstr "跳轉到派生項目" msgid "GoToYourFork|Fork" msgstr "跳轉到派生項目" -msgid "Group overview" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" msgid "Health Check" @@ -585,12 +726,6 @@ msgstr "沒有檢測到健康問題" msgid "HealthCheck|Unhealthy" msgstr "不良" -msgid "Home" -msgstr "首頁" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "已開始維護" @@ -612,6 +747,9 @@ msgstr "議題事件 (issue event)" msgid "Issues" msgstr "" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "停用" @@ -674,6 +812,9 @@ msgstr "" msgid "Merge events" msgstr "合併事件 (merge event)" +msgid "Merge request" +msgstr "" + msgid "Messages" msgstr "" @@ -801,6 +942,18 @@ msgstr "" msgid "Owner" msgstr "所有者" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "" @@ -906,12 +1059,9 @@ msgstr "於階段" msgid "Preferences" msgstr "" -msgid "Profile Settings" +msgid "Profile" msgstr "" -msgid "Project" -msgstr "專案" - msgid "Project '%{project_name}' queued for deletion." msgstr "項目 '%{project_name}' 已進入刪除隊列。" @@ -942,12 +1092,6 @@ msgstr "項目導出鏈接已過期。請從項目設置中重新生成項目導 msgid "Project export started. A download link will be sent by email." msgstr "項目導出已開始。下載鏈接將通過電子郵件發送。" -msgid "Project home" -msgstr "項目首頁" - -msgid "Project overview" -msgstr "" - msgid "ProjectActivityRSS|Subscribe" msgstr "訂閱" @@ -972,27 +1116,30 @@ msgstr "階段" msgid "ProjectNetworkGraph|Graph" msgstr "分支圖" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" msgstr "" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Push Rules" +msgstr "" + msgid "Push events" msgstr "推送事件 (push event) " @@ -1008,6 +1155,9 @@ msgstr "分支" msgid "RefSwitcher|Tags" msgstr "標籤" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "相關的提交" @@ -1062,6 +1212,9 @@ msgstr "保存流水線計劃" msgid "Schedule a new pipeline" msgstr "新建流水線計劃" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "流水線計劃" @@ -1101,6 +1254,12 @@ msgstr "設置密碼" msgid "Settings" msgstr "" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" @@ -1108,6 +1267,102 @@ msgstr[0] "顯示 %d 個事件" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "源代碼" @@ -1120,6 +1375,9 @@ msgstr "在 Runner 設置時指定以下 URL:" msgid "StarProject|Star" msgstr "星標" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "由此更改 %{new_merge_request}" @@ -1129,6 +1387,9 @@ msgstr "運作 Runner!" msgid "Switch branch/tag" msgstr "切換分支/標籤" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "標籤" @@ -1193,6 +1454,9 @@ msgstr "中位數是壹個數列中最中間的值。例如在 3、5、9 之間 msgid "There are problems accessing Git storage: " msgstr "訪問 Git 存儲時出現問題:" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。" @@ -1366,9 +1630,15 @@ msgstr "在安裝過程中使用以下註冊令牌:" msgid "Use your global notification setting" msgstr "使用全局通知設置" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "查看開啟的合並請求" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "內部" @@ -1441,6 +1711,12 @@ msgstr "在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推 msgid "Your name" msgstr "您的名字" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "天" diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po index da6a98bdb5c..8a14cd01566 100644 --- a/locale/zh_TW/gitlab.po +++ b/locale/zh_TW/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-06 08:32+0200\n" -"PO-Revision-Date: 2017-09-15 05:21-0400\n" +"POT-Creation-Date: 2017-09-27 16:26+0200\n" +"PO-Revision-Date: 2017-09-27 13:44-0400\n" "Last-Translator: gitlab \n" "Language-Team: Chinese Traditional\n" "Language: zh_TW\n" @@ -27,6 +27,9 @@ msgstr[0] "因效能考量,不顯示 %s 個更動 (commit)。" msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} 在 %{commit_timeago} 送交" +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "已失敗 %{number_of_failures} 次,在失敗 %{maximum_failures} 次前 GitLab 會重試。" @@ -47,6 +50,9 @@ msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d 條流水線" +msgid "1st contribution!" +msgstr "" + msgid "A collection of graphs regarding Continuous Integration" msgstr "持續整合 (CI) 相關的圖表" @@ -63,7 +69,7 @@ msgid "Access to failing storages has been temporarily disabled to allow the mou msgstr "已暫時停用失敗的 Git 儲存空間。當儲存空間恢復正常後,請重置儲存空間健康指數。" msgid "Account" -msgstr "" +msgstr "帳號" msgid "Active" msgstr "啟用" @@ -89,8 +95,8 @@ msgstr "新增目錄" msgid "All" msgstr "全部" -msgid "Appearances" -msgstr "外觀" +msgid "Appearance" +msgstr "" msgid "Applications" msgstr "應用程式" @@ -113,10 +119,34 @@ msgstr "確定要重置健康檢查存取憑證 (access token) 嗎?" msgid "Are you sure?" msgstr "確定嗎?" +msgid "Artifacts" +msgstr "" + msgid "Attach a file by drag & drop or %{upload_link}" msgstr "拖放檔案到此處或者 %{upload_link}" -msgid "Authentication log" +msgid "Authentication Log" +msgstr "" + +msgid "Auto DevOps (Beta)" +msgstr "" + +msgid "Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "Auto DevOps documentation" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." +msgstr "" + +msgid "AutoDevOps|Learn more in the" msgstr "" msgid "Billing" @@ -173,6 +203,9 @@ msgstr "" msgid "Billinglans|Downgrade" msgstr "" +msgid "Board" +msgstr "" + msgid "Branch" msgid_plural "Branches" msgstr[0] "分支 (branch) " @@ -189,6 +222,90 @@ msgstr "切換分支 (branch)" msgid "Branches" msgstr "分支 (branch) " +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + msgid "Browse Directory" msgstr "瀏覽目錄" @@ -331,9 +448,6 @@ msgstr "送交者為 " msgid "Compare" msgstr "比較" -msgid "Container Registry" -msgstr "" - msgid "Contribution guide" msgstr "協作指南" @@ -429,7 +543,7 @@ msgid_plural "Deploys" msgstr[0] "部署" msgid "Deploy Keys" -msgstr "" +msgstr "部署金鑰" msgid "Description" msgstr "描述" @@ -482,6 +596,9 @@ msgstr "編輯 %{id} 流水線 (pipeline) 排程" msgid "Emails" msgstr "電子郵件" +msgid "Enable in settings" +msgstr "" + msgid "EventFilterBy|Filter by all" msgstr "顯示全部" @@ -509,6 +626,9 @@ msgstr "每月執行(每月一日淩晨四點)" msgid "Every week (Sundays at 4:00am)" msgstr "每週執行(週日淩晨 四點)" +msgid "Explore projects" +msgstr "" + msgid "Failed to change the owner" msgstr "無法變更所有權" @@ -547,7 +667,7 @@ msgid "From merge request merge until deploy to production" msgstr "從請求被合併後 (merge request merged) 直到部署至營運環境" msgid "GPG Keys" -msgstr "" +msgstr "GPG 金鑰" msgid "Geo Nodes" msgstr "" @@ -564,8 +684,29 @@ msgstr "前往您的分支 (fork) " msgid "GoToYourFork|Fork" msgstr "前往您的分支 (fork) " -msgid "Group overview" -msgstr "群組總覽" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" +msgstr "" msgid "Health Check" msgstr "健康檢查" @@ -585,12 +726,6 @@ msgstr "沒有檢測到健康問題" msgid "HealthCheck|Unhealthy" msgstr "不良" -msgid "Home" -msgstr "首頁" - -msgid "Hooks" -msgstr "" - msgid "Housekeeping successfully started" msgstr "已開始維護" @@ -612,6 +747,9 @@ msgstr "議題 (issue) 事件" msgid "Issues" msgstr "議題" +msgid "Jobs" +msgstr "" + msgid "LFSStatus|Disabled" msgstr "停用" @@ -669,13 +807,16 @@ msgid "Members" msgstr "成員" msgid "Merge Requests" -msgstr "" +msgstr "合併請求 (merge request)" msgid "Merge events" msgstr "合併 (merge) 事件" +msgid "Merge request" +msgstr "" + msgid "Messages" -msgstr "訊息" +msgstr "公告" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "新增 SSH 金鑰" @@ -801,6 +942,18 @@ msgstr "總覽" msgid "Owner" msgstr "所有權" +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + msgid "Password" msgstr "密碼" @@ -904,14 +1057,11 @@ msgid "Pipeline|with stages" msgstr "於階段" msgid "Preferences" -msgstr "" +msgstr "偏好設定" -msgid "Profile Settings" +msgid "Profile" msgstr "" -msgid "Project" -msgstr "專案" - msgid "Project '%{project_name}' queued for deletion." msgstr "專案 '%{project_name}' 已加入刪除佇列。" @@ -942,12 +1092,6 @@ msgstr "專案的匯出連結已失效。請到專案設定中產生新的連結 msgid "Project export started. A download link will be sent by email." msgstr "專案導出已開始。完成後下載連結會送到您的信箱。" -msgid "Project home" -msgstr "專案首頁" - -msgid "Project overview" -msgstr "專案總覽" - msgid "ProjectActivityRSS|Subscribe" msgstr "訂閱" @@ -972,25 +1116,28 @@ msgstr "階段" msgid "ProjectNetworkGraph|Graph" msgstr "分支圖" -msgid "Push Rules" +msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" msgstr "" -msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" - msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" -msgstr "" +msgstr "搜尋您的專案" -msgid "ProjectsDropdown|Something went wrong on our end" +msgid "ProjectsDropdown|Something went wrong on our end." msgstr "" +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "抱歉,沒有符合搜尋條件的專案" + msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "此功能需要瀏覽器支援 localStorage" + +msgid "Push Rules" msgstr "" msgid "Push events" @@ -1008,6 +1155,9 @@ msgstr "分支 (branch) " msgid "RefSwitcher|Tags" msgstr "標籤" +msgid "Registry" +msgstr "" + msgid "Related Commits" msgstr "相關的更動記錄 (commit) " @@ -1054,7 +1204,7 @@ msgid "Revert this merge request" msgstr "還原此合併請求 (merge request) " msgid "SSH Keys" -msgstr "" +msgstr "SSH 金鑰" msgid "Save pipeline schedule" msgstr "儲存流水線 (pipeline) 排程" @@ -1062,6 +1212,9 @@ msgstr "儲存流水線 (pipeline) 排程" msgid "Schedule a new pipeline" msgstr "建立流水線 (pipeline) 排程" +msgid "Schedules" +msgstr "" + msgid "Scheduling Pipelines" msgstr "流水線 (pipeline) 排程" @@ -1101,6 +1254,12 @@ msgstr "設定密碼" msgid "Settings" msgstr "設定" +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" @@ -1108,6 +1267,102 @@ msgstr[0] "顯示 %d 個事件" msgid "Snippets" msgstr "" +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + msgid "Source code" msgstr "原始碼" @@ -1120,6 +1375,9 @@ msgstr "在安裝 Runner 時指定以下 URL:" msgid "StarProject|Star" msgstr "收藏" +msgid "Starred projects" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "以這些改動建立一個新的 %{new_merge_request} " @@ -1129,6 +1387,9 @@ msgstr "啟動 Runner!" msgid "Switch branch/tag" msgstr "切換分支 (branch) 或標籤" +msgid "System Hooks" +msgstr "" + msgid "Tag" msgid_plural "Tags" msgstr[0] "標籤" @@ -1193,6 +1454,9 @@ msgstr "中位數是一個數列中最中間的值。例如在 3、5、9 之間 msgid "There are problems accessing Git storage: " msgstr "存取 Git 儲存空間時出現問題:" +msgid "This is the author's first Merge Request to this project. Handle with care." +msgstr "" + msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "這代表在您建立一個空的檔案庫 (repository) 或是匯入一個現存的檔案庫之前,您將無法上傳更新 (push) 。" @@ -1366,9 +1630,15 @@ msgstr "在安裝過程中使用此註冊憑證 (registration token):" msgid "Use your global notification setting" msgstr "使用全域通知設定" +msgid "View file @ " +msgstr "" + msgid "View open merge request" msgstr "查看此分支的合併請求 (merge request)" +msgid "View replaced file @ " +msgstr "" + msgid "VisibilityLevel|Internal" msgstr "內部" @@ -1388,7 +1658,7 @@ msgid "We don't have enough data to show this stage." msgstr "因該階段的資料不足而無法顯示相關資訊" msgid "Wiki" -msgstr "" +msgstr "Wiki" msgid "Withdraw Access Request" msgstr "取消權限申請" @@ -1441,6 +1711,12 @@ msgstr "在個人帳號中 %{add_ssh_key_link} 之前, 將無法使用 SSH 上 msgid "Your name" msgstr "您的名字" +msgid "Your projects" +msgstr "" + +msgid "commit" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "天" -- cgit v1.2.1 From feae8b2e44ee66c572efeab2575234de292ac01e Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Sun, 1 Oct 2017 16:14:12 +0100 Subject: use LazyImageTagHelper.placeholder_image for blank src base64 image --- spec/views/shared/issuable/_participants.html.haml.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/views/shared/issuable/_participants.html.haml.rb b/spec/views/shared/issuable/_participants.html.haml.rb index 0a123e83e2e..51059d4c0d7 100644 --- a/spec/views/shared/issuable/_participants.html.haml.rb +++ b/spec/views/shared/issuable/_participants.html.haml.rb @@ -19,7 +19,7 @@ describe 'shared/issuable/_participants.html.haml' do avatars.each do |avatar| expect(avatar[:class]).to include('lazy') - expect(avatar[:src]).to eql('data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==') + expect(avatar[:src]).to eql(LazyImageTagHelper.placeholder_image) expect(avatar[:"data-src"]).to match('http://www.gravatar.com/avatar/') end end -- cgit v1.2.1 From 1e9f9d97e1754fb99b9317847a06cfd5a3755fe7 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Sun, 1 Oct 2017 22:04:18 -0400 Subject: minor cleanup --- doc/install/kubernetes/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/install/kubernetes/index.md b/doc/install/kubernetes/index.md index 90b9e98455a..aed00ae9e2c 100644 --- a/doc/install/kubernetes/index.md +++ b/doc/install/kubernetes/index.md @@ -10,11 +10,11 @@ should be deployed, upgraded, and configured. ## Chart Overview * **[GitLab-Omnibus](gitlab_omnibus.md)**: The best way to run GitLab on Kubernetes today. It is suited for small to medium deployments, and is in beta while support for backups and other features are added. -* **[Cloud Native GitLab Chart](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md)**: The next generation of charts, currently in development. Will support large deployments, with horizontal scaling of individual GitLab components. +* **[Cloud Native GitLab Chart](https://gitlab.com/charts/helm.gitlab.io/blob/master/README.md)**: The next generation GitLab chart, currently in development. Will support large deployments with horizontal scaling of individual GitLab components. * Other Charts * [GitLab Runner Chart](gitlab_runner_chart.md): For deploying just the GitLab Runner. * [Advanced GitLab Installation](gitlab_chart.md): Provides additional deployment options, but provides less functionality out-of-the-box. It's beta, no longer actively developed, and will be deprecated by [gitlab-omnibus](#gitlab-omnibus-chart-recommended) once it supports these options. - * [Community Contributed Charts](#community-contributed-charts): Community contributed charts, deprecated by the official GitLab charts. + * [Community Contributed Charts](#community-contributed-charts): Community contributed charts, deprecated by the official GitLab chart. ## GitLab-Omnibus Chart (Recommended) > **Note**: This chart is in beta while [additional features](https://gitlab.com/charts/charts.gitlab.io/issues/68) are being added. -- cgit v1.2.1 From 6188e449dee43a18b9cec1a7bb5a2cd7aa17b6f7 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 1 Oct 2017 19:45:44 -0700 Subject: Fix pushes to an empty repository not invalidating has_visible_content? cache `Repository#has_visible_content?` used to rely on the cached count of local branches, but since it is now an independently cached value it needs to be invalidated on its own. Closes #38646 --- app/models/repository.rb | 9 ++++++--- changelogs/unreleased/sh-fix-issue-38646.yml | 5 +++++ spec/models/repository_spec.rb | 13 ++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 changelogs/unreleased/sh-fix-issue-38646.yml diff --git a/app/models/repository.rb b/app/models/repository.rb index 1f4df50a913..a0f57f1e54d 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -34,7 +34,10 @@ class Repository CACHED_METHODS = %i(size commit_count rendered_readme contribution_guide changelog license_blob license_key gitignore koding_yml gitlab_ci_yml branch_names tag_names branch_count - tag_count avatar exists? empty? root_ref).freeze + tag_count avatar exists? empty? root_ref has_visible_content?).freeze + + # Methods that use cache_method but only memoize the value + MEMOIZED_CACHED_METHODS = %i(license empty_repo?).freeze # Certain method caches should be refreshed when certain types of files are # changed. This Hash maps file types (as returned by Gitlab::FileDetector) to @@ -269,7 +272,7 @@ class Repository end def expire_branches_cache - expire_method_caches(%i(branch_names branch_count)) + expire_method_caches(%i(branch_names branch_count has_visible_content?)) @local_branches = nil @branch_exists_memo = nil end @@ -340,7 +343,7 @@ class Repository def expire_emptiness_caches return unless empty? - expire_method_caches(%i(empty?)) + expire_method_caches(%i(empty? has_visible_content?)) end def lookup_cache diff --git a/changelogs/unreleased/sh-fix-issue-38646.yml b/changelogs/unreleased/sh-fix-issue-38646.yml new file mode 100644 index 00000000000..5c205775662 --- /dev/null +++ b/changelogs/unreleased/sh-fix-issue-38646.yml @@ -0,0 +1,5 @@ +--- +title: Fix pushes to an empty repository not invalidating has_visible_content? cache +merge_request: +author: +type: fixed diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index ab81d39691b..3b8ae4d3fd1 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1272,6 +1272,7 @@ describe Repository do allow(repository).to receive(:empty?).and_return(true) expect(cache).to receive(:expire).with(:empty?) + expect(cache).to receive(:expire).with(:has_visible_content?) repository.expire_emptiness_caches end @@ -1280,6 +1281,7 @@ describe Repository do allow(repository).to receive(:empty?).and_return(false) expect(cache).not_to receive(:expire).with(:empty?) + expect(cache).not_to receive(:expire).with(:has_visible_content?) repository.expire_emptiness_caches end @@ -1609,7 +1611,7 @@ describe Repository do describe '#expire_branches_cache' do it 'expires the cache' do expect(repository).to receive(:expire_method_caches) - .with(%i(branch_names branch_count)) + .with(%i(branch_names branch_count has_visible_content?)) .and_call_original repository.expire_branches_cache @@ -1888,6 +1890,15 @@ describe Repository do repository.expire_all_method_caches end + + it 'all cache_method definitions are in the lists of method caches' do + methods = repository.methods.map do |method| + match = /^_uncached_(.*)/.match(method) + match[1].to_sym if match + end.compact + + expect(methods).to match_array(Repository::CACHED_METHODS + Repository::MEMOIZED_CACHED_METHODS) + end end describe '#file_on_head' do -- cgit v1.2.1 From b4d6bbf4507a2c4aa09a1f9d11823a8b94fb4a62 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 2 Oct 2017 09:01:55 +0000 Subject: Remove global components --- .../components/stage_code_component.vue | 4 +++ .../cycle_analytics/components/stage_component.vue | 4 +++ .../components/stage_plan_component.vue | 34 ++++++++++++---------- .../components/stage_review_component.vue | 4 +++ .../components/stage_staging_component.vue | 4 +++ .../components/stage_test_component.vue | 34 +++++++++++++--------- .../cycle_analytics/cycle_analytics_bundle.js | 6 ---- 7 files changed, 55 insertions(+), 35 deletions(-) diff --git a/app/assets/javascripts/cycle_analytics/components/stage_code_component.vue b/app/assets/javascripts/cycle_analytics/components/stage_code_component.vue index e4d62b649e5..45930145b0a 100644 --- a/app/assets/javascripts/cycle_analytics/components/stage_code_component.vue +++ b/app/assets/javascripts/cycle_analytics/components/stage_code_component.vue @@ -1,5 +1,7 @@ diff --git a/app/assets/javascripts/cycle_analytics/components/stage_component.vue b/app/assets/javascripts/cycle_analytics/components/stage_component.vue index ab730af8f5b..8c98bd249a1 100644 --- a/app/assets/javascripts/cycle_analytics/components/stage_component.vue +++ b/app/assets/javascripts/cycle_analytics/components/stage_component.vue @@ -1,5 +1,7 @@ diff --git a/app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue b/app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue index 152c086a606..75d2f1fd70c 100644 --- a/app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue +++ b/app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue @@ -1,21 +1,25 @@