Commit b55bd9ef authored by Alfredo Sumaran's avatar Alfredo Sumaran

Merge branch 'master' into 25426-group-dashboard-ui

parents c24b7068 b4972c4b
...@@ -2,6 +2,26 @@ ...@@ -2,6 +2,26 @@
documentation](doc/development/changelog.md) for instructions on adding your own documentation](doc/development/changelog.md) for instructions on adding your own
entry. entry.
## 9.2.5 (2017-06-07)
- No changes.
## 9.2.4 (2017-06-02)
- Fix visibility when referencing snippets.
## 9.2.3 (2017-05-31)
- Move uploads from 'public/uploads' to 'public/uploads/system'.
- Escapes html content before appending it to the DOM.
- Restrict API X-Frame-Options to same origin.
- Allow users autocomplete by author_id only for authenticated users.
## 9.2.2 (2017-05-25)
- Fix issue where real time pipelines were not cached. !11615
- Make all notes use equal padding.
## 9.2.1 (2017-05-23) ## 9.2.1 (2017-05-23)
- Fix placement of note emoji on hover. - Fix placement of note emoji on hover.
...@@ -207,6 +227,20 @@ entry. ...@@ -207,6 +227,20 @@ entry.
- Fix preemptive scroll bar on user activity calendar. - Fix preemptive scroll bar on user activity calendar.
- Pipeline chat notifications convert seconds to minutes and hours. - Pipeline chat notifications convert seconds to minutes and hours.
## 9.1.7 (2017-06-07)
- No changes.
## 9.1.6 (2017-06-02)
- Fix visibility when referencing snippets.
## 9.1.5 (2017-05-31)
- Move uploads from 'public/uploads' to 'public/uploads/system'.
- Restrict API X-Frame-Options to same origin.
- Allow users autocomplete by author_id only for authenticated users.
## 9.1.4 (2017-05-12) ## 9.1.4 (2017-05-12)
- Fix error on CI/CD Settings page related to invalid pipeline trigger. !10948 (dosuken123) - Fix error on CI/CD Settings page related to invalid pipeline trigger. !10948 (dosuken123)
...@@ -505,6 +539,20 @@ entry. ...@@ -505,6 +539,20 @@ entry.
- Only send chat notifications for the default branch. - Only send chat notifications for the default branch.
- Don't fill in the default kubernetes namespace. - Don't fill in the default kubernetes namespace.
## 9.0.10 (2017-06-07)
- No changes.
## 9.0.9 (2017-06-02)
- Fix visibility when referencing snippets.
## 9.0.8 (2017-05-31)
- Move uploads from 'public/uploads' to 'public/uploads/system'.
- Restrict API X-Frame-Options to same origin.
- Allow users autocomplete by author_id only for authenticated users.
## 9.0.7 (2017-05-05) ## 9.0.7 (2017-05-05)
- Enforce project features when searching blobs and wikis. - Enforce project features when searching blobs and wikis.
......
...@@ -655,7 +655,7 @@ GEM ...@@ -655,7 +655,7 @@ GEM
retriable (1.4.1) retriable (1.4.1)
rinku (2.0.0) rinku (2.0.0)
rotp (2.1.2) rotp (2.1.2)
rouge (2.0.7) rouge (2.1.0)
rqrcode (0.7.0) rqrcode (0.7.0)
chunky_png chunky_png
rqrcode-rails3 (0.1.7) rqrcode-rails3 (0.1.7)
......
...@@ -80,7 +80,7 @@ window.Build = (function () { ...@@ -80,7 +80,7 @@ window.Build = (function () {
this.$scrollContainer.niceScroll({ this.$scrollContainer.niceScroll({
cursorcolor: '#fff', cursorcolor: '#fff',
cursoropacitymin: 1, cursoropacitymin: 1,
cursorwidth: '3px', cursorwidth: '7px',
railpadding: { top: 5, bottom: 5, right: 5 }, railpadding: { top: 5, bottom: 5, right: 5 },
}); });
...@@ -238,7 +238,7 @@ window.Build = (function () { ...@@ -238,7 +238,7 @@ window.Build = (function () {
}; };
Build.prototype.toggleSidebar = function (shouldHide) { Build.prototype.toggleSidebar = function (shouldHide) {
const shouldShow = !shouldHide; const shouldShow = typeof shouldHide === 'boolean' ? !shouldHide : undefined;
this.$buildTrace this.$buildTrace
.toggleClass('sidebar-expanded', shouldShow) .toggleClass('sidebar-expanded', shouldShow)
......
...@@ -230,7 +230,7 @@ export default { ...@@ -230,7 +230,7 @@ export default {
</div> </div>
</div> </div>
<div class="content-list environments-container"> <div class="environments-container">
<loading-icon <loading-icon
label="Loading environments" label="Loading environments"
size="3" size="3"
......
...@@ -70,7 +70,7 @@ export default { ...@@ -70,7 +70,7 @@ export default {
</span> </span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu dropdown-menu-align-right">
<li v-for="action in actions"> <li v-for="action in actions">
<button <button
type="button" type="button"
......
...@@ -422,11 +422,13 @@ export default { ...@@ -422,11 +422,13 @@ export default {
</script> </script>
<template> <template>
<div <div
:class="{ 'js-child-row environment-child-row': model.isChildren, 'folder-row': model.isFolder, 'gl-responsive-table-row': !model.isFolder }"> :class="{ 'js-child-row environment-child-row': model.isChildren, 'folder-row': model.isFolder, 'gl-responsive-table-row': !model.isFolder }"
role="row">
<div class="table-section section-10" role="gridcell"> <div class="table-section section-10" role="gridcell">
<div <div
v-if="!model.isFolder" v-if="!model.isFolder"
class="table-mobile-header"> class="table-mobile-header"
role="rowheader">
Environment Environment
</div> </div>
<a <a
...@@ -497,6 +499,7 @@ export default { ...@@ -497,6 +499,7 @@ export default {
<div class="table-section section-25" role="gridcell"> <div class="table-section section-25" role="gridcell">
<div <div
v-if="!model.isFolder" v-if="!model.isFolder"
role="rowheader"
class="table-mobile-header"> class="table-mobile-header">
Commit Commit
</div> </div>
...@@ -513,7 +516,7 @@ export default { ...@@ -513,7 +516,7 @@ export default {
</div> </div>
<div <div
v-if="!model.isFolder && !hasLastDeploymentKey" v-if="!model.isFolder && !hasLastDeploymentKey"
class="commit-title"> class="commit-title table-mobile-content">
No deployments yet No deployments yet
</div> </div>
</div> </div>
...@@ -521,6 +524,7 @@ export default { ...@@ -521,6 +524,7 @@ export default {
<div class="table-section section-10" role="gridcell"> <div class="table-section section-10" role="gridcell">
<div <div
v-if="!model.isFolder" v-if="!model.isFolder"
role="rowheader"
class="table-mobile-header"> class="table-mobile-header">
Updated Updated
</div> </div>
......
...@@ -47,19 +47,19 @@ export default { ...@@ -47,19 +47,19 @@ export default {
<template> <template>
<div class="ci-table" role="grid"> <div class="ci-table" role="grid">
<div class="gl-responsive-table-row table-row-header" role="row"> <div class="gl-responsive-table-row table-row-header" role="row">
<div class="table-section section-10 environments-name" role="rowheader"> <div class="table-section section-10 environments-name" role="columnheader">
Environment Environment
</div> </div>
<div class="table-section section-10 environments-deploy" role="rowheader"> <div class="table-section section-10 environments-deploy" role="columnheader">
Deployment Deployment
</div> </div>
<div class="table-section section-15 environments-build" role="rowheader"> <div class="table-section section-15 environments-build" role="columnheader">
Job Job
</div> </div>
<div class="table-section section-25 environments-commit" role="rowheader"> <div class="table-section section-25 environments-commit" role="columnheader">
Commit Commit
</div> </div>
<div class="table-section section-10 environments-date" role="rowheader"> <div class="table-section section-10 environments-date" role="columnheader">
Updated Updated
</div> </div>
</div> </div>
......
...@@ -3,6 +3,11 @@ ...@@ -3,6 +3,11 @@
import timeago from 'timeago.js'; import timeago from 'timeago.js';
import dateFormat from 'vendor/date.format'; import dateFormat from 'vendor/date.format';
import {
lang,
s__,
} from '../../locale';
window.timeago = timeago; window.timeago = timeago;
window.dateFormat = dateFormat; window.dateFormat = dateFormat;
...@@ -48,26 +53,45 @@ window.dateFormat = dateFormat; ...@@ -48,26 +53,45 @@ window.dateFormat = dateFormat;
var locale; var locale;
if (!timeagoInstance) { if (!timeagoInstance) {
const localeRemaining = function(number, index) {
return [
[s__('Timeago|less than a minute ago'), s__('Timeago|a while')],
[s__('Timeago|less than a minute ago'), s__('Timeago|%s seconds remaining')],
[s__('Timeago|about a minute ago'), s__('Timeago|1 minute remaining')],
[s__('Timeago|%s minutes ago'), s__('Timeago|%s minutes remaining')],
[s__('Timeago|about an hour ago'), s__('Timeago|1 hour remaining')],
[s__('Timeago|about %s hours ago'), s__('Timeago|%s hours remaining')],
[s__('Timeago|a day ago'), s__('Timeago|1 day remaining')],
[s__('Timeago|%s days ago'), s__('Timeago|%s days remaining')],
[s__('Timeago|a week ago'), s__('Timeago|1 week remaining')],
[s__('Timeago|%s weeks ago'), s__('Timeago|%s weeks remaining')],
[s__('Timeago|a month ago'), s__('Timeago|1 month remaining')],
[s__('Timeago|%s months ago'), s__('Timeago|%s months remaining')],
[s__('Timeago|a year ago'), s__('Timeago|1 year remaining')],
[s__('Timeago|%s years ago'), s__('Timeago|%s years remaining')]
][index];
};
locale = function(number, index) { locale = function(number, index) {
return [ return [
['less than a minute ago', 'a while'], [s__('Timeago|less than a minute ago'), s__('Timeago|a while')],
['less than a minute ago', 'in %s seconds'], [s__('Timeago|less than a minute ago'), s__('Timeago|in %s seconds')],
['about a minute ago', 'in 1 minute'], [s__('Timeago|about a minute ago'), s__('Timeago|in 1 minute')],
['%s minutes ago', 'in %s minutes'], [s__('Timeago|%s minutes ago'), s__('Timeago|in %s minutes')],
['about an hour ago', 'in 1 hour'], [s__('Timeago|about an hour ago'), s__('Timeago|in 1 hour')],
['about %s hours ago', 'in %s hours'], [s__('Timeago|about %s hours ago'), s__('Timeago|in %s hours')],
['a day ago', 'in 1 day'], [s__('Timeago|a day ago'), s__('Timeago|in 1 day')],
['%s days ago', 'in %s days'], [s__('Timeago|%s days ago'), s__('Timeago|in %s days')],
['a week ago', 'in 1 week'], [s__('Timeago|a week ago'), s__('Timeago|in 1 week')],
['%s weeks ago', 'in %s weeks'], [s__('Timeago|%s weeks ago'), s__('Timeago|in %s weeks')],
['a month ago', 'in 1 month'], [s__('Timeago|a month ago'), s__('Timeago|in 1 month')],
['%s months ago', 'in %s months'], [s__('Timeago|%s months ago'), s__('Timeago|in %s months')],
['a year ago', 'in 1 year'], [s__('Timeago|a year ago'), s__('Timeago|in 1 year')],
['%s years ago', 'in %s years'] [s__('Timeago|%s years ago'), s__('Timeago|in %s years')]
][index]; ][index];
}; };
timeago.register('gl_en', locale); timeago.register(lang, locale);
timeago.register(`${lang}-remaining`, localeRemaining);
timeagoInstance = timeago(); timeagoInstance = timeago();
} }
...@@ -79,13 +103,11 @@ window.dateFormat = dateFormat; ...@@ -79,13 +103,11 @@ window.dateFormat = dateFormat;
if (!time) { if (!time) {
return ''; return '';
} }
suffix || (suffix = 'remaining'); if (new Date(time) < new Date()) {
expiredLabel || (expiredLabel = 'Past due'); expiredLabel || (expiredLabel = s__('Timeago|Past due'));
timefor = gl.utils.getTimeago().format(time).replace('in', '');
if (timefor.indexOf('ago') > -1) {
timefor = expiredLabel; timefor = expiredLabel;
} else { } else {
timefor = timefor.trim() + ' ' + suffix; timefor = gl.utils.getTimeago().format(time, `${lang}-remaining`).trim();
} }
return timefor; return timefor;
}; };
...@@ -102,7 +124,7 @@ window.dateFormat = dateFormat; ...@@ -102,7 +124,7 @@ window.dateFormat = dateFormat;
}; };
w.gl.utils.updateTimeagoText = function(el) { w.gl.utils.updateTimeagoText = function(el) {
const formattedDate = gl.utils.getTimeago().format(el.getAttribute('datetime'), 'gl_en'); const formattedDate = gl.utils.getTimeago().format(el.getAttribute('datetime'), lang);
if (el.textContent !== formattedDate) { if (el.textContent !== formattedDate) {
el.textContent = formattedDate; el.textContent = formattedDate;
......
var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-05-04 19:24-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-05 09:40-0400","Last-Translator":"Lyubomir Vasilev <lyubomirv@abv.bg>","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"ByAuthor|by":["от"],"Commit":["Подаване","Подавания"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Deploy":["Внедряване","Внедрявания"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Introducing Cycle Analytics":["Представяме Ви анализът на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Pipeline Health":["Състояние"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всички задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнените на първата Ви такава задача."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}};
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
var locales = locales || {}; locales['pt_BR'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-05-04 19:24-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-05 03:29-0400","Last-Translator":"Alexandre Alencar <alexandre.alencar@gmail.com>","Language-Team":"Portuguese (Brazil)","Language":"pt-BR","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"pt_BR","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"ByAuthor|by":["por"],"Commit":["Commit","Commits"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["A Análise de Ciclo fornece uma visão geral de quanto tempo uma ideia demora para ir para produção em seu projeto."],"CycleAnalyticsStage|Code":["Código"],"CycleAnalyticsStage|Issue":["Tarefa"],"CycleAnalyticsStage|Plan":["Plano"],"CycleAnalyticsStage|Production":["Produção"],"CycleAnalyticsStage|Review":["Revisão"],"CycleAnalyticsStage|Staging":["Homologação"],"CycleAnalyticsStage|Test":["Teste"],"Deploy":["Implantação","Implantações"],"FirstPushedBy|First":["Primeiro"],"FirstPushedBy|pushed by":["publicado por"],"From issue creation until deploy to production":["Da criação de tarefas até a implantação para a produção"],"From merge request merge until deploy to production":["Da incorporação do merge request até a implantação em produção"],"Introducing Cycle Analytics":["Apresentando a Análise de Ciclo"],"Last %d day":["Último %d dia","Últimos %d dias"],"Limited to showing %d event at most":["Limitado a mostrar %d evento no máximo","Limitado a mostrar %d eventos no máximo"],"Median":["Mediana"],"New Issue":["Nova Tarefa","Novas Tarefas"],"Not available":["Não disponível"],"Not enough data":["Dados insuficientes"],"OpenedNDaysAgo|Opened":["Aberto"],"Pipeline Health":["Saúde da Pipeline"],"ProjectLifecycle|Stage":["Etapa"],"Read more":["Ler mais"],"Related Commits":["Commits Relacionados"],"Related Deployed Jobs":["Jobs Relacionados Incorporados"],"Related Issues":["Tarefas Relacionadas"],"Related Jobs":["Jobs Relacionados"],"Related Merge Requests":["Merge Requests Relacionados"],"Related Merged Requests":["Merge Requests Relacionados"],"Showing %d event":["Mostrando %d evento","Mostrando %d eventos"],"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.":["O estágio de codificação mostra o tempo desde o primeiro commit até a criação do merge request. \\nOs dados serão automaticamente adicionados aqui uma vez que você tenha criado seu primeiro merge request."],"The collection of events added to the data gathered for that stage.":["A coleção de eventos adicionados aos dados coletados para esse estágio."],"The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage.":["O estágio em questão mostra o tempo que leva desde a criação de uma tarefa até a sua assinatura para um milestone, ou a sua adição para a lista no seu Painel de Tarefas. Comece a criar tarefas para ver dados para esta etapa."],"The phase of the development lifecycle.":["A fase do ciclo de vida do desenvolvimento."],"The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit.":["A fase de planejamento mostra o tempo do passo anterior até empurrar o seu primeiro commit. Este tempo será adicionado automaticamente assim que você realizar seu primeiro commit."],"The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle.":["O estágio de produção mostra o tempo total que leva entre criar uma tarefa e implantar o código na produção. Os dados serão adicionados automaticamente até que você complete todo o ciclo de produção."],"The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request.":["A etapa de revisão mostra o tempo de criação de um merge request até que o merge seja feito. Os dados serão automaticamente adicionados depois que você fizer seu primeiro merge request."],"The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time.":["O estágio de estágio mostra o tempo entre a fusão do MR e o código de implantação para o ambiente de produção. Os dados serão automaticamente adicionados depois de implantar na produção pela primeira vez."],"The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running.":["A fase de teste mostra o tempo que o GitLab CI leva para executar cada pipeline para o merge request relacionado. Os dados serão automaticamente adicionados após a conclusão do primeiro pipeline."],"The time taken by each data entry gathered by that stage.":["O tempo necessário para cada entrada de dados reunida por essa etapa."],"The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6.":["O valor situado no ponto médio de uma série de valores observados. Ex., entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5 + 7) / 2 = 6."],"Time before an issue gets scheduled":["Tempo até que uma tarefa seja planejada"],"Time before an issue starts implementation":["Tempo até que uma tarefa comece a ser implementada"],"Time between merge request creation and merge/close":["Tempo entre a criação do merge request e o merge/fechamento"],"Time until first merge request":["Tempo até o primeiro merge request"],"Time|hr":["h","hs"],"Time|min":["min","mins"],"Time|s":["s"],"Total Time":["Tempo Total"],"Total test time for all commits/merges":["Tempo de teste total para todos os commits/merges"],"Want to see the data? Please ask an administrator for access.":["Precisa visualizar os dados? Solicite acesso ao administrador."],"We don't have enough data to show this stage.":["Não temos dados suficientes para mostrar esta fase."],"You need permission.":["Você precisa de permissão."],"day":["dia","dias"]}}};
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
.awards { .awards {
display: flex;
flex-wrap: wrap;
.emoji-icon { .emoji-icon {
width: 20px; width: 20px;
height: 20px; height: 20px;
...@@ -100,7 +103,6 @@ ...@@ -100,7 +103,6 @@
.award-menu-holder { .award-menu-holder {
display: inline-block; display: inline-block;
position: absolute;
.tooltip { .tooltip {
white-space: nowrap; white-space: nowrap;
...@@ -108,9 +110,11 @@ ...@@ -108,9 +110,11 @@
} }
.award-control { .award-control {
margin: 0 5px 6px 0; margin: 4px 8px 4px 0;
outline: 0; outline: 0;
position: relative; position: relative;
display: block;
float: left;
&.disabled { &.disabled {
cursor: default; cursor: default;
......
...@@ -266,7 +266,14 @@ ...@@ -266,7 +266,14 @@
text-transform: capitalize; text-transform: capitalize;
} }
.separator + .dropdown-header { .dropdown-bold-header {
font-weight: 600;
line-height: 22px;
padding: 0 16px;
}
.separator + .dropdown-header,
.separator + .dropdown-bold-header {
padding-top: 2px; padding-top: 2px;
} }
......
...@@ -19,10 +19,6 @@ ...@@ -19,10 +19,6 @@
.table-section { .table-section {
white-space: nowrap; white-space: nowrap;
.branch-commit {
max-width: 100%;
}
$section-widths: 10 15 20 25 30 40; $section-widths: 10 15 20 25 30 40;
@each $width in $section-widths { @each $width in $section-widths {
&.section-#{$width} { &.section-#{$width} {
...@@ -87,4 +83,9 @@ ...@@ -87,4 +83,9 @@
@media (min-width: $screen-md-min) { @media (min-width: $screen-md-min) {
flex: 0 0 90%; flex: 0 0 90%;
} }
.avatar {
float: none;
margin-right: 4px;
}
} }
...@@ -228,7 +228,7 @@ ...@@ -228,7 +228,7 @@
margin: 10px 0; margin: 10px 0;
background: $gray-light; background: $gray-light;
display: none; display: none;
white-space: pre-line; white-space: pre-wrap;
word-break: normal; word-break: normal;
pre { pre {
......
...@@ -143,8 +143,8 @@ ...@@ -143,8 +143,8 @@
} }
> .btn-group, > .btn-group,
.external-url, > .external-url,
.btn { > .btn {
flex: 1; flex: 1;
flex-basis: 28px; flex-basis: 28px;
margin: 0 5px; margin: 0 5px;
...@@ -153,6 +153,10 @@ ...@@ -153,6 +153,10 @@
.dropdown-new { .dropdown-new {
width: 100%; width: 100%;
} }
.dropdown-menu {
min-width: initial;
}
} }
} }
} }
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
} }
.emoji-block { .emoji-block {
padding: 10px 0 4px; padding: 10px 0;
} }
} }
...@@ -756,7 +756,6 @@ ...@@ -756,7 +756,6 @@
position: -webkit-sticky; position: -webkit-sticky;
top: 60px; top: 60px;
z-index: 200; z-index: 200;
@include transition(all);
} }
} }
} }
...@@ -249,9 +249,13 @@ ul.related-merge-requests > li { ...@@ -249,9 +249,13 @@ ul.related-merge-requests > li {
} }
@media (min-width: $screen-sm-min) { @media (min-width: $screen-sm-min) {
.emoji-block .row {
display: flex;
.new-branch-col { .new-branch-col {
padding-top: 0; padding-top: 0;
text-align: right; text-align: right;
align-self: center;
} }
.create-mr-dropdown-wrap { .create-mr-dropdown-wrap {
...@@ -259,4 +263,5 @@ ul.related-merge-requests > li { ...@@ -259,4 +263,5 @@ ul.related-merge-requests > li {
display: inline-block; display: inline-block;
} }
} }
}
} }
...@@ -55,7 +55,7 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -55,7 +55,7 @@ class Projects::BlobController < Projects::ApplicationController
def edit def edit
if can_collaborate_with_project? if can_collaborate_with_project?
blob.load_all_data!(@repository) blob.load_all_data!
else else
redirect_to action: 'show' redirect_to action: 'show'
end end
...@@ -74,7 +74,7 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -74,7 +74,7 @@ class Projects::BlobController < Projects::ApplicationController
def preview def preview
@content = params[:content] @content = params[:content]
@blob.load_all_data!(@repository) @blob.load_all_data!
diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true) diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true)
diff_lines = diffy.diff.scan(/.*\n/)[2..-1] diff_lines = diffy.diff.scan(/.*\n/)[2..-1]
diff_lines = Gitlab::Diff::Parser.new.parse(diff_lines) diff_lines = Gitlab::Diff::Parser.new.parse(diff_lines)
...@@ -111,7 +111,7 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -111,7 +111,7 @@ class Projects::BlobController < Projects::ApplicationController
private private
def blob def blob
@blob ||= Blob.decorate(@repository.blob_at(@commit.id, @path), @project) @blob ||= @repository.blob_at(@commit.id, @path)
if @blob if @blob
@blob @blob
......
...@@ -8,7 +8,7 @@ class Projects::LabelsController < Projects::ApplicationController ...@@ -8,7 +8,7 @@ class Projects::LabelsController < Projects::ApplicationController
before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update, before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
:generate, :destroy, :remove_priority, :generate, :destroy, :remove_priority,
:set_priorities] :set_priorities]
before_action :authorize_admin_group!, only: [:promote] before_action :authorize_admin_group_labels!, only: [:promote]
respond_to :js, :html respond_to :js, :html
...@@ -161,7 +161,7 @@ class Projects::LabelsController < Projects::ApplicationController ...@@ -161,7 +161,7 @@ class Projects::LabelsController < Projects::ApplicationController
return render_404 unless can?(current_user, :admin_label, @project) return render_404 unless can?(current_user, :admin_label, @project)
end end
def authorize_admin_group! def authorize_admin_group_labels!
return render_404 unless can?(current_user, :admin_group, @project.group) return render_404 unless can?(current_user, :admin_label, @project.group)
end end
end end
...@@ -43,7 +43,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController ...@@ -43,7 +43,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
if schedule.update(owner: current_user) if schedule.update(owner: current_user)
redirect_to pipeline_schedules_path(@project) redirect_to pipeline_schedules_path(@project)
else else
redirect_to pipeline_schedules_path(@project), alert: "Failed to change the owner" redirect_to pipeline_schedules_path(@project), alert: _("Failed to change the owner")
end end
end end
...@@ -53,7 +53,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController ...@@ -53,7 +53,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
else else
redirect_to pipeline_schedules_path(@project), redirect_to pipeline_schedules_path(@project),
status: 302, status: 302,
alert: "Failed to remove the pipeline schedule" alert: _("Failed to remove the pipeline schedule")
end end
end end
......
...@@ -34,7 +34,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -34,7 +34,7 @@ class ProjectsController < Projects::ApplicationController
redirect_to( redirect_to(
project_path(@project), project_path(@project),
notice: "Project '#{@project.name}' was successfully created." notice: _("Project '%{project_name}' was successfully created.") % { project_name: @project.name }
) )
else else
render 'new' render 'new'
...@@ -49,7 +49,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -49,7 +49,7 @@ class ProjectsController < Projects::ApplicationController
respond_to do |format| respond_to do |format|
if result[:status] == :success if result[:status] == :success
flash[:notice] = "Project '#{@project.name}' was successfully updated." flash[:notice] = _("Project '%{project_name}' was successfully updated.") % { project_name: @project.name }
format.html do format.html do
redirect_to(edit_project_path(@project)) redirect_to(edit_project_path(@project))
end end
...@@ -76,7 +76,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -76,7 +76,7 @@ class ProjectsController < Projects::ApplicationController
return access_denied! unless can?(current_user, :remove_fork_project, @project) return access_denied! unless can?(current_user, :remove_fork_project, @project)
if ::Projects::UnlinkForkService.new(@project, current_user).execute if ::Projects::UnlinkForkService.new(@project, current_user).execute
flash[:notice] = 'The fork relationship has been removed.' flash[:notice] = _('The fork relationship has been removed.')
end end
end end
...@@ -97,7 +97,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -97,7 +97,7 @@ class ProjectsController < Projects::ApplicationController
end end
if @project.pending_delete? if @project.pending_delete?
flash[:alert] = "Project #{@project.name} queued for deletion." flash[:alert] = _("Project '%{project_name}' queued for deletion.") % { project_name: @project.name }
end end
respond_to do |format| respond_to do |format|
...@@ -117,7 +117,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -117,7 +117,7 @@ class ProjectsController < Projects::ApplicationController
return access_denied! unless can?(current_user, :remove_project, @project) return access_denied! unless can?(current_user, :remove_project, @project)
::Projects::DestroyService.new(@project, current_user, {}).async_execute ::Projects::DestroyService.new(@project, current_user, {}).async_execute
flash[:alert] = "Project '#{@project.name_with_namespace}' will be deleted." flash[:alert] = _("Project '%{project_name}' will be deleted.") % { project_name: @project.name_with_namespace }
redirect_to dashboard_projects_path, status: 302 redirect_to dashboard_projects_path, status: 302
rescue Projects::DestroyService::DestroyError => ex rescue Projects::DestroyService::DestroyError => ex
...@@ -156,7 +156,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -156,7 +156,7 @@ class ProjectsController < Projects::ApplicationController
redirect_to( redirect_to(
project_path(@project), project_path(@project),
notice: "Housekeeping successfully started" notice: _("Housekeeping successfully started")
) )
rescue ::Projects::HousekeepingService::LeaseTaken => ex rescue ::Projects::HousekeepingService::LeaseTaken => ex
redirect_to( redirect_to(
...@@ -170,7 +170,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -170,7 +170,7 @@ class ProjectsController < Projects::ApplicationController
redirect_to( redirect_to(
edit_project_path(@project), edit_project_path(@project),
notice: "Project export started. A download link will be sent by email." notice: _("Project export started. A download link will be sent by email.")
) )
end end
...@@ -182,16 +182,16 @@ class ProjectsController < Projects::ApplicationController ...@@ -182,16 +182,16 @@ class ProjectsController < Projects::ApplicationController
else else
redirect_to( redirect_to(
edit_project_path(@project), edit_project_path(@project),
alert: "Project export link has expired. Please generate a new export from your project settings." alert: _("Project export link has expired. Please generate a new export from your project settings.")
) )
end end
end end
def remove_export def remove_export
if @project.remove_exports if @project.remove_exports
flash[:notice] = "Project export has been deleted." flash[:notice] = _("Project export has been deleted.")
else else
flash[:alert] = "Project export could not be deleted." flash[:alert] = _("Project export could not be deleted.")
end end
redirect_to(edit_project_path(@project)) redirect_to(edit_project_path(@project))
end end
...@@ -202,7 +202,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -202,7 +202,7 @@ class ProjectsController < Projects::ApplicationController
else else
redirect_to( redirect_to(
edit_project_path(@project), edit_project_path(@project),
alert: "Project export could not be deleted." alert: _("Project export could not be deleted.")
) )
end end
end end
...@@ -220,13 +220,13 @@ class ProjectsController < Projects::ApplicationController ...@@ -220,13 +220,13 @@ class ProjectsController < Projects::ApplicationController
branches = BranchesFinder.new(@repository, params).execute.map(&:name) branches = BranchesFinder.new(@repository, params).execute.map(&:name)
options = { options = {
'Branches' => branches.take(100) s_('RefSwitcher|Branches') => branches.take(100)
} }
unless @repository.tag_count.zero? unless @repository.tag_count.zero?
tags = TagsFinder.new(@repository, params).execute.map(&:name) tags = TagsFinder.new(@repository, params).execute.map(&:name)
options['Tags'] = tags.take(100) options[s_('RefSwitcher|Tags')] = tags.take(100)
end end
# If reference is commit id - we should add it to branch/tag selectbox # If reference is commit id - we should add it to branch/tag selectbox
......
...@@ -61,7 +61,7 @@ module ButtonHelper ...@@ -61,7 +61,7 @@ module ButtonHelper
html: true, html: true,
placement: placement, placement: placement,
container: 'body', container: 'body',
title: "Set a password on your account<br>to pull or push via #{protocol}" title: _("Set a password on your account to pull or push via %{protocol}") % { protocol: protocol }
} }
end end
...@@ -76,7 +76,7 @@ module ButtonHelper ...@@ -76,7 +76,7 @@ module ButtonHelper
html: true, html: true,
placement: placement, placement: placement,
container: 'body', container: 'body',
title: 'Add an SSH key to your profile<br>to pull or push via SSH.' title: _('Add an SSH key to your profile to pull or push via SSH.')
} }
end end
end end
...@@ -16,7 +16,7 @@ module CiStatusHelper ...@@ -16,7 +16,7 @@ module CiStatusHelper
return status.label return status.label
end end
case status label = case status
when 'success' when 'success'
'passed' 'passed'
when 'success_with_warnings' when 'success_with_warnings'
...@@ -26,6 +26,8 @@ module CiStatusHelper ...@@ -26,6 +26,8 @@ module CiStatusHelper
else else
status status
end end
translation = "CiStatusLabel|#{label}"
s_(translation)
end end
def ci_text_for_status(status) def ci_text_for_status(status)
...@@ -35,13 +37,22 @@ module CiStatusHelper ...@@ -35,13 +37,22 @@ module CiStatusHelper
case status case status
when 'success' when 'success'
'passed' s_('CiStatusText|passed')
when 'success_with_warnings' when 'success_with_warnings'
'passed' s_('CiStatusText|passed')
when 'manual' when 'manual'
'blocked' s_('CiStatusText|blocked')
else else
status # All states are already being translated inside the detailed statuses:
# :running => Gitlab::Ci::Status::Running
# :skipped => Gitlab::Ci::Status::Skipped
# :failed => Gitlab::Ci::Status::Failed
# :success => Gitlab::Ci::Status::Success
# :canceled => Gitlab::Ci::Status::Canceled
# The following states are customized above:
# :manual => Gitlab::Ci::Status::Manual
status_translation = "CiStatusText|#{status}"
s_(status_translation)
end end
end end
......
...@@ -13,7 +13,7 @@ module NavHelper ...@@ -13,7 +13,7 @@ module NavHelper
else else
"page-gutter right-sidebar-expanded" "page-gutter right-sidebar-expanded"
end end
elsif current_path?('builds#show') elsif current_path?('jobs#show')
"page-gutter build-sidebar right-sidebar-expanded" "page-gutter build-sidebar right-sidebar-expanded"
elsif current_path?('wikis#show') || elsif current_path?('wikis#show') ||
current_path?('wikis#edit') || current_path?('wikis#edit') ||
......
...@@ -21,30 +21,36 @@ module NotificationsHelper ...@@ -21,30 +21,36 @@ module NotificationsHelper
end end
def notification_title(level) def notification_title(level)
# Can be anything in `NotificationSetting.level:
case level.to_sym case level.to_sym
when :participating when :participating
'Participate' s_('NotificationLevel|Participate')
when :mention when :mention
'On mention' s_('NotificationLevel|On mention')
else else
level.to_s.titlecase N_('NotificationLevel|Global')
N_('NotificationLevel|Watch')
N_('NotificationLevel|Disabled')
N_('NotificationLevel|Custom')
level = "NotificationLevel|#{level.to_s.humanize}"
s_(level)
end end
end end
def notification_description(level) def notification_description(level)
case level.to_sym case level.to_sym
when :participating when :participating
'You will only receive notifications for threads you have participated in' _('You will only receive notifications for threads you have participated in')
when :mention when :mention
'You will receive notifications only for comments in which you were @mentioned' _('You will receive notifications only for comments in which you were @mentioned')
when :watch when :watch
'You will receive notifications for any activity' _('You will receive notifications for any activity')
when :disabled when :disabled
'You will not get any notifications via email' _('You will not get any notifications via email')
when :global when :global
'Use your global notification setting' _('Use your global notification setting')
when :custom when :custom
'You will only receive notifications for the events you choose' _('You will only receive notifications for the events you choose')
end end
end end
...@@ -76,11 +82,22 @@ module NotificationsHelper ...@@ -76,11 +82,22 @@ module NotificationsHelper
end end
def notification_event_name(event) def notification_event_name(event)
# All values from NotificationSetting::EMAIL_EVENTS
case event case event
when :success_pipeline when :success_pipeline
'Successful pipeline' s_('NotificationEvent|Successful pipeline')
else else
event.to_s.humanize N_('NotificationEvent|New note')
N_('NotificationEvent|New issue')
N_('NotificationEvent|Reopen issue')
N_('NotificationEvent|Close issue')
N_('NotificationEvent|Reassign issue')
N_('NotificationEvent|New merge request')
N_('NotificationEvent|Close merge request')
N_('NotificationEvent|Reassign merge request')
N_('NotificationEvent|Merge merge request')
N_('NotificationEvent|Failed pipeline')
s_(event.to_s.humanize)
end end
end end
end end
...@@ -70,15 +70,18 @@ module ProjectsHelper ...@@ -70,15 +70,18 @@ module ProjectsHelper
end end
def remove_project_message(project) def remove_project_message(project)
"You are going to remove #{project.name_with_namespace}.\n Removed project CANNOT be restored!\n Are you ABSOLUTELY sure?" _("You are going to remove %{project_name_with_namespace}.\nRemoved project CANNOT be restored!\nAre you ABSOLUTELY sure?") %
{ project_name_with_namespace: project.name_with_namespace }
end end
def transfer_project_message(project) def transfer_project_message(project)
"You are going to transfer #{project.name_with_namespace} to another owner. Are you ABSOLUTELY sure?" _("You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?") %
{ project_name_with_namespace: project.name_with_namespace }
end end
def remove_fork_project_message(project) def remove_fork_project_message(project)
"You are going to remove the fork relationship to source project #{@project.forked_from_project.name_with_namespace}. Are you ABSOLUTELY sure?" _("You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?") %
{ forked_from_project: @project.forked_from_project.name_with_namespace }
end end
def project_nav_tabs def project_nav_tabs
...@@ -143,7 +146,7 @@ module ProjectsHelper ...@@ -143,7 +146,7 @@ module ProjectsHelper
end end
options = options_for_select( options = options_for_select(
options, options.invert,
selected: highest_available_option || @project.project_feature.public_send(field), selected: highest_available_option || @project.project_feature.public_send(field),
disabled: disabled_option disabled: disabled_option
) )
...@@ -159,12 +162,13 @@ module ProjectsHelper ...@@ -159,12 +162,13 @@ module ProjectsHelper
end end
def link_to_autodeploy_doc def link_to_autodeploy_doc
link_to 'About auto deploy', help_page_path('ci/autodeploy/index'), target: '_blank' link_to _('About auto deploy'), help_page_path('ci/autodeploy/index'), target: '_blank'
end end
def autodeploy_flash_notice(branch_name) def autodeploy_flash_notice(branch_name)
"Branch <strong>#{truncate(sanitize(branch_name))}</strong> was created. To set up auto deploy, \ translation = _("Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}") %
choose a GitLab CI Yaml template and commit your changes. #{link_to_autodeploy_doc}".html_safe { branch_name: truncate(sanitize(branch_name)), link_to_autodeploy_doc: link_to_autodeploy_doc }
translation.html_safe
end end
def project_list_cache_key(project) def project_list_cache_key(project)
...@@ -250,11 +254,11 @@ module ProjectsHelper ...@@ -250,11 +254,11 @@ module ProjectsHelper
def project_lfs_status(project) def project_lfs_status(project)
if project.lfs_enabled? if project.lfs_enabled?
content_tag(:span, class: 'lfs-enabled') do content_tag(:span, class: 'lfs-enabled') do
'Enabled' s_('LFSStatus|Enabled')
end end
else else
content_tag(:span, class: 'lfs-disabled') do content_tag(:span, class: 'lfs-disabled') do
'Disabled' s_('LFSStatus|Disabled')
end end
end end
end end
...@@ -263,7 +267,7 @@ module ProjectsHelper ...@@ -263,7 +267,7 @@ module ProjectsHelper
if current_user if current_user
current_user.name current_user.name
else else
"Your name" _("Your name")
end end
end end
...@@ -300,17 +304,18 @@ module ProjectsHelper ...@@ -300,17 +304,18 @@ module ProjectsHelper
if project.last_activity_at if project.last_activity_at
time_ago_with_tooltip(project.last_activity_at, placement: 'bottom', html_class: 'last_activity_time_ago') time_ago_with_tooltip(project.last_activity_at, placement: 'bottom', html_class: 'last_activity_time_ago')
else else
"Never" s_("ProjectLastActivity|Never")
end end
end end
def add_special_file_path(project, file_name:, commit_message: nil, branch_name: nil, context: nil) def add_special_file_path(project, file_name:, commit_message: nil, branch_name: nil, context: nil)
commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name.downcase }
namespace_project_new_blob_path( namespace_project_new_blob_path(
project.namespace, project.namespace,
project, project,
project.default_branch || 'master', project.default_branch || 'master',
file_name: file_name, file_name: file_name,
commit_message: commit_message || "Add #{file_name.downcase}", commit_message: commit_message,
branch_name: branch_name, branch_name: branch_name,
context: context context: context
) )
...@@ -447,9 +452,9 @@ module ProjectsHelper ...@@ -447,9 +452,9 @@ module ProjectsHelper
def project_feature_options def project_feature_options
{ {
'Disabled' => ProjectFeature::DISABLED, ProjectFeature::DISABLED => s_('ProjectFeature|Disabled'),
'Only team members' => ProjectFeature::PRIVATE, ProjectFeature::PRIVATE => s_('ProjectFeature|Only team members'),
'Everyone with access' => ProjectFeature::ENABLED ProjectFeature::ENABLED => s_('ProjectFeature|Everyone with access')
} }
end end
......
...@@ -29,11 +29,11 @@ module VisibilityLevelHelper ...@@ -29,11 +29,11 @@ module VisibilityLevelHelper
def project_visibility_level_description(level) def project_visibility_level_description(level)
case level case level
when Gitlab::VisibilityLevel::PRIVATE when Gitlab::VisibilityLevel::PRIVATE
"Project access must be granted explicitly to each user." _("Project access must be granted explicitly to each user.")
when Gitlab::VisibilityLevel::INTERNAL when Gitlab::VisibilityLevel::INTERNAL
"The project can be accessed by any logged in user." _("The project can be accessed by any logged in user.")
when Gitlab::VisibilityLevel::PUBLIC when Gitlab::VisibilityLevel::PUBLIC
"The project can be accessed without any authentication." _("The project can be accessed without any authentication.")
end end
end end
...@@ -81,7 +81,9 @@ module VisibilityLevelHelper ...@@ -81,7 +81,9 @@ module VisibilityLevelHelper
end end
def visibility_level_label(level) def visibility_level_label(level)
Project.visibility_levels.key(level) # The visibility level can be:
# 'VisibilityLevel|Private', 'VisibilityLevel|Internal', 'VisibilityLevel|Public'
s_(Project.visibility_levels.key(level))
end end
def restricted_visibility_levels(show_all = false) def restricted_visibility_levels(show_all = false)
......
...@@ -5,7 +5,7 @@ class AwardEmoji < ActiveRecord::Base ...@@ -5,7 +5,7 @@ class AwardEmoji < ActiveRecord::Base
include Participable include Participable
include GhostUser include GhostUser
belongs_to :awardable, polymorphic: true belongs_to :awardable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
belongs_to :user belongs_to :user
validates :awardable, :user, presence: true validates :awardable, :user, presence: true
......
...@@ -94,6 +94,10 @@ class Blob < SimpleDelegator ...@@ -94,6 +94,10 @@ class Blob < SimpleDelegator
end end
end end
def load_all_data!
super(project.repository) if project
end
def no_highlighting? def no_highlighting?
raw_size && raw_size > MAXIMUM_TEXT_HIGHLIGHT_SIZE raw_size && raw_size > MAXIMUM_TEXT_HIGHLIGHT_SIZE
end end
......
...@@ -9,9 +9,7 @@ module BlobViewer ...@@ -9,9 +9,7 @@ module BlobViewer
end end
def prepare! def prepare!
if blob.project blob.load_all_data!
blob.load_all_data!(blob.project.repository)
end
end end
def render_error def render_error
......
...@@ -114,16 +114,16 @@ class Commit ...@@ -114,16 +114,16 @@ class Commit
# #
# Usually, the commit title is the first line of the commit message. # Usually, the commit title is the first line of the commit message.
# In case this first line is longer than 100 characters, it is cut off # In case this first line is longer than 100 characters, it is cut off
# after 80 characters and ellipses (`&hellp;`) are appended. # after 80 characters + `...`
def title def title
full_title.length > 100 ? full_title[0..79] << "…" : full_title return full_title if full_title.length < 100
full_title.truncate(81, separator: ' ', omission: '…')
end end
# Returns the full commits title # Returns the full commits title
def full_title def full_title
return @full_title if @full_title @full_title ||=
@full_title =
if safe_message.blank? if safe_message.blank?
no_commit_message no_commit_message
else else
...@@ -131,18 +131,13 @@ class Commit ...@@ -131,18 +131,13 @@ class Commit
end end
end end
# Returns the commits description # Returns full commit message if title is truncated (greater than 99 characters)
# # otherwise returns commit message without first line
# cut off, ellipses (`&hellp;`) are prepended to the commit message.
def description def description
title_end = safe_message.index("\n") return safe_message if full_title.length >= 100
@description ||=
if (!title_end && safe_message.length > 100) || (title_end && title_end > 100)
"…" << safe_message[80..-1]
else
safe_message.split("\n", 2)[1].try(:chomp) safe_message.split("\n", 2)[1].try(:chomp)
end end
end
def description? def description?
description.present? description.present?
......
...@@ -4,7 +4,7 @@ class Deployment < ActiveRecord::Base ...@@ -4,7 +4,7 @@ class Deployment < ActiveRecord::Base
belongs_to :project, required: true, validate: true belongs_to :project, required: true, validate: true
belongs_to :environment, required: true, validate: true belongs_to :environment, required: true, validate: true
belongs_to :user belongs_to :user
belongs_to :deployable, polymorphic: true belongs_to :deployable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :sha, presence: true validates :sha, presence: true
validates :ref, presence: true validates :ref, presence: true
......
...@@ -47,7 +47,7 @@ class Event < ActiveRecord::Base ...@@ -47,7 +47,7 @@ class Event < ActiveRecord::Base
belongs_to :author, class_name: "User" belongs_to :author, class_name: "User"
belongs_to :project belongs_to :project
belongs_to :target, polymorphic: true belongs_to :target, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
# For Hash only # For Hash only
serialize :data # rubocop:disable Cop/ActiverecordSerialize serialize :data # rubocop:disable Cop/ActiverecordSerialize
......
class LabelLink < ActiveRecord::Base class LabelLink < ActiveRecord::Base
include Importable include Importable
belongs_to :target, polymorphic: true belongs_to :target, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
belongs_to :label belongs_to :label
validates :target, presence: true, unless: :importing? validates :target, presence: true, unless: :importing?
......
...@@ -8,7 +8,7 @@ class Member < ActiveRecord::Base ...@@ -8,7 +8,7 @@ class Member < ActiveRecord::Base
belongs_to :created_by, class_name: "User" belongs_to :created_by, class_name: "User"
belongs_to :user belongs_to :user
belongs_to :source, polymorphic: true belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
delegate :name, :username, :email, to: :user, prefix: true delegate :name, :username, :email, to: :user, prefix: true
......
...@@ -41,7 +41,7 @@ class Note < ActiveRecord::Base ...@@ -41,7 +41,7 @@ class Note < ActiveRecord::Base
participant :author participant :author
belongs_to :project belongs_to :project
belongs_to :noteable, polymorphic: true, touch: true belongs_to :noteable, polymorphic: true, touch: true # rubocop:disable Cop/PolymorphicAssociations
belongs_to :author, class_name: "User" belongs_to :author, class_name: "User"
belongs_to :updated_by, class_name: "User" belongs_to :updated_by, class_name: "User"
belongs_to :last_edited_by, class_name: 'User' belongs_to :last_edited_by, class_name: 'User'
......
...@@ -4,7 +4,7 @@ class NotificationSetting < ActiveRecord::Base ...@@ -4,7 +4,7 @@ class NotificationSetting < ActiveRecord::Base
default_value_for :level, NotificationSetting.levels[:global] default_value_for :level, NotificationSetting.levels[:global]
belongs_to :user belongs_to :user
belongs_to :source, polymorphic: true belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
belongs_to :project, foreign_key: 'source_id' belongs_to :project, foreign_key: 'source_id'
validates :user, presence: true validates :user, presence: true
......
...@@ -63,16 +63,6 @@ class Project < ActiveRecord::Base ...@@ -63,16 +63,6 @@ class Project < ActiveRecord::Base
# update visibility_level of forks # update visibility_level of forks
after_update :update_forks_visibility_level after_update :update_forks_visibility_level
def update_forks_visibility_level
return unless visibility_level < visibility_level_was
forks.each do |forked_project|
if forked_project.visibility_level > visibility_level
forked_project.visibility_level = visibility_level
forked_project.save!
end
end
end
after_validation :check_pending_delete after_validation :check_pending_delete
...@@ -165,7 +155,7 @@ class Project < ActiveRecord::Base ...@@ -165,7 +155,7 @@ class Project < ActiveRecord::Base
has_many :todos, dependent: :destroy has_many :todos, dependent: :destroy
has_many :notification_settings, dependent: :destroy, as: :source has_many :notification_settings, dependent: :destroy, as: :source
has_one :import_data, dependent: :delete, class_name: "ProjectImportData" has_one :import_data, dependent: :delete, class_name: 'ProjectImportData'
has_one :project_feature, dependent: :destroy has_one :project_feature, dependent: :destroy
has_one :statistics, class_name: 'ProjectStatistics', dependent: :delete has_one :statistics, class_name: 'ProjectStatistics', dependent: :delete
has_many :container_repositories, dependent: :destroy has_many :container_repositories, dependent: :destroy
...@@ -488,7 +478,11 @@ class Project < ActiveRecord::Base ...@@ -488,7 +478,11 @@ class Project < ActiveRecord::Base
ProjectCacheWorker.perform_async(self.id) ProjectCacheWorker.perform_async(self.id)
end end
self.import_data&.destroy remove_import_data
end
def remove_import_data
import_data&.destroy
end end
def import_url=(value) def import_url=(value)
...@@ -1060,6 +1054,17 @@ class Project < ActiveRecord::Base ...@@ -1060,6 +1054,17 @@ class Project < ActiveRecord::Base
!!repository.exists? !!repository.exists?
end end
def update_forks_visibility_level
return unless visibility_level < visibility_level_was
forks.each do |forked_project|
if forked_project.visibility_level > visibility_level
forked_project.visibility_level = visibility_level
forked_project.save!
end
end
end
def create_wiki def create_wiki
ProjectWiki.new(self, self.owner).wiki ProjectWiki.new(self, self.owner).wiki
true true
...@@ -1068,6 +1073,10 @@ class Project < ActiveRecord::Base ...@@ -1068,6 +1073,10 @@ class Project < ActiveRecord::Base
false false
end end
def wiki
@wiki ||= ProjectWiki.new(self, self.owner)
end
def jira_tracker_active? def jira_tracker_active?
jira_tracker? && jira_service.active jira_tracker? && jira_service.active
end end
...@@ -1190,10 +1199,6 @@ class Project < ActiveRecord::Base ...@@ -1190,10 +1199,6 @@ class Project < ActiveRecord::Base
end end
end end
def wiki
@wiki ||= ProjectWiki.new(self, self.owner)
end
def running_or_pending_build_count(force: false) def running_or_pending_build_count(force: false)
Rails.cache.fetch(['projects', id, 'running_or_pending_build_count'], force: force) do Rails.cache.fetch(['projects', id, 'running_or_pending_build_count'], force: force) do
builds.running_or_pending.count(:all) builds.running_or_pending.count(:all)
......
class RedirectRoute < ActiveRecord::Base class RedirectRoute < ActiveRecord::Base
belongs_to :source, polymorphic: true belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :source, presence: true validates :source, presence: true
......
...@@ -946,6 +946,8 @@ class Repository ...@@ -946,6 +946,8 @@ class Repository
end end
def is_ancestor?(ancestor_id, descendant_id) def is_ancestor?(ancestor_id, descendant_id)
return false if ancestor_id.nil? || descendant_id.nil?
Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled| Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled|
if is_enabled if is_enabled
raw_repository.is_ancestor?(ancestor_id, descendant_id) raw_repository.is_ancestor?(ancestor_id, descendant_id)
...@@ -1102,7 +1104,7 @@ class Repository ...@@ -1102,7 +1104,7 @@ class Repository
blob = blob_at(sha, path) blob = blob_at(sha, path)
return unless blob return unless blob
blob.load_all_data!(self) blob.load_all_data!
blob.data blob.data
end end
......
class Route < ActiveRecord::Base class Route < ActiveRecord::Base
belongs_to :source, polymorphic: true belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :source, presence: true validates :source, presence: true
......
...@@ -2,7 +2,7 @@ class SentNotification < ActiveRecord::Base ...@@ -2,7 +2,7 @@ class SentNotification < ActiveRecord::Base
serialize :position, Gitlab::Diff::Position # rubocop:disable Cop/ActiverecordSerialize serialize :position, Gitlab::Diff::Position # rubocop:disable Cop/ActiverecordSerialize
belongs_to :project belongs_to :project
belongs_to :noteable, polymorphic: true belongs_to :noteable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
belongs_to :recipient, class_name: "User" belongs_to :recipient, class_name: "User"
validates :project, :recipient, presence: true validates :project, :recipient, presence: true
......
class Subscription < ActiveRecord::Base class Subscription < ActiveRecord::Base
belongs_to :user belongs_to :user
belongs_to :project belongs_to :project
belongs_to :subscribable, polymorphic: true belongs_to :subscribable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :user, :subscribable, presence: true validates :user, :subscribable, presence: true
......
...@@ -22,7 +22,7 @@ class Todo < ActiveRecord::Base ...@@ -22,7 +22,7 @@ class Todo < ActiveRecord::Base
belongs_to :author, class_name: "User" belongs_to :author, class_name: "User"
belongs_to :note belongs_to :note
belongs_to :project belongs_to :project
belongs_to :target, polymorphic: true, touch: true belongs_to :target, polymorphic: true, touch: true # rubocop:disable Cop/PolymorphicAssociations
belongs_to :user belongs_to :user
delegate :name, :email, to: :author, prefix: true, allow_nil: true delegate :name, :email, to: :author, prefix: true, allow_nil: true
......
...@@ -2,7 +2,7 @@ class Upload < ActiveRecord::Base ...@@ -2,7 +2,7 @@ class Upload < ActiveRecord::Base
# Upper limit for foreground checksum processing # Upper limit for foreground checksum processing
CHECKSUM_THRESHOLD = 100.megabytes CHECKSUM_THRESHOLD = 100.megabytes
belongs_to :model, polymorphic: true belongs_to :model, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :size, presence: true validates :size, presence: true
validates :path, presence: true validates :path, presence: true
......
class UserAgentDetail < ActiveRecord::Base class UserAgentDetail < ActiveRecord::Base
belongs_to :subject, polymorphic: true belongs_to :subject, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :user_agent, :ip_address, :subject_id, :subject_type, presence: true validates :user_agent, :ip_address, :subject_id, :subject_type, presence: true
......
...@@ -57,6 +57,8 @@ module Ci ...@@ -57,6 +57,8 @@ module Ci
cancel_pending_pipelines if project.auto_cancel_pending_pipelines? cancel_pending_pipelines if project.auto_cancel_pending_pipelines?
pipeline_created_counter.increment(source: source)
pipeline.tap(&:process!) pipeline.tap(&:process!)
end end
...@@ -131,5 +133,9 @@ module Ci ...@@ -131,5 +133,9 @@ module Ci
pipeline.drop if save pipeline.drop if save
pipeline pipeline
end end
def pipeline_created_counter
@pipeline_created_counter ||= Gitlab::Metrics.counter(:pipelines_created_count, "Pipelines created count")
end
end end
end end
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
= webpack_bundle_tag "runtime" = webpack_bundle_tag "runtime"
= webpack_bundle_tag "common" = webpack_bundle_tag "common"
= webpack_bundle_tag "locale"
= webpack_bundle_tag "main" = webpack_bundle_tag "main"
= webpack_bundle_tag "raven" if current_application_settings.clientside_sentry_enabled = webpack_bundle_tag "raven" if current_application_settings.clientside_sentry_enabled
= webpack_bundle_tag "test" if Rails.env.test? = webpack_bundle_tag "test" if Rails.env.test?
......
...@@ -36,10 +36,7 @@ ...@@ -36,10 +36,7 @@
%li %li
= link_to admin_root_path, title: 'Admin area', aria: { label: "Admin area" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = link_to admin_root_path, title: 'Admin area', aria: { label: "Admin area" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= icon('wrench fw') = icon('wrench fw')
- if current_user.can_create_project? = render 'layouts/header/new_dropdown'
%li
= link_to new_project_path, title: 'New project', aria: { label: "New project" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= icon('plus fw')
- if Gitlab::Sherlock.enabled? - if Gitlab::Sherlock.enabled?
%li %li
= link_to sherlock_transactions_path, title: 'Sherlock Transactions', = link_to sherlock_transactions_path, title: 'Sherlock Transactions',
...@@ -74,12 +71,12 @@ ...@@ -74,12 +71,12 @@
@#{current_user.username} @#{current_user.username}
%li.divider %li.divider
%li %li
= link_to "Profile", current_user, class: 'profile-link', aria: { label: "Profile" }, data: { user: current_user.username } = link_to "Profile", current_user, class: 'profile-link', data: { user: current_user.username }
%li %li
= link_to "Settings", profile_path, aria: { label: "Settings" } = link_to "Settings", profile_path
%li.divider %li.divider
%li %li
= link_to "Sign out", destroy_user_session_path, method: :delete, class: "sign-out-link", aria: { label: "Sign out" } = link_to "Sign out", destroy_user_session_path, method: :delete, class: "sign-out-link"
- else - else
%li %li
%div %div
......
%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
= icon('plus fw')
= icon('caret-down')
.dropdown-menu-nav.dropdown-menu-align-right
%ul
- if @group
- create_group_project = can?(current_user, :create_projects, @group)
- create_group_subgroup = can?(current_user, :create_subgroup, @group)
- if create_group_project || create_group_subgroup
%li.dropdown-bold-header This group
- if create_group_project
%li.header-new-group-project
= link_to 'New project', new_project_path(namespace_id: @group.id)
- if create_group_subgroup
%li
= link_to 'New subgroup', new_group_path(parent_id: @group.id)
%li.divider
%li.dropdown-bold-header GitLab
- if @project && @project.persisted?
- create_project_issue = can?(current_user, :create_issue, @project)
- merge_project = can?(current_user, :create_merge_request, @project) ? @project : (current_user && current_user.fork_of(@project))
- create_project_snippet = can?(current_user, :create_project_snippet, @project)
- if create_project_issue || merge_project || create_project_snippet
%li.dropdown-bold-header This project
- if create_project_issue
%li
= link_to 'New issue', new_namespace_project_issue_path(@project.namespace, @project)
- if merge_project
%li
= link_to 'New merge request', new_namespace_project_merge_request_path(merge_project.namespace, merge_project)
- if create_project_snippet
%li.header-new-project-snippet
= link_to 'New snippet', new_namespace_project_snippet_path(@project.namespace, @project)
%li.divider
%li.dropdown-bold-header GitLab
- if current_user.can_create_project?
%li
= link_to 'New project', new_project_path
- if current_user.can_create_group?
%li
= link_to 'New group', new_group_path
%li
= link_to 'New snippet', new_snippet_path
= link_to namespace_project_find_file_path(@project.namespace, @project, @ref), class: 'btn btn-grouped shortcuts-find-file', rel: 'nofollow' do = link_to namespace_project_find_file_path(@project.namespace, @project, @ref), class: 'btn btn-grouped shortcuts-find-file', rel: 'nofollow' do
= icon('search') = icon('search')
%span Find file %span= _('Find file')
...@@ -4,17 +4,14 @@ ...@@ -4,17 +4,14 @@
.nav-links.sub-nav.scrolling-tabs .nav-links.sub-nav.scrolling-tabs
%ul{ class: container_class } %ul{ class: container_class }
= nav_link(path: 'projects#show') do = nav_link(path: 'projects#show') do
= link_to project_path(@project), title: 'Project home', class: 'shortcuts-project' do = link_to project_path(@project), title: _('Project home'), class: 'shortcuts-project' do
%span %span= _('Home')
Home
= nav_link(path: 'projects#activity') do = nav_link(path: 'projects#activity') do
= link_to activity_project_path(@project), title: 'Activity', class: 'shortcuts-project-activity' do = link_to activity_project_path(@project), title: _('Activity'), class: 'shortcuts-project-activity' do
%span %span= _('Activity')
Activity
- if can?(current_user, :read_cycle_analytics, @project) - if can?(current_user, :read_cycle_analytics, @project)
= nav_link(path: 'cycle_analytics#show') do = nav_link(path: 'cycle_analytics#show') do
= link_to project_cycle_analytics_path(@project), title: 'Cycle Analytics', class: 'shortcuts-project-cycle-analytics' do = link_to project_cycle_analytics_path(@project), title: _('Cycle Analytics'), class: 'shortcuts-project-cycle-analytics' do
%span %span= _('Cycle Analytics')
Cycle Analytics
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
- if forked_from_project = @project.forked_from_project - if forked_from_project = @project.forked_from_project
%p %p
Forked from #{ s_('ForkedFromProjectPath|Forked from') }
= link_to project_path(forked_from_project) do = link_to project_path(forked_from_project) do
= forked_from_project.namespace.try(:name) = forked_from_project.namespace.try(:name)
......
...@@ -15,4 +15,4 @@ ...@@ -15,4 +15,4 @@
.pull-right .pull-right
= link_to new_mr_path_from_push_event(event), title: "New merge request", class: "btn btn-info btn-sm" do = link_to new_mr_path_from_push_event(event), title: "New merge request", class: "btn btn-info btn-sm" do
Create merge request #{ _('Create merge request') }
...@@ -3,18 +3,18 @@ ...@@ -3,18 +3,18 @@
.modal-content .modal-content
.modal-header .modal-header
%a.close{ href: "#", "data-dismiss" => "modal" } × %a.close{ href: "#", "data-dismiss" => "modal" } ×
%h3.page-title Create New Directory %h3.page-title= _('Create New Directory')
.modal-body .modal-body
= form_tag namespace_project_create_dir_path(@project.namespace, @project, @id), method: :post, remote: false, class: 'form-horizontal js-create-dir-form js-quick-submit js-requires-input' do = form_tag namespace_project_create_dir_path(@project.namespace, @project, @id), method: :post, remote: false, class: 'form-horizontal js-create-dir-form js-quick-submit js-requires-input' do
.form-group .form-group
= label_tag :dir_name, 'Directory name', class: 'control-label' = label_tag :dir_name, _('Directory name'), class: 'control-label'
.col-sm-10 .col-sm-10
= text_field_tag :dir_name, params[:dir_name], required: true, class: 'form-control' = text_field_tag :dir_name, params[:dir_name], required: true, class: 'form-control'
= render 'shared/new_commit_form', placeholder: "Add new directory" = render 'shared/new_commit_form', placeholder: _("Add new directory")
.form-actions .form-actions
= submit_tag "Create directory", class: 'btn btn-create' = submit_tag _("Create directory"), class: 'btn btn-create'
= link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal"
- unless can?(current_user, :push_code, @project) - unless can?(current_user, :push_code, @project)
......
...@@ -2,29 +2,29 @@ ...@@ -2,29 +2,29 @@
- if !project.empty_repo? && can?(current_user, :download_code, project) - if !project.empty_repo? && can?(current_user, :download_code, project)
.project-action-button.dropdown.inline> .project-action-button.dropdown.inline>
%button.btn.has-tooltip{ title: 'Download', 'data-toggle' => 'dropdown', 'aria-label' => 'Download' } %button.btn.has-tooltip{ title: 'Download', 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download') }
= icon('download') = icon('download')
= icon("caret-down") = icon("caret-down")
%span.sr-only %span.sr-only= _('Select Archive Format')
Select Archive Format
%ul.dropdown-menu.dropdown-menu-align-right{ role: 'menu' } %ul.dropdown-menu.dropdown-menu-align-right{ role: 'menu' }
%li.dropdown-header Source code %li.dropdown-header
#{ _('Source code') }
%li %li
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'zip'), rel: 'nofollow', download: '' do = link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'zip'), rel: 'nofollow', download: '' do
%i.fa.fa-download %i.fa.fa-download
%span Download zip %span= _('Download zip')
%li %li
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar.gz'), rel: 'nofollow', download: '' do = link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar.gz'), rel: 'nofollow', download: '' do
%i.fa.fa-download %i.fa.fa-download
%span Download tar.gz %span= _('Download tar.gz')
%li %li
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar.bz2'), rel: 'nofollow', download: '' do = link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar.bz2'), rel: 'nofollow', download: '' do
%i.fa.fa-download %i.fa.fa-download
%span Download tar.bz2 %span= _('Download tar.bz2')
%li %li
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar'), rel: 'nofollow', download: '' do = link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar'), rel: 'nofollow', download: '' do
%i.fa.fa-download %i.fa.fa-download
%span Download tar %span= _('Download tar')
- if pipeline - if pipeline
- artifacts = pipeline.builds.latest.with_artifacts - artifacts = pipeline.builds.latest.with_artifacts
...@@ -39,4 +39,5 @@ ...@@ -39,4 +39,5 @@
%li %li
= link_to latest_succeeded_namespace_project_artifacts_path(project.namespace, project, "#{ref}/download", job: job.name), rel: 'nofollow', download: '' do = link_to latest_succeeded_namespace_project_artifacts_path(project.namespace, project, "#{ref}/download", job: job.name), rel: 'nofollow', download: '' do
%i.fa.fa-download %i.fa.fa-download
%span Download '#{job.name}' %span
#{ s_('DownloadArtifacts|Download') } '#{job.name}'
...@@ -12,19 +12,19 @@ ...@@ -12,19 +12,19 @@
%li %li
= link_to new_namespace_project_issue_path(@project.namespace, @project) do = link_to new_namespace_project_issue_path(@project.namespace, @project) do
= icon('exclamation-circle fw') = icon('exclamation-circle fw')
New issue #{ _('New issue') }
- if merge_project - if merge_project
%li %li
= link_to new_namespace_project_merge_request_path(merge_project.namespace, merge_project) do = link_to new_namespace_project_merge_request_path(merge_project.namespace, merge_project) do
= icon('tasks fw') = icon('tasks fw')
New merge request #{ _('New merge request') }
- if can_create_snippet - if can_create_snippet
%li %li
= link_to new_namespace_project_snippet_path(@project.namespace, @project) do = link_to new_namespace_project_snippet_path(@project.namespace, @project) do
= icon('file-text-o fw') = icon('file-text-o fw')
New snippet #{ _('New snippet') }
- if can_create_issue || merge_project || can_create_snippet - if can_create_issue || merge_project || can_create_snippet
%li.divider %li.divider
...@@ -33,20 +33,20 @@ ...@@ -33,20 +33,20 @@
%li %li
= link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do = link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do
= icon('file fw') = icon('file fw')
New file #{ _('New file') }
%li %li
= link_to new_namespace_project_branch_path(@project.namespace, @project) do = link_to new_namespace_project_branch_path(@project.namespace, @project) do
= icon('code-fork fw') = icon('code-fork fw')
New branch #{ _('New branch') }
%li %li
= link_to new_namespace_project_tag_path(@project.namespace, @project) do = link_to new_namespace_project_tag_path(@project.namespace, @project) do
= icon('tags fw') = icon('tags fw')
New tag #{ _('New tag') }
- elsif current_user && current_user.already_forked?(@project) - elsif current_user && current_user.already_forked?(@project)
%li %li
= link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do = link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do
= icon('file fw') = icon('file fw')
New file #{ _('New file') }
- elsif can?(current_user, :fork_project, @project) - elsif can?(current_user, :fork_project, @project)
%li %li
- continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master'), - continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master'),
...@@ -56,4 +56,4 @@ ...@@ -56,4 +56,4 @@
continue: continue_params) continue: continue_params)
= link_to fork_path, method: :post do = link_to fork_path, method: :post do
= icon('file fw') = icon('file fw')
New file #{ _('New file') }
- unless @project.empty_repo? - unless @project.empty_repo?
- if current_user && can?(current_user, :fork_project, @project) - if current_user && can?(current_user, :fork_project, @project)
- if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2
= link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn has-tooltip' do = 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') = custom_icon('icon_fork')
%span Fork %span= s_('GoToYourFork|Fork')
- else - else
= link_to new_namespace_project_fork_path(@project.namespace, @project), class: 'btn' do = link_to new_namespace_project_fork_path(@project.namespace, @project), class: 'btn' do
= custom_icon('icon_fork') = custom_icon('icon_fork')
%span Fork %span= s_('CreateNewFork|Fork')
.count-with-arrow .count-with-arrow
%span.arrow %span.arrow
= link_to namespace_project_forks_path(@project.namespace, @project), title: 'Forks', class: 'count' do = link_to namespace_project_forks_path(@project.namespace, @project), title: n_('Forks', @project.forks_count), class: 'count' do
= @project.forks_count = @project.forks_count
- if koding_enabled? && current_user && @repository.koding_yml && can_push_branch?(@project, @project.default_branch) - if koding_enabled? && current_user && @repository.koding_yml && can_push_branch?(@project, @project.default_branch)
= link_to koding_project_url(@project), class: 'btn project-action-button inline', target: '_blank', rel: 'noopener noreferrer' do = link_to koding_project_url(@project), class: 'btn project-action-button inline', target: '_blank', rel: 'noopener noreferrer' do
Run in IDE (Koding) _('Run in IDE (Koding)')
...@@ -2,19 +2,19 @@ ...@@ -2,19 +2,19 @@
= link_to toggle_star_namespace_project_path(@project.namespace, @project), { class: 'btn star-btn toggle-star', method: :post, remote: true } do = link_to toggle_star_namespace_project_path(@project.namespace, @project), { class: 'btn star-btn toggle-star', method: :post, remote: true } do
- if current_user.starred?(@project) - if current_user.starred?(@project)
= icon('star') = icon('star')
%span.starred Unstar %span.starred= _('Unstar')
- else - else
= icon('star-o') = icon('star-o')
%span Star %span= s_('StarProject|Star')
.count-with-arrow .count-with-arrow
%span.arrow %span.arrow
%span.count.star-count %span.count.star-count
= @project.star_count = @project.star_count
- else - else
= link_to new_user_session_path, class: 'btn has-tooltip star-btn', title: 'You must sign in to star a project' do = link_to new_user_session_path, class: 'btn has-tooltip star-btn', title: _('You must sign in to star a project') do
= icon('star') = icon('star')
Star #{ s_('StarProject|Star') }
.count-with-arrow .count-with-arrow
%span.arrow %span.arrow
%span.count %span.count
......
...@@ -31,12 +31,12 @@ ...@@ -31,12 +31,12 @@
= preserve(markdown(commit.description, pipeline: :single_line, author: commit.author)) = preserve(markdown(commit.description, pipeline: :single_line, author: commit.author))
.commiter .commiter
= commit_author_link(commit, avatar: false, size: 24) = commit_author_link(commit, avatar: false, size: 24)
committed #{ _('committed') }
#{time_ago_with_tooltip(commit.committed_date)} #{time_ago_with_tooltip(commit.committed_date)}
.commit-actions.flex-row.hidden-xs .commit-actions.flex-row.hidden-xs
- if commit.status(ref) - if commit.status(ref)
= render_commit_status(commit, ref: ref) = render_commit_status(commit, ref: ref)
= link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit-sha btn btn-transparent" = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit-sha btn btn-transparent"
= clipboard_button(text: commit.id, title: "Copy commit SHA to clipboard") = clipboard_button(text: commit.id, title: _("Copy commit SHA to clipboard"))
= link_to_browse_code(project, commit) = link_to_browse_code(project, commit)
...@@ -5,32 +5,32 @@ ...@@ -5,32 +5,32 @@
%ul{ class: (container_class) } %ul{ class: (container_class) }
= nav_link(controller: %w(tree blob blame edit_tree new_tree find_file)) do = nav_link(controller: %w(tree blob blame edit_tree new_tree find_file)) do
= link_to project_files_path(@project) do = link_to project_files_path(@project) do
Files #{ _('Files') }
= nav_link(controller: [:commit, :commits]) do = nav_link(controller: [:commit, :commits]) do
= link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
Commits #{ _('Commits') }
= nav_link(html_options: {class: branches_tab_class}) do = nav_link(html_options: {class: branches_tab_class}) do
= link_to namespace_project_branches_path(@project.namespace, @project) do = link_to namespace_project_branches_path(@project.namespace, @project) do
Branches #{ _('Branches') }
= nav_link(controller: [:tags, :releases]) do = nav_link(controller: [:tags, :releases]) do
= link_to namespace_project_tags_path(@project.namespace, @project) do = link_to namespace_project_tags_path(@project.namespace, @project) do
Tags #{ _('Tags') }
= nav_link(path: 'graphs#show') do = nav_link(path: 'graphs#show') do
= link_to namespace_project_graph_path(@project.namespace, @project, current_ref) do = link_to namespace_project_graph_path(@project.namespace, @project, current_ref) do
Contributors #{ _('Contributors') }
= nav_link(controller: %w(network)) do = nav_link(controller: %w(network)) do
= link_to namespace_project_network_path(@project.namespace, @project, current_ref) do = link_to namespace_project_network_path(@project.namespace, @project, current_ref) do
Graph #{ s_('ProjectNetworkGraph|Graph') }
= nav_link(controller: :compare) do = nav_link(controller: :compare) do
= link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: current_ref) do = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: current_ref) do
Compare #{ _('Compare') }
= nav_link(path: 'graphs#charts') do = nav_link(path: 'graphs#charts') do
= link_to charts_namespace_project_graph_path(@project.namespace, @project, current_ref) do = link_to charts_namespace_project_graph_path(@project.namespace, @project, current_ref) do
Charts #{ _('Charts') }
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
- page_title "Cycle Analytics" - page_title "Cycle Analytics"
- content_for :page_specific_javascripts do - content_for :page_specific_javascripts do
= page_specific_javascript_bundle_tag('common_vue') = page_specific_javascript_bundle_tag('common_vue')
= page_specific_javascript_bundle_tag('locale')
= page_specific_javascript_bundle_tag('cycle_analytics') = page_specific_javascript_bundle_tag('cycle_analytics')
= render "projects/head" = render "projects/head"
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
%button.dropdown.dropdown-new.btn.btn-default{ type: 'button', 'data-toggle' => 'dropdown' } %button.dropdown.dropdown-new.btn.btn-default{ type: 'button', 'data-toggle' => 'dropdown' }
= custom_icon('icon_play') = custom_icon('icon_play')
= icon('caret-down') = icon('caret-down')
%ul.dropdown-menu %ul.dropdown-menu.dropdown-menu-align-right
- actions.each do |action| - actions.each do |action|
- next unless can?(current_user, :update_build, action) - next unless can?(current_user, :update_build, action)
%li %li
......
.branch-commit .table-mobile-content
.branch-commit
- if deployment.ref - if deployment.ref
%span.icon-container %span.icon-container
= deployment.tag? ? icon('tag') : icon('code-fork') = deployment.tag? ? icon('tag') : icon('code-fork')
......
.gl-responsive-table-row.deployment .gl-responsive-table-row.deployment{ role: 'row' }
.table-section.section-10{ role: 'gridcell' } .table-section.section-10{ role: 'gridcell' }
%strong ##{deployment.iid} .table-mobile-header{ role: 'rowheader' } ID
%strong.table-mobile-content ##{deployment.iid}
.table-section.section-40{ role: 'gridcell' } .table-section.section-40{ role: 'gridcell' }
.table-mobile-header{ role: 'rowheader' } Commit
= render 'projects/deployments/commit', deployment: deployment = render 'projects/deployments/commit', deployment: deployment
.table-section.section-15.build-column{ role: 'gridcell' } .table-section.section-15.build-column{ role: 'gridcell' }
.table-mobile-header{ role: 'rowheader' } Job
- if deployment.deployable - if deployment.deployable
= link_to [@project.namespace.becomes(Namespace), @project, deployment.deployable], class: 'build-link' do = link_to [@project.namespace.becomes(Namespace), @project, deployment.deployable], class: 'build-link table-mobile-content' do
#{deployment.deployable.name} (##{deployment.deployable.id}) #{deployment.deployable.name} (##{deployment.deployable.id})
- if deployment.user - if deployment.user
by by
= user_avatar(user: deployment.user, size: 20) = user_avatar(user: deployment.user, size: 20)
.table-section.section-15{ role: 'gridcell' } .table-section.section-15{ role: 'gridcell' }
#{time_ago_with_tooltip(deployment.created_at)} .table-mobile-header{ role: 'rowheader' } Created
%span.table-mobile-content= time_ago_with_tooltip(deployment.created_at)
.table-section.section-20.environments-actions.table-button-footer{ role: 'gridcell' } .table-section.section-20.environments-actions.table-button-footer{ role: 'gridcell' }
.btn-group.environment-action-buttons .btn-group.environment-action-buttons
......
- blob = diff_file.blob - blob = diff_file.blob
- blob.load_all_data!(diff_file.repository) - blob.load_all_data!
- total_lines = blob.lines.size - total_lines = blob.lines.size
- total_lines -= 1 if total_lines > 0 && blob.lines.last.blank? - total_lines -= 1 if total_lines > 0 && blob.lines.last.blank?
- if diff_view == :parallel - if diff_view == :parallel
......
...@@ -28,12 +28,12 @@ ...@@ -28,12 +28,12 @@
= link_to "Read more", help_page_path("ci/environments"), class: "btn btn-success" = link_to "Read more", help_page_path("ci/environments"), class: "btn btn-success"
- else - else
.table-holder .table-holder
.ci-table.environments .ci-table.environments{ role: 'grid' }
.gl-responsive-table-row.table-row-header{ role: 'row' } .gl-responsive-table-row.table-row-header{ role: 'row' }
.table-section.section-10{ role: 'rollheader' } ID .table-section.section-10{ role: 'columnheader' } ID
.table-section.section-40{ role: 'rollheader' } Commit .table-section.section-40{ role: 'columnheader' } Commit
.table-section.section-15{ role: 'rollheader' } Job .table-section.section-15{ role: 'columnheader' } Job
.table-section.section-15{ role: 'rollheader' } Created .table-section.section-15{ role: 'columnheader' } Created
= render @deployments = render @deployments
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
= link_to namespace_project_tree_path(@project.namespace, @project, @ref) do = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do
= @project.path = @project.path
%li.file-finder %li.file-finder
%input#file_find.form-control.file-finder-input{ type: "text", placeholder: 'Find by path', autocomplete: 'off' } %input#file_find.form-control.file-finder-input{ type: "text", placeholder: _('Find by path'), autocomplete: 'off' }
.tree-content-holder .tree-content-holder
.table-holder .table-holder
......
%h2 %h2
%i.fa.fa-warning %i.fa.fa-warning
No repository #{ _('No repository') }
%p.slead %p.slead
The repository for this project does not exist. #{ _('The repository for this project does not exist.') }
%br %br
This means you can not push code until you create an empty repository or import existing one. #{ _('This means you can not push code until you create an empty repository or import existing one.') }
%hr %hr
.no-repo-actions .no-repo-actions
= link_to namespace_project_repository_path(@project.namespace, @project), method: :post, class: 'btn btn-primary' do = link_to namespace_project_repository_path(@project.namespace, @project), method: :post, class: 'btn btn-primary' do
Create empty bare repository #{ _('Create empty bare repository') }
%strong.prepend-left-10.append-right-10 or %strong.prepend-left-10.append-right-10 or
= link_to new_namespace_project_import_path(@project.namespace, @project), class: 'btn' do = link_to new_namespace_project_import_path(@project.namespace, @project), class: 'btn' do
Import repository #{ _('Import repository') }
- if can? current_user, :remove_project, @project - if can? current_user, :remove_project, @project
.prepend-top-20 .prepend-top-20
= link_to 'Remove project', project_path(@project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" = link_to _('Remove project'), project_path(@project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right"
...@@ -6,28 +6,28 @@ ...@@ -6,28 +6,28 @@
= form_errors(@schedule) = form_errors(@schedule)
.form-group .form-group
.col-md-9 .col-md-9
= f.label :description, 'Description', class: 'label-light' = f.label :description, _('Description'), class: 'label-light'
= f.text_field :description, class: 'form-control', required: true, autofocus: true, placeholder: 'Provide a short description for this pipeline' = f.text_field :description, class: 'form-control', required: true, autofocus: true, placeholder: _('PipelineSchedules|Provide a short description for this pipeline')
.form-group .form-group
.col-md-9 .col-md-9
= f.label :cron, 'Interval Pattern', class: 'label-light' = f.label :cron, _('Interval Pattern'), class: 'label-light'
#interval-pattern-input{ data: { initial_interval: @schedule.cron } } #interval-pattern-input{ data: { initial_interval: @schedule.cron } }
.form-group .form-group
.col-md-9 .col-md-9
= f.label :cron_timezone, 'Cron Timezone', class: 'label-light' = f.label :cron_timezone, _('Cron Timezone'), class: 'label-light'
= dropdown_tag("Select a timezone", options: { toggle_class: 'btn js-timezone-dropdown', title: "Select a timezone", filter: true, placeholder: "Filter", data: { data: timezone_data } } ) = dropdown_tag(_("Select a timezone"), options: { toggle_class: 'btn js-timezone-dropdown', title: _("Select a timezone"), filter: true, placeholder: _("Filter"), data: { data: timezone_data } } )
= f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true = f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true
.form-group .form-group
.col-md-9 .col-md-9
= f.label :ref, 'Target Branch', class: 'label-light' = f.label :ref, _('Target Branch'), class: 'label-light'
= dropdown_tag("Select target branch", options: { toggle_class: 'btn js-target-branch-dropdown git-revision-dropdown-toggle', dropdown_class: 'git-revision-dropdown', title: "Select target branch", filter: true, placeholder: "Filter", data: { data: @project.repository.branch_names, default_branch: @project.default_branch } } ) = dropdown_tag(_("Select target branch"), options: { toggle_class: 'btn js-target-branch-dropdown git-revision-dropdown-toggle', dropdown_class: 'git-revision-dropdown', title: _("Select target branch"), filter: true, placeholder: _("Filter"), data: { data: @project.repository.branch_names, default_branch: @project.default_branch } } )
= f.text_field :ref, value: @schedule.ref, id: 'schedule_ref', class: 'hidden', name: 'schedule[ref]', required: true = f.text_field :ref, value: @schedule.ref, id: 'schedule_ref', class: 'hidden', name: 'schedule[ref]', required: true
.form-group .form-group
.col-md-9 .col-md-9
= f.label :active, 'Activated', class: 'label-light' = f.label :active, _('PipelineSchedules|Activated'), class: 'label-light'
%div %div
= f.check_box :active, required: false, value: @schedule.active? = f.check_box :active, required: false, value: @schedule.active?
Active Active
.footer-block.row-content-block .footer-block.row-content-block
= f.submit 'Save pipeline schedule', class: 'btn btn-create', tabindex: 3 = f.submit _('Save pipeline schedule'), class: 'btn btn-create', tabindex: 3
= link_to 'Cancel', pipeline_schedules_path(@project), class: 'btn btn-cancel' = link_to _('Cancel'), pipeline_schedules_path(@project), class: 'btn btn-cancel'
...@@ -13,12 +13,12 @@ ...@@ -13,12 +13,12 @@
= ci_icon_for_status(pipeline_schedule.last_pipeline.status) = ci_icon_for_status(pipeline_schedule.last_pipeline.status)
%span ##{pipeline_schedule.last_pipeline.id} %span ##{pipeline_schedule.last_pipeline.id}
- else - else
None = _("PipelineSchedules|None")
%td.next-run-cell %td.next-run-cell
- if pipeline_schedule.active? - if pipeline_schedule.active?
= time_ago_with_tooltip(pipeline_schedule.real_next_run) = time_ago_with_tooltip(pipeline_schedule.real_next_run)
- else - else
Inactive = _("PipelineSchedules|Inactive")
%td %td
- if pipeline_schedule.owner - if pipeline_schedule.owner
= image_tag avatar_icon(pipeline_schedule.owner, 20), class: "avatar s20" = image_tag avatar_icon(pipeline_schedule.owner, 20), class: "avatar s20"
...@@ -27,11 +27,11 @@ ...@@ -27,11 +27,11 @@
%td %td
.pull-right.btn-group .pull-right.btn-group
- if can?(current_user, :update_pipeline_schedule, @project) && !pipeline_schedule.owned_by?(current_user) - if can?(current_user, :update_pipeline_schedule, @project) && !pipeline_schedule.owned_by?(current_user)
= link_to take_ownership_pipeline_schedule_path(pipeline_schedule), method: :post, title: 'Take Ownership', class: 'btn' do = link_to take_ownership_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('PipelineSchedules|Take ownership'), class: 'btn' do
Take ownership = s_('PipelineSchedules|Take ownership')
- if can?(current_user, :update_pipeline_schedule, pipeline_schedule) - if can?(current_user, :update_pipeline_schedule, pipeline_schedule)
= link_to edit_pipeline_schedule_path(pipeline_schedule), title: 'Edit', class: 'btn' do = link_to edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), class: 'btn' do
= icon('pencil') = icon('pencil')
- if can?(current_user, :admin_pipeline_schedule, pipeline_schedule) - if can?(current_user, :admin_pipeline_schedule, pipeline_schedule)
= link_to pipeline_schedule_path(pipeline_schedule), title: 'Delete', method: :delete, class: 'btn btn-remove', data: { confirm: "Are you sure you want to cancel this pipeline?" } do = link_to pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, class: 'btn btn-remove', data: { confirm: _("Are you sure you want to delete this pipeline schedule?") } do
= icon('trash') = icon('trash')
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
%table.table.ci-table %table.table.ci-table
%thead %thead
%tr %tr
%th Description %th= _("Description")
%th Target %th= s_("PipelineSchedules|Target")
%th Last Pipeline %th= _("Last Pipeline")
%th Next Run %th= s_("PipelineSchedules|Next Run")
%th Owner %th= _("Owner")
%th %th
= render partial: "pipeline_schedule", collection: @schedules = render partial: "pipeline_schedule", collection: @schedules
%ul.nav-links %ul.nav-links
%li{ class: active_when(scope.nil?) }> %li{ class: active_when(scope.nil?) }>
= link_to schedule_path_proc.call(nil) do = link_to schedule_path_proc.call(nil) do
All = s_("PipelineSchedules|All")
%span.badge.js-totalbuilds-count %span.badge.js-totalbuilds-count
= number_with_delimiter(all_schedules.count(:id)) = number_with_delimiter(all_schedules.count(:id))
%li{ class: active_when(scope == 'active') }> %li{ class: active_when(scope == 'active') }>
= link_to schedule_path_proc.call('active') do = link_to schedule_path_proc.call('active') do
Active = s_("PipelineSchedules|Active")
%span.badge %span.badge
= number_with_delimiter(all_schedules.active.count(:id)) = number_with_delimiter(all_schedules.active.count(:id))
%li{ class: active_when(scope == 'inactive') }> %li{ class: active_when(scope == 'inactive') }>
= link_to schedule_path_proc.call('inactive') do = link_to schedule_path_proc.call('inactive') do
Inactive = s_("PipelineSchedules|Inactive")
%span.badge %span.badge
= number_with_delimiter(all_schedules.inactive.count(:id)) = number_with_delimiter(all_schedules.inactive.count(:id))
- page_title "Edit", @schedule.description, "Pipeline Schedule" - page_title _("Edit"), @schedule.description, _("Pipeline Schedule")
%h3.page-title %h3.page-title
Edit Pipeline Schedule #{@schedule.id} = _("Edit Pipeline Schedule %{id}") % { id: @schedule.id }
%hr %hr
= render "form" = render "form"
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
= webpack_bundle_tag 'schedules_index' = webpack_bundle_tag 'schedules_index'
- @no_container = true - @no_container = true
- page_title "Pipeline Schedules" - page_title _("Pipeline Schedules")
= render "projects/pipelines/head" = render "projects/pipelines/head"
%div{ class: container_class } %div{ class: container_class }
...@@ -21,4 +21,4 @@ ...@@ -21,4 +21,4 @@
= render partial: "table" = render partial: "table"
- else - else
.light-well .light-well
.nothing-here-block No schedules .nothing-here-block= _("No schedules")
- page_title "New Pipeline Schedule" - page_title _("New Pipeline Schedule")
%h3.page-title %h3.page-title
Schedule a new pipeline = _("Schedule a new pipeline")
%hr %hr
= render "form" = render "form"
...@@ -17,24 +17,24 @@ ...@@ -17,24 +17,24 @@
%ul.nav %ul.nav
%li %li
= link_to project_files_path(@project) do = link_to project_files_path(@project) do
Files (#{storage_counter(@project.statistics.total_repository_size)}) #{_('Files')} (#{storage_counter(@project.statistics.total_repository_size)})
%li %li
= link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
#{'Commit'.pluralize(@project.statistics.commit_count)} (#{number_with_delimiter(@project.statistics.commit_count)}) #{n_('Commit', 'Commits', @project.statistics.commit_count)} (#{number_with_delimiter(@project.statistics.commit_count)})
%li %l
= link_to namespace_project_branches_path(@project.namespace, @project) do = link_to namespace_project_branches_path(@project.namespace, @project) do
#{'Branch'.pluralize(@repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)}) #{n_('Branch', 'Branches', @repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)})
%li %li
= link_to namespace_project_tags_path(@project.namespace, @project) do = link_to namespace_project_tags_path(@project.namespace, @project) do
#{'Tag'.pluralize(@repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)}) #{n_('Tag', 'Tags', @repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)})
- if default_project_view != 'readme' && @repository.readme - if default_project_view != 'readme' && @repository.readme
%li %li
= link_to 'Readme', readme_path(@project) = link_to _('Readme'), readme_path(@project)
- if @repository.changelog - if @repository.changelog
%li %li
= link_to 'Changelog', changelog_path(@project) = link_to _('Changelog'), changelog_path(@project)
- if @repository.license_blob - if @repository.license_blob
%li %li
...@@ -42,43 +42,43 @@ ...@@ -42,43 +42,43 @@
- if @repository.contribution_guide - if @repository.contribution_guide
%li %li
= link_to 'Contribution guide', contribution_guide_path(@project) = link_to _('Contribution guide'), contribution_guide_path(@project)
- if @repository.gitlab_ci_yml - if @repository.gitlab_ci_yml
%li %li
= link_to 'CI configuration', ci_configuration_path(@project) = link_to _('CI configuration'), ci_configuration_path(@project)
- if current_user && can_push_branch?(@project, @project.default_branch) - if current_user && can_push_branch?(@project, @project.default_branch)
- unless @repository.changelog - unless @repository.changelog
%li.missing %li.missing
= link_to add_special_file_path(@project, file_name: 'CHANGELOG') do = link_to add_special_file_path(@project, file_name: 'CHANGELOG') do
Add Changelog #{ _('Add Changelog') }
- unless @repository.license_blob - unless @repository.license_blob
%li.missing %li.missing
= link_to add_special_file_path(@project, file_name: 'LICENSE') do = link_to add_special_file_path(@project, file_name: 'LICENSE') do
Add License #{ _('Add License') }
- unless @repository.contribution_guide - unless @repository.contribution_guide
%li.missing %li.missing
= link_to add_special_file_path(@project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') do = link_to add_special_file_path(@project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') do
Add Contribution guide #{ _('Add Contribution guide') }
- unless @repository.gitlab_ci_yml - unless @repository.gitlab_ci_yml
%li.missing %li.missing
= link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do
Set up CI #{ _('Set up CI') }
- if koding_enabled? && @repository.koding_yml.blank? - if koding_enabled? && @repository.koding_yml.blank?
%li.missing %li.missing
= link_to 'Set up Koding', add_koding_stack_path(@project) = link_to _('Set up Koding'), add_koding_stack_path(@project)
- if @repository.gitlab_ci_yml.blank? && @project.deployment_service.present? - if @repository.gitlab_ci_yml.blank? && @project.deployment_service.present?
%li.missing %li.missing
= link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml', commit_message: 'Set up auto deploy', branch_name: 'auto-deploy', context: 'autodeploy') do = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml', commit_message: 'Set up auto deploy', branch_name: 'auto-deploy', context: 'autodeploy') do
Set up auto deploy #{ _('Set up auto deploy') }
%div{ class: container_class } %div{ class: container_class }
- if @project.archived? - if @project.archived?
.text-warning.center.prepend-top-20 .text-warning.center.prepend-top-20
%p %p
= icon("exclamation-triangle fw") = icon("exclamation-triangle fw")
Archived project! Repository is read-only #{ _('Archived project! Repository is read-only') }
- view_path = default_project_view - view_path = default_project_view
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
%table.table#tree-slider{ class: "table_#{@hex_path} tree-table" } %table.table#tree-slider{ class: "table_#{@hex_path} tree-table" }
%thead %thead
%tr %tr
%th Name %th= s_('ProjectFileTree|Name')
%th.hidden-xs %th.hidden-xs
.pull-left Last commit .pull-left= _('Last commit')
%th.text-right Last Update %th.text-right= _('Last Update')
- if @path.present? - if @path.present?
%tr.tree-item %tr.tree-item
%td.tree-item-file-name %td.tree-item-file-name
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
= render "projects/tree/readme", readme: tree.readme = render "projects/tree/readme", readme: tree.readme
- if can_edit_tree? - if can_edit_tree?
= render 'projects/blob/upload', title: 'Upload New File', placeholder: 'Upload new file', button_title: 'Upload file', form_path: namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post = render 'projects/blob/upload', title: _('Upload New File'), placeholder: _('Upload New File'), button_title: _('Upload file'), form_path: namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post
= render 'projects/blob/new_dir' = render 'projects/blob/new_dir'
:javascript :javascript
......
.tree-controls .tree-controls
= render 'projects/find_file_link' = render 'projects/find_file_link'
= link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), class: 'btn btn-grouped' = link_to s_('Commits|History'), namespace_project_commits_path(@project.namespace, @project, @id), class: 'btn btn-grouped'
= render 'projects/buttons/download', project: @project, ref: @ref = render 'projects/buttons/download', project: @project, ref: @ref
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
- if current_user - if current_user
%li %li
- if !on_top_of_branch? - if !on_top_of_branch?
%span.btn.add-to-tree.disabled.has-tooltip{ title: "You can only add files when you are on a branch", data: { container: 'body' } } %span.btn.add-to-tree.disabled.has-tooltip{ title: _("You can only add files when you are on a branch"), data: { container: 'body' } }
= icon('plus') = icon('plus')
- else - else
%span.dropdown %span.dropdown
...@@ -30,15 +30,15 @@ ...@@ -30,15 +30,15 @@
%li %li
= link_to namespace_project_new_blob_path(@project.namespace, @project, @id) do = link_to namespace_project_new_blob_path(@project.namespace, @project, @id) do
= icon('pencil fw') = icon('pencil fw')
New file #{ _('New file') }
%li %li
= link_to '#modal-upload-blob', { 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal' } do = link_to '#modal-upload-blob', { 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal' } do
= icon('file fw') = icon('file fw')
Upload file #{ _('Upload file') }
%li %li
= link_to '#modal-create-new-dir', { 'data-target' => '#modal-create-new-dir', 'data-toggle' => 'modal' } do = link_to '#modal-create-new-dir', { 'data-target' => '#modal-create-new-dir', 'data-toggle' => 'modal' } do
= icon('folder fw') = icon('folder fw')
New directory #{ _('New directory') }
- elsif can?(current_user, :fork_project, @project) - elsif can?(current_user, :fork_project, @project)
%li %li
- continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @id), - continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @id),
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
continue: continue_params) continue: continue_params)
= link_to fork_path, method: :post do = link_to fork_path, method: :post do
= icon('pencil fw') = icon('pencil fw')
New file #{ _('New file') }
%li %li
- continue_params = { to: request.fullpath, - continue_params = { to: request.fullpath,
notice: edit_in_new_fork_notice + " Try to upload a file again.", notice: edit_in_new_fork_notice + " Try to upload a file again.",
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
continue: continue_params) continue: continue_params)
= link_to fork_path, method: :post do = link_to fork_path, method: :post do
= icon('file fw') = icon('file fw')
Upload file #{ _('Upload file') }
%li %li
- continue_params = { to: request.fullpath, - continue_params = { to: request.fullpath,
notice: edit_in_new_fork_notice + " Try to create a new directory again.", notice: edit_in_new_fork_notice + " Try to create a new directory again.",
...@@ -66,14 +66,14 @@ ...@@ -66,14 +66,14 @@
continue: continue_params) continue: continue_params)
= link_to fork_path, method: :post do = link_to fork_path, method: :post do
= icon('folder fw') = icon('folder fw')
New directory #{ _('New directory') }
%li.divider %li.divider
%li %li
= link_to new_namespace_project_branch_path(@project.namespace, @project) do = link_to new_namespace_project_branch_path(@project.namespace, @project) do
= icon('code-fork fw') = icon('code-fork fw')
New branch #{ _('New branch') }
%li %li
= link_to new_namespace_project_tag_path(@project.namespace, @project) do = link_to new_namespace_project_tag_path(@project.namespace, @project) do
= icon('tags fw') = icon('tags fw')
New tag #{ _('New tag') }
- @no_container = true - @no_container = true
- page_title @path.presence || "Files", @ref - page_title @path.presence || _("Files"), @ref
= content_for :meta_tags do = content_for :meta_tags do
= auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, rss_url_options), title: "#{@project.name}:#{@ref} commits") = auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, rss_url_options), title: "#{@project.name}:#{@ref} commits")
= render "projects/commits/head" = render "projects/commits/head"
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
= text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: 'Project clone URL' } = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: 'Project clone URL' }
.input-group-btn .input-group-btn
= clipboard_button(target: '#project_clone', title: "Copy URL to clipboard") = clipboard_button(target: '#project_clone', title: _("Copy URL to clipboard"))
:javascript :javascript
$('ul.clone-options-dropdown a').on('click',function(e){ $('ul.clone-options-dropdown a').on('click',function(e){
......
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
%a.js-subscribe-button{ data: { url: toggle_subscription_group_label_path(label.group, label) } } %a.js-subscribe-button{ data: { url: toggle_subscription_group_label_path(label.group, label) } }
Group level Group level
- if label.is_a?(ProjectLabel) && label.project.group && can?(current_user, :admin_group, label.project.group) - if label.is_a?(ProjectLabel) && label.project.group && can?(current_user, :admin_label, label.project.group)
= link_to promote_namespace_project_label_path(label.project.namespace, label.project, label), title: "Promote to Group Label", class: 'btn btn-transparent btn-action', data: {confirm: "Promoting this label will make this label available to all projects inside this group. Existing project labels with the same name will be merged. Are you sure?", toggle: "tooltip"}, method: :post do = link_to promote_namespace_project_label_path(label.project.namespace, label.project, label), title: "Promote to Group Label", class: 'btn btn-transparent btn-action', data: {confirm: "Promoting this label will make this label available to all projects inside this group. Existing project labels with the same name will be merged. Are you sure?", toggle: "tooltip"}, method: :post do
%span.sr-only Promote to Group %span.sr-only Promote to Group
= icon('level-up') = icon('level-up')
......
- if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.require_password? - if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.require_password?
.no-password-message.alert.alert-warning .no-password-message.alert.alert-warning
You won't be able to pull or push project code via #{gitlab_config.protocol.upcase} until you #{link_to 'set a password', edit_profile_password_path} on your account - set_password_link = link_to s_('SetPasswordToCloneLink|set a password'), edit_profile_password_path
- translation_params = { protocol: gitlab_config.protocol.upcase, set_password_link: set_password_link }
- set_password_message = _("You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account") % translation_params
.alert-link-group .alert-link-group
= link_to "Don't show again", profile_path(user: {hide_no_password: true}), method: :put = link_to _("Don't show again"), profile_path(user: {hide_no_password: true}), method: :put
| |
= link_to 'Remind later', '#', class: 'hide-no-password-message' = link_to _('Remind later'), '#', class: 'hide-no-password-message'
- if cookies[:hide_no_ssh_message].blank? && !current_user.hide_no_ssh_key && current_user.require_ssh_key? - if cookies[:hide_no_ssh_message].blank? && !current_user.hide_no_ssh_key && current_user.require_ssh_key?
.no-ssh-key-message.alert.alert-warning .no-ssh-key-message.alert.alert-warning
You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', profile_keys_path, class: 'alert-link'} to your profile - add_ssh_key_link = link_to s_('MissingSSHKeyWarningLink|add an SSH key'), profile_keys_path, class: 'alert-link'
- ssh_message = _("You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile") % { add_ssh_key_link: add_ssh_key_link }
#{ ssh_message.html_safe }
.alert-link-group .alert-link-group
= link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'alert-link' = link_to _("Don't show again"), profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'alert-link'
| |
= link_to 'Remind later', '#', class: 'hide-no-ssh-message alert-link' = link_to _('Remind later'), '#', class: 'hide-no-ssh-message alert-link'
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
- @options && @options.each do |key, value| - @options && @options.each do |key, value|
= hidden_field_tag key, value, id: nil = hidden_field_tag key, value, id: nil
.dropdown .dropdown
= dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_namespace_project_path(@project.namespace, @project), field_name: 'ref', submit_form_on_click: true }, { toggle_class: "js-project-refs-dropdown git-revision-dropdown-toggle" } = dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_namespace_project_path(@project.namespace, @project), field_name: 'ref', submit_form_on_click: true }, { 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-menu.dropdown-menu-selectable.git-revision-dropdown{ class: ("dropdown-menu-align-right" if local_assigns[:align_right]) }
= dropdown_title "Switch branch/tag" = dropdown_title _("Switch branch/tag")
= dropdown_filter "Search branches and tags" = dropdown_filter _("Search branches and tags")
= dropdown_content = dropdown_content
= dropdown_loading = dropdown_loading
...@@ -2,16 +2,17 @@ ...@@ -2,16 +2,17 @@
.project-action-button.inline .project-action-button.inline
- if can?(current_user, :"destroy_#{model_name}_member", source.members.find_by(user_id: current_user.id)) - if can?(current_user, :"destroy_#{model_name}_member", source.members.find_by(user_id: current_user.id))
= link_to "Leave #{model_name}", polymorphic_path([:leave, source, :members]), - link_text = source.is_a?(Group) ? _('Leave group') : _('Leave project')
= link_to link_text, polymorphic_path([:leave, source, :members]),
method: :delete, method: :delete,
data: { confirm: leave_confirmation_message(source) }, data: { confirm: leave_confirmation_message(source) },
class: 'btn' class: 'btn'
- elsif requester = source.requesters.find_by(user_id: current_user.id) - elsif requester = source.requesters.find_by(user_id: current_user.id)
= link_to 'Withdraw Access Request', polymorphic_path([:leave, source, :members]), = link_to _('Withdraw Access Request'), polymorphic_path([:leave, source, :members]),
method: :delete, method: :delete,
data: { confirm: remove_member_message(requester) }, data: { confirm: remove_member_message(requester) },
class: 'btn' class: 'btn'
- elsif source.request_access_enabled && can?(current_user, :request_access, source) - elsif source.request_access_enabled && can?(current_user, :request_access, source)
= link_to 'Request Access', polymorphic_path([:request_access, source, :members]), = link_to _('Request Access'), polymorphic_path([:request_access, source, :members]),
method: :post, method: :post,
class: 'btn' class: 'btn'
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
%button.close{ type: "button", "aria-label": "close", data: { dismiss: "modal" } } %button.close{ type: "button", "aria-label": "close", data: { dismiss: "modal" } }
%span{ "aria-hidden": "true" } } × %span{ "aria-hidden": "true" } } ×
%h4#custom-notifications-title.modal-title %h4#custom-notifications-title.modal-title
Custom notification events #{ _('Custom notification events') }
.modal-body .modal-body
.container-fluid .container-fluid
...@@ -13,12 +13,11 @@ ...@@ -13,12 +13,11 @@
= hidden_setting_source_input(notification_setting) = hidden_setting_source_input(notification_setting)
.row .row
.col-lg-4 .col-lg-4
%h4.prepend-top-0 %h4.prepend-top-0= _('Notification events')
Notification events
%p %p
Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out - notification_link = link_to _('notification emails'), help_page_path('workflow/notifications'), target: '_blank'
= succeed "." do - paragraph = _('Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}.') % { notification_link: notification_link.html_safe }
%a{ href: help_page_path('workflow/notifications'), target: "_blank" } notification emails #{ paragraph.html_safe }
.col-lg-8 .col-lg-8
- NotificationSetting::EMAIL_EVENTS.each_with_index do |event, index| - NotificationSetting::EMAIL_EVENTS.each_with_index do |event, index|
- field_id = "#{notifications_menu_identifier("modal", notification_setting)}_notification_setting[#{event}]" - field_id = "#{notifications_menu_identifier("modal", notification_setting)}_notification_setting[#{event}]"
......
---
title: Fix long urls in the title of commit
merge_request: 10938
author: Alexander Randa
---
title: Add extra context-sensitive functionality for the top right menu button
merge_request: 11632
author:
---
title: Confirm Project forking behaviour via the API
merge_request:
author:
--- ---
title: Make all notes use equal padding title: Create equal padding for emoji
merge_request: merge_request:
author: author:
---
title: Add all pipeline sources as special keywords to 'only' and 'except'
merge_request: 11844
author: Filip Krakowski
---
title: Use pre-wrap for commit messages to keep lists indented
merge_request:
author:
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment