Commit f6482f1c authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'ce-to-ee-2017-07-13' into 'master'

CE upstream: Thursday

Closes gitlab-shell#92, gitaly#356, gitlab-ce#34853, and gitlab-ce#34941

See merge request !2422
parents 7c6633b4 eff16717
......@@ -10,7 +10,7 @@ linters:
# Reports when you use improper spacing around ! (the "bang") in !default,
# !global, !important, and !optional flags.
BangFormat:
enabled: false
enabled: true
# Whether or not to prefer `border: 0` over `border: none`.
BorderZero:
......@@ -43,10 +43,11 @@ linters:
# Rule sets should be ordered as follows:
# - @extend declarations
# - @include declarations without inner @content
# - properties, @include declarations with inner @content
# - properties
# - @include declarations with inner @content
# - nested rule sets.
DeclarationOrder:
enabled: false
enabled: true
# `scss-lint:disable` control comments should be preceded by a comment
# explaining why these linters are being disabled for this file.
......@@ -93,7 +94,7 @@ linters:
# The basenames of @imported SCSS partials should not begin with an
# underscore and should not include the filename extension.
ImportPath:
enabled: false
enabled: true
# Avoid using !important in properties. It is usually indicative of a
# misunderstanding of CSS specificity and can lead to brittle code.
......@@ -133,7 +134,7 @@ linters:
# Reports when you use an unknown or disabled CSS property
# (ignoring vendor-prefixed properties).
PropertySpelling:
enabled: false
enabled: true
# Configure which units are allowed for property values.
PropertyUnits:
......@@ -176,6 +177,10 @@ linters:
# Commas in lists should be followed by a space.
SpaceAfterComma:
enabled: true
# Comment literals should be followed by a space.
SpaceAfterComment:
enabled: false
# Properties should be formatted with a single space separating the colon
......@@ -240,7 +245,7 @@ linters:
# Do not use parent selector references (&) when they would otherwise
# be unnecessary.
UnnecessaryParentReference:
enabled: false
enabled: true
# URLs should be valid and not contain protocols or domain names.
UrlFormat:
......
......@@ -259,8 +259,8 @@ gem 'jquery-rails', '~> 4.1.0'
gem 'request_store', '~> 1.3'
gem 'select2-rails', '~> 3.5.9'
gem 'virtus', '~> 1.0.1'
gem 'net-ssh', '~> 3.0.1'
gem 'base32', '~> 0.3.0'
gem "gitlab-license", "~> 1.0"
# Sentry integration
......@@ -345,7 +345,7 @@ group :development, :test do
gem 'rubocop', '~> 0.47.1', require: false
gem 'rubocop-rspec', '~> 1.15.0', require: false
gem 'scss_lint', '~> 0.47.0', require: false
gem 'scss_lint', '~> 0.54.0', require: false
gem 'haml_lint', '~> 0.21.0', require: false
gem 'simplecov', '~> 0.14.0', require: false
gem 'flay', '~> 2.8.0', require: false
......
......@@ -501,7 +501,6 @@ GEM
mysql2 (0.4.5)
net-ldap (0.12.1)
net-ntp (2.1.3)
net-ssh (3.0.1)
netrc (0.11.0)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
......@@ -792,9 +791,9 @@ GEM
sawyer (0.8.1)
addressable (>= 2.3.5, < 2.6)
faraday (~> 0.8, < 1.0)
scss_lint (0.47.1)
rake (>= 0.9, < 11)
sass (~> 3.4.15)
scss_lint (0.54.0)
rake (>= 0.9, < 13)
sass (~> 3.4.20)
securecompare (1.0.0)
seed-fu (2.3.6)
activerecord (>= 3.1)
......@@ -809,7 +808,7 @@ GEM
rack
shoulda-matchers (2.8.0)
activesupport (>= 3.0.0)
sidekiq (5.0.0)
sidekiq (5.0.4)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
rack-protection (>= 1.5.0)
......@@ -1051,7 +1050,6 @@ DEPENDENCIES
mysql2 (~> 0.4.5)
net-ldap
net-ntp
net-ssh (~> 3.0.1)
nokogiri (~> 1.6.7, >= 1.6.7.2)
oauth2 (~> 1.4)
octokit (~> 4.6.2)
......@@ -1121,7 +1119,7 @@ DEPENDENCIES
rugged (~> 0.25.1.1)
sanitize (~> 2.0)
sass-rails (~> 5.0.6)
scss_lint (~> 0.47.0)
scss_lint (~> 0.54.0)
seed-fu (~> 2.3.5)
select2-rails (~> 3.5.9)
sentry-raven (~> 2.5.3)
......
app/assets/images/new_nav.png

23.2 KB | W: | H:

app/assets/images/new_nav.png

14 KB | W: | H:

app/assets/images/new_nav.png
app/assets/images/new_nav.png
app/assets/images/new_nav.png
app/assets/images/new_nav.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -513,9 +513,9 @@ export default {
<div class="table-section section-15 hidden-xs hidden-sm" role="gridcell">
<a
v-if="shouldRenderBuildName"
class="build-link"
class="build-link flex-truncate-parent"
:href="buildPath">
{{buildName}}
<span class="flex-truncate-child">{{buildName}}</span>
</a>
</div>
......
......@@ -42,4 +42,4 @@
/*
* Styles for JS behaviors.
*/
@import "behaviors.scss";
@import "behaviors";
......@@ -4,49 +4,49 @@
@import 'framework/tw_bootstrap';
@import "framework/layout";
@import "framework/animations.scss";
@import "framework/avatar.scss";
@import "framework/asciidoctor.scss";
@import "framework/blocks.scss";
@import "framework/buttons.scss";
@import "framework/badges.scss";
@import "framework/calendar.scss";
@import "framework/callout.scss";
@import "framework/common.scss";
@import "framework/dropdowns.scss";
@import "framework/files.scss";
@import "framework/filters.scss";
@import "framework/flash.scss";
@import "framework/forms.scss";
@import "framework/gfm.scss";
@import "framework/header.scss";
@import "framework/highlight.scss";
@import "framework/issue_box.scss";
@import "framework/jquery.scss";
@import "framework/lists.scss";
@import "framework/logo.scss";
@import "framework/markdown_area.scss";
@import "framework/mobile.scss";
@import "framework/modal.scss";
@import "framework/nav.scss";
@import "framework/pagination.scss";
@import "framework/panels.scss";
@import "framework/selects.scss";
@import "framework/sidebar.scss";
@import "framework/tables.scss";
@import "framework/notes.scss";
@import "framework/timeline.scss";
@import "framework/typography.scss";
@import "framework/zen.scss";
@import "framework/animations";
@import "framework/avatar";
@import "framework/asciidoctor";
@import "framework/blocks";
@import "framework/buttons";
@import "framework/badges";
@import "framework/calendar";
@import "framework/callout";
@import "framework/common";
@import "framework/dropdowns";
@import "framework/files";
@import "framework/filters";
@import "framework/flash";
@import "framework/forms";
@import "framework/gfm";
@import "framework/header";
@import "framework/highlight";
@import "framework/issue_box";
@import "framework/jquery";
@import "framework/lists";
@import "framework/logo";
@import "framework/markdown_area";
@import "framework/mobile";
@import "framework/modal";
@import "framework/nav";
@import "framework/pagination";
@import "framework/panels";
@import "framework/selects";
@import "framework/sidebar";
@import "framework/tables";
@import "framework/notes";
@import "framework/timeline";
@import "framework/typography";
@import "framework/zen";
@import "framework/blank";
@import "framework/wells.scss";
@import "framework/page-header.scss";
@import "framework/awards.scss";
@import "framework/images.scss";
@import "framework/wells";
@import "framework/page-header";
@import "framework/awards";
@import "framework/images";
@import "framework/broadcast-messages";
@import "framework/emojis.scss";
@import "framework/emoji-sprites.scss";
@import "framework/icons.scss";
@import "framework/snippets.scss";
@import "framework/memory_graph.scss";
@import "framework/responsive-tables.scss";
@import "framework/emojis";
@import "framework/emoji-sprites";
@import "framework/icons";
@import "framework/snippets";
@import "framework/memory_graph";
@import "framework/responsive-tables";
......@@ -24,7 +24,7 @@
opacity: 0;
transform: scale(.2);
transform-origin: 0 -45px;
transition: .3s cubic-bezier(.67,.06,.19,1.44);
transition: .3s cubic-bezier(.67, .06, .19, 1.44);
transition-property: transform, opacity;
&.is-aligned-right {
......@@ -231,11 +231,11 @@
.award-control-icon-positive,
.award-control-icon-super-positive {
@include transition(opacity, transform);
position: absolute;
left: 10px;
bottom: 6px;
opacity: 0;
@include transition(opacity, transform);
}
.award-control-text {
......
.blank-state-parent-container {
display: flex;
.section-container {
display: flex;
flex: 1;
padding: 10px;
}
......@@ -13,91 +9,42 @@
padding-bottom: 25px;
border: 1px solid $border-color;
border-radius: $border-radius-default;
&.section-ee-trial {
display: flex;
align-items: center;
justify-content: center;
}
}
}
.blank-state-welcome {
text-align: center;
.blank-state-text {
margin-bottom: 0;
}
}
.blank-state {
padding-top: 20px;
padding-bottom: 20px;
}
.blank-state.ee-trial {
padding: 20px;
text-align: center;
}
.blank-state-no-icon {
padding-top: 40px;
padding-bottom: 40px;
}
&.blank-state-welcome {
.blank-state-welcome-title {
font-size: 24px;
}
.blank-state-text {
margin-bottom: 0;
}
}
.blank-state-icon {
.blank-state-icon {
padding-bottom: 20px;
font-size: 56px;
svg {
display: block;
margin: auto;
}
}
@media (min-width: $screen-sm-max) {
.section-welcome .blank-state-icon svg {
width: 130%;
}
}
.blank-state-title {
.blank-state-title {
margin-top: 0;
margin-bottom: 10px;
font-size: 18px;
}
.blank-state-text {
margin-top: 0;
margin-bottom: $gl-padding;
font-size: 14px;
> strong {
font-weight: 600;
}
}
.blank-state-welcome-title {
font-size: 24px;
}
@media (max-width: $screen-md-min) {
.blank-state-parent-container {
&,
.section-container {
display: block;
}
}
.blank-state {
text-align: center;
}
.blank-state-icon {
padding-bottom: 0;
}
.blank-state-body {
margin-top: 15px;
.blank-state-text {
max-width: $container-text-max-width;
margin: 0 auto $gl-padding;
font-size: 14px;
}
}
......@@ -340,11 +340,6 @@ table {
text-align: center;
}
#nprogress .spinner {
top: 15px !important;
right: 10px !important;
}
.header-with-avatar {
h3 {
margin: 0;
......@@ -454,4 +449,3 @@ table {
pointer-events: none;
opacity: .5;
}
......@@ -35,8 +35,8 @@
.open {
.dropdown-menu,
.dropdown-menu-nav {
display: block;
@include set-visible;
display: block;
@media (max-width: $screen-xs-max) {
width: 100%;
......@@ -184,6 +184,7 @@
.dropdown-menu,
.dropdown-menu-nav {
@include set-invisible;
display: block;
position: absolute;
width: 100%;
......@@ -200,7 +201,6 @@
border: 1px solid $dropdown-border-color;
border-radius: $border-radius-base;
box-shadow: 0 2px 4px $dropdown-shadow-color;
@include set-invisible;
@media (max-width: $screen-sm-min) {
width: 100%;
......@@ -675,8 +675,8 @@
}
.pika-single {
position: relative!important;
top: 0!important;
position: relative !important;
top: 0 !important;
border: 0;
box-shadow: none;
}
......
......@@ -368,7 +368,7 @@
margin-right: 0.3em;
}
& > .value {
> .value {
font-weight: 600;
}
}
......@@ -467,7 +467,7 @@
-webkit-flex-direction: column;
flex-direction: column;
&> span {
> span {
white-space: normal;
word-break: break-all;
}
......
......@@ -330,7 +330,7 @@ header {
padding-left: 5px;
.nav > li:not(.hidden-xs) {
display: table-cell!important;
display: table-cell !important;
width: 25%;
a {
......
......@@ -61,7 +61,7 @@
&:focus {
outline: none;
& i {
i {
visibility: visible;
}
}
......
......@@ -165,8 +165,8 @@
.cur {
.avatar {
border: 1px solid $white-light;
@include disableAllAnimation;
border: 1px solid $white-light;
}
}
......
......@@ -100,9 +100,9 @@
}
.table-mobile-header {
@include flex-max-width(40);
color: $gl-text-color-secondary;
text-align: left;
@include flex-max-width(40);
@media (min-width: $screen-md-min) {
display: none;
......
......@@ -176,6 +176,7 @@ $header-height: 50px;
$fixed-layout-width: 1280px;
$limited-layout-width: 990px;
$limited-layout-width-sm: 790px;
$container-text-max-width: 540px;
$gl-avatar-size: 40px;
$error-exclamation-point: $red-500;
$border-radius-default: 3px;
......@@ -321,7 +322,7 @@ $badge-color: $gl-text-color-secondary;
/*
* Award emoji
*/
$award-emoji-menu-shadow: rgba(0,0,0,.175);
$award-emoji-menu-shadow: rgba(0, 0, 0, .175);
$award-emoji-positive-add-bg: #fed159;
$award-emoji-positive-add-lines: #bb9c13;
......@@ -572,7 +573,7 @@ $kdb-color: #555;
$kdb-border: #ccc;
$kdb-border-bottom: #bbb;
$kdb-shadow: #bbb;
$body-text-shadow: rgba(255,255,255,0.01);
$body-text-shadow: rgba(255, 255, 255, 0.01);
/*
* UI Dev Kit
......
......@@ -113,7 +113,7 @@ $white-gc-bg: #eaf2f5;
border-color: $line-removed-dark;
a {
color: scale-color($line-number-old,$red: -30%, $green: -30%, $blue: -30%);
color: scale-color($line-number-old, $red: -30%, $green: -30%, $blue: -30%);
}
}
......@@ -122,7 +122,7 @@ $white-gc-bg: #eaf2f5;
border-color: $line-added-dark;
a {
color: scale-color($line-number-new,$red: -30%, $green: -30%, $blue: -30%);
color: scale-color($line-number-new, $red: -30%, $green: -30%, $blue: -30%);
}
}
......@@ -163,7 +163,7 @@ $white-gc-bg: #eaf2f5;
background-color: $line-removed;
&::before {
color: scale-color($line-number-old,$red: -30%, $green: -30%, $blue: -30%);
color: scale-color($line-number-old, $red: -30%, $green: -30%, $blue: -30%);
}
span.idiff {
......@@ -175,7 +175,7 @@ $white-gc-bg: #eaf2f5;
background-color: $line-added;
&::before {
color: scale-color($line-number-new,$red: -30%, $green: -30%, $blue: -30%);
color: scale-color($line-number-new, $red: -30%, $green: -30%, $blue: -30%);
}
span.idiff {
......
......@@ -2,12 +2,12 @@
@import 'framework/tw_bootstrap_variables';
@import "bootstrap/variables";
$active-background: rgba(0,0,0,.04);
$active-background: rgba(0, 0, 0, .04);
$active-border: $indigo-500;
$active-color: $indigo-700;
$active-hover-background: $active-background;
$active-hover-color: $gl-text-color;
$inactive-badge-background: rgba(0,0,0,.08);
$inactive-badge-background: rgba(0, 0, 0, .08);
$hover-background: $indigo-700;
$hover-color: $white-light;
$inactive-color: $gl-text-color-secondary;
......
......@@ -11,7 +11,7 @@
.is-dragging {
// Important because plugin sets inline CSS
opacity: 1!important;
opacity: 1 !important;
* {
-webkit-user-select: none;
......@@ -19,8 +19,8 @@
-ms-user-select: none;
user-select: none;
// !important to make sure no style can override this when dragging
cursor: -webkit-grabbing!important;
cursor: grabbing!important;
cursor: -webkit-grabbing !important;
cursor: grabbing !important;
}
}
......
......@@ -6,26 +6,26 @@
@keyframes blinking-dots {
0% {
background-color: rgba($white-light, 1);
box-shadow: 12px 0 0 0 rgba($white-light,0.2),
24px 0 0 0 rgba($white-light,0.2);
box-shadow: 12px 0 0 0 rgba($white-light, 0.2),
24px 0 0 0 rgba($white-light, 0.2);
}
25% {
background-color: rgba($white-light, 0.4);
box-shadow: 12px 0 0 0 rgba($white-light,2),
24px 0 0 0 rgba($white-light,0.2);
box-shadow: 12px 0 0 0 rgba($white-light, 2),
24px 0 0 0 rgba($white-light, 0.2);
}
75% {
background-color: rgba($white-light, 0.4);
box-shadow: 12px 0 0 0 rgba($white-light,0.2),
24px 0 0 0 rgba($white-light,1);
box-shadow: 12px 0 0 0 rgba($white-light, 0.2),
24px 0 0 0 rgba($white-light, 1);
}
100% {
background-color: rgba($white-light, 1);
box-shadow: 12px 0 0 0 rgba($white-light,0.2),
24px 0 0 0 rgba($white-light,0.2);
box-shadow: 12px 0 0 0 rgba($white-light, 0.2),
24px 0 0 0 rgba($white-light, 0.2);
}
}
......
......@@ -250,8 +250,8 @@
}
.committed_ago {
float: right;
@extend .cgray;
float: right;
}
}
}
......
......@@ -24,9 +24,9 @@
.col-headers {
ul {
@include clearfix;
margin: 0;
padding: 0;
@include clearfix;
}
li {
......@@ -189,8 +189,8 @@
}
li {
list-style-type: none;
@include clearfix;
list-style-type: none;
}
.stage-nav-item {
......@@ -281,11 +281,11 @@
}
.stage-event-item {
@include clearfix;
list-style-type: none;
padding: 0 0 $gl-padding;
margin: 0 $gl-padding $gl-padding;
border-bottom: 1px solid $gray-darker;
@include clearfix;
&:last-child {
border-bottom: none;
......@@ -307,9 +307,9 @@
&.issue-title,
&.commit-title,
&.merge-merquest-title {
@include text-overflow();
max-width: 100%;
display: block;
@include text-overflow();
a {
color: $gl-text-color;
......
......@@ -91,6 +91,7 @@
.old_line,
.new_line {
@include user-select(none);
margin: 0;
border: none;
padding: 0 5px;
......@@ -99,7 +100,6 @@
min-width: 35px;
max-width: 50px;
width: 35px;
@include user-select(none);
a {
float: left;
......@@ -354,12 +354,12 @@
}
&.active {
cursor: default;
color: $gl-text-color;
&:hover {
text-decoration: none;
}
cursor: default;
color: $gl-text-color;
}
&.disabled {
......
......@@ -358,7 +358,7 @@ ul.related-merge-requests > li {
background-color: $border-gray-normal;
}
& > .fa {
> .fa {
line-height: inherit;
}
}
......@@ -394,7 +394,7 @@ ul.related-merge-requests > li {
outline: none;
}
& > .fa {
> .fa {
font-size: 0.9em;
}
}
......@@ -41,7 +41,7 @@
.member {
&.is-overriden {
.btn-ldap-override {
display: none!important;
display: none !important;
}
}
......
......@@ -96,7 +96,7 @@
overflow: visible;
}
& > span {
> span {
padding-right: 4px;
}
......
......@@ -264,10 +264,10 @@
}
.btn {
font-size: 12px;
@include btn-outline($white-light, $blue-500, $blue-500, $blue-500, $white-light, $blue-600, $blue-600, $blue-700);
font-size: 12px;
&.active {
background-color: $blue-500;
border-color: $blue-600;
......
......@@ -121,10 +121,11 @@ ul.notes {
overflow-y: hidden;
.note-text {
word-wrap: break-word;
@include md-typography;
// Reset ul style types since we're nested inside a ul already
@include bulleted-list;
word-wrap: break-word;
ul.task-list {
ul:not(.task-list) {
padding-left: 1.3em;
......@@ -250,7 +251,7 @@ ul.notes {
}
.note-text {
& p:first-child {
p:first-child {
display: none;
}
......
.js-pipeline-schedule-form {
.dropdown-select,
.dropdown-menu-toggle {
width: 100%!important;
width: 100% !important;
}
.gl-field-error {
......@@ -96,12 +96,12 @@
}
&:last-child {
& .pipeline-variable-row-remove-button {
.pipeline-variable-row-remove-button {
display: none;
}
@media (max-width: $screen-sm-max) {
& .pipeline-variable-value-input {
.pipeline-variable-value-input {
margin-right: $pipeline-variable-remove-button-width;
}
}
......@@ -137,6 +137,7 @@
}
.pipeline-variable-row-remove-button {
@include transition(color);
flex-shrink: 0;
display: flex;
justify-content: center;
......@@ -147,7 +148,6 @@
background: transparent;
border: 0;
color: $gl-text-color-secondary;
@include transition(color);
&:hover,
&:focus {
......
......@@ -1027,7 +1027,7 @@
.linked-pipelines-column.stage-column {
position: relative;
& > ul {
> ul {
padding: 0;
}
......
......@@ -26,7 +26,7 @@
margin-bottom: 5px;
}
& > .form-group {
> .form-group {
padding-left: 0;
}
......@@ -91,7 +91,7 @@
border: 1px solid $border-color;
}
& + .select2 a {
+ .select2 a {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
......@@ -595,9 +595,9 @@ pre.light-well {
}
.project-row {
@include basic-list-stats;
display: flex;
align-items: center;
@include basic-list-stats;
}
h3 {
......
......@@ -81,7 +81,7 @@
.todo-title {
display: flex;
& > .title-item {
> .title-item {
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
margin: 0 2px;
......
......@@ -5,13 +5,13 @@
}
.example {
padding: 15px;
border: 1px dashed $ui-dev-kit-example-border;
margin-bottom: 15px;
&::before {
content: "Example";
color: $ui-dev-kit-example-color;
}
padding: 15px;
border: 1px dashed $ui-dev-kit-example-border;
margin-bottom: 15px;
}
}
......@@ -147,13 +147,13 @@
}
ul.wiki-pages-list.content-list {
& ul {
ul {
list-style: none;
margin-left: 0;
padding-left: 15px;
}
& ul li {
ul li {
padding: 5px 0;
}
}
......
......@@ -37,7 +37,7 @@ ul.notes-form,
.issuable-details .content-block-small,
.edit-link,
.note-action-button {
display: none!important;
display: none !important;
}
pre {
......
......@@ -35,7 +35,7 @@ module ApplicationSettingsHelper
# Return a group of checkboxes that use Bootstrap's button plugin for a
# toggle button effect.
def restricted_level_checkboxes(help_block_id, checkbox_name)
Gitlab::VisibilityLevel.options.map do |name, level|
Gitlab::VisibilityLevel.values.map do |level|
checked = restricted_visibility_levels(true).include?(level)
css_class = checked ? 'active' : ''
tag_name = "application_setting_visibility_level_#{level}"
......@@ -44,7 +44,7 @@ module ApplicationSettingsHelper
check_box_tag(checkbox_name, level, checked,
autocomplete: 'off',
'aria-describedby' => help_block_id,
id: tag_name) + visibility_level_icon(level) + name
id: tag_name) + visibility_level_icon(level) + visibility_level_label(level)
end
end
end
......
......@@ -718,7 +718,7 @@ class User < ActiveRecord::Base
end
def sanitize_attrs
%w[name username skype linkedin twitter].each do |attr|
%w[username skype linkedin twitter].each do |attr|
value = public_send(attr)
public_send("#{attr}=", Sanitize.clean(value)) if value.present?
end
......
.row.blank-state.clearfix
.col-md-1.col-md-offset-3.blank-state-icon
.blank-state
.blank-state-icon
= custom_icon("add_new_user", size: 50)
.col-md-5.blank-state-body
.blank-state-body
%h3.blank-state-title
Add user
%p.blank-state-text
......@@ -9,10 +9,10 @@
= link_to new_admin_user_path, class: "btn btn-new" do
New user
.row.blank-state.clearfix
.col-md-1.col-md-offset-3.blank-state-icon
.blank-state
.blank-state-icon
= custom_icon("configure_server", size: 50)
.col-md-5.blank-state-body
.blank-state-body
%h3.blank-state-title
Configure GitLab
%p.blank-state-text
......@@ -21,10 +21,10 @@
Configure
- if current_user.can_create_group?
.row.blank-state.clearfix
.col-md-1.col-md-offset-3.blank-state-icon
.blank-state
.blank-state-icon
= custom_icon("add_new_group", size: 50)
.col-md-5.blank-state-body
.blank-state-body
%h3.blank-state-title
Create a group
%p.blank-state-text
......
- public_project_count = ProjectsFinder.new(current_user: current_user).execute.count
- if current_user.can_create_group?
.row.blank-state.clearfix
.col-md-1.col-md-offset-3.blank-state-icon
.blank-state
.blank-state-icon
= custom_icon("add_new_group", size: 50)
.col-md-5.blank-state-body
.blank-state-body
%h3.blank-state-title
Create a group for several dependent projects.
%p.blank-state-text
......@@ -12,10 +12,10 @@
= link_to new_group_path, class: "btn btn-new" do
New group
.row.blank-state.clearfix
.col-md-1.col-md-offset-3.blank-state-icon
.blank-state
.blank-state-icon
= custom_icon("add_new_project", size: 50)
.col-md-5.blank-state-body
.blank-state-body
%h3.blank-state-title
Create a project
%p.blank-state-text
......@@ -32,10 +32,10 @@
New project
- if public_project_count > 0
.row.blank-state.clearfix
.col-md-1.col-md-offset-3.blank-state-icon
.blank-state
.blank-state-icon
= custom_icon("globe", size: 50)
.col-md-5.blank-state-body
.blank-state-body
%h3.blank-state-title
Explore public projects
%p.blank-state-text
......
.row.blank-state-parent-container
.section-container
.container.section-body.section-welcome{ class: "#{ 'section-admin-welcome' if current_user.admin? }" }
.section-container.section-welcome{ class: "#{ 'section-admin-welcome' if current_user.admin? }" }
.container.section-body
.blank-state.blank-state-welcome
%h2.blank-state-welcome-title
Welcome to GitLab
......
......@@ -525,7 +525,7 @@
%h4
%code .file-holder
- blob = Snippet.new(content: "Wow\nSuch\nFile")
- blob = Snippet.new(content: "Wow\nSuch\nFile").blob
.example
.file-holder
.js-file-title.file-title
......
......@@ -87,7 +87,7 @@
%li
= link_to "Settings", profile_path
%li
= link_to "Turn on new nav", profile_preferences_path(anchor: "new-navigation")
= link_to "Turn on new navigation", profile_preferences_path(anchor: "new-navigation")
%li.divider
%li
= link_to "Sign out", destroy_user_session_path, method: :delete, class: "sign-out-link"
......
......@@ -69,7 +69,7 @@
%li
= link_to "Settings", profile_path
%li
= link_to "Turn off new nav", profile_preferences_path(anchor: "new-navigation")
= link_to "Turn off new navigation", profile_preferences_path(anchor: "new-navigation")
%li.divider
%li
= link_to "Sign out", destroy_user_session_path, method: :delete, class: "sign-out-link"
......
......@@ -2,7 +2,7 @@
- hide_top_links = @hide_top_links || false
%nav.breadcrumbs{ role: "navigation" }
.breadcrumbs-container{ class: container_class }
.breadcrumbs-container{ class: [container_class, @content_class] }
.breadcrumbs-links.js-title-container
- unless hide_top_links
.title
......
......@@ -74,9 +74,9 @@
= nav_link(controller: @project.default_issues_tracker? ? [:issues, :labels, :milestones, :boards] : :issues) do
= link_to project_issues_path(@project), title: 'Issues', class: 'shortcuts-issues' do
%span
Issues
- if @project.default_issues_tracker?
%span.badge.count.issue_counter= number_with_delimiter(IssuesFinder.new(current_user, project_id: @project.id).execute.opened.count)
Issues
%ul.sidebar-sub-level-items
- if project_nav_tab?(:issues) && !current_controller?(:merge_requests)
......@@ -112,8 +112,8 @@
= nav_link(controller: @project.default_issues_tracker? ? :merge_requests : [:merge_requests, :labels, :milestones]) do
= link_to project_merge_requests_path(@project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do
%span
Merge Requests
%span.badge.count.merge_counter.js-merge-counter= number_with_delimiter(MergeRequestsFinder.new(current_user, project_id: @project.id).execute.opened.count)
Merge Requests
- if project_nav_tab? :pipelines
= nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :environments, :artifacts]) do
......
......@@ -30,7 +30,7 @@
%ul.dropdown-menu.dropdown-menu-align-right
%li.visible-xs-block.visible-sm-block
= link_to project_tree_path(@project, @commit) do
_('Browse Files')
#{ _('Browse Files') }
- unless @commit.has_been_reverted?(current_user)
%li.clearfix
= revert_commit_link(@commit, project_commit_path(@project, @commit.id), has_tooltip: false)
......
- @no_container = true
- container_class = !fluid_layout && diff_view == :inline ? 'container-limited' : ''
- limited_container_width = fluid_layout ? '' : 'limit-container-width'
- @content_class = limited_container_width
- page_title "#{@commit.title} (#{@commit.short_id})", "Commits"
- page_description @commit.description
= render "projects/commits/head"
......
......@@ -9,6 +9,7 @@
.col-lg-3.profile-settings-sidebar
%h4.prepend-top-0
New project
- if import_sources_enabled?
%p
Create or Import your project from popular Git services
.col-lg-9
......
......@@ -12,6 +12,7 @@
- schedule_path_proc = ->(scope) { pipeline_schedules_path(@project, scope: scope) }
= render "tabs", schedule_path_proc: schedule_path_proc, all_schedules: @all_schedules, scope: @scope
- if can?(current_user, :create_pipeline_schedule, @project)
.nav-controls
= link_to new_project_pipeline_schedule_path(@project), class: 'btn btn-create' do
%span= _('New schedule')
......
- @no_container = true
- @content_class = "limit-container-width" unless fluid_layout
- flash_message_container = show_new_nav? ? :new_global_flash : :flash_message
= content_for :meta_tags do
......
- @no_container = true
- @content_class = "limit-container-width" unless fluid_layout
- page_title @path.presence || _("Files"), @ref
= content_for :meta_tags do
......
---
title: "Insert user name directly without encoding"
merge_request: 10085
author: Nathan Neulinger <nneul@neulinger.org>
---
title: Return `is_admin` attribute in the GET /user endpoint for admins
merge_request: 12811
author:
---
title: Fix crash on /help/ui
merge_request:
author:
---
title: Bump scss-lint to 0.54.0
merge_request: 12733
author: Takuya Noguchi
---
title: Remove net-ssh gem
merge_request:
author: Takuya Noguchi
---
title: Do not show pipeline schedule button for non-member
merge_request: 12757
author: Takuya Noguchi
---
title: Remove public/ci/favicon.ico
merge_request: 12803
author: Takuya Noguchi
---
title: Enable BangFormat in scss-lint [ci skip]
merge_request: 12815
author: Takuya Noguchi
---
title: Enable DeclarationOrder in scss-lint
merge_request: 12805
author: Takuya Noguchi
---
title: Enable ImportPath in scss-lint
merge_request: 12749
author: Takuya Noguchi
---
title: Enable PropertySpelling in scss-lint
merge_request: 12752
author: Takuya Noguchi
---
title: Enable SpaceAfterComma in scss-lint
merge_request: 12734
author: Takuya Noguchi
---
title: Enable UnnecessaryParentReference in scss-lint
merge_request: 12738
author: Takuya Noguchi
---
title: Improve issue rendering performance with lots of notes from other users
merge_request:
author:
---
title: Remove CSS for nprogress removed
merge_request: 12737
author: Takuya Noguchi
---
title: Replace 'browse_files.feature' spinach test with an rspec analog
merge_request: 12251
author: @blackst0ne
---
title: Add a simple mode to merge request API
merge_request:
author:
---
title: Toggle import description with import_sources_enabled
merge_request: 12691
author: Brianna Kicia
\ No newline at end of file
......@@ -25,6 +25,7 @@ Parameters:
| `order_by`| string | no | Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` |
| `sort` | string | no | Return requests sorted in `asc` or `desc` order. Default is `desc` |
| `milestone` | string | no | Return merge requests for a specific milestone |
| `view` | string | no | If `simple`, returns the `iid`, URL, title, description, and basic state of merge request |
| `labels` | string | no | Return merge requests matching a comma separated list of labels |
| `created_after` | datetime | no | Return merge requests created after the given time (inclusive) |
| `created_before` | datetime | no | Return merge requests created before the given time (inclusive) |
......
......@@ -369,7 +369,7 @@ GET /user
Parameters:
- `sudo` (required) - the ID of a user
- `sudo` (optional) - the ID of a user to make the call in their place
```
GET /user
......
......@@ -294,9 +294,9 @@ sudo usermod -aG redis git
### Clone the Source
# Clone GitLab repository
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 9-3-stable gitlab
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 9-4-stable gitlab
**Note:** You can change `9-3-stable` to `master` if you want the *bleeding edge* version, but never install master on a production server!
**Note:** You can change `9-4-stable` to `master` if you want the *bleeding edge* version, but never install master on a production server!
### Configure It
......
......@@ -69,7 +69,7 @@ so keep in mind that you need at least 4GB available before running GitLab. With
less memory GitLab will give strange errors during the reconfigure run and 500
errors during usage.
- 1GB RAM + 3GB of swap is the absolute minimum but we strongly **advise against** this amount of memory. See the unicorn worker section below for more advice.
- 1GB RAM + 3GB of swap is the absolute minimum but we strongly **advise against** this amount of memory. See the [unicorn worker section below](#unicorn-workers) for more advice.
- 2GB RAM + 2GB swap supports up to 100 users but it will be very slow
- **4GB RAM** is the **recommended** memory size for all installations and supports up to 100 users
- 8GB RAM supports up to 1,000 users
......
......@@ -72,8 +72,8 @@ More information can be found on the [yarn website](https://yarnpkg.com/en/docs/
### 5. Update Go
NOTE: GitLab 9.4 and higher only supports Go 1.8.3 and dropped support for Go 1.5.x through 1.7.x. Be
sure to upgrade your installation if necessary
NOTE: GitLab 9.2 and higher only supports Go 1.8.3 and dropped support for Go
1.5.x through 1.7.x. Be sure to upgrade your installation if necessary.
You can check which version you are running with `go version`.
......@@ -117,7 +117,7 @@ cd /home/git/gitlab
sudo -u git -H git checkout 9-4-stable-ee
```
### 5. Update gitlab-shell
### 7. Update gitlab-shell
```bash
cd /home/git/gitlab-shell
......@@ -127,11 +127,10 @@ sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_SHELL_VERSION)
sudo -u git -H bin/compile
```
### 6. Update gitlab-workhorse
### 8. Update gitlab-workhorse
Install and compile gitlab-workhorse. This requires
[Go 1.8](https://golang.org/dl) which should already be on your system from
GitLab 8.1. GitLab-Workhorse uses [GNU Make](https://www.gnu.org/software/make/).
Install and compile gitlab-workhorse. GitLab-Workhorse uses
[GNU Make](https://www.gnu.org/software/make/).
If you are not using Linux you may have to run `gmake` instead of
`make` below.
......@@ -143,7 +142,7 @@ sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_WORKHORSE_VERSION)
sudo -u git -H make
```
### 7. Update Gitaly
### 9. Update Gitaly
If you have not yet set up Gitaly then follow [Gitaly section of the installation
guide](../install/installation.md#install-gitaly).
......@@ -171,7 +170,29 @@ sudo -u git -H git checkout v$(</home/git/gitlab/GITALY_SERVER_VERSION)
sudo -u git -H make
```
### 10. Update configuration files
### 10. Update MySQL permissions
If you are using MySQL you need to grant the GitLab user the necessary
permissions on the database:
```bash
mysql -u root -p -e "GRANT TRIGGER ON \`gitlabhq_production\`.* TO 'git'@'localhost';"
```
If you use MySQL with replication, or just have MySQL configured with binary logging,
you will need to also run the following on all of your MySQL servers:
```bash
mysql -u root -p -e "SET GLOBAL log_bin_trust_function_creators = 1;"
```
You can make this setting permanent by adding it to your `my.cnf`:
```
log_bin_trust_function_creators=1
```
### 11. Update configuration files
#### New configuration options for `gitlab.yml`
......@@ -245,7 +266,7 @@ For Ubuntu 16.04.1 LTS:
sudo systemctl daemon-reload
```
### 11. Install libs, migrations, etc.
### 12. Install libs, migrations, etc.
```bash
cd /home/git/gitlab
......@@ -271,14 +292,14 @@ sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
**MySQL installations**: Run through the `MySQL strings limits` and `Tables and data conversion to utf8mb4` [tasks](../install/database_mysql.md).
### 12. Start application
### 13. Start application
```bash
sudo service gitlab start
sudo service nginx restart
```
### 13. Check application status
### 14. Check application status
Check if GitLab and its environment are configured correctly:
......
This diff is collapsed.
......@@ -353,6 +353,13 @@ module API
expose :id
end
class MergeRequestSimple < ProjectEntity
expose :title
expose :web_url do |merge_request, options|
Gitlab::UrlBuilder.build(merge_request)
end
end
class MergeRequestBasic < ProjectEntity
expose :target_branch, :source_branch
expose :upvotes do |merge_request, options|
......
......@@ -50,9 +50,14 @@ module API
args[:label_name] = args.delete(:labels)
merge_requests = MergeRequestsFinder.new(current_user, args).execute
merge_requests = merge_requests.reorder(args[:order_by] => args[:sort])
paginate(merge_requests)
.preload(:notes, :target_project, :author, :assignee, :milestone, :merge_request_diff, :labels)
.reorder(args[:order_by] => args[:sort])
merge_requests = paginate(merge_requests)
.preload(:target_project)
return merge_requests if args[:view] == 'simple'
merge_requests
.preload(:notes, :author, :assignee, :milestone, :merge_request_diff, :labels)
end
params :optional_params_ce do
......@@ -89,15 +94,25 @@ module API
optional :labels, type: String, desc: 'Comma-separated list of label names'
optional :created_after, type: DateTime, desc: 'Return merge requests created after the specified time'
optional :created_before, type: DateTime, desc: 'Return merge requests created before the specified time'
optional :view, type: String, values: %w[simple], desc: 'If simple, returns the `iid`, URL, title, description, and basic state of merge request'
use :pagination
end
get ":id/merge_requests" do
authorize! :read_merge_request, user_project
merge_requests = find_merge_requests(project_id: user_project.id)
issuable_metadata = issuable_meta_data(merge_requests, 'MergeRequest')
present merge_requests, with: Entities::MergeRequestBasic, current_user: current_user, project: user_project, issuable_metadata: issuable_metadata
options = { with: Entities::MergeRequestBasic,
current_user: current_user,
project: user_project }
if params[:view] == 'simple'
options[:with] = Entities::MergeRequestSimple
else
options[:issuable_metadata] = issuable_meta_data(merge_requests, 'MergeRequest')
end
present merge_requests, options
end
desc 'Create a merge request' do
......
......@@ -427,7 +427,16 @@ module API
success Entities::UserPublic
end
get do
present current_user, with: sudo? ? Entities::UserWithPrivateDetails : Entities::UserPublic
entity =
if sudo?
Entities::UserWithPrivateDetails
elsif current_user.admin?
Entities::UserWithAdmin
else
Entities::UserPublic
end
present current_user, with: entity
end
desc "Get the currently authenticated user's SSH keys" do
......
# Gitaly note: JV: not sure what to make of this class. Why does it use
# the full disk path of the repository to look up attributes This is
# problematic in Gitaly, because Gitaly hides the full disk path to the
# repository from gitlab-ce.
module Gitlab
module Git
# Class for parsing Git attribute files and extracting the attributes for
......
# Gitaly note: JV: needs 1 RPC for #load_blame.
module Gitlab
module Git
class Blame
......@@ -24,6 +26,7 @@ module Gitlab
private
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/376
def load_blame
cmd = %W(#{Gitlab.config.git.bin_path} --git-dir=#{@repo.path} blame -p #{@sha} -- #{@path})
# Read in binary mode to ensure ASCII-8BIT
......
# Gitaly note: JV: seems to be completely migrated (behind feature flags).
module Gitlab
module Git
class Blob
......@@ -107,6 +109,8 @@ module Gitlab
detect && detect[:type] == :binary
end
private
# Recursive search of blob id by path
#
# Ex.
......
# Gitaly note: JV: no RPC's here.
module Gitlab
module Git
class BlobSnippet
......
# Gitaly note: JV: no RPC's here.
module Gitlab
module Git
class Branch < Ref
......
......@@ -48,6 +48,7 @@ module Gitlab
#
# Commit.find(repo, 'master')
#
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/321
def find(repo, commit_id = "HEAD")
return commit_id if commit_id.is_a?(Gitlab::Git::Commit)
return decorate(commit_id) if commit_id.is_a?(Rugged::Commit)
......@@ -124,6 +125,7 @@ module Gitlab
# are documented here:
# http://www.rubydoc.info/github/libgit2/rugged/Rugged#SORT_NONE-constant)
#
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/326
def find_all(repo, options = {})
actual_options = options.dup
......@@ -243,6 +245,8 @@ module Gitlab
# Shows the diff between the commit's parent and the commit.
#
# Cuts out the header and stats from #to_patch and returns only the diff.
#
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/324
def to_diff
diff_from_parent.patch
end
......
# Gitaly note: JV: 1 RPC, migration in progress.
# Gitlab::Git::CommitStats counts the additions, deletions, and total changes
# in a commit.
module Gitlab
......@@ -6,6 +8,8 @@ module Gitlab
attr_reader :id, :additions, :deletions, :total
# Instantiate a CommitStats object
#
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/323
def initialize(commit)
@id = commit.id
@additions = 0
......
# Gitaly note: JV: no RPC's here.
module Gitlab
module Git
class Compare
......
# Gitaly note: JV: needs RPC for Gitlab::Git::Diff.between.
# Gitlab::Git::Diff is a wrapper around native Rugged::Diff object
module Gitlab
module Git
......@@ -81,110 +83,16 @@ module Gitlab
# Return a copy of the +options+ hash containing only keys that can be
# passed to Rugged. Allowed options are:
#
# :max_size ::
# An integer specifying the maximum byte size of a file before a it
# will be treated as binary. The default value is 512MB.
#
# :context_lines ::
# The number of unchanged lines that define the boundary of a hunk
# (and to display before and after the actual changes). The default is
# 3.
#
# :interhunk_lines ::
# The maximum number of unchanged lines between hunk boundaries before
# the hunks will be merged into a one. The default is 0.
#
# :old_prefix ::
# The virtual "directory" to prefix to old filenames in hunk headers.
# The default is "a".
#
# :new_prefix ::
# The virtual "directory" to prefix to new filenames in hunk headers.
# The default is "b".
#
# :reverse ::
# If true, the sides of the diff will be reversed.
#
# :force_text ::
# If true, all files will be treated as text, disabling binary
# attributes & detection.
#
# :ignore_whitespace ::
# If true, all whitespace will be ignored.
#
# :ignore_whitespace_change ::
# If true, changes in amount of whitespace will be ignored.
#
# :ignore_whitespace_eol ::
# If true, whitespace at end of line will be ignored.
#
# :ignore_submodules ::
# if true, submodules will be excluded from the diff completely.
#
# :patience ::
# If true, the "patience diff" algorithm will be used (currenlty
# unimplemented).
#
# :include_ignored ::
# If true, ignored files will be included in the diff.
#
# :include_untracked ::
# If true, untracked files will be included in the diff.
#
# :include_unmodified ::
# If true, unmodified files will be included in the diff.
#
# :recurse_untracked_dirs ::
# Even if +:include_untracked+ is true, untracked directories will
# only be marked with a single entry in the diff. If this flag is set
# to true, all files under ignored directories will be included in the
# diff, too.
#
# :disable_pathspec_match ::
# If true, the given +*paths+ will be applied as exact matches,
# instead of as fnmatch patterns.
#
# :deltas_are_icase ::
# If true, filename comparisons will be made with case-insensitivity.
#
# :include_untracked_content ::
# if true, untracked content will be contained in the the diff patch
# text.
#
# :skip_binary_check ::
# If true, diff deltas will be generated without spending time on
# binary detection. This is useful to improve performance in cases
# where the actual file content difference is not needed.
#
# :include_typechange ::
# If true, type changes for files will not be interpreted as deletion
# of the "old file" and addition of the "new file", but will generate
# typechange records.
#
# :include_typechange_trees ::
# Even if +:include_typechange+ is true, blob -> tree changes will
# still usually be handled as a deletion of the blob. If this flag is
# set to true, blob -> tree changes will be marked as typechanges.
#
# :ignore_filemode ::
# If true, file mode changes will be ignored.
#
# :recurse_ignored_dirs ::
# Even if +:include_ignored+ is true, ignored directories will only be
# marked with a single entry in the diff. If this flag is set to true,
# all files under ignored directories will be included in the diff,
# too.
def filter_diff_options(options, default_options = {})
allowed_options = [:max_size, :context_lines, :interhunk_lines,
:old_prefix, :new_prefix, :reverse, :force_text,
:ignore_whitespace, :ignore_whitespace_change,
:ignore_whitespace_eol, :ignore_submodules,
:patience, :include_ignored, :include_untracked,
:include_unmodified, :recurse_untracked_dirs,
:disable_pathspec_match, :deltas_are_icase,
:include_untracked_content, :skip_binary_check,
:include_typechange, :include_typechange_trees,
:ignore_filemode, :recurse_ignored_dirs, :paths,
allowed_options = [:ignore_whitespace_change,
:disable_pathspec_match, :paths,
:max_files, :max_lines, :limits, :expanded]
if default_options
......
# Gitaly note: JV: no RPC's here.
module Gitlab
module Git
class DiffCollection
......
# Gitaly note: JV: no RPC's here.
module Gitlab
module Git
# Ephemeral (per request) storage for environment variables that some Git
......
# Gitaly note: JV: no RPC's here.
module Gitlab
module Git
class GitmodulesParser
......
# Gitaly note: JV: looks like this is only used by GitHooksService in
# app/services. We shouldn't bother migrating this until we know how
# GitHooksService will be migrated.
module Gitlab
module Git
class Hook
......
# Gitaly note: JV: When the time comes I think we will want to copy this
# class into Gitaly. None of its methods look like they should be RPC's.
# The RPC's will be at a higher level.
module Gitlab
module Git
class Index
......
# Gitaly note: JV: no RPC's here.
module Gitlab
module Git
class PathHelper
......
# Gitaly note: JV: no RPC's here.
require 'open3'
module Gitlab
......
# Gitaly note: JV: probably no RPC's here (just one interaction with Rugged).
module Gitlab
module Git
class Ref
......@@ -24,6 +26,7 @@ module Gitlab
str.gsub(/\Arefs\/heads\//, '')
end
# Gitaly: this method will probably be migrated indirectly via its call sites.
def self.dereference_object(object)
object = object.target while object.is_a?(Rugged::Tag::Annotation)
......
......@@ -553,6 +553,7 @@ module Gitlab
# @repository.submodule_url_for('master', 'rack')
# # => git@localhost:rack.git
#
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/329
def submodule_url_for(ref, path)
Gitlab::GitalyClient.migrate(:submodule_url_for) do |is_enabled|
if is_enabled
......@@ -567,6 +568,8 @@ module Gitlab
end
# Return total commits count accessible from passed ref
#
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/330
def commit_count(ref)
gitaly_migrate(:commit_count) do |is_enabled|
if is_enabled
......@@ -838,6 +841,7 @@ module Gitlab
# Ex.
# repo.ls_files('master')
#
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/327
def ls_files(ref)
actual_ref = ref || root_ref
......@@ -864,6 +868,7 @@ module Gitlab
raw_output.compact
end
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/328
def copy_gitattributes(ref)
begin
commit = lookup(ref)
......
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