From 0ce7ad57b74053be1525dd04ba444a0174073b3c Mon Sep 17 00:00:00 2001 From: timspin Date: Wed, 27 Jun 2012 00:08:13 +0600 Subject: [PATCH 001/357] Adds refs to gitolite conf with $ at the end --- lib/gitlab/gitolite.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gitlab/gitolite.rb b/lib/gitlab/gitolite.rb index efb89165..5fb50f85 100644 --- a/lib/gitlab/gitolite.rb +++ b/lib/gitlab/gitolite.rb @@ -106,13 +106,13 @@ module Gitlab name_writers = project.repository_writers name_masters = project.repository_masters - pr_br = project.protected_branches.map(&:name).join(" ") + pr_br = project.protected_branches.map(&:name).join("$ ") repo.clean_permissions # Deny access to protected branches for writers unless name_writers.blank? || pr_br.blank? - repo.add_permission("-", pr_br, name_writers) + repo.add_permission("-", pr_br.strip + "$ ", name_writers) end # Add read permissions From 87d2a763e61241ea8f1919c1b0f87d4a23efa5d6 Mon Sep 17 00:00:00 2001 From: Dmitry Kalinkin Date: Wed, 27 Jun 2012 21:21:44 +0400 Subject: [PATCH 002/357] fix archiving prefix --- app/roles/repository.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/roles/repository.rb b/app/roles/repository.rb index f61c7782..8de92965 100644 --- a/app/roles/repository.rb +++ b/app/roles/repository.rb @@ -133,10 +133,13 @@ module Repository storage_path = File.join(Rails.root, "tmp", "repositories", self.code) file_path = File.join(storage_path, file_name) + # Put files into a directory before archiving + prefix = self.code + "/" + # Create file if not exists unless File.exists?(file_path) FileUtils.mkdir_p storage_path - file = self.repo.archive_to_file(ref, nil, file_path) + file = self.repo.archive_to_file(ref, prefix, file_path) end file_path From 44ec5579bd73ef1f712e3a116fab5492f19b48ec Mon Sep 17 00:00:00 2001 From: gliptak Date: Thu, 19 Jul 2012 12:39:02 -0300 Subject: [PATCH 003/357] Display configured git repository location on error page (this is partially addressing issue #1072) --- app/views/errors/gitolite.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/errors/gitolite.html.haml b/app/views/errors/gitolite.html.haml index ccee7573..3691b309 100644 --- a/app/views/errors/gitolite.html.haml +++ b/app/views/errors/gitolite.html.haml @@ -15,5 +15,5 @@ Try: %pre = preserve do - sudo chmod -R 770 /home/git/repositories/ - sudo chown -R git:git /home/git/repositories/ + sudo chmod -R 770 #{Gitlab.config.git_base_path} + sudo chown -R git:git #{Gitlab.config.git_base_path} \ No newline at end of file From b0a901fe0165b00ec00c9b8fa32344a413b316bf Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 16 Aug 2012 14:51:31 -0400 Subject: [PATCH 004/357] Add API for Milestones --- lib/api.rb | 1 + lib/api/milestones.rb | 93 +++++++++++++++++++++++++++++++++++++ spec/api/milestones_spec.rb | 53 +++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 lib/api/milestones.rb create mode 100644 spec/api/milestones_spec.rb diff --git a/lib/api.rb b/lib/api.rb index 3ff3b383..be04701c 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -16,5 +16,6 @@ module Gitlab mount Users mount Projects mount Issues + mount Milestones end end diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb new file mode 100644 index 00000000..3cdb7d9f --- /dev/null +++ b/lib/api/milestones.rb @@ -0,0 +1,93 @@ +module Gitlab + # Milestones API + class Milestones < Grape::API + before { authenticate! } + + resource :projects do + # Get a list of project milestones + # + # Parameters: + # id (required) - The ID or code name of a project + # Example Request: + # GET /projects/:id/milestones + get ":id/milestones" do + present user_project.milestones, with: Entities::Milestone + end + + # Get a single project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # milestone_id (required) - The ID of a project milestone + # Example Request: + # GET /projects/:id/milestones/:milestone_id + get ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + present @milestone, with: Entities::Milestone + end + + # Create a new project milestone + # + # Parameters: + # id (required) - The ID or code name of the project + # title (required) - The title of the milestone + # description (optional) - The description of the milestone + # due_date (optional) - The due date of the milestone + # closed (optional) - The status of the milestone + # Example Request: + # POST /projects/:id/milestones + post ":id/milestones" do + @milestone = user_project.milestones.new( + title: params[:title], + description: params[:description], + due_date: params[:due_date], + closed: (params[:closed] || false) + ) + + if @milestone.save + present @milestone, with: Entities::Milestone + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Update an existing project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # title (optional) - The title of a milestone + # description (optional) - The description of a milestone + # due_date (optional) - The due date of a milestone + # closed (optional) - The status of the milestone + # Example Request: + # PUT /projects/:id/milestones/:milestone_id + put ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + parameters = { + title: (params[:title] || @milestone.title), + description: (params[:description] || @milestone.description), + due_date: (params[:due_date] || @milestone.due_date), + closed: (params[:closed] || @milestone.closed) + } + + if @milestone.update_attributes(parameters) + present @milestone, with: Entities::Milestone + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Delete a project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # milestone_id (required) - The ID of a project milestone + # Example Request: + # DELETE /projects/:id/milestones/:milestone_id + delete ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + @milestone.destroy + end + end + end +end diff --git a/spec/api/milestones_spec.rb b/spec/api/milestones_spec.rb new file mode 100644 index 00000000..23f19ddd --- /dev/null +++ b/spec/api/milestones_spec.rb @@ -0,0 +1,53 @@ +require 'spec_helper' + +describe Gitlab::API do + let(:user) { Factory :user } + let!(:project) { Factory :project, owner: user } + let!(:milestone) { Factory :milestone, project: project } + + before { project.add_access(user, :read) } + + describe "GET /projects/:id/milestones" do + it "should return project milestones" do + get "#{api_prefix}/projects/#{project.code}/milestones?private_token=#{user.private_token}" + response.status.should == 200 + json_response.should be_an Array + json_response.first['title'].should == milestone.title + end + end + + describe "GET /projects/:id/milestones/:milestone_id" do + it "should return a project milestone by id" do + get "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}" + response.status.should == 200 + json_response['title'].should == milestone.title + end + end + + describe "POST /projects/:id/milestones" do + it "should create a new project milestone" do + post "#{api_prefix}/projects/#{project.code}/milestones?private_token=#{user.private_token}", + title: 'new milestone' + response.status.should == 201 + json_response['title'].should == 'new milestone' + json_response['description'].should be_nil + end + end + + describe "PUT /projects/:id/milestones/:milestone_id" do + it "should update a project milestone" do + put "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}", + title: 'updated title' + response.status.should == 200 + json_response['title'].should == 'updated title' + end + end + + describe "DELETE /projects/:id/milestones/:milestone_id" do + it "should delete a project milestone" do + expect { + delete "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}" + }.to change { Milestone.count }.by(-1) + end + end +end From a64aff2f1c1ddc77b00211489d74fbc23c0c2fa2 Mon Sep 17 00:00:00 2001 From: Florian Unglaub Date: Fri, 3 Aug 2012 17:27:39 +0200 Subject: [PATCH 005/357] Omniauth Support --- Gemfile | 4 ++ Gemfile.lock | 32 ++++++++++++++ app/assets/stylesheets/auth_methods.scss | 10 +++++ app/assets/stylesheets/main.scss | 26 ++++++------ .../omniauth_callbacks_controller.rb | 32 +++++++++++++- app/helpers/application_helper.rb | 11 +++-- app/views/devise/sessions/new.html.erb | 13 ++++-- app/views/layouts/profile.html.haml | 2 +- app/views/profile/password.html.haml | 40 ++++++++++++------ app/views/profile/show.html.haml | 7 +++ config/gitlab.yml.example | 22 +++++++--- config/initializers/1_settings.rb | 19 ++++++--- ...803152018_add_provider_and_uid_to_users.rb | 6 +++ db/schema.rb | 32 +++++++------- .../assets/images/authbuttons/github_32.png | Bin 0 -> 1931 bytes .../assets/images/authbuttons/github_64.png | Bin 0 -> 4447 bytes .../assets/images/authbuttons/google_32.png | Bin 0 -> 1615 bytes .../assets/images/authbuttons/google_64.png | Bin 0 -> 3446 bytes .../assets/images/authbuttons/twitter_32.png | Bin 0 -> 1439 bytes .../assets/images/authbuttons/twitter_64.png | Bin 0 -> 3384 bytes 20 files changed, 195 insertions(+), 61 deletions(-) create mode 100644 app/assets/stylesheets/auth_methods.scss create mode 100644 db/migrate/20120803152018_add_provider_and_uid_to_users.rb create mode 100644 vendor/assets/images/authbuttons/github_32.png create mode 100644 vendor/assets/images/authbuttons/github_64.png create mode 100644 vendor/assets/images/authbuttons/google_32.png create mode 100644 vendor/assets/images/authbuttons/google_64.png create mode 100644 vendor/assets/images/authbuttons/twitter_32.png create mode 100644 vendor/assets/images/authbuttons/twitter_64.png diff --git a/Gemfile b/Gemfile index d2a5728f..12610b65 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,10 @@ gem "mysql2" # Auth gem "devise", "~> 2.1.0" +gem 'omniauth' +gem 'omniauth-google-oauth2' +gem 'omniauth-twitter' +gem 'omniauth-github' # GITLAB patched libs gem "grit", :git => "https://github.com/gitlabhq/grit.git", :ref => "7f35cb98ff17d534a07e3ce6ec3d580f67402837" diff --git a/Gemfile.lock b/Gemfile.lock index 7356c35e..b34f401b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -166,6 +166,8 @@ GEM eventmachine (0.12.10) execjs (1.4.0) multi_json (~> 1.0) + faraday (0.8.1) + multipart-post (~> 1.1) ffaker (1.14.0) ffi (1.0.11) foreman (0.47.0) @@ -191,6 +193,7 @@ GEM httparty (0.8.3) multi_json (~> 1.0) multi_xml + httpauth (0.1) i18n (0.6.0) journey (1.0.4) jquery-rails (2.0.2) @@ -200,6 +203,8 @@ GEM jquery-rails railties (>= 3.1.0) json (1.7.4) + jwt (0.1.5) + multi_json (>= 1.0) kaminari (0.13.0) actionpack (>= 3.0.0) activesupport (>= 3.0.0) @@ -223,12 +228,35 @@ GEM sprockets (~> 2.0) multi_json (1.3.6) multi_xml (0.5.1) + multipart-post (1.1.5) mysql2 (0.3.11) net-ldap (0.2.2) nokogiri (1.5.3) + oauth (0.4.6) + oauth2 (0.8.0) + faraday (~> 0.8) + httpauth (~> 0.1) + jwt (~> 0.1.4) + multi_json (~> 1.0) + rack (~> 1.2) omniauth (1.1.0) hashie (~> 1.2) rack + omniauth-github (1.0.1) + omniauth (~> 1.0) + omniauth-oauth2 (~> 1.0) + omniauth-google-oauth2 (0.1.13) + omniauth (~> 1.0) + omniauth-oauth2 + omniauth-oauth (1.0.1) + oauth + omniauth (~> 1.0) + omniauth-oauth2 (1.1.0) + oauth2 (~> 0.8.0) + omniauth (~> 1.0) + omniauth-twitter (0.0.12) + multi_json (~> 1.3) + omniauth-oauth (~> 1.0) orm_adapter (0.3.0) polyglot (0.3.3) posix-spawn (0.3.6) @@ -411,7 +439,11 @@ DEPENDENCIES minitest (>= 2.10) modernizr (= 2.5.3) mysql2 + omniauth + omniauth-github + omniauth-google-oauth2 omniauth-ldap! + omniauth-twitter pry pygments.rb! rack-mini-profiler diff --git a/app/assets/stylesheets/auth_methods.scss b/app/assets/stylesheets/auth_methods.scss new file mode 100644 index 00000000..ed6f5b0f --- /dev/null +++ b/app/assets/stylesheets/auth_methods.scss @@ -0,0 +1,10 @@ +.auth_methods { + &ul { + margin: 0; + text-align:center; + padding: 5px; + &li { + display: inline; + } + } +} diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 5613f1e8..0e3de4e8 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -3,8 +3,8 @@ /** GITLAB colors **/ $text_color:#222; -$lite_text_color: #666; -$link_color:#2A79A3; +$lite_text_color: #666; +$link_color:#2A79A3; $active_link_color:#2FA0BB; $active_bg_color:#79C3E0; $active_bd_color: #2FA0BB; @@ -31,7 +31,7 @@ $hover: #FDF5D9; box-shadow: 0 0 3px #ddd; } -@mixin solid_shade { +@mixin solid_shade { -moz-box-shadow: 0 0 0 3px #eee; -webkit-box-shadow: 0 0 0 3px #eee; box-shadow: 0 0 0 3px #eee; @@ -73,21 +73,21 @@ $hover: #FDF5D9; /** - * Header of application. + * Header of application. * Contain application logo, search panel, profile icon */ @import "sections/header.scss"; /** - * Navigation menu of application. + * Navigation menu of application. * Panel with links to pages depends on project, profile or admin area */ @import "sections/nav.scss"; /** - * This file represent some UI that can be changed - * during web app restyle or theme select. - * + * This file represent some UI that can be changed + * during web app restyle or theme select. + * * Next items should be placed there * - link, button colors * - header restyles @@ -118,11 +118,11 @@ $hover: #FDF5D9; * Most of application styles placed here. * This file represent common UI that should not be changed between themes * or project restyling like form width or user avatar class or commit title - * + * * TODO: clean it */ @import "common.scss"; - +@import "auth_methods.scss"; /** * Styles related to specific part of app @@ -140,17 +140,17 @@ $hover: #FDF5D9; @import "ref_select.scss"; /** - * Code (files list) styles. Browsing project files there + * Code (files list) styles. Browsing project files there */ @import "sections/tree.scss"; /** - * This file represent notes(comments) styles + * This file represent notes(comments) styles */ @import "sections/notes.scss"; /** - * Devise styles + * Devise styles */ @import "sections/login.scss"; diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index d19931e9..84e578a3 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -9,7 +9,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController error ||= env["omniauth.error.type"].to_s error.to_s.humanize if error end - + def ldap # We only find ourselves here if the authentication to LDAP was successful. info = request.env["omniauth.auth"]["info"] @@ -20,4 +20,34 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController sign_in_and_redirect @user end + Settings.omniauth_providers.each do |provider| + define_method provider['name'] do + handle_omniauth + end + end + + private + + def handle_omniauth + oauth = request.env['omniauth.auth'] + provider, uid = oauth['provider'], oauth['uid'] + + if current_user + # Change a logged-in user's authentication method: + current_user.uid = uid + current_user.provider = provider + current_user.save + redirect_to profile_path + else + @user = User.find_by_provider_and_uid(provider, uid) + + if @user + sign_in_and_redirect @user + else + flash[:notice] = "There's no such user!" + redirect_to new_user_session_path + end + end + end + end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 51569b06..8a457cea 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -75,16 +75,16 @@ module ApplicationHelper end def show_last_push_widget?(event) - event && + event && event.last_push_to_non_root? && !event.rm_ref? && - event.project && + event.project && event.project.merge_requests_enabled end def tab_class(tab_key) active = case tab_key - + # Project Area when :wall; wall_tab? when :wiki; controller.controller_name == "wikis" @@ -123,4 +123,9 @@ module ApplicationHelper def hexdigest(string) Digest::SHA1.hexdigest string end + + def authbutton(provider, size = 64) + image_tag("authbuttons/#{provider.to_s.split('_').first}_#{size}.png", + alt: "Sign in with #{provider.to_s.titleize}" ) + end end diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb index a0383866..6b334b87 100644 --- a/app/views/devise/sessions/new.html.erb +++ b/app/views/devise/sessions/new.html.erb @@ -14,10 +14,15 @@
<%= render :partial => "devise/shared/links" %>
<%- if devise_mapping.omniauthable? %> - <%- resource_class.omniauth_providers.each do |provider| %> -
- <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn primary" %>
- <% end -%> +
+
+
    + <%- resource_class.omniauth_providers.each do |provider| %> +
  • <%= link_to authbutton(provider), + omniauth_authorize_path(resource_name, provider) %>
  • + <% end -%> +
+
<% end -%> <% end %> diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index b624415d..810b346f 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -10,7 +10,7 @@ = link_to "Profile", profile_path %li{class: tab_class(:password)} - = link_to "Password", profile_password_path + = link_to "Authentication", profile_password_path %li{class: tab_class(:ssh_keys)} = link_to keys_path do diff --git a/app/views/profile/password.html.haml b/app/views/profile/password.html.haml index 257dacb1..1d4d468c 100644 --- a/app/views/profile/password.html.haml +++ b/app/views/profile/password.html.haml @@ -1,19 +1,31 @@ %h3.page_title Password %hr -= form_for @user, url: profile_password_path, method: :put do |f| - .data - %p.slead After successful password update you will be redirected to login page where you should login with new password - -if @user.errors.any? - .alert-message.block-message.error - %ul - - @user.errors.full_messages.each do |msg| - %li= msg - .clearfix - = f.label :password - .input= f.password_field :password - .clearfix - = f.label :password_confirmation - .input= f.password_field :password_confirmation += form_for @user, url: profile_password_path, method: :put do |f| + .row + .span7 + .data + %p.slead After successful password update you will be redirected to login page where you should login with new password + -if @user.errors.any? + .alert-message.block-message.error + %ul + - @user.errors.full_messages.each do |msg| + %li= msg + + .clearfix + = f.label :password + .input= f.password_field :password + .clearfix + = f.label :password_confirmation + .input= f.password_field :password_confirmation + + - if Settings.omniauth.enabled + .span5.right + .auth_methods.alert.alert-info + %strong Tip: Use one of the following sites to login + %ul + - User.omniauth_providers.each do |provider| + %li= link_to authbutton(provider), | + omniauth_authorize_path(User, provider) | .actions = f.submit 'Save', class: "btn primary" diff --git a/app/views/profile/show.html.haml b/app/views/profile/show.html.haml index 95cce2bb..4d89cd3d 100644 --- a/app/views/profile/show.html.haml +++ b/app/views/profile/show.html.haml @@ -49,6 +49,13 @@ %strong Tip: You can change your avatar at gravatar.com + - if Settings.omniauth.enabled && @user.provider? + %h4 + Omniauth Providers: + = link_to "Change", profile_password_path, class: "btn small right" + You can login through #{@user.provider.titleize}! + = authbutton(@user.provider, 32) + %h4 Personal projects: %small.right diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 1818f2c0..622ac9ec 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -1,4 +1,4 @@ -# # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # Gitlab application config file # # # # # # # # # # # # # # # # # # # @@ -19,14 +19,14 @@ email: # Application specific settings # Like default project limit for user etc -app: - default_projects_limit: 10 +app: + default_projects_limit: 10 # backup_path: "/vol/backups" # default: Rails.root + backups/ # backup_keep_time: 604800 # default: 0 (forever) (in seconds) -# -# 2. Advanced settings: +# +# 2. Advanced settings: # ========================== # Git Hosting configuration @@ -49,3 +49,15 @@ git: git_max_size: 5242880 # 5.megabytes # Git timeout to read commit, in seconds git_timeout: 10 + +# Omniauth configuration +# omniauth: +# enabled: true +# providers: +# - { name: 'google_oauth2', app_id: 'YOUR APP ID', +# app_secret: 'YOUR APP SECRET', +# args: { access_type: 'offline', approval_prompt: '' } } +# - { name: 'twitter', app_id: 'YOUR APP ID', +# app_secret: 'YOUR APP SECRET'} +# - { name: 'github', app_id: 'YOUR APP ID', +# app_secret: 'YOUR APP SECRET' } diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 5c5987a8..741a29d5 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -6,7 +6,7 @@ class Settings < Settingslogic self.web['protocol'] ||= web.https ? "https" : "http" end - def web_host + def web_host self.web['host'] ||= 'localhost' end @@ -14,11 +14,11 @@ class Settings < Settingslogic self.email['from'] ||= ("notify@" + web_host) end - def url + def url self['url'] ||= build_url - end + end - def web_port + def web_port if web.https web['port'] = 443 else @@ -36,7 +36,7 @@ class Settings < Settingslogic raw_url << web_host if web_custom_port? - raw_url << ":#{web_port}" + raw_url << ":#{web_port}" end raw_url @@ -111,5 +111,14 @@ class Settings < Settingslogic def backup_keep_time app['backup_keep_time'] || 0 end + + def omniauth_enabled? + omniauth['enabled'] || false + end + + def omniauth_providers + omniauth['providers'] || [] + end + end end diff --git a/db/migrate/20120803152018_add_provider_and_uid_to_users.rb b/db/migrate/20120803152018_add_provider_and_uid_to_users.rb new file mode 100644 index 00000000..14f53e4e --- /dev/null +++ b/db/migrate/20120803152018_add_provider_and_uid_to_users.rb @@ -0,0 +1,6 @@ +class AddProviderAndUidToUsers < ActiveRecord::Migration + def change + add_column :users, :provider, :string + add_column :users, :uid, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index c4c54f56..5ac159d8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120712080407) do +ActiveRecord::Schema.define(:version => 20120803152018) do create_table "events", :force => true do |t| t.string "target_type" @@ -146,31 +146,33 @@ ActiveRecord::Schema.define(:version => 20120712080407) do end create_table "users", :force => true do |t| - t.string "email", :default => "", :null => false - t.string "encrypted_password", :limit => 128, :default => "", :null => false + t.string "email", :default => "", :null => false + t.string "encrypted_password", :default => "", :null => false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", :default => 0 + t.integer "sign_in_count", :default => 0 t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "name" - t.boolean "admin", :default => false, :null => false - t.integer "projects_limit", :default => 10 - t.string "skype", :default => "", :null => false - t.string "linkedin", :default => "", :null => false - t.string "twitter", :default => "", :null => false + t.boolean "admin", :default => false, :null => false + t.integer "projects_limit", :default => 10 + t.string "skype", :default => "", :null => false + t.string "linkedin", :default => "", :null => false + t.string "twitter", :default => "", :null => false t.string "authentication_token" - t.boolean "dark_scheme", :default => false, :null => false - t.integer "theme_id", :default => 1, :null => false + t.boolean "dark_scheme", :default => false, :null => false + t.integer "theme_id", :default => 1, :null => false t.string "bio" - t.boolean "blocked", :default => false, :null => false - t.integer "failed_attempts", :default => 0 + t.boolean "blocked", :default => false, :null => false + t.integer "failed_attempts", :default => 0 t.datetime "locked_at" + t.string "provider" + t.string "uid" end add_index "users", ["email"], :name => "index_users_on_email", :unique => true diff --git a/vendor/assets/images/authbuttons/github_32.png b/vendor/assets/images/authbuttons/github_32.png new file mode 100644 index 0000000000000000000000000000000000000000..247e52a5f4282110243afa350cd4a13b0154c2a1 GIT binary patch literal 1931 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}oCO|{#S9FrogmDZn=$tn z0|SF(iEBhjaDG}zd16s2gJVj5QmTSyZen_BP-IyNBZ6tSKNPpV|m%E z(z`#JkEHLld%ov>`Mvi)@BL={cfb9MP+7nVviY$L^wP|O}OTS%lo7SGQkL~Zj_on*i)W!Dmb=iWM9(>qr|IxJd z_U^aaKK))3Cd#*)x8Lpx>*`ekBfg{>@u=+>!{M<_v?hXv+hil zm^aTka;9iqKet`gw-C!CmO5hGA+9GUvv%b)`n*3SG&yBX$h2&k&~-;zgY)J9kN9PFf$I7Pq}(VWoM3@kTWhmFYskN0&{%zI(~SHGk~??vyc82@BgeDM~wX z*R-=rM)Km<552f^&nYdq^^`7)Q<^~0L`ky_?aJB(FI)wKV_zN+-@Y~B_cDgIoNmJSutbOpEGTbcCg+AUv95EpO=u3vC}eYtj946stek z@>~C8?CuGUxHqdKsaiwfhrR75out*-FRETJNSSS);qay3lTVdlUv-AO8N2kmh$GVe z$Hg*>XVx6FNKE!Mb<Ej{bQZKukmjD&31pgfvXV$A4C8ZiY^*tg@7b~0^c9_}lO`oGH zSoiUarenGEC$}@+e-H1lF;IIGBk_ixCr803`O~(%RpJ|uE|;3$yKtKwLujadXx%*l zhWQg(&mEiYC1jbt`QppU$>EPzwM;iT_~%QM*#4S_8b&kE)bl5#2Mc_SGyj&eSN5~^ z$}J32eU`SoXWWrE5dFOB!_)KS3NO~1Rh};SG&!V2 z!sTG&V(#vUh$y$77pES~xS=4|J@fq*maKwD>Gz$bpSP68)fd-DJv?lGOTt0F@>58X z=-ZU0ztv^41P?~8y_B~+>4`{Ldb{<JBwlFp}E;wbmM5uel?9QaJDz1;M60fA3BNU?5 z!!J(=6aMh_7H>Rzqrd8VU9KB3QTq<=urkrRa$b4otV1v7+5Pz^|2}DoP{_hlQzJ!{ zcVFDQ`c`|s-Nz|A?7w~A?2yA$E%%@8(C*odIZ`j5hMwW^t0@xMV6}7J_AA$C%oPxq zy*Gn#8RwN{Y>Q2HyQgpPNu9P^iA|0x|M0`~x{l|4vP(-PZGLVQnRCVYgGb=m38JU( zGH&3!!G43K^y)gH^<}}+kJy~!x4D!p*<-k(=JwU%e>yhzqH=D3Wi{EBcXX!l-HM+l zygx*nUJ1LoV$E&WjG`xZu5z}rdAw+!(l?vA?jYaQUo4`>9)05a_icTD%P(%f7aX~+ z-{s?7p6_es*qV3v-rx2MKR-Ce)cx0qv;1~Q)-~hsybZO$wtIk@TAsk?DER9V&k|6;eeqqjz7a)+B+;iDgh$|0OPee!q}twXORRYo3hga;b;)#3`Pa4#x5}QUe;4d{sPTm9^e3fRx62oOzhwF6 z<%{(XSAJI(>s0b}u->(=>-77-!i~$s&iMKtV z<-1=s&+0|xrA;gHyDqYK)`dvzxMuwGRrmg?MXwKB-~aUEuUj&H>Xwaq6LXYa`OWN^ z=OrXH;adGuj)hgV8zyE5>t6gKe7yenuj`(FcAh-=@4Dt{w~AsWz1JF9!m7y{M>H09 zdhH6ku-Pj`u;%e8mFJA7U3ugFS+_oYb;$I^sVQgUjZMzRzEu(ri<)`SqUPPx+W`lJ z{!iI*gmuy0sn_<-{?8=5bIL;rMpXvUTbzIEKfV58&&0zJWmdK II;Vst0A0+q{r~^~ literal 0 HcmV?d00001 diff --git a/vendor/assets/images/authbuttons/github_64.png b/vendor/assets/images/authbuttons/github_64.png new file mode 100644 index 0000000000000000000000000000000000000000..fca7bf44652470a58edd12b410613656da95aed3 GIT binary patch literal 4447 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE~)k>)Ik z3H|!-fBI>w+-aVd-uTX%WRiJ#lG&DRTO%ApM8x^rSuCrLJY`ta@u1N1+TlXR!gzsx zxi34yx5%_4X+}gdx3q0D$(@yU|JJgb>T`Y6Zl9@nU;F=W?z8hLn@?DN+nWFH+r9tq z-+jMZ&0MfFHZ%Oz)Uu_2|C=RFOm1~O_cPw~=7s6K3{uI5^Y;IreP3TpIC#~ZbuFtB zG+0`1&Mf$CT^8Z@>+k2%3)TiQAC(SnS$5*;$xVB5PRLHWVs2Eh@7;6$+Lglk&U;RK zyD~8UyY;B z@^=1?myzL3+1n52F)u&N$hTXzzifl2P)i{zYoui0%{is!!lx99e0vB$4DoER+T(tU9Kwz={xuP!-x_!YSB zO~_7_{Ih!_tA(Sf*6NsrLE#G*@hsf%X-=L2BVYT}#ffndeA=J4Ru^5VK75MvZgKUe z?z*=1H#%)ImWnU2xKe(v@c#7mo~O^%cC1)l-pVX-)k5i6lj4c*OI-J=*qTaKvAN$^ zq`GK@#>T~64sM~st-P^&#l9B0)CMlyu_7q${epS3RiZ!SthigZ?cs&SFlM1=PZ_G3 zpPbabu}*Ksjj)GIDWQQ$^2=QVt<7z?R3FQISmV)K60z$a!zV;vO?=nRIQtO>Z?cGK?o95cBaP`D0+vipO+`oYjhApFipVx9I;!d^ zIy(GdZHi0y6z;G?eTLX#<{3VQ(`lMRY8nT+meUi5G%wrn|{ zbxP#a@odr7)e=T=7T1nUIG}O5q=~14nd9PjNpX&zUtQn0FV`=LifEqrrTxJFRt{&Y z4{Fgm$F?>$H8D(b4n3#Bx8u@IAFfjyzuswhT761z#rAda*7_f^yq)=W?pro#X87Ca zKhnGO1WXM>t{>ECO89V1?7^y|+Jo`^?PERwQvW$xNc>XU$hF{*<*P&4MBa z9e5m7*$Ngk{$_7#Y<-@&t##M6BAMm4=e}rKE4nm;_t=7+%jMlBa$mZ8((u07JN^R~ zH^&-S+8!?P_Kj3rb1EX!vh43G8;g!GC9~2LW7CwoFZ&+a=}lsOb~A9oTJ;B=zkbfl zJky-rdziJ@5t5mI0GFxa|%;#Oju>AGakwM(saPCH-j zyZ^rZ_`d%dF>~fLubLI*asJfCWnY@i_Io=xWagResebMDj7@)wp!$lK34#l`g)WK+ z301MX^X@iJ{p$Q!xFGQc_s*HS>~8F@x3~FpLiyI$TdT5mJbV_Ncz4-ZsjaEL{wJTw zD&3FOlVp6q;%NWdJDW6m=Dm5*eBg^tw8!h6-5m|4({y|}E;w8-+i0}s-o<360}Gwo zeTt*~=cm-Z{gw6Og8KW`HFs*h{BbH+x0<=_*ZJo15*D?;!UpEns~KJtG^K3TMV#m_c zyOk^jjl!3_2$a`dr*8aY(vGQ9rtGN{aF7-`tNAQs_MCaW4?nh=*gBZ)dwgiZ)m zh3@m}zwvr1c6!fr;qGI#3EbIUS=rX0=6-0w_2WKso^G37+$i*G+QTc^?)L>)jy!EJ zzWZFk-oE~z{^EoaC(jj&MN0pjW9GT_Y1-L$^Jlg3c`Yiq`000zfobO6*-JFOzP+B` z%>QPG)U{{n&R&bSHGH4D&VB5v{q(DUqrJh=N1Y-@%Jt1oY1`lYy!lA*!=H<8GlXRe z?oQ*K_EJAN`@mco&0P^IwL^I_mhafOWkTzXlQ%6}IiwFPp7!QIy>alhd9hhROg6ti z)NWXu)w}e);Of{}bE2f!FD%kHe!Y8JU9G2La8uYs>Gk!KHtq{83O@b*qxhwd718`Z zmM>3CII~>wq=wcal}NUX?{$CmWGiM1o6EhPviD!*9sM)D|G$?uNCnNFH@Ep%UtCGE z|AEeL^Hvn{%{$%g6FE_5a#3&IgN@ z)BI9@x&FzvU*_cO^fVB?Ao{FLs9Eom$l;7~`8`Gd(;fI)6F)oOZ<^zB$JpnmUbCn{ zK-&s)!5MuoRpWvKnRc6p9$2<%k;a3Sfl@t2&Qo-aiab@WU--W1Gq+E%@4q%{>0R^h zwI9%4`F~xl|0CP;PYs)&y;*Z6Wvhdz}-Q_oJ9Alle_pbbHbNlgR+wH5k1D?)ZWc|c&*~htw z(b3XVrcQNCN>U10r1A6r*Hyrb$LGUgspgm!50zgSB~X zz@K-s6*@Y2&iXjtT)TatY~7`vHy=3*7TuikX4_N614owa>0WV8^Fb!7P2j49Tf3L; z3>B=peXL01%&CS~ud*a0B^!?&bNjaD@f%6ipPeB-ex=TFg_@@=R#!dPR{gHsU4BQq zYu&#OhgNTRzW9A}$|?OtCxvJ6Io|AjAL0{wdSb@@l=qGrt5!BFT77zYCqsux?v!rv z3o|u4q^iHv!`1`0D;1?ce-G+=u6J_xIUvx2_Tn@VWo#;`fHLdF>Bueq}K#C1|8_ zYTIg_WuVoyq&Kur$&Oe;b zzvoQNq~q^)GhfQo7gGLyy?7DpoyeC3oTA&7tMtG5VicUbX`kmpzo&(P2QMWEIBD$n znJsO#blbYsk>aLx5~(IFX(T%S1Cq&A4?>jdnsnlgR7sS?_Od%XD0pUU7&0tnG8tBTV9q zR_d+c|QT%k|-u*>; z&d2h(pODxVCQ!h3c0qno=0Yu|f9u=(r6S@2*CfU%sqeh}@LT?Wkxe$O8{WI`XLx^x zA?C$96ODw}%v~2^_4L*^dEQ^D%4l!Tlp@P1#kAwjwfQe2uC#Y#&&$tfxi4SCxhyTs zbb)gJzbhsjODZ4iEw2&kI<58KY3+HZ`2UeJX3sTz$r_r{@ymVQ&)cayosuj4Tiu(2 zCb}LJ`gC5i(n|ipSKqfiPkXtp9*J$+;dn{H$~n&U_?;gU{SWl-{}cHl)0SK4MxyiC z=!-R8yIx$l_UlCV=~ae(-3(f3A!6z?CM+=UlbE;8n(gPjk`)@~lHHT}3QkmW_H8dS zF1+acvg%5B|GL*632L?`hwt-Em^qm{d)2CkUnW-FQQG|=<*uN{${P%wnkyg3$}y#{ z5`M-1YUANGdz>U}?w>wq{`Lm1GV|XH*XyR~)e0zA%84`X+c@!>%6F~_k%o&7oVpqz zsO-*kcezG@KCAPZ6!s($bLq>s1XDLp^tOiVP#i=fn8(WIa|2*#Z-;jNYzifHfR5wPqtywXBtC=f01wStM8-D-aEAJPxzc(M0 zowl=9eYQMT>(+BQl^UPwJYJuYvGe0I6h86pB-{Rj37J>kr;3Xl)Gfcu?-$O*QX?Gj z{|lo<;Rl1Bulx@6)zi1VI}^GyN_6%s*-zQ0?yj^fTeV17*U};2)EbpJEn*=B3TMh< zT5gp7I+DEf>g@dsZ-gYIu25R-KczA?%;#?AQ6@J2iw9T(ozKdIZ2OnBBd56fwFPhGg_wz5jl@sV#(e!{JtXz|QroZ-S#o5O= zwLaWQ*GEond>8&5X^GRH zz$esV$-?)2!KN?A=hr-6$$LE~f6uD4+voNyx*Gkw$+3}HX~wAu9J@_om+S4ZW8t>qTl8P*KiFEx#M*iz&E1XNYu-$*6`yy%`ey%Cr0Gug-TvZbg3}aUtc=x7 zRGiVgV9lS%MO`6#CVWurY~p5Dd#vKcr1r4(7W3^)8I7qcmCi2qP!;Ww>T7x!74XD= zed==?6&LS@91pS0#Yv&dgfjY9*i4SB5&e?fv6APhWooKsvUR8PMsDFBQyJZq}B=#;E>&@3wGJ$mZa{4$PX zrx-R1O(+#_T&R2|m${fdw8cfCsqe_GCt{b_61tR=#o`5mCUSBoICIZ2V92@SRIn=B z-SOc(jRU-@yPZ;w=Eevb6fivJxY;1mS|#W%E9k{vWXXS?{YFsKpG%3Y)jU-}7v^Uc zKfc8u9Cr4B;t9buO8O4{F`3~}bH2$lvN7oId2^wg?NK=c0|SGntDnm{r-UW|^0i|t literal 0 HcmV?d00001 diff --git a/vendor/assets/images/authbuttons/google_32.png b/vendor/assets/images/authbuttons/google_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3909e9de93b22e1f3a2e6c264f6289331412a3bb GIT binary patch literal 1615 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}oCO|{#S9FrogmDZn=$tn z0|SF(iEBhjaDG}zd16s2gJVj5QmTSyZen_BP-z7DKNjt&We&yF7b4 zJ0*mUurPNBnksC|TyjN2e&MBQ{cM>F-MRN}E5Goq%KGt}bNBAO`?^k`Zl=Y{+vR27 z=GM-uv`>51@V{EQ{O7wosr||mrcIl6$F*DRYWKS>yZY-~qn|UZdiFf=`|i^+WwzS# z&DY9V=M*bGa&~blkURd!rq9=+DP8&E`s;DLvHqS3@9*vXxpnK-_R!GU4{O)|JGAfd zUWF+V3fyU_iRYKOPkdP{xozUPGL~!W7}AA8w@+kAxi8UP!!|i8`OleyAAT6W=ehHy zJ5kH5=GKiHKX%=Jzy9?L*@NHy&i$~odcw2P!;_yK`>=zpzk5;9xe`l5bN)YW3~w$~ zYUqiE1hxbOO!d-rQTO-o>ACvMe{o91^A9%+CAP4v=xvbdbV++LcX9pq!`cmd*>-qm zOuzX5-Fdr~V~eh_++X$F@$%jUas8@Y$61fAd*qe-Vj107bDiq)NY#!A+rpho!jcy?yjZYH!rOfBf_m$U%rkwS zlT*`)#jb(STSxdy?u%emo`nSe-vFCd)C^~17vSg*w@{}acRGWu2 z50<5xU%Z>Tw|tpx`IR|)=er4ROkTONYg^t+pEo%#J0}}38eMu+DV_QEY(?oB1KIu0 zt1nJox9GU~wI!JvZ}}HnSadxVZwnNW*?zGgtj>!mdv*H5<;H(^mE<7FQ%R}Nj$XV+MFbt!b2xm?{=ya6qsL!QPe|+IZ@rm$V{4+}ueM`7b3SliJedCflUbW`;?AVx zt7lmHZ9nfg;?cQZS@osGrd=Es)wY(5w$ahnY#Va2g-^MvPU*NR?)yEd_G}JwOn$UA zpT)tQvUAiW%O}k+V!6|0>VABxpp30`gYEIEo`NG$zVB>yCZ)yOcK54B@3mD47D~7y zls5Uoij=r0C#n$;&c^E%D8vKL76zldI%cfv&Npl|I5m-)$;j_uUmQ2$abW#=Bw z)&5_YHdiv8vsDh26nkE=F|kzB%X?Fxsk!>ohjG@Mh1g?eZ+!EiT5W>b*0k?Ew%<-l zTG)Je`b=ue+X}w*Hn!~ET<03T=CSM!U@q&DIK&(+J30H4_@lqA`bQ2XUrqSV^xRKh zCC7!2N%Z@9hJL=rxq9sHg~TWPlXX~O8TTxFdt>Yx)0{O0Iu&O7ikwZPcia^|sqeZZvE6OXbXB8!XV_+VIB|TODqTFQ%KuiEA_#-%lS~`f&9M`z^7@?yb_1d#}FB`kT$NSe5EsuQSVc#P-|~NOx7+-vn)9TO&O=rKBXL-wzkNrvQq$E8h$XH_|i&sMMAv!n2*wdbTl8J7Qh ezpZCrW;n?{yLQ*X&Up+B3=E#GelF{r5}E)u2>A8@ literal 0 HcmV?d00001 diff --git a/vendor/assets/images/authbuttons/google_64.png b/vendor/assets/images/authbuttons/google_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e55f34f1b7d57c52172eb2bab0964037c532629b GIT binary patch literal 3446 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 literal 0 HcmV?d00001 diff --git a/vendor/assets/images/authbuttons/twitter_32.png b/vendor/assets/images/authbuttons/twitter_32.png new file mode 100644 index 0000000000000000000000000000000000000000..daadcffd315f11026cface9d99409997050ab9b9 GIT binary patch literal 1439 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}oCO|{#S9FrogmDZn=$tn z0|SF(iEBhjaDG}zd16s2gJVj5QmTSyZen_BP-kcwMR!p~;Q zhKksKKeuQ7jPzM*rkUJo8y$TVG+ftQZS@d;zPh5WA!qBE5;n7)x3(a2I5A0p0ES!>cu5F+Cbv0XY?RSxKpDOLP zPYb&ymZe_*@5kMxF$~7X?@L-5)IM2VwA3b8Ph645`NA!!uRnSXi?W26c?=dtUh6T< zx}gxO&eOI2<(+kkw$kxYGi<+KdNY&%eZ}m=WBcT!=GU#h6h3oh*zW}~Iu08>7;boP zZ|=C3{J2*#dqO+wBOap$6~zf0g>z1n`dokW_`!`Yw@voDE9bEbWSRW#Y85!OllhvHLds)@G=9X*hPBD>o<-Wno$$07am!3tx&&>Vx zXzkiH2RBSz_QK=&g%9matnTXW51zhk-ehKYMgQ~k>3NshdzF_y-tlQmQFC5|ftG6Y z$Ayi*BWLeoZ8$h>j-Z8A!^(@cy0=XX@Ax0sQXHImVO3aE@~L@K+;;`!JbBkJ%|dz0 zfq=W4!vixkd|&7=rkZFdEjKcAW#urAUn)@)vVfOiv#7!B(_5}Ry=yyFNoMvf{uwt! z9<%fOGGW=VaSz+`|9iL{Yy{f{HXEK|U$DiC_xH}1PM;;#h&+(^n6!Mc2-}CV`KI%8 zciz5migCI5qt5w)Y(mnD{F+({qc(<_r=4GE%&Hf$y zUOd4hNqgsw5XZ0sGp;>$bLo=wj@_`8<-aYr%lF7A;mcR5!fS5roU}nGFSq+n)ng-J zg=>FRHWj_ytlWP7trthr4GaGti)TISb-VNF(!G6)CQNakRF!{lS?NLPvX#7b4%!*>)ONLWn@1n3YZx$)L{8o#xnn(5x;rZzju;HeiWDrSDiWA z;-}~|->=iaMs1thNE^Mk#n?xU5A+->&5SBsWCaeDRCRO#)`)8;EPJA-5o%xSve==9}fO0~tylqD}8 zxV3U~FT8c{M$=|*{w2G9W?g5=4?ch4cZ}}Et+}?GfkN(Ir?e!@4xDN-ar^1a>Yj_s zHwo)&AC6lxw|B+Hd23HMZtC^$(2BSh6T8R0TH zGOOS1epdFif4kYgU4L%6zc+v7t$k%j$28CDZnX}L4pUyNZEWZF^Xs+$e`@vBg%?j2 z)qfRyd6d)e)R|gKcji#Ol{-|69)@L@Pn27>wR-Dn`?LQGeqFisHak3{cIuoPYV6W4 z!!)W}QdW3%hel~!S|^gB`=HeP^M!3WC)RBGGu799ip!#z?r)xT~)iH^;Y zbr-cW-u+!|+vFV^AG0|96A6lPnjEs$I<*gs;LwK-GTRW;A*H!5apGc~AqW?qQOjoRV&JS~5o z;rEwQ@_xUry0YSyhogO2m1a_OdrOh^a%0O_9o>B<<*9#;umAswJ)MK+DnCQpV`lbw zzn>k{<+uHJ+va@xW}Rl6^A2f3OD6EKFthDF%H(k5=SRh5i%V)J2tJv|xT|ko!9I0` zi_I+uekFdI_raF&^5p0D|6b}8uP=$2fA<|*Q-s?acD|aA+5I^;zu(+%BGvoQO__af z`<{u7j7pmoIDWG!a~EDv;bnOFK*FK#vq0bN+0|i|T60TOY8S4pfByZ!m)?)U{(nE8 z(D!?3u2;gO7=O%a&D}2-4vOlJ+V}8W^tKIojmWIy#qM6@?8x(>}H~QR}I-PB1$2u)v#_F>|k~>%1Tzn?$btAn+ zsj0QP{DSqb2u{|@;t!dNmM{MFj;�!!m)Qh)a96J48I%%fg|{=*M1hRXxK?VRqz; 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 V;mC$h*$fN}44$rjF6*2UngHt=Pv-yt literal 0 HcmV?d00001 From c5ae1549a1d09599734ccaab27e90a8752f1ede6 Mon Sep 17 00:00:00 2001 From: Florian Unglaub Date: Fri, 17 Aug 2012 16:32:22 +0200 Subject: [PATCH 006/357] Adding default values for omniauth settings so tests don't failt --- config/gitlab.yml.example | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 622ac9ec..85149fe8 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -51,6 +51,10 @@ git: git_timeout: 10 # Omniauth configuration +omniauth: + enabled: false + providers: + # omniauth: # enabled: true # providers: From 0f1ca8b3e7454a6fa788f8e57607b95f3195e145 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 22 Aug 2012 13:19:55 -0400 Subject: [PATCH 007/357] Remove DELETE API for Milestones --- lib/api/milestones.rb | 12 ------------ spec/api/milestones_spec.rb | 8 -------- 2 files changed, 20 deletions(-) diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb index 3cdb7d9f..1ddcd1f8 100644 --- a/lib/api/milestones.rb +++ b/lib/api/milestones.rb @@ -76,18 +76,6 @@ module Gitlab error!({'message' => '404 Not found'}, 404) end end - - # Delete a project milestone - # - # Parameters: - # id (required) - The ID or code name of a project - # milestone_id (required) - The ID of a project milestone - # Example Request: - # DELETE /projects/:id/milestones/:milestone_id - delete ":id/milestones/:milestone_id" do - @milestone = user_project.milestones.find(params[:milestone_id]) - @milestone.destroy - end end end end diff --git a/spec/api/milestones_spec.rb b/spec/api/milestones_spec.rb index 23f19ddd..ba1d15cc 100644 --- a/spec/api/milestones_spec.rb +++ b/spec/api/milestones_spec.rb @@ -42,12 +42,4 @@ describe Gitlab::API do json_response['title'].should == 'updated title' end end - - describe "DELETE /projects/:id/milestones/:milestone_id" do - it "should delete a project milestone" do - expect { - delete "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}" - }.to change { Milestone.count }.by(-1) - end - end end From b838440f15fbc56d0504162fcff376cacf9c8186 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 22 Aug 2012 13:26:09 -0400 Subject: [PATCH 008/357] Deprecate the DELETE method for Issues API Now returns HTTP Status 405 - http://httpstatus.es/405 Closes #1245 Closes #1264 --- lib/api/issues.rb | 5 ++--- spec/api/issues_spec.rb | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 2abc20ad..836c2818 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -95,7 +95,7 @@ module Gitlab end end - # Delete a project issue + # Delete a project issue (deprecated) # # Parameters: # id (required) - The ID or code name of a project @@ -103,8 +103,7 @@ module Gitlab # Example Request: # DELETE /projects/:id/issues/:issue_id delete ":id/issues/:issue_id" do - @issue = user_project.issues.find(params[:issue_id]) - @issue.destroy + error!({'message' => 'method not allowed'}, 405) end end end diff --git a/spec/api/issues_spec.rb b/spec/api/issues_spec.rb index f6d8e379..62814307 100644 --- a/spec/api/issues_spec.rb +++ b/spec/api/issues_spec.rb @@ -63,9 +63,8 @@ describe Gitlab::API do describe "DELETE /projects/:id/issues/:issue_id" do it "should delete a project issue" do - expect { - delete "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" - }.to change { Issue.count }.by(-1) + delete "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" + response.status.should == 405 end end end From 22ec463764f7fe2b6cf3003450c5eabe2c122d5f Mon Sep 17 00:00:00 2001 From: Seif Attar Date: Thu, 23 Aug 2012 10:48:45 +0100 Subject: [PATCH 009/357] rake task to add all users to all projects --- lib/tasks/bulk_add_permission.rake | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 lib/tasks/bulk_add_permission.rake diff --git a/lib/tasks/bulk_add_permission.rake b/lib/tasks/bulk_add_permission.rake new file mode 100644 index 00000000..779f286f --- /dev/null +++ b/lib/tasks/bulk_add_permission.rake @@ -0,0 +1,16 @@ +desc "Add all users to all projects, system administratos are added as masters" +task :add_users_to_project_teams => :environment do |t, args| + users = User.find_all_by_admin(false, :select => 'id').map(&:id) + admins = User.find_all_by_admin(true, :select => 'id').map(&:id) + + users.each do |user| + puts "#{user}" + end + + Project.all.each do |project| + puts "Importing #{users.length} users into #{project.path}" + UsersProject.bulk_import(project, users, UsersProject::DEVELOPER) + puts "Importing #{admins.length} admins into #{project.path}" + UsersProject.bulk_import(project, admins, UsersProject::MASTER) + end +end From 2d6a3e6b67ec1c469ac19d2d5e581d8425b229c6 Mon Sep 17 00:00:00 2001 From: Seif Attar Date: Thu, 23 Aug 2012 10:48:55 +0100 Subject: [PATCH 010/357] Task to assign user developer role to all projects --- lib/tasks/bulk_add_permission.rake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/tasks/bulk_add_permission.rake b/lib/tasks/bulk_add_permission.rake index 779f286f..55797825 100644 --- a/lib/tasks/bulk_add_permission.rake +++ b/lib/tasks/bulk_add_permission.rake @@ -14,3 +14,13 @@ task :add_users_to_project_teams => :environment do |t, args| UsersProject.bulk_import(project, admins, UsersProject::MASTER) end end + +desc "Add user to as a developer to all projects" +task :add_user_to_project_teams, [:email] => :environment do |t, args| + user_email = args.email + user = User.find_by_email(user_email) + + project_ids = Project.all.map(&:id) + + UsersProject.user_bulk_import(user,project_ids,UsersProject::DEVELOPER) +end From 14bd9c9228c50d2a9c5914394603d7ff2b2aa145 Mon Sep 17 00:00:00 2001 From: randx Date: Fri, 24 Aug 2012 12:17:05 +0300 Subject: [PATCH 011/357] Fix dashboard issues atom feed rspec --- spec/requests/atom/dashboard_issues_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/requests/atom/dashboard_issues_spec.rb b/spec/requests/atom/dashboard_issues_spec.rb index 9b4ffc0e..1d208c70 100644 --- a/spec/requests/atom/dashboard_issues_spec.rb +++ b/spec/requests/atom/dashboard_issues_spec.rb @@ -7,11 +7,11 @@ describe "User Issues Dashboard" do login_as :user @project1 = Factory :project, - path: "project1", + path: "gitlabhq_0", code: "TEST1" @project2 = Factory :project, - path: "project2", + path: "gitlabhq_1", code: "TEST2" @project1.add_access(@user, :read, :write) From 3dd7703b8083d44c64a03cef6b72d161aed04239 Mon Sep 17 00:00:00 2001 From: randx Date: Fri, 24 Aug 2012 13:05:40 +0300 Subject: [PATCH 012/357] Feature: Labels page. Index page --- app/controllers/labels_controller.rb | 25 +++++++++++++++++++ app/views/issues/_head.html.haml | 3 +++ app/views/labels/_label.html.haml | 4 +++ app/views/labels/index.html.haml | 14 +++++++++++ config/routes.rb | 2 ++ features/projects/issues/labels.feature | 13 ++++++++++ .../project/project_issues_steps.rb | 21 +++++++++++++++- 7 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 app/controllers/labels_controller.rb create mode 100644 app/views/labels/_label.html.haml create mode 100644 app/views/labels/index.html.haml create mode 100644 features/projects/issues/labels.feature diff --git a/app/controllers/labels_controller.rb b/app/controllers/labels_controller.rb new file mode 100644 index 00000000..f52fc2d8 --- /dev/null +++ b/app/controllers/labels_controller.rb @@ -0,0 +1,25 @@ +class LabelsController < ApplicationController + before_filter :authenticate_user! + before_filter :project + before_filter :module_enabled + + layout "project" + + # Authorize + before_filter :add_project_abilities + + # Allow read any issue + before_filter :authorize_read_issue! + + respond_to :js, :html + + def index + @labels = Issue.tag_counts_on(:labels) + end + + protected + + def module_enabled + return render_404 unless @project.issues_enabled + end +end diff --git a/app/views/issues/_head.html.haml b/app/views/issues/_head.html.haml index 1f6e7d7f..8ebe3e05 100644 --- a/app/views/issues/_head.html.haml +++ b/app/views/issues/_head.html.haml @@ -5,6 +5,9 @@ %li{class: "#{'active' if current_page?(project_milestones_path(@project))}"} = link_to project_milestones_path(@project), class: "tab" do Milestones + %li{class: "#{'active' if current_page?(project_labels_path(@project))}"} + = link_to project_labels_path(@project), class: "tab" do + Labels %li.right %span.rss-icon = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do diff --git a/app/views/labels/_label.html.haml b/app/views/labels/_label.html.haml new file mode 100644 index 00000000..32158c20 --- /dev/null +++ b/app/views/labels/_label.html.haml @@ -0,0 +1,4 @@ +%li.wll + %strong= label.name + .right + %span= pluralize label.count, 'issue' diff --git a/app/views/labels/index.html.haml b/app/views/labels/index.html.haml new file mode 100644 index 00000000..4e41d375 --- /dev/null +++ b/app/views/labels/index.html.haml @@ -0,0 +1,14 @@ += render "issues/head" + +%h3.page_title + Labels +%br +%div.ui-box + %ul.unstyled.labels-table + - @labels.each do |label| + = render 'label', label: label + + - unless @labels.present? + %li + %h3.nothing_here_message Nothing to show here + diff --git a/config/routes.rb b/config/routes.rb index 97594d57..f895478f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -197,7 +197,9 @@ Gitlab::Application.routes.draw do end resources :team_members resources :milestones + resources :labels, :only => [:index] resources :issues do + collection do post :sort post :bulk_update diff --git a/features/projects/issues/labels.feature b/features/projects/issues/labels.feature new file mode 100644 index 00000000..5a20bfd6 --- /dev/null +++ b/features/projects/issues/labels.feature @@ -0,0 +1,13 @@ +Feature: Labels + Background: + Given I signin as a user + And I own project "Shop" + And project "Shop" have issues tags: + | name | + | bug | + | feature | + Given I visit project "Shop" labels page + + Scenario: I should see active milestones + Then I should see label "bug" + And I should see label "feature" diff --git a/features/step_definitions/project/project_issues_steps.rb b/features/step_definitions/project/project_issues_steps.rb index 00a1721f..27de03d5 100644 --- a/features/step_definitions/project/project_issues_steps.rb +++ b/features/step_definitions/project/project_issues_steps.rb @@ -33,6 +33,25 @@ Given /^I visit issue page "(.*?)"$/ do |arg1| end Given /^I submit new issue "(.*?)"$/ do |arg1| - fill_in "issue_title", :with => arg1 + fill_in "issue_title", with: arg1 click_button "Submit new issue" end + +Given /^project "(.*?)" have issues tags:$/ do |arg1, table| + project = Project.find_by_name(arg1) + table.hashes.each do |hash| + Factory :issue, + project: project, + label_list: [hash[:name]] + end +end + +Given /^I visit project "(.*?)" labels page$/ do |arg1| + visit project_labels_path(Project.find_by_name(arg1)) +end + +Then /^I should see label "(.*?)"$/ do |arg1| + within ".labels-table" do + page.should have_content arg1 + end +end From 6d4ae75f544d9819954865c105414a722344336a Mon Sep 17 00:00:00 2001 From: randx Date: Fri, 24 Aug 2012 13:17:19 +0300 Subject: [PATCH 013/357] Final fix for dashboard cucumber feature --- features/step_definitions/dashboard_steps.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/step_definitions/dashboard_steps.rb b/features/step_definitions/dashboard_steps.rb index 1eec7619..d910ec90 100644 --- a/features/step_definitions/dashboard_steps.rb +++ b/features/step_definitions/dashboard_steps.rb @@ -107,11 +107,11 @@ end Given /^I have authored merge requests$/ do project1 = Factory :project, - :path => "project1", + :path => "gitlabhq_1", :code => "gitlabhq_1" project2 = Factory :project, - :path => "project2", + :path => "gitlabhq_2", :code => "gitlabhq_2" project1.add_access(@user, :read, :write) From 2b38f51a17464537b9e4110917868bc9c1b1950a Mon Sep 17 00:00:00 2001 From: Cyril Date: Sat, 25 Aug 2012 00:22:45 +0200 Subject: [PATCH 014/357] fix merge request form --- app/controllers/merge_requests_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index 4938a294..187bb407 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -103,10 +103,12 @@ class MergeRequestsController < ApplicationController def branch_from @commit = project.commit(params[:ref]) + @commit = CommitDecorator.decorate(@commit) end def branch_to @commit = project.commit(params[:ref]) + @commit = CommitDecorator.decorate(@commit) end protected From 0dbde913dcfd8559433ef57a28e84b9e9f266f90 Mon Sep 17 00:00:00 2001 From: Joe Hillenbrand Date: Fri, 24 Aug 2012 16:04:07 -0700 Subject: [PATCH 015/357] Hide gravatar tip if gravatar is disabled. --- app/views/profile/show.html.haml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/profile/show.html.haml b/app/views/profile/show.html.haml index 95cce2bb..a7b6a18a 100644 --- a/app/views/profile/show.html.haml +++ b/app/views/profile/show.html.haml @@ -45,9 +45,10 @@ %span.help-block Tell us about yourself in fewer than 250 characters. .span5.right - %p.alert.alert-info - %strong Tip: - You can change your avatar at gravatar.com + -unless Gitlab.config.disable_gravatar? + %p.alert.alert-info + %strong Tip: + You can change your avatar at gravatar.com %h4 Personal projects: From 74d65bb8238923d04dde6eefc657a40995c8e4ff Mon Sep 17 00:00:00 2001 From: Saito Date: Sat, 25 Aug 2012 15:24:21 +0800 Subject: [PATCH 016/357] fix git push body bigger than 112k problem --- config/initializers/grack_auth.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/initializers/grack_auth.rb b/config/initializers/grack_auth.rb index 5995b873..4f77c327 100644 --- a/config/initializers/grack_auth.rb +++ b/config/initializers/grack_auth.rb @@ -42,13 +42,13 @@ module Grack def current_ref if @env["HTTP_CONTENT_ENCODING"] =~ /gzip/ - input = Zlib::GzipReader.new(@request.body).string + input = Zlib::GzipReader.new(@request.body).read else - input = @request.body.string + input = @request.body.read end - - oldrev, newrev, ref = input.split(' ') - /refs\/heads\/([\w-]+)/.match(ref).to_a.last + # Need to reset seek point + @request.body.rewind + /refs\/heads\/([\w-]+)/.match(input).to_a.first end end# Auth end# Grack From d5fcf0f672ffb5457c9b1bc345c4cf72a94af324 Mon Sep 17 00:00:00 2001 From: randx Date: Fri, 24 Aug 2012 15:34:27 +0300 Subject: [PATCH 017/357] Show labels specific to project --- app/controllers/labels_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/labels_controller.rb b/app/controllers/labels_controller.rb index f52fc2d8..e703f822 100644 --- a/app/controllers/labels_controller.rb +++ b/app/controllers/labels_controller.rb @@ -14,7 +14,7 @@ class LabelsController < ApplicationController respond_to :js, :html def index - @labels = Issue.tag_counts_on(:labels) + @labels = @project.issues.tag_counts_on(:labels).order('count DESC') end protected From 36ffdf36b96a877154f265327d83d022ed27e9e4 Mon Sep 17 00:00:00 2001 From: Florian Unglaub Date: Fri, 24 Aug 2012 15:40:44 +0200 Subject: [PATCH 018/357] Merge issue fixed --- app/controllers/omniauth_callbacks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index 9b40e564..00ec7c42 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -33,7 +33,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController if current_user # Change a logged-in user's authentication method: - current_user.uid = uid + current_user.extern_uid = uid current_user.provider = provider current_user.save redirect_to profile_path From fee26c58e22f9150e802b86202e5e5e9a6b2c233 Mon Sep 17 00:00:00 2001 From: randx Date: Sat, 25 Aug 2012 19:21:11 +0300 Subject: [PATCH 019/357] Move snippets api doc to separate file --- app/views/help/api.html.haml | 12 +++++ doc/api/README.md | 1 + doc/api/projects.md | 102 ----------------------------------- doc/api/snippets.md | 100 ++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 102 deletions(-) create mode 100644 doc/api/snippets.md diff --git a/app/views/help/api.html.haml b/app/views/help/api.html.haml index 344f8ade..4f7af193 100644 --- a/app/views/help/api.html.haml +++ b/app/views/help/api.html.haml @@ -9,6 +9,8 @@ %a{href: "#README"} README %li %a{href: "#projects"} Projects + %li + %a{href: "#snippets"} Snippets %li %a{href: "#users"} Users %li @@ -34,6 +36,16 @@ %br +.file_holder#snippets + .file_title + %i.icon-file + Projects Snippets + .file_content.wiki + = preserve do + = markdown File.read(Rails.root.join("doc", "api", "snippets.md")) + +%br + .file_holder#users .file_title %i.icon-file diff --git a/doc/api/README.md b/doc/api/README.md index e0111966..d32573aa 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -27,4 +27,5 @@ The API uses JSON to serialize data. You don't need to specify `.json` at the en + [Users](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/users.md) + [Projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md) ++ [Snippets](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/snippets.md) + [Issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/issues.md) diff --git a/doc/api/projects.md b/doc/api/projects.md index ead31003..d680b5d8 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -204,108 +204,6 @@ Parameters: ] ``` -# Project Snippets - -## List snippets - -Not implemented. - -## Single snippet - -Get a project snippet. - -``` -GET /projects/:id/snippets/:snippet_id -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet - -```json -{ - "id": 1, - "title": "test", - "file_name": "add.rb", - "author": { - "id": 1, - "email": "john@example.com", - "name": "John Smith", - "blocked": false, - "created_at": "2012-05-23T08:00:58Z" - }, - "expires_at": null, - "updated_at": "2012-06-28T10:52:04Z", - "created_at": "2012-06-28T10:52:04Z" -} -``` - -## Snippet content - -Get a raw project snippet. - -``` -GET /projects/:id/snippets/:snippet_id/raw -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet - -## New snippet - -Create a new project snippet. - -``` -POST /projects/:id/snippets -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `title` (required) - The title of a snippet -+ `file_name` (required) - The name of a snippet file -+ `lifetime` (optional) - The expiration date of a snippet -+ `code` (required) - The content of a snippet - -Will return created snippet with status `201 Created` on success, or `404 Not found` on fail. - -## Edit snippet - -Update an existing project snippet. - -``` -PUT /projects/:id/snippets/:snippet_id -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet -+ `title` (optional) - The title of a snippet -+ `file_name` (optional) - The name of a snippet file -+ `lifetime` (optional) - The expiration date of a snippet -+ `code` (optional) - The content of a snippet - -Will return updated snippet with status `200 OK` on success, or `404 Not found` on fail. - -## Delete snippet - -Delete existing project snippet. - -``` -DELETE /projects/:id/snippets/:snippet_id -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet - -Status code `200` will be returned on success. - ## Raw blob content Get the raw file contents for a file. diff --git a/doc/api/snippets.md b/doc/api/snippets.md new file mode 100644 index 00000000..0cd29ce5 --- /dev/null +++ b/doc/api/snippets.md @@ -0,0 +1,100 @@ +## List snippets + +Not implemented. + +## Single snippet + +Get a project snippet. + +``` +GET /projects/:id/snippets/:snippet_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet + +```json +{ + "id": 1, + "title": "test", + "file_name": "add.rb", + "author": { + "id": 1, + "email": "john@example.com", + "name": "John Smith", + "blocked": false, + "created_at": "2012-05-23T08:00:58Z" + }, + "expires_at": null, + "updated_at": "2012-06-28T10:52:04Z", + "created_at": "2012-06-28T10:52:04Z" +} +``` + +## Snippet content + +Get a raw project snippet. + +``` +GET /projects/:id/snippets/:snippet_id/raw +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet + +## New snippet + +Create a new project snippet. + +``` +POST /projects/:id/snippets +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `title` (required) - The title of a snippet ++ `file_name` (required) - The name of a snippet file ++ `lifetime` (optional) - The expiration date of a snippet ++ `code` (required) - The content of a snippet + +Will return created snippet with status `201 Created` on success, or `404 Not found` on fail. + +## Edit snippet + +Update an existing project snippet. + +``` +PUT /projects/:id/snippets/:snippet_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet ++ `title` (optional) - The title of a snippet ++ `file_name` (optional) - The name of a snippet file ++ `lifetime` (optional) - The expiration date of a snippet ++ `code` (optional) - The content of a snippet + +Will return updated snippet with status `200 OK` on success, or `404 Not found` on fail. + +## Delete snippet + +Delete existing project snippet. + +``` +DELETE /projects/:id/snippets/:snippet_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet + +Status code `200` will be returned on success. + From c05692b7b1194e67b5427ca0a6a4926562abdf6e Mon Sep 17 00:00:00 2001 From: randx Date: Sat, 25 Aug 2012 19:42:34 +0300 Subject: [PATCH 020/357] scss refactoring --- app/assets/stylesheets/gitlab_bootstrap.scss | 23 ++++---------------- app/assets/stylesheets/main.scss | 8 ++++++- app/assets/stylesheets/ref_select.scss | 4 +--- app/assets/stylesheets/sections/graph.scss | 6 +---- app/assets/stylesheets/sections/nav.scss | 6 +---- app/assets/stylesheets/sections/tree.scss | 6 +---- 6 files changed, 15 insertions(+), 38 deletions(-) diff --git a/app/assets/stylesheets/gitlab_bootstrap.scss b/app/assets/stylesheets/gitlab_bootstrap.scss index 03beeaef..a1faf060 100644 --- a/app/assets/stylesheets/gitlab_bootstrap.scss +++ b/app/assets/stylesheets/gitlab_bootstrap.scss @@ -468,12 +468,8 @@ form { h5, .title { padding: 0 10px; @include round-borders-top(4px); + @include bg-gray-gradient; border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); &.small { line-height: 28px; @@ -499,10 +495,7 @@ form { } .bottom { - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; @include round-borders-bottom(4px); border-bottom:none; border-top: 1px solid #bbb; @@ -555,11 +548,7 @@ table.admin-table { th { border-color: #CCC; border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; } } @@ -682,11 +671,7 @@ h3.page_title { .file_title { border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; margin: 0; font-weight: normal; font-weight: bold; diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index ad8be0bc..b4f0ebf8 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -72,7 +72,13 @@ $hover: #FDF5D9; border-radius: $radius; } - +@mixin bg-gray-gradient { + background:#eee; + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); + background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); + background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); + background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); +} /** * Header of application. diff --git a/app/assets/stylesheets/ref_select.scss b/app/assets/stylesheets/ref_select.scss index 6f6a1bc9..5b52e11b 100644 --- a/app/assets/stylesheets/ref_select.scss +++ b/app/assets/stylesheets/ref_select.scss @@ -33,9 +33,7 @@ } .chzn-single { - background:#ddd; - //border:none; - //box-shadow:none; + @include bg-gray-gradient; div { background:transparent; diff --git a/app/assets/stylesheets/sections/graph.scss b/app/assets/stylesheets/sections/graph.scss index 33d91de5..2aa4463e 100644 --- a/app/assets/stylesheets/sections/graph.scss +++ b/app/assets/stylesheets/sections/graph.scss @@ -6,11 +6,7 @@ h4 { padding:0 10px; border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; } .graph { diff --git a/app/assets/stylesheets/sections/nav.scss b/app/assets/stylesheets/sections/nav.scss index 4a773644..fc7293b2 100644 --- a/app/assets/stylesheets/sections/nav.scss +++ b/app/assets/stylesheets/sections/nav.scss @@ -6,13 +6,9 @@ ul.main_menu { border-radius: 4px; margin: auto; margin:30px 0; - background:#eee; border:1px solid #bbb; height:37px; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; position:relative; overflow:hidden; @include shade; diff --git a/app/assets/stylesheets/sections/tree.scss b/app/assets/stylesheets/sections/tree.scss index 2663fc9a..891f5e20 100644 --- a/app/assets/stylesheets/sections/tree.scss +++ b/app/assets/stylesheets/sections/tree.scss @@ -72,11 +72,7 @@ th { border-color: #CCC; border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; } } From f13bccc14ba915c1d04ac1688f789709267a82a9 Mon Sep 17 00:00:00 2001 From: randx Date: Sat, 25 Aug 2012 19:47:00 +0300 Subject: [PATCH 021/357] better flash message style --- app/assets/stylesheets/common.scss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 3c160358..68f862b8 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -129,10 +129,12 @@ table a code { border-bottom:1px solid #ccc; h4 { - color:#444; - font-size:22px; + color:#666; + font-size:18px; + line-height:38px; padding-top:5px; margin:2px; + font-weight:normal; } } From 852b9c28dd80af4a49336b0ff921a1a863dbc929 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 15 Aug 2012 23:16:33 -0400 Subject: [PATCH 022/357] Move observer specs out of spec/models into spec/observers --- spec/{models => observers}/activity_observer_spec.rb | 0 spec/{models => observers}/issue_observer_spec.rb | 0 spec/{models => observers}/user_observer_spec.rb | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename spec/{models => observers}/activity_observer_spec.rb (100%) rename spec/{models => observers}/issue_observer_spec.rb (100%) rename spec/{models => observers}/user_observer_spec.rb (100%) diff --git a/spec/models/activity_observer_spec.rb b/spec/observers/activity_observer_spec.rb similarity index 100% rename from spec/models/activity_observer_spec.rb rename to spec/observers/activity_observer_spec.rb diff --git a/spec/models/issue_observer_spec.rb b/spec/observers/issue_observer_spec.rb similarity index 100% rename from spec/models/issue_observer_spec.rb rename to spec/observers/issue_observer_spec.rb diff --git a/spec/models/user_observer_spec.rb b/spec/observers/user_observer_spec.rb similarity index 100% rename from spec/models/user_observer_spec.rb rename to spec/observers/user_observer_spec.rb From 6ff0652e9e807b35d298b63699c71377014800ea Mon Sep 17 00:00:00 2001 From: randx Date: Sat, 25 Aug 2012 20:31:19 +0300 Subject: [PATCH 023/357] Admin area -> user form --- app/views/admin/dashboard/index.html.haml | 8 +- app/views/admin/projects/index.html.haml | 2 +- app/views/admin/users/_form.html.haml | 118 ++++++++++++---------- app/views/admin/users/edit.html.haml | 2 +- app/views/admin/users/index.html.haml | 2 +- app/views/admin/users/new.html.haml | 4 +- 6 files changed, 73 insertions(+), 63 deletions(-) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 2e67abfc..3e26f566 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -35,11 +35,13 @@ %h3 Latest projects %hr - @projects.each do |project| - %h5 + %p = link_to project.name, [:admin, project] .span6 %h3 Latest users %hr - @users.each do |user| - %h5 - = link_to user.name, [:admin, user] + %p + = link_to [:admin, user] do + = user.name + %small= user.email diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 882b2ab5..f7dd486d 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -1,4 +1,4 @@ -%h3 +%h3.page_title Projects = link_to 'New Project', new_admin_project_path, class: "btn small right" %br diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index 5e68a23f..20144723 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -2,68 +2,76 @@ = form_for [:admin, @admin_user] do |f| -if @admin_user.errors.any? #error_explanation - %ul + %ul.unstyled.alert.alert-error - @admin_user.errors.full_messages.each do |msg| %li= msg .row - .span6 - .clearfix - = f.label :name - .input - = f.text_field :name - %span.help-inline * required - .clearfix - = f.label :email - .input - = f.text_field :email - %span.help-inline * required - %hr + .span7 + .ui-box + %br + .clearfix + = f.label :name + .input + = f.text_field :name + %span.help-inline * required + .clearfix + = f.label :email + .input + = f.text_field :email + %span.help-inline * required + %hr + -if f.object.new_record? + .clearfix + = f.label :force_random_password do + %span Generate random password + .input= f.check_box :force_random_password, {}, true, nil + + %div.password-fields + .clearfix + = f.label :password + .input= f.password_field :password, disabled: f.object.force_random_password + .clearfix + = f.label :password_confirmation + .input= f.password_field :password_confirmation, disabled: f.object.force_random_password + %hr + .clearfix + = f.label :skype + .input= f.text_field :skype + .clearfix + = f.label :linkedin + .input= f.text_field :linkedin + .clearfix + = f.label :twitter + .input= f.text_field :twitter + .span5 + .ui-box + %br + .clearfix + = f.label :projects_limit + .input= f.number_field :projects_limit - -if f.object.new_record? - .clearfix - = f.label :admin, class: "checkbox" do - = f.check_box :force_random_password, {}, true, nil - %span Generate random password - - %div.password-fields .clearfix - = f.label :password - .input= f.password_field :password, disabled: f.object.force_random_password - .clearfix - = f.label :password_confirmation - .input= f.password_field :password_confirmation, disabled: f.object.force_random_password - %hr - .clearfix - = f.label :skype - .input= f.text_field :skype - .clearfix - = f.label :linkedin - .input= f.text_field :linkedin - .clearfix - = f.label :twitter - .input= f.text_field :twitter - .span6 - .clearfix - = f.label :projects_limit - .input= f.text_field :projects_limit, class: "small_input" + = f.label :admin do + %strong.cred Administrator + .input= f.check_box :admin + - unless @admin_user.new_record? + %hr + .padded.cred + - if @admin_user.blocked + %span + This user is blocked and is not able to login to GitLab + .clearfix + = link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn small right" + - else + %span + Blocked users will be removed from all projects & will not be able to login to GitLab. + .clearfix + = link_to 'Block User', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small right danger" - .alert - .clearfix - %p Make the user a GitLab administrator. - = f.label :admin, class: "checkbox" do - = f.check_box :admin - %span Administrator - - unless @admin_user.new_record? - .alert.alert-error - - if @admin_user.blocked - %span - = link_to 'Unblock', unblock_admin_user_path(@admin_user), method: :put, class: "btn small" - This user is blocked and is not able to login to GitLab - - else - %span - = link_to 'Block', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small danger" - Blocked users will be removed from all projects & will not be able to login to GitLab. + .row + .span6 + .span6 .actions = f.submit 'Save', class: "btn primary" - if @admin_user.new_record? diff --git a/app/views/admin/users/edit.html.haml b/app/views/admin/users/edit.html.haml index 0e94be9e..032e3cfa 100644 --- a/app/views/admin/users/edit.html.haml +++ b/app/views/admin/users/edit.html.haml @@ -1,3 +1,3 @@ -%h3= @admin_user.name +%h3.page_title #{@admin_user.name} → Edit user %hr = render 'form' diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 3d027217..f21baabf 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -1,4 +1,4 @@ -%h3 +%h3.page_title Users = link_to 'New User', new_admin_user_path, class: "btn small right" %br diff --git a/app/views/admin/users/new.html.haml b/app/views/admin/users/new.html.haml index 87d6b0f2..70ead0d3 100644 --- a/app/views/admin/users/new.html.haml +++ b/app/views/admin/users/new.html.haml @@ -1,3 +1,3 @@ -%h2 New user -%hr +%h3.page_title New user +%br = render 'form' From fba174e9bc4e4ef5c0c4d6a4282f37e5265b87e2 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 23 Aug 2012 05:19:40 -0400 Subject: [PATCH 024/357] Cleanup spec/support folder and spec/spec_helper Changes: * Move spec/monkeypatch to spec/support * Remove unused support/shared_examples * Move support/api to support/api_helpers to match module name * Move support/login to support/login_helpers to match module name * Move API specs to requests/api (convention over configuration) * Remove unused support/js_patch * Simplify login_as helper * Move DatabaseCleaner stuff to its own support file * Remove unnecessary configuration and requires from spec_helper --- .../project/projects_steps.rb | 2 +- features/support/env.rb | 4 +- spec/{ => requests}/api/issues_spec.rb | 0 spec/{ => requests}/api/projects_spec.rb | 0 spec/{ => requests}/api/users_spec.rb | 0 spec/spec_helper.rb | 37 +++---------------- spec/support/api.rb | 7 ---- spec/support/api_helpers.rb | 9 +++++ spec/support/db_cleaner.rb | 18 +++++++++ spec/support/js_patch.rb | 6 --- spec/support/login.rb | 30 --------------- spec/support/login_helpers.rb | 23 ++++++++++++ spec/{ => support}/monkeypatch.rb | 0 spec/support/shared_examples.rb | 16 -------- 14 files changed, 59 insertions(+), 93 deletions(-) rename spec/{ => requests}/api/issues_spec.rb (100%) rename spec/{ => requests}/api/projects_spec.rb (100%) rename spec/{ => requests}/api/users_spec.rb (100%) delete mode 100644 spec/support/api.rb create mode 100644 spec/support/api_helpers.rb create mode 100644 spec/support/db_cleaner.rb delete mode 100644 spec/support/js_patch.rb delete mode 100644 spec/support/login.rb create mode 100644 spec/support/login_helpers.rb rename spec/{ => support}/monkeypatch.rb (100%) delete mode 100644 spec/support/shared_examples.rb diff --git a/features/step_definitions/project/projects_steps.rb b/features/step_definitions/project/projects_steps.rb index 3ff08d58..d981e1f3 100644 --- a/features/step_definitions/project/projects_steps.rb +++ b/features/step_definitions/project/projects_steps.rb @@ -1,4 +1,4 @@ -include LoginMacros +include LoginHelpers Given /^I signin as a user$/ do login_as :user diff --git a/features/support/env.rb b/features/support/env.rb index b69a5fe7..80a465b4 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -7,9 +7,9 @@ require 'cucumber/rails' require 'webmock/cucumber' WebMock.allow_net_connect! -require Rails.root.join 'spec/monkeypatch' require Rails.root.join 'spec/factories' -require Rails.root.join 'spec/support/login' +require Rails.root.join 'spec/support/monkeypatch' +require Rails.root.join 'spec/support/login_helpers' require Rails.root.join 'spec/support/valid_commit' Capybara.default_selector = :css diff --git a/spec/api/issues_spec.rb b/spec/requests/api/issues_spec.rb similarity index 100% rename from spec/api/issues_spec.rb rename to spec/requests/api/issues_spec.rb diff --git a/spec/api/projects_spec.rb b/spec/requests/api/projects_spec.rb similarity index 100% rename from spec/api/projects_spec.rb rename to spec/requests/api/projects_spec.rb diff --git a/spec/api/users_spec.rb b/spec/requests/api/users_spec.rb similarity index 100% rename from spec/api/users_spec.rb rename to spec/requests/api/users_spec.rb diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index cd931475..d3635ed1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -9,10 +9,8 @@ require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'capybara/rails' require 'capybara/rspec' -require 'capybara/dsl' require 'webmock/rspec' require 'factories' -require 'monkeypatch' require 'email_spec' require 'headless' @@ -23,10 +21,13 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} # Use capybara-webkit Capybara.javascript_driver = :webkit +WebMock.disable_net_connect!(allow_localhost: true) + RSpec.configure do |config| config.mock_with :rspec - config.include LoginMacros + config.include LoginHelpers, type: :request + config.include ApiHelpers, type: :request # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false @@ -38,35 +39,9 @@ RSpec.configure do |config| headless.start end - config.before :each, type: :integration do - DeviseSessionMock.disable - end - config.before do - if example.metadata[:js] - DatabaseCleaner.strategy = :truncation - Capybara::Selenium::Driver::DEFAULT_OPTIONS[:resynchronize] = true - else - DatabaseCleaner.strategy = :transaction - end - - DatabaseCleaner.start - - WebMock.disable_net_connect!(allow_localhost: true) - # !!! Observers disabled by default in tests - # - # Use next code to enable observers - # before(:each) { ActiveRecord::Base.observers.enable(:all) } - # - ActiveRecord::Base.observers.disable :all + ActiveRecord::Base.observers.disable(:all) + # ActiveRecord::Base.observers.enable(:all) end - - config.after do - DatabaseCleaner.clean - end - - config.include RSpec::Rails::RequestExampleGroup, type: :request, example_group: { - file_path: /spec\/api/ - } end diff --git a/spec/support/api.rb b/spec/support/api.rb deleted file mode 100644 index d363d8b9..00000000 --- a/spec/support/api.rb +++ /dev/null @@ -1,7 +0,0 @@ -def api_prefix - "/api/#{Gitlab::API::VERSION}" -end - -def json_response - JSON.parse(response.body) -end diff --git a/spec/support/api_helpers.rb b/spec/support/api_helpers.rb new file mode 100644 index 00000000..e35d5735 --- /dev/null +++ b/spec/support/api_helpers.rb @@ -0,0 +1,9 @@ +module ApiHelpers + def api_prefix + "/api/#{Gitlab::API::VERSION}" + end + + def json_response + JSON.parse(response.body) + end +end diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb new file mode 100644 index 00000000..f1e072aa --- /dev/null +++ b/spec/support/db_cleaner.rb @@ -0,0 +1,18 @@ +require 'database_cleaner' + +RSpec.configure do |config| + config.before do + if example.metadata[:js] + DatabaseCleaner.strategy = :truncation + Capybara::Selenium::Driver::DEFAULT_OPTIONS[:resynchronize] = true + else + DatabaseCleaner.strategy = :transaction + end + + DatabaseCleaner.start + end + + config.after do + DatabaseCleaner.clean + end +end diff --git a/spec/support/js_patch.rb b/spec/support/js_patch.rb deleted file mode 100644 index 0d4ab264..00000000 --- a/spec/support/js_patch.rb +++ /dev/null @@ -1,6 +0,0 @@ -module JsPatch - def confirm_js_popup - page.evaluate_script("window.alert = function(msg) { return true; }") - page.evaluate_script("window.confirm = function(msg) { return true; }") - end -end diff --git a/spec/support/login.rb b/spec/support/login.rb deleted file mode 100644 index 78a907ba..00000000 --- a/spec/support/login.rb +++ /dev/null @@ -1,30 +0,0 @@ -module LoginMacros - def login_as role - @user = User.create(email: "user#{User.count}@mail.com", - name: "John Smith", - password: "123456", - password_confirmation: "123456", - skype: 'user_skype') - - if role == :admin - @user.admin = true - @user.save! - end - - visit new_user_session_path - fill_in "user_email", with: @user.email - fill_in "user_password", with: "123456" - click_button "Sign in" - end - - def login_with(user) - visit new_user_session_path - fill_in "user_email", with: user.email - fill_in "user_password", with: "123456" - click_button "Sign in" - end - - def logout - click_link "Logout" rescue nil - end -end diff --git a/spec/support/login_helpers.rb b/spec/support/login_helpers.rb new file mode 100644 index 00000000..769034e2 --- /dev/null +++ b/spec/support/login_helpers.rb @@ -0,0 +1,23 @@ +module LoginHelpers + # Internal: Create and log in as a user of the specified role + # + # role - User role (e.g., :admin, :user) + def login_as(role) + @user = Factory(role) + login_with(@user) + end + + # Internal: Login as the specified user + # + # user - User instance to login with + def login_with(user) + visit new_user_session_path + fill_in "user_email", with: user.email + fill_in "user_password", with: "123456" + click_button "Sign in" + end + + def logout + click_link "Logout" rescue nil + end +end diff --git a/spec/monkeypatch.rb b/spec/support/monkeypatch.rb similarity index 100% rename from spec/monkeypatch.rb rename to spec/support/monkeypatch.rb diff --git a/spec/support/shared_examples.rb b/spec/support/shared_examples.rb deleted file mode 100644 index 9fd207d0..00000000 --- a/spec/support/shared_examples.rb +++ /dev/null @@ -1,16 +0,0 @@ -shared_examples_for :project_side_pane do - subject { page } - it { should have_content((@project || project).name) } - it { should have_content("Commits") } - it { should have_content("Files") } -end - -shared_examples_for :tree_view do - subject { page } - - it "should have Tree View of project" do - should have_content("app") - should have_content("History") - should have_content("Gemfile") - end -end From b2a5344a2d68922d5c6cb8de228fb9b41ce3efc4 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sat, 25 Aug 2012 13:31:50 -0400 Subject: [PATCH 025/357] Add a simple `api` method to ApiHelpers, replacing api_prefix See docs for usage --- spec/requests/api/issues_spec.rb | 2 ++ spec/requests/api/projects_spec.rb | 2 ++ spec/requests/api/users_spec.rb | 2 ++ spec/spec_helper.rb | 1 - spec/support/api_helpers.rb | 29 +++++++++++++++++++++++++++-- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb index f6d8e379..4701ca2f 100644 --- a/spec/requests/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe Gitlab::API do + include ApiHelpers + let(:user) { Factory :user } let!(:project) { Factory :project, owner: user } let!(:issue) { Factory :issue, author: user, assignee: user, project: project } diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index ff45619e..a721ab3a 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe Gitlab::API do + include ApiHelpers + let(:user) { Factory :user } let!(:project) { Factory :project, owner: user } let!(:snippet) { Factory :snippet, author: user, project: project, title: 'example' } diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb index 32b9379d..fcfea131 100644 --- a/spec/requests/api/users_spec.rb +++ b/spec/requests/api/users_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe Gitlab::API do + include ApiHelpers + let(:user) { Factory :user } describe "GET /users" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d3635ed1..9fb0ad7e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -27,7 +27,6 @@ RSpec.configure do |config| config.mock_with :rspec config.include LoginHelpers, type: :request - config.include ApiHelpers, type: :request # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false diff --git a/spec/support/api_helpers.rb b/spec/support/api_helpers.rb index e35d5735..7d901197 100644 --- a/spec/support/api_helpers.rb +++ b/spec/support/api_helpers.rb @@ -1,6 +1,31 @@ module ApiHelpers - def api_prefix - "/api/#{Gitlab::API::VERSION}" + # Public: Prepend a request path with the path to the API + # + # path - Path to append + # user - User object - If provided, automatically appends private_token query + # string for authenticated requests + # + # Examples + # + # >> api('/issues') + # => "/api/v2/issues" + # + # >> api('/issues', User.last) + # => "/api/v2/issues?private_token=..." + # + # >> api('/issues?foo=bar', User.last) + # => "/api/v2/issues?foo=bar&private_token=..." + # + # Returns the relative path to the requested API resource + def api(path, user = nil) + "/api/#{Gitlab::API::VERSION}#{path}" + + + # Normalize query string + (path.index('?') ? '' : '?') + + + # Append private_token if given a User object + (user.respond_to?(:private_token) ? + "&private_token=#{user.private_token}" : "") end def json_response From 232389f4e8ebaffd125985ce63439cea407e85d5 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sat, 25 Aug 2012 13:43:55 -0400 Subject: [PATCH 026/357] Clean up request specs --- spec/requests/admin/security_spec.rb | 24 +- spec/requests/api/issues_spec.rb | 14 +- spec/requests/api/projects_spec.rb | 35 ++- spec/requests/api/users_spec.rb | 8 +- spec/requests/security/profile_access_spec.rb | 30 ++- spec/requests/security/project_access_spec.rb | 230 ++++++++++-------- 6 files changed, 191 insertions(+), 150 deletions(-) diff --git a/spec/requests/admin/security_spec.rb b/spec/requests/admin/security_spec.rb index 0c369740..63068326 100644 --- a/spec/requests/admin/security_spec.rb +++ b/spec/requests/admin/security_spec.rb @@ -2,20 +2,26 @@ require 'spec_helper' describe "Admin::Projects" do describe "GET /admin/projects" do - it { admin_projects_path.should be_allowed_for :admin } - it { admin_projects_path.should be_denied_for :user } - it { admin_projects_path.should be_denied_for :visitor } + subject { admin_projects_path } + + it { should be_allowed_for :admin } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /admin/users" do - it { admin_users_path.should be_allowed_for :admin } - it { admin_users_path.should be_denied_for :user } - it { admin_users_path.should be_denied_for :visitor } + subject { admin_users_path } + + it { should be_allowed_for :admin } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /admin/hooks" do - it { admin_hooks_path.should be_allowed_for :admin } - it { admin_hooks_path.should be_denied_for :user } - it { admin_hooks_path.should be_denied_for :visitor } + subject { admin_hooks_path } + + it { should be_allowed_for :admin } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end end diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb index 4701ca2f..c00a056d 100644 --- a/spec/requests/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -10,13 +10,13 @@ describe Gitlab::API do describe "GET /issues" do it "should return authentication error" do - get "#{api_prefix}/issues" + get api("/issues") response.status.should == 401 end describe "authenticated GET /issues" do it "should return an array of issues" do - get "#{api_prefix}/issues?private_token=#{user.private_token}" + get api("/issues", user) response.status.should == 200 json_response.should be_an Array json_response.first['title'].should == issue.title @@ -26,7 +26,7 @@ describe Gitlab::API do describe "GET /projects/:id/issues" do it "should return project issues" do - get "#{api_prefix}/projects/#{project.code}/issues?private_token=#{user.private_token}" + get api("/projects/#{project.code}/issues", user) response.status.should == 200 json_response.should be_an Array json_response.first['title'].should == issue.title @@ -35,7 +35,7 @@ describe Gitlab::API do describe "GET /projects/:id/issues/:issue_id" do it "should return a project issue by id" do - get "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" + get api("/projects/#{project.code}/issues/#{issue.id}", user) response.status.should == 200 json_response['title'].should == issue.title end @@ -43,7 +43,7 @@ describe Gitlab::API do describe "POST /projects/:id/issues" do it "should create a new project issue" do - post "#{api_prefix}/projects/#{project.code}/issues?private_token=#{user.private_token}", + post api("/projects/#{project.code}/issues", user), title: 'new issue', labels: 'label, label2' response.status.should == 201 json_response['title'].should == 'new issue' @@ -54,7 +54,7 @@ describe Gitlab::API do describe "PUT /projects/:id/issues/:issue_id" do it "should update a project issue" do - put "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}", + put api("/projects/#{project.code}/issues/#{issue.id}", user), title: 'updated title', labels: 'label2', closed: 1 response.status.should == 200 json_response['title'].should == 'updated title' @@ -66,7 +66,7 @@ describe Gitlab::API do describe "DELETE /projects/:id/issues/:issue_id" do it "should delete a project issue" do expect { - delete "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" + delete api("/projects/#{project.code}/issues/#{issue.id}", user) }.to change { Issue.count }.by(-1) end end diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index a721ab3a..0cbc12af 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -10,13 +10,13 @@ describe Gitlab::API do describe "GET /projects" do it "should return authentication error" do - get "#{api_prefix}/projects" + get api("/projects") response.status.should == 401 end describe "authenticated GET /projects" do it "should return an array of projects" do - get "#{api_prefix}/projects?private_token=#{user.private_token}" + get api("/projects", user) response.status.should == 200 json_response.should be_an Array json_response.first['name'].should == project.name @@ -27,20 +27,20 @@ describe Gitlab::API do describe "GET /projects/:id" do it "should return a project by id" do - get "#{api_prefix}/projects/#{project.id}?private_token=#{user.private_token}" + get api("/projects/#{project.id}", user) response.status.should == 200 json_response['name'].should == project.name json_response['owner']['email'].should == user.email end it "should return a project by code name" do - get "#{api_prefix}/projects/#{project.code}?private_token=#{user.private_token}" + get api("/projects/#{project.code}", user) response.status.should == 200 json_response['name'].should == project.name end it "should return a 404 error if not found" do - get "#{api_prefix}/projects/42?private_token=#{user.private_token}" + get api("/projects/42", user) response.status.should == 404 json_response['message'].should == '404 Not found' end @@ -48,7 +48,7 @@ describe Gitlab::API do describe "GET /projects/:id/repository/branches" do it "should return an array of project branches" do - get "#{api_prefix}/projects/#{project.code}/repository/branches?private_token=#{user.private_token}" + get api("/projects/#{project.code}/repository/branches", user) response.status.should == 200 json_response.should be_an Array json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name @@ -57,7 +57,7 @@ describe Gitlab::API do describe "GET /projects/:id/repository/branches/:branch" do it "should return the branch information for a single branch" do - get "#{api_prefix}/projects/#{project.code}/repository/branches/new_design?private_token=#{user.private_token}" + get api("/projects/#{project.code}/repository/branches/new_design", user) response.status.should == 200 json_response['name'].should == 'new_design' @@ -67,7 +67,7 @@ describe Gitlab::API do describe "GET /projects/:id/repository/tags" do it "should return an array of project tags" do - get "#{api_prefix}/projects/#{project.code}/repository/tags?private_token=#{user.private_token}" + get api("/projects/#{project.code}/repository/tags", user) response.status.should == 200 json_response.should be_an Array json_response.first['name'].should == project.repo.tags.sort_by(&:name).reverse.first.name @@ -76,7 +76,7 @@ describe Gitlab::API do describe "GET /projects/:id/snippets/:snippet_id" do it "should return a project snippet" do - get "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}" + get api("/projects/#{project.code}/snippets/#{snippet.id}", user) response.status.should == 200 json_response['title'].should == snippet.title end @@ -84,7 +84,7 @@ describe Gitlab::API do describe "POST /projects/:id/snippets" do it "should create a new project snippet" do - post "#{api_prefix}/projects/#{project.code}/snippets?private_token=#{user.private_token}", + post api("/projects/#{project.code}/snippets", user), title: 'api test', file_name: 'sample.rb', code: 'test' response.status.should == 201 json_response['title'].should == 'api test' @@ -93,7 +93,7 @@ describe Gitlab::API do describe "PUT /projects/:id/snippets" do it "should update an existing project snippet" do - put "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}", + put api("/projects/#{project.code}/snippets/#{snippet.id}", user), code: 'updated code' response.status.should == 200 json_response['title'].should == 'example' @@ -104,34 +104,31 @@ describe Gitlab::API do describe "DELETE /projects/:id/snippets/:snippet_id" do it "should delete existing project snippet" do expect { - delete "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}" + delete api("/projects/#{project.code}/snippets/#{snippet.id}", user) }.to change { Snippet.count }.by(-1) end end describe "GET /projects/:id/snippets/:snippet_id/raw" do it "should get a raw project snippet" do - get "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}/raw?private_token=#{user.private_token}" + get api("/projects/#{project.code}/snippets/#{snippet.id}/raw", user) response.status.should == 200 end end describe "GET /projects/:id/:sha/blob" do it "should get the raw file contents" do - get "#{api_prefix}/projects/#{project.code}/repository/commits/master/blob?filepath=README.md&private_token=#{user.private_token}" - + get api("/projects/#{project.code}/repository/commits/master/blob?filepath=README.md", user) response.status.should == 200 end it "should return 404 for invalid branch_name" do - get "#{api_prefix}/projects/#{project.code}/repository/commits/invalid_branch_name/blob?filepath=README.md&private_token=#{user.private_token}" - + get api("/projects/#{project.code}/repository/commits/invalid_branch_name/blob?filepath=README.md", user) response.status.should == 404 end it "should return 404 for invalid file" do - get "#{api_prefix}/projects/#{project.code}/repository/commits/master/blob?filepath=README.invalid&private_token=#{user.private_token}" - + get api("/projects/#{project.code}/repository/commits/master/blob?filepath=README.invalid", user) response.status.should == 404 end end diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb index fcfea131..d791962a 100644 --- a/spec/requests/api/users_spec.rb +++ b/spec/requests/api/users_spec.rb @@ -7,13 +7,13 @@ describe Gitlab::API do describe "GET /users" do it "should return authentication error" do - get "#{api_prefix}/users" + get api("/users") response.status.should == 401 end describe "authenticated GET /users" do it "should return an array of users" do - get "#{api_prefix}/users?private_token=#{user.private_token}" + get api("/users", user) response.status.should == 200 json_response.should be_an Array json_response.first['email'].should == user.email @@ -23,7 +23,7 @@ describe Gitlab::API do describe "GET /users/:id" do it "should return a user by id" do - get "#{api_prefix}/users/#{user.id}?private_token=#{user.private_token}" + get api("/users/#{user.id}", user) response.status.should == 200 json_response['email'].should == user.email end @@ -31,7 +31,7 @@ describe Gitlab::API do describe "GET /user" do it "should return current user" do - get "#{api_prefix}/user?private_token=#{user.private_token}" + get api("/user", user) response.status.should == 200 json_response['email'].should == user.email end diff --git a/spec/requests/security/profile_access_spec.rb b/spec/requests/security/profile_access_spec.rb index b8ed27f0..9f6fe6a2 100644 --- a/spec/requests/security/profile_access_spec.rb +++ b/spec/requests/security/profile_access_spec.rb @@ -11,24 +11,30 @@ describe "Users Security" do end describe "GET /keys" do - it { keys_path.should be_allowed_for @u1 } - it { keys_path.should be_allowed_for :admin } - it { keys_path.should be_allowed_for :user } - it { keys_path.should be_denied_for :visitor } + subject { keys_path } + + it { should be_allowed_for @u1 } + it { should be_allowed_for :admin } + it { should be_allowed_for :user } + it { should be_denied_for :visitor } end describe "GET /profile" do - it { profile_path.should be_allowed_for @u1 } - it { profile_path.should be_allowed_for :admin } - it { profile_path.should be_allowed_for :user } - it { profile_path.should be_denied_for :visitor } + subject { profile_path } + + it { should be_allowed_for @u1 } + it { should be_allowed_for :admin } + it { should be_allowed_for :user } + it { should be_denied_for :visitor } end describe "GET /profile/password" do - it { profile_password_path.should be_allowed_for @u1 } - it { profile_password_path.should be_allowed_for :admin } - it { profile_password_path.should be_allowed_for :user } - it { profile_password_path.should be_denied_for :visitor } + subject { profile_password_path } + + it { should be_allowed_for @u1 } + it { should be_allowed_for :admin } + it { should be_allowed_for :user } + it { should be_denied_for :visitor } end end end diff --git a/spec/requests/security/project_access_spec.rb b/spec/requests/security/project_access_spec.rb index d503cf85..0cdf43bf 100644 --- a/spec/requests/security/project_access_spec.rb +++ b/spec/requests/security/project_access_spec.rb @@ -26,64 +26,76 @@ describe "Application access" do end describe "GET /project_code" do - it { project_path(@project).should be_allowed_for @u1 } - it { project_path(@project).should be_allowed_for @u3 } - it { project_path(@project).should be_denied_for :admin } - it { project_path(@project).should be_denied_for @u2 } - it { project_path(@project).should be_denied_for :user } - it { project_path(@project).should be_denied_for :visitor } + subject { project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/master/tree" do - it { tree_project_ref_path(@project, @project.root_ref).should be_allowed_for @u1 } - it { tree_project_ref_path(@project, @project.root_ref).should be_allowed_for @u3 } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for :admin } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for @u2 } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for :user } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for :visitor } + subject { tree_project_ref_path(@project, @project.root_ref) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/commits" do - it { project_commits_path(@project).should be_allowed_for @u1 } - it { project_commits_path(@project).should be_allowed_for @u3 } - it { project_commits_path(@project).should be_denied_for :admin } - it { project_commits_path(@project).should be_denied_for @u2 } - it { project_commits_path(@project).should be_denied_for :user } - it { project_commits_path(@project).should be_denied_for :visitor } + subject { project_commits_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/commit" do - it { project_commit_path(@project, @project.commit.id).should be_allowed_for @u1 } - it { project_commit_path(@project, @project.commit.id).should be_allowed_for @u3 } - it { project_commit_path(@project, @project.commit.id).should be_denied_for :admin } - it { project_commit_path(@project, @project.commit.id).should be_denied_for @u2 } - it { project_commit_path(@project, @project.commit.id).should be_denied_for :user } - it { project_commit_path(@project, @project.commit.id).should be_denied_for :visitor } + subject { project_commit_path(@project, @project.commit.id) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/team" do - it { team_project_path(@project).should be_allowed_for @u1 } - it { team_project_path(@project).should be_allowed_for @u3 } - it { team_project_path(@project).should be_denied_for :admin } - it { team_project_path(@project).should be_denied_for @u2 } - it { team_project_path(@project).should be_denied_for :user } - it { team_project_path(@project).should be_denied_for :visitor } + subject { team_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/wall" do - it { wall_project_path(@project).should be_allowed_for @u1 } - it { wall_project_path(@project).should be_allowed_for @u3 } - it { wall_project_path(@project).should be_denied_for :admin } - it { wall_project_path(@project).should be_denied_for @u2 } - it { wall_project_path(@project).should be_denied_for :user } - it { wall_project_path(@project).should be_denied_for :visitor } + subject { wall_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/blob" do before do - @commit = @project.commit - @path = @commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name - @blob_path = blob_project_ref_path(@project, @commit.id, path: @path) + commit = @project.commit + path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name + @blob_path = blob_project_ref_path(@project, commit.id, path: path) end it { @blob_path.should be_allowed_for @u1 } @@ -95,93 +107,113 @@ describe "Application access" do end describe "GET /project_code/edit" do - it { edit_project_path(@project).should be_allowed_for @u1 } - it { edit_project_path(@project).should be_denied_for @u3 } - it { edit_project_path(@project).should be_denied_for :admin } - it { edit_project_path(@project).should be_denied_for @u2 } - it { edit_project_path(@project).should be_denied_for :user } - it { edit_project_path(@project).should be_denied_for :visitor } + subject { edit_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_denied_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/deploy_keys" do - it { project_deploy_keys_path(@project).should be_allowed_for @u1 } - it { project_deploy_keys_path(@project).should be_denied_for @u3 } - it { project_deploy_keys_path(@project).should be_denied_for :admin } - it { project_deploy_keys_path(@project).should be_denied_for @u2 } - it { project_deploy_keys_path(@project).should be_denied_for :user } - it { project_deploy_keys_path(@project).should be_denied_for :visitor } + subject { project_deploy_keys_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_denied_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/issues" do - it { project_issues_path(@project).should be_allowed_for @u1 } - it { project_issues_path(@project).should be_allowed_for @u3 } - it { project_issues_path(@project).should be_denied_for :admin } - it { project_issues_path(@project).should be_denied_for @u2 } - it { project_issues_path(@project).should be_denied_for :user } - it { project_issues_path(@project).should be_denied_for :visitor } + subject { project_issues_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/snippets" do - it { project_snippets_path(@project).should be_allowed_for @u1 } - it { project_snippets_path(@project).should be_allowed_for @u3 } - it { project_snippets_path(@project).should be_denied_for :admin } - it { project_snippets_path(@project).should be_denied_for @u2 } - it { project_snippets_path(@project).should be_denied_for :user } - it { project_snippets_path(@project).should be_denied_for :visitor } + subject { project_snippets_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/merge_requests" do - it { project_merge_requests_path(@project).should be_allowed_for @u1 } - it { project_merge_requests_path(@project).should be_allowed_for @u3 } - it { project_merge_requests_path(@project).should be_denied_for :admin } - it { project_merge_requests_path(@project).should be_denied_for @u2 } - it { project_merge_requests_path(@project).should be_denied_for :user } - it { project_merge_requests_path(@project).should be_denied_for :visitor } + subject { project_merge_requests_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/repository" do - it { project_repository_path(@project).should be_allowed_for @u1 } - it { project_repository_path(@project).should be_allowed_for @u3 } - it { project_repository_path(@project).should be_denied_for :admin } - it { project_repository_path(@project).should be_denied_for @u2 } - it { project_repository_path(@project).should be_denied_for :user } - it { project_repository_path(@project).should be_denied_for :visitor } + subject { project_repository_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/repository/branches" do - it { branches_project_repository_path(@project).should be_allowed_for @u1 } - it { branches_project_repository_path(@project).should be_allowed_for @u3 } - it { branches_project_repository_path(@project).should be_denied_for :admin } - it { branches_project_repository_path(@project).should be_denied_for @u2 } - it { branches_project_repository_path(@project).should be_denied_for :user } - it { branches_project_repository_path(@project).should be_denied_for :visitor } + subject { branches_project_repository_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/repository/tags" do - it { tags_project_repository_path(@project).should be_allowed_for @u1 } - it { tags_project_repository_path(@project).should be_allowed_for @u3 } - it { tags_project_repository_path(@project).should be_denied_for :admin } - it { tags_project_repository_path(@project).should be_denied_for @u2 } - it { tags_project_repository_path(@project).should be_denied_for :user } - it { tags_project_repository_path(@project).should be_denied_for :visitor } + subject { tags_project_repository_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/hooks" do - it { project_hooks_path(@project).should be_allowed_for @u1 } - it { project_hooks_path(@project).should be_allowed_for @u3 } - it { project_hooks_path(@project).should be_denied_for :admin } - it { project_hooks_path(@project).should be_denied_for @u2 } - it { project_hooks_path(@project).should be_denied_for :user } - it { project_hooks_path(@project).should be_denied_for :visitor } + subject { project_hooks_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/files" do - it { files_project_path(@project).should be_allowed_for @u1 } - it { files_project_path(@project).should be_allowed_for @u3 } - it { files_project_path(@project).should be_denied_for :admin } - it { files_project_path(@project).should be_denied_for @u2 } - it { files_project_path(@project).should be_denied_for :user } - it { files_project_path(@project).should be_denied_for :visitor } + subject { files_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end end end From 580ce4f2d85f89e81825c3b5993fd3ee68f4d93a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sat, 25 Aug 2012 13:54:38 -0400 Subject: [PATCH 027/357] Minor cleanup to Milestone model and spec Back-ported from my still-in-progress major cleanup. --- app/models/milestone.rb | 14 +++----------- spec/models/milestone_spec.rb | 27 ++++++++++++++++++--------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 592c57f9..d416fb63 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -28,17 +28,9 @@ class Milestone < ActiveRecord::Base end def percent_complete - @percent_complete ||= begin - total_i = self.issues.count - closed_i = self.issues.closed.count - if total_i > 0 - (closed_i * 100) / total_i - else - 100 - end - rescue => ex - 0 - end + ((self.issues.closed.count * 100) / self.issues.count).abs + rescue ZeroDivisionError + 100 end def expires_at diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index 880d3f30..e9acc4e2 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -31,24 +31,33 @@ describe Milestone do it { milestone.should be_valid } - describe "Issues" do - before do + describe "#percent_complete" do + it "should not count open issues" do milestone.issues << issue + milestone.percent_complete.should == 0 end - it { milestone.percent_complete.should == 0 } + it "should count closed issues" do + issue.update_attributes(closed: true) + milestone.issues << issue + milestone.percent_complete.should == 100 + end - it do - issue.update_attributes closed: true + it "should recover from dividing by zero" do + milestone.issues.should_receive(:count).and_return(0) milestone.percent_complete.should == 100 end end - describe :expires_at do - before do - milestone.update_attributes due_date: Date.today + 1.day + describe "#expires_at" do + it "should be nil when due_date is unset" do + milestone.update_attributes(due_date: nil) + milestone.expires_at.should be_nil end - it { milestone.expires_at.should_not be_nil } + it "should not be nil when due_date is set" do + milestone.update_attributes(due_date: Date.tomorrow) + milestone.expires_at.should be_present + end end end From e0cd807020e0c50e365480133a66dca25efab36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikul=C3=A1=C5=A1=20D=C3=ADt=C4=9B?= Date: Sat, 25 Aug 2012 20:48:30 +0200 Subject: [PATCH 028/357] fix web hooks help view commit count off by one --- app/views/hooks/_data_ex.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/hooks/_data_ex.html.erb b/app/views/hooks/_data_ex.html.erb index 8d3de3f0..e43714e9 100644 --- a/app/views/hooks/_data_ex.html.erb +++ b/app/views/hooks/_data_ex.html.erb @@ -37,7 +37,7 @@ } } ], - total_commits_count => 3 + total_commits_count => 4 } eos %> From 2c32574ac303e180f43cfc2a3d119dd6a7b29b0c Mon Sep 17 00:00:00 2001 From: randx Date: Sat, 25 Aug 2012 23:39:01 +0300 Subject: [PATCH 029/357] Project git clone panel --- app/assets/stylesheets/sections/projects.scss | 11 +++++++++++ app/views/projects/show.html.haml | 4 +--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 0866b43f..20fd2cbf 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -39,3 +39,14 @@ } } } + +.project_clone_panel { + @include border-radius(4px); + @include bg-gray-gradient; + padding: 4px 7px; + border: 1px solid #CCC; + margin-bottom:5px; + input[type=text] { + border: 1px solid #BBB; + } +} diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index ebd2c8e4..628dc53d 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,12 +1,10 @@ = render "project_head" -.entry +.project_clone_panel .row .span7 .form-horizontal .input-prepend.project_clone_holder - - %span.add-on git clone = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" From 867f46076ed5fe0ce472f77eb17458ed3b317610 Mon Sep 17 00:00:00 2001 From: randx Date: Sun, 26 Aug 2012 01:40:01 +0300 Subject: [PATCH 030/357] No need to chown hooks in backup script any mroe --- lib/tasks/gitlab/backup.rake | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake index d9053c23..8e2fa2c0 100644 --- a/lib/tasks/gitlab/backup.rake +++ b/lib/tasks/gitlab/backup.rake @@ -145,7 +145,6 @@ namespace :gitlab do permission_commands = [ "sudo chmod -R g+rwX #{Gitlab.config.git_base_path}", "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}", - "sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive" ] permission_commands.each { |command| Kernel.system(command) } puts "[DONE]".green From aaeb37419ac00ed065f1c88f617db5788ada8525 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Mon, 27 Aug 2012 00:13:03 +0300 Subject: [PATCH 031/357] Send notifiation on create UserProject relation (access granted) --- app/mailers/notify.rb | 7 +++++ app/observers/users_project_observer.rb | 5 ++++ .../project_access_granted_email.html.haml | 14 ++++++++++ spec/factories.rb | 5 ++++ spec/mailers/notify_spec.rb | 20 ++++++++++++++ spec/observers/users_project_observer_spec.rb | 27 +++++++++++++++++++ 6 files changed, 78 insertions(+) create mode 100644 app/observers/users_project_observer.rb create mode 100644 app/views/notify/project_access_granted_email.html.haml create mode 100644 spec/observers/users_project_observer_spec.rb diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index d0571b7b..1d222eb1 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -76,6 +76,13 @@ class Notify < ActionMailer::Base mail(to: recipient(recipient_id), subject: subject("changed issue ##{@issue.id}", @issue.title)) end + def project_access_granted_email(user_project_id) + @users_project = UsersProject.find user_project_id + @project = @users_project.project + mail(to: @users_project.user.email, + subject: subject("access to project was granted")) + end + private # Look up a User by their ID and return their email address diff --git a/app/observers/users_project_observer.rb b/app/observers/users_project_observer.rb new file mode 100644 index 00000000..cb33eb3f --- /dev/null +++ b/app/observers/users_project_observer.rb @@ -0,0 +1,5 @@ +class UsersProjectObserver < ActiveRecord::Observer + def after_create(users_project) + Notify.project_access_granted_email(users_project.id).deliver + end +end diff --git a/app/views/notify/project_access_granted_email.html.haml b/app/views/notify/project_access_granted_email.html.haml new file mode 100644 index 00000000..154c2aaa --- /dev/null +++ b/app/views/notify/project_access_granted_email.html.haml @@ -0,0 +1,14 @@ +%td.content{align: "left", style: "font-family: Helvetica, Arial, sans-serif; padding: 20px 0 0;", valign: "top", width: "600"} + %table{border: "0", cellpadding: "0", cellspacing: "0", style: "color: #717171; font: normal 11px Helvetica, Arial, sans-serif; margin: 0; padding: 0;", width: "600"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = "You got granted #{@users_project.project_access_human} access to project" + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464 !important; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = link_to_gfm truncate(@project.name, length: 45), project_url(@project), title: @project.name + %br diff --git a/spec/factories.rb b/spec/factories.rb index ab2ca468..26868462 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -90,3 +90,8 @@ Factory.add(:milestone, Milestone) do |obj| obj.title = Faker::Lorem.sentence obj.due_date = Date.today + 1.month end + +Factory.add(:users_project, UsersProject) do |obj| + obj.user = Factory :user + obj.project = Factory :project +end diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index 93427ebf..60f3231c 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -145,6 +145,26 @@ describe Notify do end end + describe 'project access changed' do + let(:project) { Factory.create(:project, + path: "Fuu", + code: "Fuu") } + let(:user) { Factory.create :user } + let(:users_project) { Factory.create(:users_project, + project: project, + user: user) } + subject { Notify.project_access_granted_email(users_project.id) } + it 'has the correct subject' do + should have_subject /access to project was granted/ + end + it 'contains name of project' do + should have_body_text /#{project.name}/ + end + it 'contains new user role' do + should have_body_text /#{users_project.project_access_human}/ + end + end + context 'items that are noteable, the email for a note' do let(:note_author) { Factory.create(:user, name: 'author_name') } let(:note) { Factory.create(:note, project: project, author: note_author) } diff --git a/spec/observers/users_project_observer_spec.rb b/spec/observers/users_project_observer_spec.rb new file mode 100644 index 00000000..37de9e51 --- /dev/null +++ b/spec/observers/users_project_observer_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe UsersProjectObserver do + let(:user) { Factory.create :user } + let(:project) { Factory.create(:project, + code: "Fuu", + path: "Fuu" ) } + let(:users_project) { Factory.create(:users_project, + project: project, + user: user )} + subject { UsersProjectObserver.instance } + + describe "#after_create" do + it "should called when UsersProject created" do + subject.should_receive(:after_create) + UsersProject.observers.enable :users_project_observer do + Factory.create(:users_project, + project: project, + user: user) + end + end + it "should send email to user" do + Notify.should_receive(:project_access_granted_email).with(users_project.id).and_return(double(deliver: true)) + subject.after_create(users_project) + end + end +end From 3c96d1f0e1fa1264250c0f93fbd0c26a0dbb1330 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Mon, 27 Aug 2012 00:32:03 +0300 Subject: [PATCH 032/357] Send notification on update UserProject relation (access changed) --- app/observers/users_project_observer.rb | 4 ++++ config/application.rb | 2 +- spec/observers/users_project_observer_spec.rb | 17 +++++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/observers/users_project_observer.rb b/app/observers/users_project_observer.rb index cb33eb3f..763b2c87 100644 --- a/app/observers/users_project_observer.rb +++ b/app/observers/users_project_observer.rb @@ -2,4 +2,8 @@ class UsersProjectObserver < ActiveRecord::Observer def after_create(users_project) Notify.project_access_granted_email(users_project.id).deliver end + + def after_update(users_project) + Notify.project_access_granted_email(users_project.id).deliver + end end diff --git a/config/application.rb b/config/application.rb index ecd88b15..ad41f196 100644 --- a/config/application.rb +++ b/config/application.rb @@ -23,7 +23,7 @@ module Gitlab # config.plugins = [ :exception_notification, :ssl_requirement, :all ] # Activate observers that should always be running. - config.active_record.observers = :mailer_observer, :activity_observer, :project_observer, :key_observer, :issue_observer, :user_observer, :system_hook_observer + config.active_record.observers = :mailer_observer, :activity_observer, :project_observer, :key_observer, :issue_observer, :user_observer, :system_hook_observer, :users_project_observer # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. diff --git a/spec/observers/users_project_observer_spec.rb b/spec/observers/users_project_observer_spec.rb index 37de9e51..3e392040 100644 --- a/spec/observers/users_project_observer_spec.rb +++ b/spec/observers/users_project_observer_spec.rb @@ -6,8 +6,8 @@ describe UsersProjectObserver do code: "Fuu", path: "Fuu" ) } let(:users_project) { Factory.create(:users_project, - project: project, - user: user )} + project: project, + user: user )} subject { UsersProjectObserver.instance } describe "#after_create" do @@ -24,4 +24,17 @@ describe UsersProjectObserver do subject.after_create(users_project) end end + + describe "#after_update" do + it "should called when UsersProject updated" do + subject.should_receive(:after_update) + UsersProject.observers.enable :users_project_observer do + users_project.update_attribute(:project_access, 40) + end + end + it "should send email to user" do + Notify.should_receive(:project_access_granted_email).with(users_project.id).and_return(double(deliver: true)) + subject.after_update(users_project) + end + end end From 28cc4de2677d86274665acbd95891ac01960c17c Mon Sep 17 00:00:00 2001 From: Purwandi Date: Mon, 27 Aug 2012 12:43:28 +0700 Subject: [PATCH 033/357] Replace folder icon to use high quality --- app/assets/images/file_dir.png | Bin 517 -> 1648 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/assets/images/file_dir.png b/app/assets/images/file_dir.png index 97b0539393d29c78a596f565087b9282df0f0291..ea277bb14dba38fa633a32675ee58b88b88f80a4 100644 GIT binary patch delta 1613 zcmZo=`M@(lxt>KO)7d$|)7e=epeR2rGbfdS!9uV#^nU*B5D~l1{GcUb_6ia1?OjLL zhXzOQl$Kh1jLmcM(zjk>OJCm5Qh8!!-nmkm{r1aktNg1Q&Ds7iI^1OD_pnjqWlO5Q z`R%|K&){~gRh}NzFOKjls=Z|meYm?UNj>;T%-3J1E$>@Cx2}I4ciY7_K6C3V$`=Pccsyo0~-EdZX~~$Sij;# zaOQ)=2M4`sSIvx{RT%cH+f}wu^0b)Ov5PO&>er@Kr3>D=!Mb~% z_^k=^?_PRS!X{C9!+wvI{xde2+p$-IlC~{AQ1AZ2#YNdqOgHK3N-ygr0rQNe9NFt; zW}|9!qNVll=|n>%|4TwScPlOXA0Kb&*(APKcTwO{>*MPS_MhAsVIO>x@sE7c<~Ih? z>B37knBSQFhQs@y)j>X1uA*EkQLW3h8ec!}@h=S#v+@i0^v9uAqa*O#&G%Bj&i4On zo3+7P`-^hD{{=&n=(oZO?7|tP=9lc2XJ^~L;j=l#w)@AqxBIfQOa2so?!DWcd)#b8 z-mz_me%x5UQTI=75R-L6RoAqIr#_S&;;c}XwT)rCtjha3|3T!1TS2!rE?)ZTXX6EB zwS)F2?9N=;`S8N3e~bRD%v%w^Lj1~o>#P<@>t!mnTD97LHEQeCYxV#7bd^NzQu?bB zJ9XbgJyy%z@AuAEy-~eBK2i8?S8T@B?D?kZ!G5QzpNK!5@@LPVO*YaSM0Uo@O-_G*5UB4CRaO! zy{%=pBA?3Z96hAa(VD7r)QjmLi}0b-x9{HkIOp!~N7^ic;?LflJ2%HNJ#D?Q@z439 z9C9(ScO!Og{g$!o!gT-L)-PYTZ@*k#Z*`rC#lEiMKcn!9`r`-VE(`w5X53!${^jP@ zpGSAUF3*eq*mq&uy|;CLj$M8)U8S@yH)z9qd6_-@-NnU+pWlu?>=oM_86%#OT=6;R z5|5`E=cYxenm3n3tlYgrvhw4r)HS*?a`N4&Z?lWvXC-NA$%ROYxh@qE2@pQ|F0i4h z>Diq6d0I=BsqxR^)p=0Ann5Per|@|~2*doNBJpQ67esaLcxCjYN+pop;n|5cNd}gu z3{kz34QDhZ+L&Z+OjbMLl3--`q;)go93|QG5xl(@;2&LH0_hh)$s^R zt(IHaD|um;2v>}zo`}oi3Z9u08eN&zac2JxUf5T@VV`H9d0VA;fW@5pBPt7*c(U8> zNO~oyd}Q~RdKdlsR;!Ad58PU8Y%}NREI0YhYna#A`(B^%^InL<=N}XJo(Rnm?S4Fw z=M;x?CR6pKW1U(oTh(sOEbL+9Gl{uf^J!T`IpaHf{r6wmch~$qcIo@x^MV;2w&ttm oZ|mgXS~xLYUr+b^AEuJYD!+IP#hZ8-7#J8lUHx3vIVCg!08}~)N&o-= delta 474 zcmeys)5*c$D`4~)BVrlvN^55I~Z2oh?0tY5vm%n!3?liO-A{zU^Mx_h%Ys(DCiNCy3WK zmgv8$&QEredbqxH&ZBDCssN#co`PNKWuihSe0J@#3VqUVb?)tsEt^VpFJ&pstljGS zt!3ZxWQo4lC$IQ*on!f>Yw&Vufo=5TOGa&qe^>vLdA@PVroZ*?*Rt)gI+iqHOMSTC zYm4n_C#}4b`^y~Lm=qqWDx5qw Date: Fri, 24 Aug 2012 17:35:21 +0200 Subject: [PATCH 034/357] Update forms to show consistent link to GFM. --- app/assets/stylesheets/sections/notes.scss | 4 ++++ app/views/issues/_form.html.haml | 2 +- app/views/milestones/_form.html.haml | 2 +- app/views/notes/_form.html.haml | 5 ++--- app/views/wikis/_form.html.haml | 5 +++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 30587ef5..afa50952 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -38,6 +38,10 @@ } } +#preview-note { + margin-bottom: 0; +} + .note { padding: 8px 0; border-bottom: 1px solid #eee; diff --git a/app/views/issues/_form.html.haml b/app/views/issues/_form.html.haml index 1b67eabd..65bf605a 100644 --- a/app/views/issues/_form.html.haml +++ b/app/views/issues/_form.html.haml @@ -38,7 +38,7 @@ = f.label :description, "Details" .input = f.text_area :description, maxlength: 2000, class: "xxlarge", rows: 14 - %p.hint Markdown is enabled. + %p.hint Issues are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. .actions diff --git a/app/views/milestones/_form.html.haml b/app/views/milestones/_form.html.haml index 1cd08ac3..49200c67 100644 --- a/app/views/milestones/_form.html.haml +++ b/app/views/milestones/_form.html.haml @@ -22,7 +22,7 @@ = f.label :description, "Description", class: "control-label" .controls = f.text_area :description, maxlength: 2000, class: "input-xlarge", rows: 10 - %p.hint Markdown is enabled. + %p.hint Milestones are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. .span6 .control-group = f.label :due_date, "Due Date", class: "control-label" diff --git a/app/views/notes/_form.html.haml b/app/views/notes/_form.html.haml index dac026bd..326f1add 100644 --- a/app/views/notes/_form.html.haml +++ b/app/views/notes/_form.html.haml @@ -9,10 +9,9 @@ = f.hidden_field :noteable_type = f.text_area :note, size: 255 #preview-note.well.hide - %p.hint - = link_to "Gitlab Markdown", help_markdown_path, target: '_blank' - is enabled. + .hint = link_to 'Preview', preview_project_notes_path(@project), id: 'preview-link' + .right Comments are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. .row.note_advanced_opts.hide .span2 diff --git a/app/views/wikis/_form.html.haml b/app/views/wikis/_form.html.haml index 6b6411be..305607d4 100644 --- a/app/views/wikis/_form.html.haml +++ b/app/views/wikis/_form.html.haml @@ -14,9 +14,10 @@ .middle_box_content .input %span.cgray - Wiki content is parsed with #{link_to "Markdown", "http://en.wikipedia.org/wiki/Markdown"}. - To add link to new page you can just type + Wiki content is parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. + To link to a (new) page you can just type %code [Link Title](page-slug) + \. .bottom_box_content = f.label :content From 806695f491a8853a66d6dbde58b9e9d3eee1a72a Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Mon, 27 Aug 2012 21:20:13 +0200 Subject: [PATCH 035/357] Split and reformat markdown options and add refs to their docs. Also add hard_wrap option. --- app/helpers/gitlab_markdown_helper.rb | 29 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 88e3473b..b4e3b962 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -54,17 +54,24 @@ module GitlabMarkdownHelper end def markdown(text) - @__renderer ||= Redcarpet::Markdown.new(Redcarpet::Render::GitlabHTML.new(self, filter_html: true, with_toc_data: true), { - no_intra_emphasis: true, - tables: true, - fenced_code_blocks: true, - autolink: true, - strikethrough: true, - lax_html_blocks: true, - space_after_headers: true, - superscript: true - }) + unless @markdown + gitlab_renderer = Redcarpet::Render::GitlabHTML.new(self, + # see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch- + filter_html: true, + with_toc_data: true, + hard_wrap: true) + @markdown ||= Redcarpet::Markdown.new(gitlab_renderer, + # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use + no_intra_emphasis: true, + tables: true, + fenced_code_blocks: true, + autolink: true, + strikethrough: true, + lax_html_blocks: true, + space_after_headers: true, + superscript: true) + end - @__renderer.render(text).html_safe + @markdown.render(text).html_safe end end From 1f1ce5fbd47a8a9966323caf6b5b59672c74007a Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Fri, 24 Aug 2012 17:44:47 +0200 Subject: [PATCH 036/357] Revamp GFM user docs. --- app/views/help/markdown.html.haml | 114 +++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 17 deletions(-) diff --git a/app/views/help/markdown.html.haml b/app/views/help/markdown.html.haml index 8d6fb2a5..6a4bbb02 100644 --- a/app/views/help/markdown.html.haml +++ b/app/views/help/markdown.html.haml @@ -1,25 +1,105 @@ -- bash_lexer = Pygments::Lexer[:bash] -%h3.page_title Gitlab Markdown +%h3.page_title Gitlab Flavored Markdown .back_link = link_to help_path do ← to index %hr -%p.slead We extend Markdown with some GITLAB specific syntax. It allows you to link to: +.row + .span8 + %p + For Gitlab we developed something we call "Gitlab Flavored Markdown" (GFM). + It extends the standard Markdown in a few significant ways adds some useful functionality. -%ul - %li issues (#123) - %li merge request (!123) - %li commits (1234567) - %li team members (@foo) - %li snippets ($123) + %p You can use GFM in: + %ul + %li commit messages + %li comments + %li wall posts + %li issues + %li merge requests + %li milestones + %li wiki pages -%p.slead in + %h3 Differences from traditional Markdown -%ul - %li commit messages - %li notes/comments/wall posts - %li issues - %li merge requests - %li milestones - %li wiki pages + %h4 Newlines + + %p + The biggest difference that GFM introduces is in the handling of linebreaks. + With traditional Markdown you can hard wrap paragraphs of text and they will be combined into a single paragraph. We find this to be the cause of a huge number of unintentional formatting errors. + GFM treats newlines in paragraph-like content as real line breaks, which is probably what you intended. + + + %p The next paragraph contains two phrases separated by a single newline character: + %pre= "Roses are red\nViolets are blue" + %p becomes + = markdown "Roses are red\nViolets are blue" + + %h4 Multiple underscores in words + + %p + It is not reasonable to italicize just part of a word, especially when you're dealing with code and names often appear with multiple underscores. + Therefore, GFM ignores multiple underscores in words. + + %pre= "perform_complicated_task\ndo_this_and_do_that_and_another_thing" + %p becomes + = markdown "perform_complicated_task\ndo_this_and_do_that_and_another_thing" + + %h4 URL autolinking + + %p + GFM will autolink standard URLs you copy and paste into your text. + So if you want to link to a URL (instead of a textual link), you can simply put the URL in verbatim and it will be turned into a link to that URL. + + %h4 Fenced code blocks + + %p + Markdown converts text with four spaces at the front of each line to code blocks. + GFM supports that, but we also support fenced blocks. + Just wrap your code blocks in ``` and you won't need to indent manually to trigger a code block. + + %pre= %Q{```ruby\nrequire 'redcarpet'\nmarkdown = Redcarpet.new("Hello World!")\nputs markdown.to_html\n```} + %p becomes + = markdown %Q{```ruby\nrequire 'redcarpet'\nmarkdown = Redcarpet.new("Hello World!")\nputs markdown.to_html\n```} + + %h4 Special Gitlab references + + %p + GFM recognizes special references. + You can easily reference e.g. a team member, an issue or a commit within a project. + GFM will turn that reference into a link so you can navigate between them easily. + + %p GFM will recognize the following references: + %ul + %li + %code @foo + for team members + %li + %code #123 + for issues + %li + %code !123 + for merge request + %li + %code $123 + for snippets + %li + %code 1234567 + for commits + + -# this example will only be shown if the user has a project with at least one issue + - if @project = current_user.projects.first + - if issue = @project.issues.first + %p For example in your #{link_to @project.name, project_path(@project)} project something like + %pre= "This is related to ##{issue.id}. @#{current_user.name} is working on solving it." + %p becomes + = markdown "This is related to ##{issue.id}. @#{current_user.name} is working on solving it." + + + + .span4.right + .alert.alert-info + %p + If you're not already familiar with Markdown, you should spend 15 minutes and go over the excellent + %strong= link_to "Markdown Syntax Guide", "http://daringfireball.net/projects/markdown/syntax" + at Daring Fireball. From c81d4ab4a9101620e06cb401e7267789a6376d36 Mon Sep 17 00:00:00 2001 From: LeonB Date: Tue, 28 Aug 2012 10:57:23 +0200 Subject: [PATCH 037/357] Fixed some hardcoded paths New config option: git_hooks_path --- config/initializers/1_settings.rb | 4 ++++ lib/tasks/gitlab/backup.rake | 1 + lib/tasks/gitlab/status.rake | 2 +- lib/tasks/gitlab/write_hook.rake | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 8165d6c2..27c5bc22 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -66,6 +66,10 @@ class Settings < Settingslogic git_host['base_path'] || '/home/git/repositories/' end + def git_hooks_path + git_host['hooks_path'] || '/home/git/share/gitolite/hooks/' + end + def git_upload_pack if git_host['upload_pack'] != false true diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake index 8e2fa2c0..4dffd1ad 100644 --- a/lib/tasks/gitlab/backup.rake +++ b/lib/tasks/gitlab/backup.rake @@ -145,6 +145,7 @@ namespace :gitlab do permission_commands = [ "sudo chmod -R g+rwX #{Gitlab.config.git_base_path}", "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}", + "sudo chown gitlab:gitlab #{Gitlab.config.git_base_path}**/hooks/post-receive" ] permission_commands.each { |command| Kernel.system(command) } puts "[DONE]".green diff --git a/lib/tasks/gitlab/status.rake b/lib/tasks/gitlab/status.rake index 02d27d4b..91456189 100644 --- a/lib/tasks/gitlab/status.rake +++ b/lib/tasks/gitlab/status.rake @@ -56,7 +56,7 @@ namespace :gitlab do return end - gitolite_hooks_path = File.join("/home", Gitlab.config.ssh_user, "share", "gitolite", "hooks", "common") + gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common") gitlab_hook_files = ['post-receive'] gitlab_hook_files.each do |file_name| dest = File.join(gitolite_hooks_path, file_name) diff --git a/lib/tasks/gitlab/write_hook.rake b/lib/tasks/gitlab/write_hook.rake index 098331b8..9ec9c838 100644 --- a/lib/tasks/gitlab/write_hook.rake +++ b/lib/tasks/gitlab/write_hook.rake @@ -2,7 +2,7 @@ namespace :gitlab do namespace :gitolite do desc "GITLAB | Write GITLAB hook for gitolite" task :write_hooks => :environment do - gitolite_hooks_path = File.join("/home", Gitlab.config.ssh_user, "share", "gitolite", "hooks", "common") + gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common") gitlab_hooks_path = Rails.root.join("lib", "hooks") gitlab_hook_files = ['post-receive'] From 7a16572c0a47530939b4f59fb3f3bec490c03aba Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Tue, 28 Aug 2012 12:09:10 +0200 Subject: [PATCH 038/357] Fixed typo --- lib/tasks/gitlab/status.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/gitlab/status.rake b/lib/tasks/gitlab/status.rake index 02d27d4b..9483a95c 100644 --- a/lib/tasks/gitlab/status.rake +++ b/lib/tasks/gitlab/status.rake @@ -81,7 +81,7 @@ namespace :gitlab do next end - puts "post-reveice file ok".green + puts "post-receive file ok".green end end From aa708ed961e6c84010b3371cf64359152f08e7a8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 28 Aug 2012 13:47:13 +0300 Subject: [PATCH 039/357] Simplify setup for nginx, initd with already predefined files --- doc/installation.md | 95 +++------------------------------------- lib/support/init-gitlab | 54 +++++++++++++++++++++++ lib/support/nginx-gitlab | 33 ++++++++++++++ 3 files changed, 94 insertions(+), 88 deletions(-) create mode 100644 lib/support/init-gitlab create mode 100644 lib/support/nginx-gitlab diff --git a/doc/installation.md b/doc/installation.md index 1d32e1b7..7d3c2c41 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -244,42 +244,14 @@ You can login via web using admin generated with setup: sudo -u gitlab cp config/unicorn.rb.orig config/unicorn.rb sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D -Edit /etc/nginx/nginx.conf. In the *http* section add: +Add gitlab to nginx sites & change with your host specific settings - upstream gitlab { - server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket; - } + cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-enabled/gitlab - server { - listen YOUR_SERVER_IP:80; # e.g., listen 192.168.1.1:80; - server_name YOUR_SERVER_FQDN; # e.g., server_name source.example.com; - root /home/gitlab/gitlab/public; - - # individual nginx logs for this gitlab vhost - access_log /var/log/nginx/gitlab_access.log; - error_log /var/log/nginx/gitlab_error.log; - - location / { - # serve static files from defined root folder;. - # @gitlab is a named location for the upstream fallback, see below - try_files $uri $uri/index.html $uri.html @gitlab; - } - - # if a file, which is not found in the root folder is requested, - # then the proxy pass the request to the upsteam (gitlab unicorn) - location @gitlab { - proxy_redirect off; - - # you need to change this to "https", if you set "ssl" directive to "on" - proxy_set_header X-FORWARDED_PROTO http; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - - proxy_pass http://gitlab; - } - } - -Change **YOUR_SERVER_IP** and **YOUR_SERVER_FQDN** to the IP address and fully-qualified domain name of the host serving GitLab. + # Change **YOUR_SERVER_IP** and **YOUR_SERVER_FQDN** + # to the IP address and fully-qualified domain name + # of the host serving GitLab. + vim /etc/nginx/sites-enabled/nginx-gitlab Restart nginx: @@ -287,60 +259,7 @@ Restart nginx: Create init script in /etc/init.d/gitlab: - #! /bin/bash - ### BEGIN INIT INFO - # Provides: gitlab - # Required-Start: $local_fs $remote_fs $network $syslog redis-server - # Required-Stop: $local_fs $remote_fs $network $syslog - # Default-Start: 2 3 4 5 - # Default-Stop: 0 1 6 - # Short-Description: GitLab git repository management - # Description: GitLab git repository management - ### END INIT INFO - - DAEMON_OPTS="-c /home/gitlab/gitlab/config/unicorn.rb -E production -D" - NAME=unicorn - DESC="Gitlab service" - PID=/home/gitlab/gitlab/tmp/pids/unicorn.pid - RESQUE_PID=/home/gitlab/gitlab/tmp/pids/resque_worker.pid - - case "$1" in - start) - CD_TO_APP_DIR="cd /home/gitlab/gitlab" - START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" - START_RESQUE_PROCESS="./resque.sh" - - echo -n "Starting $DESC: " - if [ `whoami` = root ]; then - sudo -u gitlab sh -l -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" - else - $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS - fi - echo "$NAME." - ;; - stop) - echo -n "Stopping $DESC: " - kill -QUIT `cat $PID` - kill -QUIT `cat $RESQUE_PID` - echo "$NAME." - ;; - restart) - echo -n "Restarting $DESC: " - kill -USR2 `cat $PID` - echo "$NAME." - ;; - reload) - echo -n "Reloading $DESC configuration: " - kill -HUP `cat $PID` - echo "$NAME." - ;; - *) - echo "Usage: $NAME {start|stop|restart|reload}" >&2 - exit 1 - ;; - esac - - exit 0 + cp /home/gitlab/gitlab/lib/support/init-gitlab /etc/init.d/gitlab Adding permission: diff --git a/lib/support/init-gitlab b/lib/support/init-gitlab new file mode 100644 index 00000000..f146e80f --- /dev/null +++ b/lib/support/init-gitlab @@ -0,0 +1,54 @@ +#! /bin/bash +### BEGIN INIT INFO +# Provides: gitlab +# Required-Start: $local_fs $remote_fs $network $syslog redis-server +# Required-Stop: $local_fs $remote_fs $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: GitLab git repository management +# Description: GitLab git repository management +### END INIT INFO + +DAEMON_OPTS="-c /home/gitlab/gitlab/config/unicorn.rb -E production -D" +NAME=unicorn +DESC="Gitlab service" +PID=/home/gitlab/gitlab/tmp/pids/unicorn.pid +RESQUE_PID=/home/gitlab/gitlab/tmp/pids/resque_worker.pid + +case "$1" in + start) + CD_TO_APP_DIR="cd /home/gitlab/gitlab" + START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" + START_RESQUE_PROCESS="./resque.sh" + + echo -n "Starting $DESC: " + if [ `whoami` = root ]; then + sudo -u gitlab sh -l -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" + else + $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS + fi + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + kill -QUIT `cat $PID` + kill -QUIT `cat $RESQUE_PID` + echo "$NAME." + ;; + restart) + echo -n "Restarting $DESC: " + kill -USR2 `cat $PID` + echo "$NAME." + ;; + reload) + echo -n "Reloading $DESC configuration: " + kill -HUP `cat $PID` + echo "$NAME." + ;; + *) + echo "Usage: $NAME {start|stop|restart|reload}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/lib/support/nginx-gitlab b/lib/support/nginx-gitlab new file mode 100644 index 00000000..fa15d201 --- /dev/null +++ b/lib/support/nginx-gitlab @@ -0,0 +1,33 @@ +upstream gitlab { + server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket; +} + +server { + listen YOUR_SERVER_IP:80; # e.g., listen 192.168.1.1:80; + server_name YOUR_SERVER_FQDN; # e.g., server_name source.example.com; + root /home/gitlab/gitlab/public; + + # individual nginx logs for this gitlab vhost + access_log /var/log/nginx/gitlab_access.log; + error_log /var/log/nginx/gitlab_error.log; + + location / { + # serve static files from defined root folder;. + # @gitlab is a named location for the upstream fallback, see below + try_files $uri $uri/index.html $uri.html @gitlab; + } + + # if a file, which is not found in the root folder is requested, + # then the proxy pass the request to the upsteam (gitlab unicorn) + location @gitlab { + proxy_redirect off; + + # you need to change this to "https", if you set "ssl" directive to "on" + proxy_set_header X-FORWARDED_PROTO http; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + + proxy_pass http://gitlab; + } +} + From 05fa1f167c05c13b269b104de33dc7a38f34e347 Mon Sep 17 00:00:00 2001 From: LeonB Date: Tue, 28 Aug 2012 13:06:05 +0200 Subject: [PATCH 040/357] Added hooks_path option example --- config/gitlab.yml.example | 1 + 1 file changed, 1 insertion(+) diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index be36ee6d..d05cc1be 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -33,6 +33,7 @@ app: git_host: admin_uri: git@localhost:gitolite-admin base_path: /home/git/repositories/ + # hooks_path: /var/lib/gitolite/.gitolite/hooks/ # only needed when gitolite is not installed according the manual # host: localhost git_user: git upload_pack: true From ffdda12f663d6a634689f7c7b16560bcf792415e Mon Sep 17 00:00:00 2001 From: LeonB Date: Tue, 28 Aug 2012 14:18:49 +0200 Subject: [PATCH 041/357] Line not needed anymore --- lib/tasks/gitlab/backup.rake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake index 4dffd1ad..04d240f6 100644 --- a/lib/tasks/gitlab/backup.rake +++ b/lib/tasks/gitlab/backup.rake @@ -144,8 +144,7 @@ namespace :gitlab do if Kernel.system("cd #{File.dirname(project.second)} > /dev/null 2>&1 && git clone --bare #{backup_path_repo}/#{project.first}.bundle #{project.first}.git > /dev/null 2>&1") permission_commands = [ "sudo chmod -R g+rwX #{Gitlab.config.git_base_path}", - "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}", - "sudo chown gitlab:gitlab #{Gitlab.config.git_base_path}**/hooks/post-receive" + "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}" ] permission_commands.each { |command| Kernel.system(command) } puts "[DONE]".green From 7cdc5b9e0438c35c83fce739a764cb146d20c004 Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 00:04:06 +0300 Subject: [PATCH 042/357] Use similar interface to access gitolite Simplified gitolite handle logic Stubn over monkeypatch Stub only specific methods in Gitlab:Gitolite Moved grach auth to lib added specs for keys observer removes SshKey role --- app/models/key.rb | 5 +- app/models/protected_branch.rb | 4 +- app/models/users_project.rb | 6 +-- app/observers/key_observer.rb | 7 ++- app/roles/git_host.rb | 5 ++ app/roles/git_merge.rb | 2 - app/roles/repository.rb | 8 ++-- app/roles/ssh_key.rb | 18 ------- config/environment.rb | 2 - config/initializers/5_backend.rb | 5 ++ features/support/env.rb | 8 ++++ lib/gitlab/{ => backend}/gitolite.rb | 48 +++++++++++++++++-- .../gitlab/backend}/grack_auth.rb | 0 lib/gitlab/git_host.rb | 17 ------- lib/tasks/gitlab/enable_automerge.rake | 4 +- lib/tasks/gitlab/gitolite_rebuild.rake | 2 +- spec/observers/key_observer_spec.rb | 34 +++++++++++++ spec/spec_helper.rb | 3 ++ spec/support/gitolite_stub.rb | 35 ++++++++++++++ spec/support/monkeypatch.rb | 30 ------------ 20 files changed, 155 insertions(+), 88 deletions(-) create mode 100644 app/roles/git_host.rb delete mode 100644 app/roles/git_merge.rb delete mode 100644 app/roles/ssh_key.rb create mode 100644 config/initializers/5_backend.rb rename lib/gitlab/{ => backend}/gitolite.rb (79%) rename {config/initializers => lib/gitlab/backend}/grack_auth.rb (100%) delete mode 100644 lib/gitlab/git_host.rb create mode 100644 spec/observers/key_observer_spec.rb create mode 100644 spec/support/gitolite_stub.rb diff --git a/app/models/key.rb b/app/models/key.rb index cfcb1f63..8b61675a 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -1,7 +1,6 @@ require 'digest/md5' class Key < ActiveRecord::Base - include SshKey belongs_to :user belongs_to :project @@ -50,6 +49,10 @@ class Key < ActiveRecord::Base user.projects end end + + def last_deploy? + Key.where(identifier: identifier).count == 0 + end end # == Schema Information # diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb index 4da1432c..7c30f7a0 100644 --- a/app/models/protected_branch.rb +++ b/app/models/protected_branch.rb @@ -1,4 +1,6 @@ class ProtectedBranch < ActiveRecord::Base + include GitHost + belongs_to :project validates_presence_of :project_id validates_presence_of :name @@ -7,7 +9,7 @@ class ProtectedBranch < ActiveRecord::Base after_destroy :update_repository def update_repository - Gitlab::GitHost.system.update_project(project.path, project) + git_host.update_repository(project) end def commit diff --git a/app/models/users_project.rb b/app/models/users_project.rb index 36e6d904..7d172934 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -1,4 +1,6 @@ class UsersProject < ActiveRecord::Base + include GitHost + GUEST = 10 REPORTER = 20 DEVELOPER = 30 @@ -58,9 +60,7 @@ class UsersProject < ActiveRecord::Base end def update_repository - Gitlab::GitHost.system.new.configure do |c| - c.update_project(project.path, project) - end + git_host.update_repository(project) end def project_access_human diff --git a/app/observers/key_observer.rb b/app/observers/key_observer.rb index fac53a67..a3f17bde 100644 --- a/app/observers/key_observer.rb +++ b/app/observers/key_observer.rb @@ -1,9 +1,12 @@ class KeyObserver < ActiveRecord::Observer + include GitHost + def after_save(key) - key.update_repository + git_host.set_key(key.identifier, key.key, key.projects) end def after_destroy(key) - key.repository_delete_key + return if key.is_deploy_key && !key.last_deploy? + git_host.remove_key(key.identifier, key.projects) end end diff --git a/app/roles/git_host.rb b/app/roles/git_host.rb new file mode 100644 index 00000000..aa620f77 --- /dev/null +++ b/app/roles/git_host.rb @@ -0,0 +1,5 @@ +module GitHost + def git_host + Gitlab::Gitolite.new + end +end diff --git a/app/roles/git_merge.rb b/app/roles/git_merge.rb deleted file mode 100644 index 95e5942f..00000000 --- a/app/roles/git_merge.rb +++ /dev/null @@ -1,2 +0,0 @@ -module GitMerge -end diff --git a/app/roles/repository.rb b/app/roles/repository.rb index 17f52499..5fa950db 100644 --- a/app/roles/repository.rb +++ b/app/roles/repository.rb @@ -1,4 +1,6 @@ module Repository + include GitHost + def valid_repo? repo rescue @@ -48,7 +50,7 @@ module Repository end def url_to_repo - Gitlab::GitHost.url_to_repo(path) + git_host.url_to_repo(path) end def path_to_repo @@ -56,11 +58,11 @@ module Repository end def update_repository - Gitlab::GitHost.system.update_project(path, self) + git_host.update_repository(self) end def destroy_repository - Gitlab::GitHost.system.destroy_project(self) + git_host.remove_repository(self) end def repo_exists? diff --git a/app/roles/ssh_key.rb b/app/roles/ssh_key.rb deleted file mode 100644 index 5e1d2c23..00000000 --- a/app/roles/ssh_key.rb +++ /dev/null @@ -1,18 +0,0 @@ -module SshKey - def update_repository - Gitlab::GitHost.system.new.configure do |c| - c.update_keys(identifier, key) - c.update_projects(projects) - end - end - - def repository_delete_key - Gitlab::GitHost.system.new.configure do |c| - #delete key file is there is no identically deploy keys - if !is_deploy_key || Key.where(identifier: identifier).count() == 0 - c.delete_key(identifier) - end - c.update_projects(projects) - end - end -end diff --git a/config/environment.rb b/config/environment.rb index c880a7ad..3b186a9d 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -3,5 +3,3 @@ require File.expand_path('../application', __FILE__) # Initialize the rails application Gitlab::Application.initialize! - -require File.join(Rails.root, "lib", "gitlab", "git_host") diff --git a/config/initializers/5_backend.rb b/config/initializers/5_backend.rb new file mode 100644 index 00000000..85f747ac --- /dev/null +++ b/config/initializers/5_backend.rb @@ -0,0 +1,5 @@ +# GIT over HTTP +require Rails.root.join("lib", "gitlab", "backend", "grack_auth") + +# GITOLITE backend +require Rails.root.join("lib", "gitlab", "backend", "gitolite") diff --git a/features/support/env.rb b/features/support/env.rb index 80a465b4..0d9a9ed4 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -5,10 +5,12 @@ end require 'cucumber/rails' require 'webmock/cucumber' + WebMock.allow_net_connect! require Rails.root.join 'spec/factories' require Rails.root.join 'spec/support/monkeypatch' +require Rails.root.join 'spec/support/gitolite_stub' require Rails.root.join 'spec/support/login_helpers' require Rails.root.join 'spec/support/valid_commit' @@ -48,3 +50,9 @@ headless = Headless.new headless.start require 'cucumber/rspec/doubles' + +include GitoliteStub + +Before do + stub_gitolite! +end diff --git a/lib/gitlab/gitolite.rb b/lib/gitlab/backend/gitolite.rb similarity index 79% rename from lib/gitlab/gitolite.rb rename to lib/gitlab/backend/gitolite.rb index a3f34061..4d0a0cf0 100644 --- a/lib/gitlab/gitolite.rb +++ b/lib/gitlab/backend/gitolite.rb @@ -2,24 +2,62 @@ require 'gitolite' require 'timeout' require 'fileutils' +# TODO: refactor & cleanup module Gitlab class Gitolite class AccessDenied < StandardError; end - def self.update_project(path, project) - self.new.configure { |git| git.update_project(path, project) } + def set_key key_id, key_content, projects + self.configure do |c| + c.update_keys(key_id, key_content) + c.update_project(project.path, projects) + end end - def self.destroy_project(project) - self.new.configure { |git| git.destroy_project(project) } + def remove_key key_id, projects + self.configure do |c| + c.delete_key(key_id) + c.update_project(project.path, projects) + end end + def update_repository project + self.configure do |c| + c.update_project(project.path, project) + end + end + + alias_method :create_repository, :update_repository + + def remove_repository project + self.configure do |c| + c.destroy_project(project) + end + end + + def url_to_repo path + Gitlab.config.ssh_path + "#{path}.git" + end + + def initialize + # create tmp dir + @local_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}") + end + + def enable_automerge + self.configure do |git| + git.admin_all_repo + end + end + + private + def pull # create tmp dir @local_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}") Dir.mkdir @local_dir - `git clone #{GitHost.admin_uri} #{@local_dir}/gitolite` + `git clone #{self.class.admin_uri} #{@local_dir}/gitolite` end def push diff --git a/config/initializers/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb similarity index 100% rename from config/initializers/grack_auth.rb rename to lib/gitlab/backend/grack_auth.rb diff --git a/lib/gitlab/git_host.rb b/lib/gitlab/git_host.rb deleted file mode 100644 index 76b2c7b1..00000000 --- a/lib/gitlab/git_host.rb +++ /dev/null @@ -1,17 +0,0 @@ -require File.join(Rails.root, "lib", "gitlab", "gitolite") - -module Gitlab - class GitHost - def self.system - Gitlab::Gitolite - end - - def self.admin_uri - Gitlab.config.git_host.admin_uri - end - - def self.url_to_repo(path) - Gitlab.config.ssh_path + "#{path}.git" - end - end -end diff --git a/lib/tasks/gitlab/enable_automerge.rake b/lib/tasks/gitlab/enable_automerge.rake index 07f80586..0a1a0fa7 100644 --- a/lib/tasks/gitlab/enable_automerge.rake +++ b/lib/tasks/gitlab/enable_automerge.rake @@ -2,9 +2,7 @@ namespace :gitlab do namespace :app do desc "GITLAB | Enable auto merge" task :enable_automerge => :environment do - Gitlab::GitHost.system.new.configure do |git| - git.admin_all_repo - end + Gitlab::Gitolite.new.enable_automerge Project.find_each do |project| if project.repo_exists? && !project.satellite.exists? diff --git a/lib/tasks/gitlab/gitolite_rebuild.rake b/lib/tasks/gitlab/gitolite_rebuild.rake index 5ab17606..534aa315 100644 --- a/lib/tasks/gitlab/gitolite_rebuild.rake +++ b/lib/tasks/gitlab/gitolite_rebuild.rake @@ -16,7 +16,7 @@ namespace :gitlab do task :update_keys => :environment do puts "Starting Key" Key.find_each(:batch_size => 100) do |key| - key.update_repository + Gitlab::Gitolite.new.set_key(key.identifier, key.key, key.projects) print '.' end puts "Done with keys" diff --git a/spec/observers/key_observer_spec.rb b/spec/observers/key_observer_spec.rb new file mode 100644 index 00000000..7f2a76a3 --- /dev/null +++ b/spec/observers/key_observer_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe KeyObserver do + before do + @key = double('Key', + identifier: 'admin_654654', + key: '== a vaild ssh key', + projects: [], + is_deploy_key: false + ) + + @gitolite = double('Gitlab::Gitolite', + set_key: true, + remove_key: true + ) + + @observer = KeyObserver.instance + @observer.stub(:git_host => @gitolite) + end + + context :after_save do + it do + @gitolite.should_receive(:set_key).with(@key.identifier, @key.key, @key.projects) + @observer.after_save(@key) + end + end + + context :after_destroy do + it do + @gitolite.should_receive(:remove_key).with(@key.identifier, @key.projects) + @observer.after_destroy(@key) + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9fb0ad7e..06909f39 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -27,6 +27,7 @@ RSpec.configure do |config| config.mock_with :rspec config.include LoginHelpers, type: :request + config.include GitoliteStub # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false @@ -39,6 +40,8 @@ RSpec.configure do |config| end config.before do + stub_gitolite! + # !!! Observers disabled by default in tests ActiveRecord::Base.observers.disable(:all) # ActiveRecord::Base.observers.enable(:all) diff --git a/spec/support/gitolite_stub.rb b/spec/support/gitolite_stub.rb new file mode 100644 index 00000000..2a907f99 --- /dev/null +++ b/spec/support/gitolite_stub.rb @@ -0,0 +1,35 @@ +module GitoliteStub + def stub_gitolite! + stub_gitlab_gitolite + stub_gitolite_admin + end + + def stub_gitolite_admin + gitolite_repo = mock( + clean_permissions: true, + add_permission: true + ) + + gitolite_config = mock( + add_repo: true, + get_repo: gitolite_repo, + has_repo?: true + ) + + gitolite_admin = double( + 'Gitolite::GitoliteAdmin', + config: gitolite_config, + save: true, + ) + + Gitolite::GitoliteAdmin.stub(new: gitolite_admin) + + end + + def stub_gitlab_gitolite + gitlab_gitolite = Gitlab::Gitolite.new + Gitlab::Gitolite.stub(new: gitlab_gitolite) + gitlab_gitolite.stub(configure: ->() { yield(self) }) + gitlab_gitolite.stub(update_keys: true) + end +end diff --git a/spec/support/monkeypatch.rb b/spec/support/monkeypatch.rb index 855a31f0..04bbb6fb 100644 --- a/spec/support/monkeypatch.rb +++ b/spec/support/monkeypatch.rb @@ -1,14 +1,6 @@ # Stubbing Project <-> git host path # create project using Factory only class Project - def update_repository - true - end - - def destroy_repository - true - end - def path_to_repo File.join(Rails.root, "tmp", "tests", path) end @@ -18,22 +10,6 @@ class Project end end -class Key - def update_repository - true - end - - def repository_delete_key - true - end -end - -class UsersProject - def update_repository - true - end -end - class FakeSatellite def exists? true @@ -43,9 +19,3 @@ class FakeSatellite true end end - -class ProtectedBranch - def update_repository - true - end -end From d6b2b4f06952625da670735724e8c14ac3d7b9c5 Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 00:16:33 +0300 Subject: [PATCH 043/357] fixed configure call within gitolite --- lib/gitlab/backend/gitolite.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/gitlab/backend/gitolite.rb b/lib/gitlab/backend/gitolite.rb index 4d0a0cf0..1eb8a0b0 100644 --- a/lib/gitlab/backend/gitolite.rb +++ b/lib/gitlab/backend/gitolite.rb @@ -8,21 +8,21 @@ module Gitlab class AccessDenied < StandardError; end def set_key key_id, key_content, projects - self.configure do |c| + configure do |c| c.update_keys(key_id, key_content) c.update_project(project.path, projects) end end def remove_key key_id, projects - self.configure do |c| + configure do |c| c.delete_key(key_id) c.update_project(project.path, projects) end end def update_repository project - self.configure do |c| + configure do |c| c.update_project(project.path, project) end end @@ -30,7 +30,7 @@ module Gitlab alias_method :create_repository, :update_repository def remove_repository project - self.configure do |c| + configure do |c| c.destroy_project(project) end end @@ -45,7 +45,7 @@ module Gitlab end def enable_automerge - self.configure do |git| + configure do |git| git.admin_all_repo end end From e8e8ca940bd592738f123985a8791dadcc3f75e7 Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 00:19:34 +0300 Subject: [PATCH 044/357] Fixed access to removed method --- lib/gitlab/backend/gitolite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/backend/gitolite.rb b/lib/gitlab/backend/gitolite.rb index 1eb8a0b0..96a13350 100644 --- a/lib/gitlab/backend/gitolite.rb +++ b/lib/gitlab/backend/gitolite.rb @@ -57,7 +57,7 @@ module Gitlab @local_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}") Dir.mkdir @local_dir - `git clone #{self.class.admin_uri} #{@local_dir}/gitolite` + `git clone #{Gitlab.config.gitolite_admin_uri} #{@local_dir}/gitolite` end def push From c48c0f95b279e3fdaf0764d48711304beaa8ace8 Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 00:33:19 +0300 Subject: [PATCH 045/357] Gitlab::Gitolite final fixes. Seems like all functionality is working correctly now --- lib/gitlab/backend/gitolite.rb | 80 +++++++++++++++++----------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/lib/gitlab/backend/gitolite.rb b/lib/gitlab/backend/gitolite.rb index 96a13350..18b30500 100644 --- a/lib/gitlab/backend/gitolite.rb +++ b/lib/gitlab/backend/gitolite.rb @@ -10,14 +10,14 @@ module Gitlab def set_key key_id, key_content, projects configure do |c| c.update_keys(key_id, key_content) - c.update_project(project.path, projects) + c.update_projects(projects) end end def remove_key key_id, projects configure do |c| c.delete_key(key_id) - c.update_project(project.path, projects) + c.update_projects(projects) end end @@ -50,43 +50,7 @@ module Gitlab end end - private - - def pull - # create tmp dir - @local_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}") - Dir.mkdir @local_dir - - `git clone #{Gitlab.config.gitolite_admin_uri} #{@local_dir}/gitolite` - end - - def push - Dir.chdir(File.join(@local_dir, "gitolite")) - `git add -A` - `git commit -am "Gitlab"` - `git push` - Dir.chdir(Rails.root) - - FileUtils.rm_rf(@local_dir) - end - - def configure - Timeout::timeout(30) do - File.open(File.join(Rails.root, 'tmp', "gitlabhq-gitolite.lock"), "w+") do |f| - begin - f.flock(File::LOCK_EX) - pull - yield(self) - push - ensure - f.flock(File::LOCK_UN) - end - end - end - rescue Exception => ex - Gitlab::Logger.error(ex.message) - raise Gitolite::AccessDenied.new("gitolite timeout") - end + protected def destroy_project(project) FileUtils.rm_rf(project.path_to_repo) @@ -191,5 +155,43 @@ module Gitlab conf.add_repo(repo, true) ga_repo.save end + + private + + def pull + # create tmp dir + @local_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}") + Dir.mkdir @local_dir + + `git clone #{Gitlab.config.gitolite_admin_uri} #{@local_dir}/gitolite` + end + + def push + Dir.chdir(File.join(@local_dir, "gitolite")) + `git add -A` + `git commit -am "Gitlab"` + `git push` + Dir.chdir(Rails.root) + + FileUtils.rm_rf(@local_dir) + end + + def configure + Timeout::timeout(30) do + File.open(File.join(Rails.root, 'tmp', "gitlabhq-gitolite.lock"), "w+") do |f| + begin + f.flock(File::LOCK_EX) + pull + yield(self) + push + ensure + f.flock(File::LOCK_UN) + end + end + end + rescue Exception => ex + Gitlab::Logger.error(ex.message) + raise Gitolite::AccessDenied.new("gitolite timeout") + end end end From b03ee4666bc5dfa3c509768918cbc8a477d24efb Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 00:44:26 +0300 Subject: [PATCH 046/357] Handle invalid ssh exception --- app/controllers/application_controller.rb | 4 ++++ app/views/errors/invalid_ssh_key.html.haml | 3 +++ lib/gitlab/backend/gitolite.rb | 9 +++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 app/views/errors/invalid_ssh_key.html.haml diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7c1941ec..9aab250d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -14,6 +14,10 @@ class ApplicationController < ActionController::Base render "errors/gitolite", layout: "error" end + rescue_from Gitlab::Gitolite::InvalidKey do |exception| + render "errors/invalid_ssh_key", layout: "error" + end + rescue_from Encoding::CompatibilityError do |exception| render "errors/encoding", layout: "error", status: 404 end diff --git a/app/views/errors/invalid_ssh_key.html.haml b/app/views/errors/invalid_ssh_key.html.haml new file mode 100644 index 00000000..fb7922b0 --- /dev/null +++ b/app/views/errors/invalid_ssh_key.html.haml @@ -0,0 +1,3 @@ +%h1 Git Error +%hr +%p Seems like SSH Key you provided is not a valid SSH key. diff --git a/lib/gitlab/backend/gitolite.rb b/lib/gitlab/backend/gitolite.rb index 18b30500..b69f4663 100644 --- a/lib/gitlab/backend/gitolite.rb +++ b/lib/gitlab/backend/gitolite.rb @@ -6,6 +6,7 @@ require 'fileutils' module Gitlab class Gitolite class AccessDenied < StandardError; end + class InvalidKey < StandardError; end def set_key key_id, key_content, projects configure do |c| @@ -190,8 +191,12 @@ module Gitlab end end rescue Exception => ex - Gitlab::Logger.error(ex.message) - raise Gitolite::AccessDenied.new("gitolite timeout") + if ex.message =~ /is not a valid SSH key string/ + raise Gitolite::InvalidKey.new("ssh key is not valid") + else + Gitlab::Logger.error(ex.message) + raise Gitolite::AccessDenied.new("gitolite timeout") + end end end end From b78fd0c13088ce2c19d939a26a26e247ca5047ea Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 16:49:59 -0400 Subject: [PATCH 047/357] Add github-markup gem --- Gemfile | 1 + Gemfile.lock | 2 ++ app/controllers/refs_controller.rb | 2 ++ 3 files changed, 5 insertions(+) diff --git a/Gemfile b/Gemfile index b0724fad..34f7c274 100644 --- a/Gemfile +++ b/Gemfile @@ -45,6 +45,7 @@ gem "seed-fu" # Markdown to HTML gem "redcarpet", "~> 2.1.1" +gem 'github-markup' # Servers gem "thin" diff --git a/Gemfile.lock b/Gemfile.lock index f350b3fc..fc730802 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -178,6 +178,7 @@ GEM gherkin (2.11.0) json (>= 1.4.6) git (1.2.5) + github-markup (0.7.4) gitlab_meta (2.9) grape (0.2.1) hashie (~> 1.2) @@ -396,6 +397,7 @@ DEPENDENCIES ffaker foreman git + github-markup gitlab_meta (= 2.9) gitolite! grack! diff --git a/app/controllers/refs_controller.rb b/app/controllers/refs_controller.rb index 3f81a2ca..90361437 100644 --- a/app/controllers/refs_controller.rb +++ b/app/controllers/refs_controller.rb @@ -1,3 +1,5 @@ +require 'github/markup' + class RefsController < ApplicationController include Gitlab::Encode before_filter :project From 52c521ffe84dac5dc72a299ee1ecf4736a10f07f Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 16:52:49 -0400 Subject: [PATCH 048/357] Use GitHub::Markup to parse markup files Closes #1382 --- app/helpers/tree_helper.rb | 10 ++++++++++ app/views/refs/_tree.html.haml | 6 +----- app/views/refs/_tree_file.html.haml | 5 ++--- spec/helpers/tree_helper_spec.rb | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 spec/helpers/tree_helper_spec.rb diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index ed3053d8..c51ee84a 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -24,4 +24,14 @@ module TreeHelper content.name end end + + # Public: Determines if a given filename is compatible with GitHub::Markup. + # + # filename - Filename string to check + # + # Returns boolean + def markup?(filename) + filename.end_with?(*%w(.mdown .md .markdown .textile .rdoc .org .creole + .mediawiki .rst .asciidoc .pod)) + end end diff --git a/app/views/refs/_tree.html.haml b/app/views/refs/_tree.html.haml index a4765c10..297a3b5f 100644 --- a/app/views/refs/_tree.html.haml +++ b/app/views/refs/_tree.html.haml @@ -43,11 +43,7 @@ %i.icon-file = content.name .file_content.wiki - - if content.name =~ /\.(md|markdown)$/i - = preserve do - = markdown(content.data) - - else - = simple_format(content.data) + = raw GitHub::Markup.render(content.name, content.data) :javascript $(function(){ diff --git a/app/views/refs/_tree_file.html.haml b/app/views/refs/_tree_file.html.haml index b5ed61bb..765f271a 100644 --- a/app/views/refs/_tree_file.html.haml +++ b/app/views/refs/_tree_file.html.haml @@ -9,10 +9,9 @@ = link_to "history", project_commits_path(@project, path: params[:path], ref: @ref), class: "btn very_small" = link_to "blame", blame_file_project_ref_path(@project, @ref, path: params[:path]), class: "btn very_small" - if file.text? - - if name =~ /\.(md|markdown)$/i + - if markup?(name) .file_content.wiki - = preserve do - = markdown(file.data) + = raw GitHub::Markup.render(name, file.data) - else .file_content.code - unless file.empty? diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb new file mode 100644 index 00000000..bb124d8b --- /dev/null +++ b/spec/helpers/tree_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe TreeHelper do + describe '#markup?' do + %w(mdown md markdown textile rdoc org creole mediawiki rst asciidoc pod).each do |type| + it "returns true for #{type} files" do + markup?("README.#{type}").should be_true + end + end + + it "returns false when given a non-markup filename" do + markup?('README.rb').should_not be_true + end + end +end From 1814ee0ced59aa3203ce265410ae5a7c83e096aa Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 17:02:23 -0400 Subject: [PATCH 049/357] Give github-markup gem a version requirement --- Gemfile | 4 ++-- Gemfile.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 34f7c274..c8d3821f 100644 --- a/Gemfile +++ b/Gemfile @@ -44,8 +44,8 @@ gem "ffaker" gem "seed-fu" # Markdown to HTML -gem "redcarpet", "~> 2.1.1" -gem 'github-markup' +gem "redcarpet", "~> 2.1.1" +gem "github-markup", "~> 0.7.4" # Servers gem "thin" diff --git a/Gemfile.lock b/Gemfile.lock index fc730802..830e28b5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -397,7 +397,7 @@ DEPENDENCIES ffaker foreman git - github-markup + github-markup (~> 0.7.4) gitlab_meta (= 2.9) gitolite! grack! From 8559d9a156819b576127a944dbcce1fe335d68ba Mon Sep 17 00:00:00 2001 From: Dae Myung Date: Sat, 8 Sep 2012 04:24:38 -0700 Subject: [PATCH 050/357] sending argument project but there is no project to send --- lib/gitlab/backend/gitolite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/backend/gitolite.rb b/lib/gitlab/backend/gitolite.rb index 658182c7..fe5dcef4 100644 --- a/lib/gitlab/backend/gitolite.rb +++ b/lib/gitlab/backend/gitolite.rb @@ -35,7 +35,7 @@ module Gitlab end def enable_automerge - config.admin_all_repo!(project) + config.admin_all_repo! end alias_method :create_repository, :update_repository From 1c0153682927f72f6b3011db11ddf5a139f9d16a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 9 Sep 2012 05:40:22 -0400 Subject: [PATCH 051/357] Fix spelling of "empty" in disableButtonIfEmptyField function name --- app/assets/javascripts/issues.js | 4 ++-- app/assets/javascripts/note.js | 4 ++-- app/assets/javascripts/projects.js.coffee | 2 +- app/views/merge_requests/_form.html.haml | 2 +- app/views/milestones/_form.html.haml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/issues.js b/app/assets/javascripts/issues.js index 148dc7b9..3ddc6926 100644 --- a/app/assets/javascripts/issues.js +++ b/app/assets/javascripts/issues.js @@ -5,7 +5,7 @@ function switchToNewIssue(form){ $('select#issue_milestone_id').chosen(); $("#new_issue_dialog").show("fade", { direction: "right" }, 150); $('.top-tabs .add_new').hide(); - disableButtonIfEmtpyField("#issue_title", ".save-btn"); + disableButtonIfEmptyField("#issue_title", ".save-btn"); }); } @@ -16,7 +16,7 @@ function switchToEditIssue(form){ $('select#issue_milestone_id').chosen(); $("#edit_issue_dialog").show("fade", { direction: "right" }, 150); $('.add_new').hide(); - disableButtonIfEmtpyField("#issue_title", ".save-btn"); + disableButtonIfEmptyField("#issue_title", ".save-btn"); }); } diff --git a/app/assets/javascripts/note.js b/app/assets/javascripts/note.js index 9cd3e36e..160f75c9 100644 --- a/app/assets/javascripts/note.js +++ b/app/assets/javascripts/note.js @@ -32,7 +32,7 @@ var NoteList = { $(".submit_note").removeAttr("disabled"); }) - disableButtonIfEmtpyField(".note-text", ".submit_note"); + disableButtonIfEmptyField(".note-text", ".submit_note"); $(".note-text").live("focus", function(){ $(this).css("height", "80px"); @@ -177,6 +177,6 @@ var PerLineNotes = { form.show(); return false; }); - disableButtonIfEmtpyField(".line-note-text", ".submit_inline_note"); + disableButtonIfEmptyField(".line-note-text", ".submit_inline_note"); } } diff --git a/app/assets/javascripts/projects.js.coffee b/app/assets/javascripts/projects.js.coffee index 85ab2a06..14738e14 100644 --- a/app/assets/javascripts/projects.js.coffee +++ b/app/assets/javascripts/projects.js.coffee @@ -8,7 +8,7 @@ window.Projects = -> $('.save-project-loader').show() $('form #project_default_branch').chosen() - disableButtonIfEmtpyField '#project_name', '.project-submit' + disableButtonIfEmptyField '#project_name', '.project-submit' # Git clone panel switcher $ -> diff --git a/app/views/merge_requests/_form.html.haml b/app/views/merge_requests/_form.html.haml index b554c051..d5271ed0 100644 --- a/app/views/merge_requests/_form.html.haml +++ b/app/views/merge_requests/_form.html.haml @@ -60,7 +60,7 @@ :javascript $(function(){ - disableButtonIfEmtpyField("#merge_request_title", ".save-btn"); + disableButtonIfEmptyField("#merge_request_title", ".save-btn"); $('select#merge_request_assignee_id').chosen(); $('select#merge_request_source_branch').chosen(); $('select#merge_request_target_branch').chosen(); diff --git a/app/views/milestones/_form.html.haml b/app/views/milestones/_form.html.haml index ce4145ba..194eac77 100644 --- a/app/views/milestones/_form.html.haml +++ b/app/views/milestones/_form.html.haml @@ -41,7 +41,7 @@ :javascript $(function() { - disableButtonIfEmtpyField("#milestone_title", ".save-btn"); + disableButtonIfEmptyField("#milestone_title", ".save-btn"); $( ".datepicker" ).datepicker({ dateFormat: "yy-mm-dd", onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } From 93daa8c568cff8c59eb77c7a47b72e0266613d5a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 9 Sep 2012 05:30:49 -0400 Subject: [PATCH 052/357] Move main.js to main.js.coffee --- app/assets/javascripts/{main.js => main.js.coffee} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/assets/javascripts/{main.js => main.js.coffee} (100%) diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js.coffee similarity index 100% rename from app/assets/javascripts/main.js rename to app/assets/javascripts/main.js.coffee From 3b89f140905dd1e929d5bf587fa2509866ba5d32 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 9 Sep 2012 05:59:15 -0400 Subject: [PATCH 053/357] Convert main.js to coffee Remove duplicate 's' hotkey code --- app/assets/javascripts/main.js.coffee | 176 +++++++++--------------- app/views/layouts/_head_panel.html.haml | 8 -- 2 files changed, 65 insertions(+), 119 deletions(-) diff --git a/app/assets/javascripts/main.js.coffee b/app/assets/javascripts/main.js.coffee index 61af1dc3..a614cf5b 100644 --- a/app/assets/javascripts/main.js.coffee +++ b/app/assets/javascripts/main.js.coffee @@ -1,130 +1,84 @@ -$(document).ready(function(){ +window.updatePage = (data) -> + $.ajax({type: "GET", url: location.href, data: data, dataType: "script"}) - $(".one_click_select").live("click", function(){ - $(this).select(); - }); +window.slugify = (text) -> + text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase() - $('body').on('ajax:complete, ajax:beforeSend, submit', 'form', function(e){ - var buttons = $('[type="submit"]', this); - switch( e.type ){ - case 'ajax:beforeSend': - case 'submit': - buttons.attr('disabled', 'disabled'); - break; - case ' ajax:complete': - default: - buttons.removeAttr('disabled'); - break; - } - }) +window.ajaxGet = (url) -> + $.ajax({type: "GET", url: url, dataType: "script"}) - $(".account-box").mouseenter(showMenu); - $(".account-box").mouseleave(resetMenu); + # Disable button if text field is empty +window.disableButtonIfEmptyField = (field_selector, button_selector) -> + field = $(field_selector) + closest_submit = field.closest("form").find(button_selector) - $("#projects-list .project").live('click', function(e){ - if(e.target.nodeName != "A" && e.target.nodeName != "INPUT") { - location.href = $(this).attr("url"); - e.stopPropagation(); - return false; - } - }); + closest_submit.attr("disabled", "disabled").addClass("disabled") if field.val() is "" - /** - * Focus search field by pressing 's' key - */ - $(document).keypress(function(e) { - if( $(e.target).is(":input") ) return; - switch(e.which) { - case 115: focusSearch(); - e.preventDefault(); - } - }); + field.on "keyup", -> + if $(this).val() is "" + closest_submit.attr("disabled", "disabled").addClass "disabled" + else + closest_submit.removeAttr("disabled").removeClass "disabled" - /** - * Commit show suppressed diff - * - */ - $(".supp_diff_link").bind("click", function() { - showDiff(this); - }); +$ -> + $(".one_click_select").live 'click', -> + $(this).select() - /** - * Note markdown preview - * - */ - $(document).on('click', '#preview-link', function(e) { - $('#preview-note').text('Loading...'); + $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> + buttons = $('[type="submit"]', this) - var previewLinkText = ($(this).text() == 'Preview' ? 'Edit' : 'Preview'); - $(this).text(previewLinkText); + switch e.type + when 'ajax:beforeSend', 'submit' + buttons.attr('disabled', 'disabled') + else + buttons.removeAttr('disabled') - var note = $('#note_note').val(); - if (note.trim().length === 0) { note = 'Nothing to preview'; } - $.post($(this).attr('href'), {note: note}, function(data) { - $('#preview-note').html(data); - }); + # Show/Hide the profile menu when hovering the account box + $('.account-box').hover -> $(this).toggleClass('hover') - $('#preview-note, #note_note').toggle(); - e.preventDefault(); - }); -}); + $("#projects-list .project").live 'click', (e) -> + if e.target.nodeName isnt "A" and e.target.nodeName isnt "INPUT" + location.href = $(this).attr("url") + e.stopPropagation() + false -function focusSearch() { - $("#search").focus(); -} + # Focus search field by pressing 's' key + $(document).keypress (e) -> + # Don't do anything if typing in an input + return if $(e.target).is(":input") -function updatePage(data){ - $.ajax({type: "GET", url: location.href, data: data, dataType: "script"}); -} + switch e.which + when 115 + $("#search").focus() + e.preventDefault() -function showMenu() { - $(this).toggleClass('hover'); -} + # Commit show suppressed diff + $(".supp_diff_link").bind "click", -> + $(this).next('table').show() + $(this).remove() -function resetMenu() { - $(this).removeClass("hover"); -} + # Note markdown preview + $(document).on 'click', '#preview-link', (e) -> + $('#preview-note').text('Loading...') -function slugify(text) { - return text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase(); -} + previewLinkText = if $(this).text() == 'Preview' then 'Edit' else 'Preview' + $(this).text(previewLinkText) -function showDiff(link) { - $(link).next('table').show(); - $(link).remove(); -} + note = $('#note_note').val() + note = 'Nothing to preview' if note.trim().length is 0 + $.post($(this).attr('href'), {note: note}, (data) -> + $('#preview-note').html(data) + ) -(function($){ - var _chosen = $.fn.chosen; - $.fn.extend({ - chosen: function(options) { - var default_options = {'search_contains' : 'true'}; - $.extend(default_options, options); - return _chosen.apply(this, [default_options]); - }}) -})(jQuery); + $('#preview-note, #note_note').toggle() + e.preventDefault() + false +(($) -> + _chosen = $.fn.chosen + $.fn.extend chosen: (options) -> + default_options = search_contains: "true" + $.extend default_options, options + _chosen.apply this, [default_options] -function ajaxGet(url) { - $.ajax({type: "GET", url: url, dataType: "script"}); -} - -/** - * Disable button if text field is empty - */ -function disableButtonIfEmtpyField(field_selector, button_selector) { - field = $(field_selector); - if(field.val() == "") { - field.closest("form").find(button_selector).attr("disabled", "disabled").addClass("disabled"); - } - - field.on('keyup', function(){ - var field = $(this); - var closest_submit = field.closest("form").find(button_selector); - if(field.val() == "") { - closest_submit.attr("disabled", "disabled").addClass("disabled"); - } else { - closest_submit.removeAttr("disabled").removeClass("disabled"); - } - }) -} +)(jQuery) diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index d6247d36..f5e423a5 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -34,12 +34,4 @@ source: #{raw search_autocomplete_source}, select: function(event, ui) { location.href = ui.item.url } }); - - $(document).keypress(function(e) { - if($(e.target).is(":input")) return; - switch(e.which) { - case 115: focusSearch(); - e.preventDefault(); - } - }); }); From ad1aa517c7052d26e7243f6574b3deacddd0b161 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 9 Sep 2012 07:08:13 -0400 Subject: [PATCH 054/357] Add "enable" and "disable" jQuery functions Handles (un)setting the disabled attribute and adding/removing the 'disabled' class --- app/assets/javascripts/main.js.coffee | 19 ++++++++++++++----- app/assets/javascripts/note.js | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/main.js.coffee b/app/assets/javascripts/main.js.coffee index a614cf5b..84129069 100644 --- a/app/assets/javascripts/main.js.coffee +++ b/app/assets/javascripts/main.js.coffee @@ -12,26 +12,27 @@ window.disableButtonIfEmptyField = (field_selector, button_selector) -> field = $(field_selector) closest_submit = field.closest("form").find(button_selector) - closest_submit.attr("disabled", "disabled").addClass("disabled") if field.val() is "" + closest_submit.disable() if field.val() is "" field.on "keyup", -> if $(this).val() is "" - closest_submit.attr("disabled", "disabled").addClass "disabled" + closest_submit.disable() else - closest_submit.removeAttr("disabled").removeClass "disabled" + closest_submit.enable() $ -> $(".one_click_select").live 'click', -> $(this).select() + # Disable form buttons while a form is submitting $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> buttons = $('[type="submit"]', this) switch e.type when 'ajax:beforeSend', 'submit' - buttons.attr('disabled', 'disabled') + buttons.disable() else - buttons.removeAttr('disabled') + buttons.enable() # Show/Hide the profile menu when hovering the account box $('.account-box').hover -> $(this).toggleClass('hover') @@ -81,4 +82,12 @@ $ -> $.extend default_options, options _chosen.apply this, [default_options] + # Disable an element and add the 'disabled' Bootstrap class + $.fn.extend disable: -> + $(this).attr('disabled', 'disabled').addClass('disabled') + + # Enable an element and remove the 'disabled' Bootstrap class + $.fn.extend enable: -> + $(this).removeAttr('disabled').removeClass('disabled') + )(jQuery) diff --git a/app/assets/javascripts/note.js b/app/assets/javascripts/note.js index 160f75c9..79ab086b 100644 --- a/app/assets/javascripts/note.js +++ b/app/assets/javascripts/note.js @@ -25,11 +25,11 @@ var NoteList = { $(this).closest('li').fadeOut(); }); $(".note-form-holder").live("ajax:before", function(){ - $(".submit_note").attr("disabled", "disabled"); + $(".submit_note").disable() }) $(".note-form-holder").live("ajax:complete", function(){ - $(".submit_note").removeAttr("disabled"); + $(".submit_note").enable() }) disableButtonIfEmptyField(".note-text", ".submit_note"); From 3551df8eb1c1bfe3a4cef532ddab1cbdcdd96a11 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 9 Sep 2012 07:17:01 -0400 Subject: [PATCH 055/357] Minor main.js refactor and docs --- app/assets/javascripts/main.js.coffee | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/main.js.coffee b/app/assets/javascripts/main.js.coffee index 84129069..6002f85d 100644 --- a/app/assets/javascripts/main.js.coffee +++ b/app/assets/javascripts/main.js.coffee @@ -21,8 +21,8 @@ window.disableButtonIfEmptyField = (field_selector, button_selector) -> closest_submit.enable() $ -> - $(".one_click_select").live 'click', -> - $(this).select() + # Click a .one_click_select field, select the contents + $(".one_click_select").live 'click', -> $(this).select() # Disable form buttons while a form is submitting $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> @@ -66,10 +66,12 @@ $ -> $(this).text(previewLinkText) note = $('#note_note').val() - note = 'Nothing to preview' if note.trim().length is 0 - $.post($(this).attr('href'), {note: note}, (data) -> - $('#preview-note').html(data) - ) + + if note.trim().length == 0 + $('#preview-note').text("Nothing to preview.") + else + $.post $(this).attr('href'), {note: note}, (data) -> + $('#preview-note').html(data) $('#preview-note, #note_note').toggle() e.preventDefault() From 5dcca7e4806730d4d77eff711a9b91b5a3ca8314 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 9 Sep 2012 07:17:43 -0400 Subject: [PATCH 056/357] Remove some JS that is no longer used --- app/assets/javascripts/main.js.coffee | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/assets/javascripts/main.js.coffee b/app/assets/javascripts/main.js.coffee index 6002f85d..a01b3932 100644 --- a/app/assets/javascripts/main.js.coffee +++ b/app/assets/javascripts/main.js.coffee @@ -37,12 +37,6 @@ $ -> # Show/Hide the profile menu when hovering the account box $('.account-box').hover -> $(this).toggleClass('hover') - $("#projects-list .project").live 'click', (e) -> - if e.target.nodeName isnt "A" and e.target.nodeName isnt "INPUT" - location.href = $(this).attr("url") - e.stopPropagation() - false - # Focus search field by pressing 's' key $(document).keypress (e) -> # Don't do anything if typing in an input From ad3a88cfd34aeed5ed69b4056e393580a686fb09 Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 02:03:04 +0300 Subject: [PATCH 057/357] Prepared for gitolite v3 --- app/models/merge_request.rb | 2 +- app/roles/push_event.rb | 2 ++ config/gitlab.yml.example | 4 ++-- doc/installation.md | 15 +++++++++------ lib/gitlab/merge.rb | 3 +-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 542817b0..2e457f72 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -162,7 +162,7 @@ class MergeRequest < ActiveRecord::Base end def automerge!(current_user) - if Gitlab::Merge.new(self, current_user).merge + if Gitlab::Merge.new(self, current_user).merge && self.unmerged_commits.empty? self.merge!(current_user.id) true end diff --git a/app/roles/push_event.rb b/app/roles/push_event.rb index ff8e28a2..a607f212 100644 --- a/app/roles/push_event.rb +++ b/app/roles/push_event.rb @@ -90,6 +90,8 @@ module PushEvent def push_with_commits? md_ref? && commits.any? && parent_commit && last_commit + rescue Grit::NoSuchPathError + false end def last_push_to_non_root? diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index d05cc1be..77b818ba 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -33,11 +33,11 @@ app: git_host: admin_uri: git@localhost:gitolite-admin base_path: /home/git/repositories/ - # hooks_path: /var/lib/gitolite/.gitolite/hooks/ # only needed when gitolite is not installed according the manual - # host: localhost + hooks_path: /home/git/.gitolite/hooks/ git_user: git upload_pack: true receive_pack: true + # host: localhost # port: 22 # Git settings diff --git a/doc/installation.md b/doc/installation.md index e14ec711..af169d81 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -113,17 +113,20 @@ Generate key: Clone GitLab's fork of the Gitolite source code: cd /home/git - sudo -H -u git git clone https://github.com/gitlabhq/gitolite.git /home/git/gitolite + sudo -H -u git git clone -b gl-v304 https://github.com/gitlabhq/gitolite.git /home/git/gitolite Setup: + cd /home/git + sudo -u git -H mkdir bin sudo -u git sh -c 'echo -e "PATH=\$PATH:/home/git/bin\nexport PATH" >> /home/git/.profile' - sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; /home/git/gitolite/src/gl-system-install" + sudo -u git sh -c 'gitolite/install -ln /home/git/bin' + sudo cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub sudo chmod 0444 /home/git/gitlab.pub - sudo -u git -H sed -i 's/0077/0007/g' /home/git/share/gitolite/conf/example.gitolite.rc - sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gl-setup -q /home/git/gitlab.pub" + sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gitolite setup -pk /home/git/gitlab.pub" + sudo -u git -H sed -i 's/0077/0007/g' /home/git/.gitolite.rc Permissions: @@ -189,8 +192,8 @@ and ensure you have followed all of the above steps carefully. #### Setup GitLab hooks - sudo cp ./lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive - sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive + sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive + sudo chown git:git /home/git/.gitolite/hooks/common/post-receive #### Check application status diff --git a/lib/gitlab/merge.rb b/lib/gitlab/merge.rb index 134695ce..18013574 100644 --- a/lib/gitlab/merge.rb +++ b/lib/gitlab/merge.rb @@ -21,8 +21,7 @@ module Gitlab if output =~ /CONFLICT/ false else - repo.git.push({}, "origin", merge_request.target_branch) - true + !!repo.git.push({}, "origin", merge_request.target_branch) end end end From a56cec113204130385e0fbc3f2223d81101357ef Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 02:08:39 +0300 Subject: [PATCH 058/357] specify gitolite-admin owner in config --- config/gitlab.yml.example | 1 + config/initializers/1_settings.rb | 4 ++++ lib/gitlab/backend/gitolite_config.rb | 13 +------------ 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 77b818ba..08e3427f 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -34,6 +34,7 @@ git_host: admin_uri: git@localhost:gitolite-admin base_path: /home/git/repositories/ hooks_path: /home/git/.gitolite/hooks/ + gitolite_admin_key: gitlab git_user: git upload_pack: true receive_pack: true diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 27c5bc22..df9ccf32 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -102,6 +102,10 @@ class Settings < Settingslogic git_host['admin_uri'] || 'git@localhost:gitolite-admin' end + def gitolite_admin_key + git_host['gitolite_admin_key'] || 'gitlab' + end + def default_projects_limit app['default_projects_limit'] || 10 end diff --git a/lib/gitlab/backend/gitolite_config.rb b/lib/gitlab/backend/gitolite_config.rb index 61ec8c11..60eef8e8 100644 --- a/lib/gitlab/backend/gitolite_config.rb +++ b/lib/gitlab/backend/gitolite_config.rb @@ -148,18 +148,7 @@ module Gitlab # Enable access to all repos for gitolite admin. # We use it for accept merge request feature def admin_all_repo - owner_name = "" - - # Read gitolite-admin user - # - begin - repo = conf.get_repo("gitolite-admin") - owner_name = repo.permissions[0]["RW+"][""][0] - raise StandardError if owner_name.blank? - rescue => ex - puts "Can't determine gitolite-admin owner".red - raise StandardError - end + owner_name = Gitlab.settings.gitolite_admin_key # @ALL repos premission for gitolite owner repo_name = "@all" From a04b919a4c5ef570e46ae94d6d11b09eb893b7cd Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 01:28:09 -0400 Subject: [PATCH 059/357] Add factory_girl_rails gem --- Gemfile | 1 + Gemfile.lock | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Gemfile b/Gemfile index 045baa36..4905169f 100644 --- a/Gemfile +++ b/Gemfile @@ -107,6 +107,7 @@ group :development, :test do gem "awesome_print" gem "database_cleaner" gem "launchy" + gem 'factory_girl_rails' end group :test do diff --git a/Gemfile.lock b/Gemfile.lock index 656bede4..b8e97aa0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -166,6 +166,11 @@ GEM eventmachine (0.12.10) execjs (1.4.0) multi_json (~> 1.0) + factory_girl (4.0.0) + activesupport (>= 3.0.0) + factory_girl_rails (4.0.0) + factory_girl (~> 4.0.0) + railties (>= 3.0.0) ffaker (1.14.0) ffi (1.0.11) foreman (0.47.0) @@ -388,6 +393,7 @@ DEPENDENCIES devise (~> 2.1.0) draper email_spec + factory_girl_rails ffaker foreman git From 4805c64f2a96e8a9ea5a0e94a820d840fa1675e0 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 01:28:47 -0400 Subject: [PATCH 060/357] Remove spec/factory and spec/factories --- features/support/env.rb | 1 - spec/factories.rb | 97 ----------------------------------------- spec/factory.rb | 29 ------------ spec/spec_helper.rb | 1 - 4 files changed, 128 deletions(-) delete mode 100644 spec/factories.rb delete mode 100644 spec/factory.rb diff --git a/features/support/env.rb b/features/support/env.rb index 0d9a9ed4..da6c1b70 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -8,7 +8,6 @@ require 'webmock/cucumber' WebMock.allow_net_connect! -require Rails.root.join 'spec/factories' require Rails.root.join 'spec/support/monkeypatch' require Rails.root.join 'spec/support/gitolite_stub' require Rails.root.join 'spec/support/login_helpers' diff --git a/spec/factories.rb b/spec/factories.rb deleted file mode 100644 index 26868462..00000000 --- a/spec/factories.rb +++ /dev/null @@ -1,97 +0,0 @@ -require File.join(Rails.root, 'spec', 'factory') - -Factory.add(:project, Project) do |obj| - obj.name = Faker::Internet.user_name - obj.path = 'gitlabhq' - obj.owner = Factory(:user) - obj.code = 'LGT' -end - -Factory.add(:project_without_owner, Project) do |obj| - obj.name = Faker::Internet.user_name - obj.path = 'gitlabhq' - obj.code = 'LGT' -end - -Factory.add(:public_project, Project) do |obj| - obj.name = Faker::Internet.user_name - obj.path = 'gitlabhq' - obj.private_flag = false - obj.owner = Factory(:user) - obj.code = 'LGT' -end - -Factory.add(:user, User) do |obj| - obj.email = Faker::Internet.email - obj.password = "123456" - obj.name = Faker::Name.name - obj.password_confirmation = "123456" -end - -Factory.add(:admin, User) do |obj| - obj.email = Faker::Internet.email - obj.password = "123456" - obj.name = Faker::Name.name - obj.password_confirmation = "123456" - obj.admin = true -end - -Factory.add(:issue, Issue) do |obj| - obj.title = Faker::Lorem.sentence - obj.author = Factory :user - obj.assignee = Factory :user -end - -Factory.add(:merge_request, MergeRequest) do |obj| - obj.title = Faker::Lorem.sentence - obj.author = Factory :user - obj.assignee = Factory :user - obj.source_branch = "master" - obj.target_branch = "stable" - obj.closed = false -end - -Factory.add(:snippet, Snippet) do |obj| - obj.title = Faker::Lorem.sentence - obj.file_name = Faker::Lorem.sentence - obj.content = Faker::Lorem.sentences -end - -Factory.add(:note, Note) do |obj| - obj.note = Faker::Lorem.sentence -end - -Factory.add(:key, Key) do |obj| - obj.title = "Example key" - obj.key = File.read(File.join(Rails.root, "db", "pkey.example")) -end - -Factory.add(:project_hook, ProjectHook) do |obj| - obj.url = Faker::Internet.uri("http") -end - -Factory.add(:system_hook, SystemHook) do |obj| - obj.url = Faker::Internet.uri("http") -end - -Factory.add(:wiki, Wiki) do |obj| - obj.title = Faker::Lorem.sentence - obj.content = Faker::Lorem.sentence - obj.user = Factory(:user) - obj.project = Factory(:project) -end - -Factory.add(:event, Event) do |obj| - obj.title = Faker::Lorem.sentence - obj.project = Factory(:project) -end - -Factory.add(:milestone, Milestone) do |obj| - obj.title = Faker::Lorem.sentence - obj.due_date = Date.today + 1.month -end - -Factory.add(:users_project, UsersProject) do |obj| - obj.user = Factory :user - obj.project = Factory :project -end diff --git a/spec/factory.rb b/spec/factory.rb deleted file mode 100644 index 1758b4d6..00000000 --- a/spec/factory.rb +++ /dev/null @@ -1,29 +0,0 @@ -class Factory - @factories = {} - - class << self - def add(name, klass, &block) - @factories[name] = [klass, block] - end - - def create(name, opts = {}) - new(name, opts).tap(&:save!) - end - - def new(name, opts = {}) - factory= @factories[name] - factory[0].new.tap do |obj| - factory[1].call(obj) - end.tap do |obj| - opts.each do |k, opt| - obj.send("#{k}=", opt) - end - end - end - end -end - -def Factory(name, opts={}) - Factory.create name, opts -end - diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 06909f39..fc5ba146 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -10,7 +10,6 @@ require 'rspec/rails' require 'capybara/rails' require 'capybara/rspec' require 'webmock/rspec' -require 'factories' require 'email_spec' require 'headless' From c9c1f76e002d899dd6765c4c1630697cc5068f27 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 01:42:28 -0400 Subject: [PATCH 061/357] All specs and features currently passing with FactoryGirl --- features/support/env.rb | 6 +- spec/factories.rb | 107 ++++++++++++++++++ spec/factories_spec.rb | 83 ++++++++++++++ spec/helpers/gitlab_flavored_markdown_spec.rb | 4 +- spec/models/system_hook_spec.rb | 11 +- spec/spec_helper.rb | 1 + spec/support/monkeypatch.rb | 21 ---- spec/support/stubbed_repository.rb | 60 ++++++++++ 8 files changed, 262 insertions(+), 31 deletions(-) create mode 100644 spec/factories.rb create mode 100644 spec/factories_spec.rb delete mode 100644 spec/support/monkeypatch.rb create mode 100644 spec/support/stubbed_repository.rb diff --git a/features/support/env.rb b/features/support/env.rb index da6c1b70..53578152 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -8,8 +8,8 @@ require 'webmock/cucumber' WebMock.allow_net_connect! -require Rails.root.join 'spec/support/monkeypatch' require Rails.root.join 'spec/support/gitolite_stub' +require Rails.root.join 'spec/support/stubbed_repository' require Rails.root.join 'spec/support/login_helpers' require Rails.root.join 'spec/support/valid_commit' @@ -52,6 +52,8 @@ require 'cucumber/rspec/doubles' include GitoliteStub -Before do +Before do stub_gitolite! end + +World(FactoryGirl::Syntax::Methods) diff --git a/spec/factories.rb b/spec/factories.rb new file mode 100644 index 00000000..eb3882a6 --- /dev/null +++ b/spec/factories.rb @@ -0,0 +1,107 @@ +# Backwards compatibility with the old method +def Factory(type, *args) + FactoryGirl.create(type, *args) +end + +module Factory + def self.create(type, *args) + FactoryGirl.create(type, *args) + end + + def self.new(type, *args) + FactoryGirl.build(type, *args) + end +end + +FactoryGirl.define do + sequence :sentence, aliases: [:title, :content] do + Faker::Lorem.sentence + end + + sequence(:url) { Faker::Internet.uri('http') } + + factory :user, aliases: [:author, :assignee, :owner] do + email { Faker::Internet.email } + name { Faker::Name.name } + password "123456" + password_confirmation "123456" + + trait :admin do + admin true + end + + factory :admin, traits: [:admin] + end + + factory :project do + sequence(:name) { |n| "project#{n}" } + path { name } + code { name } + owner + end + + factory :users_project do + user + project + end + + factory :issue do + title + author + project + + trait :closed do + closed true + end + + factory :closed_issue, traits: [:closed] + end + + factory :merge_request do + title + author + project + source_branch "master" + target_branch "stable" + end + + factory :note do + project + note "Note" + end + + factory :event do + end + + factory :key do + title + key { File.read(File.join(Rails.root, "db", "pkey.example")) } + end + + factory :milestone do + title + project + end + + factory :system_hook do + url + end + + factory :project_hook do + url + end + + factory :wiki do + title + content + user + end + + factory :snippet do + project + author + title + content + file_name { Faker::Lorem.sentence } + end +end diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb new file mode 100644 index 00000000..126a5b23 --- /dev/null +++ b/spec/factories_spec.rb @@ -0,0 +1,83 @@ +require 'spec_helper' + +describe "Factories" do + describe 'User' do + it "builds a valid instance" do + build(:user).should be_valid + end + + it "builds a valid admin instance" do + build(:admin).should be_valid + end + end + + describe 'Project' do + it "builds a valid instance" do + build(:project).should be_valid + end + end + + describe 'Issue' do + it "builds a valid instance" do + build(:issue).should be_valid + end + + it "builds a valid closed instance" do + build(:closed_issue).should be_valid + end + end + + describe 'MergeRequest' do + it "builds a valid instance" do + build(:merge_request).should be_valid + end + end + + describe 'Note' do + it "builds a valid instance" do + build(:note).should be_valid + end + end + + describe 'Event' do + it "builds a valid instance" do + build(:event).should be_valid + end + end + + describe 'Key' do + it "builds a valid instance" do + build(:key).should be_valid + end + end + + describe 'Milestone' do + it "builds a valid instance" do + build(:milestone).should be_valid + end + end + + describe 'SystemHook' do + it "builds a valid instance" do + build(:system_hook).should be_valid + end + end + + describe 'ProjectHook' do + it "builds a valid instance" do + build(:project_hook).should be_valid + end + end + + describe 'Wiki' do + it "builds a valid instance" do + build(:wiki).should be_valid + end + end + + describe 'Snippet' do + it "builds a valid instance" do + build(:snippet).should be_valid + end + end +end diff --git a/spec/helpers/gitlab_flavored_markdown_spec.rb b/spec/helpers/gitlab_flavored_markdown_spec.rb index e147cb39..28bd46ec 100644 --- a/spec/helpers/gitlab_flavored_markdown_spec.rb +++ b/spec/helpers/gitlab_flavored_markdown_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" describe GitlabMarkdownHelper do before do - @project = Project.find_by_path("gitlabhq") || Factory(:project) + @project = Factory(:project) @commit = @project.repo.commits.first.parents.first @commit = CommitDecorator.decorate(Commit.new(@commit)) @other_project = Factory :project, path: "OtherPath", code: "OtherCode" @@ -157,7 +157,7 @@ describe GitlabMarkdownHelper do gfm("Let @#{user.name} fix the *mess* in #{@commit.id}").should == "Let #{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} fix the *mess* in #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "}" end - it "should not trip over other stuff", focus: true do + it "should not trip over other stuff" do gfm("_Please_ *stop* 'helping' and all the other b*$#%' you do.").should == "_Please_ *stop* 'helping' and all the other b*$#%' you do." end diff --git a/spec/models/system_hook_spec.rb b/spec/models/system_hook_spec.rb index 56d76ed0..fe2a5836 100644 --- a/spec/models/system_hook_spec.rb +++ b/spec/models/system_hook_spec.rb @@ -10,13 +10,12 @@ describe SystemHook do end it "project_create hook" do - user = Factory :user with_resque do - project = Factory :project_without_owner, owner: user + project = Factory :project end WebMock.should have_requested(:post, @system_hook.url).with(body: /project_create/).once end - + it "project_destroy hook" do project = Factory :project with_resque do @@ -31,7 +30,7 @@ describe SystemHook do end WebMock.should have_requested(:post, @system_hook.url).with(body: /user_create/).once end - + it "user_destroy hook" do user = Factory :user with_resque do @@ -39,7 +38,7 @@ describe SystemHook do end WebMock.should have_requested(:post, @system_hook.url).with(body: /user_destroy/).once end - + it "project_create hook" do user = Factory :user project = Factory :project @@ -48,7 +47,7 @@ describe SystemHook do end WebMock.should have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once end - + it "project_destroy hook" do user = Factory :user project = Factory :project diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index fc5ba146..d381b3f1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -27,6 +27,7 @@ RSpec.configure do |config| config.include LoginHelpers, type: :request config.include GitoliteStub + config.include FactoryGirl::Syntax::Methods # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false diff --git a/spec/support/monkeypatch.rb b/spec/support/monkeypatch.rb deleted file mode 100644 index 04bbb6fb..00000000 --- a/spec/support/monkeypatch.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Stubbing Project <-> git host path -# create project using Factory only -class Project - def path_to_repo - File.join(Rails.root, "tmp", "tests", path) - end - - def satellite - @satellite ||= FakeSatellite.new - end -end - -class FakeSatellite - def exists? - true - end - - def create - true - end -end diff --git a/spec/support/stubbed_repository.rb b/spec/support/stubbed_repository.rb new file mode 100644 index 00000000..fa6c4c9a --- /dev/null +++ b/spec/support/stubbed_repository.rb @@ -0,0 +1,60 @@ +# Stubs out all Git repository access done by models so that specs can run +# against fake repositories without Grit complaining that they don't exist. +module StubbedRepository + extend ActiveSupport::Concern + + included do + # If a class defines the method we want to stub directly, rather than + # inheriting it from a module (as is the case in UsersProject), that method + # will overwrite our stub, so use alias_method to ensure it's our stub + # getting called. + + alias_method :update_repository, :fake_update_repository + alias_method :destroy_repository, :fake_destroy_repository + alias_method :repository_delete_key, :fake_repository_delete_key + alias_method :path_to_repo, :fake_path_to_repo + alias_method :satellite, :fake_satellite + end + + def fake_update_repository + true + end + + def fake_destroy_repository + true + end + + def fake_repository_delete_key + true + end + + def fake_path_to_repo + if new_record? + # There are a couple Project specs that expect the Project's path to be + # in the returned path, so let's patronize them. + File.join(Rails.root, 'tmp', 'tests', path) + else + # For everything else, just give it the path to one of our real seeded + # repos. + File.join(Rails.root, 'tmp', 'tests', 'gitlabhq_1') + end + end + + def fake_satellite + FakeSatellite.new + end + + class FakeSatellite + def exists? + true + end + + def create + true + end + end +end + +[Project, Key, ProtectedBranch, UsersProject].each do |c| + c.send(:include, StubbedRepository) +end From 0bc909405852135d7f98440193830eba664ea122 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 06:57:00 -0400 Subject: [PATCH 062/357] Add deploy_key and personal_key factories --- spec/factories.rb | 8 ++++++++ spec/factories_spec.rb | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/spec/factories.rb b/spec/factories.rb index eb3882a6..82fd0db2 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -76,6 +76,14 @@ FactoryGirl.define do factory :key do title key { File.read(File.join(Rails.root, "db", "pkey.example")) } + + factory :deploy_key do + project + end + + factory :personal_key do + user + end end factory :milestone do diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb index 126a5b23..5760aad4 100644 --- a/spec/factories_spec.rb +++ b/spec/factories_spec.rb @@ -49,6 +49,14 @@ describe "Factories" do it "builds a valid instance" do build(:key).should be_valid end + + it "builds a valid deploy key instance" do + build(:deploy_key).should be_valid + end + + it "builds a valid personal key instance" do + build(:personal_key).should be_valid + end end describe 'Milestone' do From 77d06454ededc3beef09db709829ccb687ccc045 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 07:01:27 -0400 Subject: [PATCH 063/357] Simple model spec changes made possible by new factories --- spec/models/issue_spec.rb | 37 ++++++++----------------------- spec/models/key_spec.rb | 17 +++++--------- spec/models/merge_request_spec.rb | 24 +++++--------------- spec/models/milestone_spec.rb | 7 ++---- spec/models/note_spec.rb | 21 +++++++----------- spec/models/user_spec.rb | 26 +++++----------------- 6 files changed, 37 insertions(+), 95 deletions(-) diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index e9cbd725..133f0734 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -19,11 +19,7 @@ describe Issue do it { Issue.should respond_to :opened } end - subject { Factory.create(:issue, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)) } - it { should be_valid } + subject { Factory.create(:issue) } describe '#is_being_reassigned?' do it 'returns true if the issue assignee has changed' do @@ -41,11 +37,7 @@ describe Issue do subject.is_being_closed?.should be_true end it 'returns false if the closed attribute has changed and is now false' do - issue = Factory.create(:issue, - closed: true, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)) + issue = Factory.create(:closed_issue) issue.closed = false issue.is_being_closed?.should be_false end @@ -57,11 +49,7 @@ describe Issue do describe '#is_being_reopened?' do it 'returns true if the closed attribute has changed and is now false' do - issue = Factory.create(:issue, - closed: true, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)) + issue = Factory.create(:closed_issue) issue.closed = false issue.is_being_reopened?.should be_true end @@ -75,40 +63,33 @@ describe Issue do end describe "plus 1" do - let(:project) { Factory(:project) } - subject { - Factory.create(:issue, - author: Factory(:user), - assignee: Factory(:user), - project: project) - } + subject { Factory.create(:issue) } it "with no notes has a 0/0 score" do subject.upvotes.should == 0 end it "should recognize non-+1 notes" do - subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone')) + subject.notes << Factory(:note, note: "No +1 here") subject.should have(1).note subject.notes.first.upvote?.should be_false subject.upvotes.should == 0 end it "should recognize a single +1 note" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) + subject.notes << Factory(:note, note: "+1 This is awesome") subject.upvotes.should == 1 end it "should recognize a multiple +1 notes" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo')) + subject.notes << Factory(:note, note: "+1 This is awesome") + subject.notes << Factory(:note, note: "+1 I want this") subject.upvotes.should == 2 end end describe ".search" do - let!(:issue) { Factory.create(:issue, title: "Searchable issue", - project: Factory.create(:project)) } + let!(:issue) { Factory.create(:issue, title: "Searchable issue") } it "matches by title" do Issue.search('able').all.should == [issue] diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb index 0f9b3177..ea58fbd2 100644 --- a/spec/models/key_spec.rb +++ b/spec/models/key_spec.rb @@ -17,20 +17,15 @@ describe Key do context "validation of uniqueness" do context "as a deploy key" do - let(:project) { Factory.create(:project, path: 'alpha', code: 'alpha') } - let(:another_project) { Factory.create(:project, path: 'beta', code: 'beta') } - - before do - deploy_key = Factory.create(:key, project: project) - end + let!(:deploy_key) { create(:deploy_key) } it "does not accept the same key twice for a project" do - key = Factory.new(:key, project: project) + key = build(:key, project: deploy_key.project) key.should_not be_valid end it "does accept the same key for another project" do - key = Factory.new(:key, project: another_project) + key = build(:key, project_id: 0) key.should be_valid end end @@ -39,12 +34,12 @@ describe Key do let(:user) { Factory.create(:user) } it "accepts the key once" do - Factory.new(:key, user: user).should be_valid + build(:key, user: user).should be_valid end it "does not accepts the key twice" do - Factory.create(:key, user: user) - Factory.new(:key, user: user).should_not be_valid + create(:key, user: user) + build(:key, user: user).should_not be_valid end end end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index c7ad08a1..f4b93eea 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -20,46 +20,34 @@ describe MergeRequest do it { MergeRequest.should respond_to :opened } end - it { Factory.create(:merge_request, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)).should be_valid } - describe "plus 1" do - let(:project) { Factory(:project) } - subject { - Factory.create(:merge_request, - author: Factory(:user), - assignee: Factory(:user), - project: project) - } + subject { Factory.create(:merge_request) } it "with no notes has a 0/0 score" do subject.upvotes.should == 0 end it "should recognize non-+1 notes" do - subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone')) + subject.notes << Factory(:note, note: "No +1 here") subject.should have(1).note subject.notes.first.upvote?.should be_false subject.upvotes.should == 0 end it "should recognize a single +1 note" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) + subject.notes << Factory(:note, note: "+1 This is awesome") subject.upvotes.should == 1 end it "should recognize a multiple +1 notes" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo')) + subject.notes << Factory(:note, note: "+1 This is awesome") + subject.notes << Factory(:note, note: "+1 I want this") subject.upvotes.should == 2 end end describe ".search" do - let!(:issue) { Factory.create(:issue, title: "Searchable issue", - project: Factory.create(:project)) } + let!(:issue) { Factory.create(:issue, title: "Searchable issue") } it "matches by title" do Issue.search('able').all.should == [issue] diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index e9acc4e2..ed805a24 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -25,11 +25,8 @@ describe Milestone do it { should validate_presence_of(:project_id) } end - let(:project) { Factory :project } - let(:milestone) { Factory :milestone, project: project } - let(:issue) { Factory :issue, project: project } - - it { milestone.should be_valid } + let(:milestone) { Factory :milestone } + let(:issue) { Factory :issue } describe "#percent_complete" do it "should not count open issues" do diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index c97b23cb..89e50479 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -1,9 +1,6 @@ require 'spec_helper' describe Note do - let(:project) { Factory :project } - let!(:commit) { project.commit } - describe "Associations" do it { should belong_to(:project) } end @@ -13,8 +10,6 @@ describe Note do it { should validate_presence_of(:project) } end - it { Factory.create(:note, - project: project).should be_valid } describe "Scopes" do it "should have a today named scope that returns ..." do Note.today.where_values.should == ["created_at >= '#{Date.today}'"] @@ -25,26 +20,27 @@ describe Note do let(:project) { Factory(:project) } it "recognizes a neutral note" do - note = Factory(:note, project: project, note: "This is not a +1 note") + note = Factory(:note, note: "This is not a +1 note") note.should_not be_upvote end it "recognizes a +1 note" do - note = Factory(:note, project: project, note: "+1 for this") + note = Factory(:note, note: "+1 for this") note.should be_upvote end it "recognizes a -1 note as no vote" do - note = Factory(:note, project: project, note: "-1 for this") + note = Factory(:note, note: "-1 for this") note.should_not be_upvote end end - describe "Commit notes" do + let(:project) { create(:project) } + let(:commit) { project.commit } + describe "Commit notes" do before do @note = Factory :note, - project: project, noteable_id: commit.id, noteable_type: "Commit" end @@ -58,7 +54,6 @@ describe Note do describe "Pre-line commit notes" do before do @note = Factory :note, - project: project, noteable_id: commit.id, noteable_type: "Commit", line_code: "0_16_1" @@ -91,8 +86,8 @@ describe Note do describe :authorization do before do - @p1 = project - @p2 = Factory :project, code: "alien", path: "gitlabhq_1" + @p1 = create(:project) + @p2 = Factory :project @u1 = Factory :user @u2 = Factory :user @u3 = Factory :user diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 265dcef1..ebc45fa4 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -3,11 +3,12 @@ require 'spec_helper' describe User do describe "Associations" do it { should have_many(:projects) } - it { should have_many(:users_projects) } - it { should have_many(:issues) } - it { should have_many(:assigned_issues) } - it { should have_many(:merge_requests) } - it { should have_many(:assigned_merge_requests) } + it { should have_many(:users_projects).dependent(:destroy) } + it { should have_many(:issues).dependent(:destroy) } + it { should have_many(:assigned_issues).dependent(:destroy) } + it { should have_many(:merge_requests).dependent(:destroy) } + it { should have_many(:assigned_merge_requests).dependent(:destroy) } + it { should have_many(:notes).dependent(:destroy) } end describe "Respond to" do @@ -49,21 +50,6 @@ describe User do user = Factory(:user) user.authentication_token.should_not == "" end - - describe "dependent" do - before do - @user = Factory :user - @note = Factory :note, - author: @user, - project: Factory(:project) - end - - it "should destroy all notes with user" do - Note.find_by_id(@note.id).should_not be_nil - @user.destroy - Note.find_by_id(@note.id).should be_nil - end - end end # == Schema Information # From a39cfb54616fe156ba43ac3df2b771c3a11d2879 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 20:57:54 -0400 Subject: [PATCH 064/357] Simplify StubbedRepository after GitHost changes from master --- spec/support/stubbed_repository.rb | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/spec/support/stubbed_repository.rb b/spec/support/stubbed_repository.rb index fa6c4c9a..637754ba 100644 --- a/spec/support/stubbed_repository.rb +++ b/spec/support/stubbed_repository.rb @@ -9,34 +9,19 @@ module StubbedRepository # will overwrite our stub, so use alias_method to ensure it's our stub # getting called. - alias_method :update_repository, :fake_update_repository - alias_method :destroy_repository, :fake_destroy_repository - alias_method :repository_delete_key, :fake_repository_delete_key - alias_method :path_to_repo, :fake_path_to_repo - alias_method :satellite, :fake_satellite - end - - def fake_update_repository - true - end - - def fake_destroy_repository - true - end - - def fake_repository_delete_key - true + alias_method :path_to_repo, :fake_path_to_repo + alias_method :satellite, :fake_satellite end def fake_path_to_repo - if new_record? - # There are a couple Project specs that expect the Project's path to be - # in the returned path, so let's patronize them. + if new_record? || path == 'newproject' + # There are a couple Project specs and features that expect the Project's + # path to be in the returned path, so let's patronize them. File.join(Rails.root, 'tmp', 'tests', path) else # For everything else, just give it the path to one of our real seeded # repos. - File.join(Rails.root, 'tmp', 'tests', 'gitlabhq_1') + File.join(Rails.root, 'tmp', 'tests', 'gitlabhq_0') end end @@ -55,6 +40,6 @@ module StubbedRepository end end -[Project, Key, ProtectedBranch, UsersProject].each do |c| +[Project, ProtectedBranch, UsersProject].each do |c| c.send(:include, StubbedRepository) end From a3a63eeb92f5cc660dc3f03e2d7249e4b5f04acf Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 21:13:22 -0400 Subject: [PATCH 065/357] Remove all instances to 'gitlabhq_x' seed repositories from specs and features We now need only one seed repo! Also cleans up the seeding script. --- db/fixtures/test/001_repo.rb | 32 ++++++++++++-------- features/step_definitions/dashboard_steps.rb | 8 ++--- spec/models/project_spec.rb | 2 +- spec/requests/admin/admin_projects_spec.rb | 2 +- spec/requests/atom/dashboard_issues_spec.rb | 8 ++--- spec/support/stubbed_repository.rb | 4 +-- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/db/fixtures/test/001_repo.rb b/db/fixtures/test/001_repo.rb index ebf005a1..67d4e7bf 100644 --- a/db/fixtures/test/001_repo.rb +++ b/db/fixtures/test/001_repo.rb @@ -1,15 +1,23 @@ -# create tmp dir if not exist -tmp_dir = File.join(Rails.root, "tmp") -Dir.mkdir(tmp_dir) unless File.exists?(tmp_dir) +require 'fileutils' -# Create dir for test repo -repo_dir = File.join(Rails.root, "tmp", "tests") -Dir.mkdir(repo_dir) unless File.exists?(repo_dir) +print "Unpacking seed repository..." -`cp spec/seed_project.tar.gz tmp/tests/` -Dir.chdir(repo_dir) -`tar -xf seed_project.tar.gz` -3.times do |i| -`cp -r gitlabhq/ gitlabhq_#{i}/` -puts "Unpacked seed repo - tmp/tests/gitlabhq_#{i}" +SEED_REPO = 'seed_project.tar.gz' +REPO_PATH = File.join(Rails.root, 'tmp', 'repositories') + +# Make whatever directories we need to make +FileUtils.mkdir_p(REPO_PATH) + +# Copy the archive to the repo path +FileUtils.cp(File.join(Rails.root, 'spec', SEED_REPO), REPO_PATH) + +# chdir to the repo path +FileUtils.cd(REPO_PATH) do + # Extract the archive + `tar -xf #{SEED_REPO}` + + # Remove the copy + FileUtils.rm(SEED_REPO) end + +puts ' done.' diff --git a/features/step_definitions/dashboard_steps.rb b/features/step_definitions/dashboard_steps.rb index d910ec90..a4edd224 100644 --- a/features/step_definitions/dashboard_steps.rb +++ b/features/step_definitions/dashboard_steps.rb @@ -106,13 +106,9 @@ Given /^I have assigned issues$/ do end Given /^I have authored merge requests$/ do - project1 = Factory :project, - :path => "gitlabhq_1", - :code => "gitlabhq_1" + project1 = Factory :project - project2 = Factory :project, - :path => "gitlabhq_2", - :code => "gitlabhq_2" + project2 = Factory :project project1.add_access(@user, :read, :write) project2.add_access(@user, :read, :write) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index af193295..faaa9a91 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -85,7 +85,7 @@ describe Project do it "should return path to repo" do project = Project.new(path: "somewhere") - project.path_to_repo.should == File.join(Rails.root, "tmp", "tests", "somewhere") + project.path_to_repo.should == File.join(Rails.root, "tmp", "repositories", "somewhere") end it "returns the full web URL for this repo" do diff --git a/spec/requests/admin/admin_projects_spec.rb b/spec/requests/admin/admin_projects_spec.rb index 0ce66f5f..2edfb592 100644 --- a/spec/requests/admin/admin_projects_spec.rb +++ b/spec/requests/admin/admin_projects_spec.rb @@ -87,7 +87,7 @@ describe "Admin::Projects" do visit new_admin_project_path fill_in 'project_name', with: 'NewProject' fill_in 'project_code', with: 'NPR' - fill_in 'project_path', with: 'gitlabhq_1' + fill_in 'project_path', with: 'newproject' expect { click_button "Create project" }.to change { Project.count }.by(1) @project = Project.last end diff --git a/spec/requests/atom/dashboard_issues_spec.rb b/spec/requests/atom/dashboard_issues_spec.rb index 1d208c70..79a9b8ef 100644 --- a/spec/requests/atom/dashboard_issues_spec.rb +++ b/spec/requests/atom/dashboard_issues_spec.rb @@ -6,13 +6,9 @@ describe "User Issues Dashboard" do login_as :user - @project1 = Factory :project, - path: "gitlabhq_0", - code: "TEST1" + @project1 = Factory :project - @project2 = Factory :project, - path: "gitlabhq_1", - code: "TEST2" + @project2 = Factory :project @project1.add_access(@user, :read, :write) @project2.add_access(@user, :read, :write) diff --git a/spec/support/stubbed_repository.rb b/spec/support/stubbed_repository.rb index 637754ba..8dd4f40e 100644 --- a/spec/support/stubbed_repository.rb +++ b/spec/support/stubbed_repository.rb @@ -17,11 +17,11 @@ module StubbedRepository if new_record? || path == 'newproject' # There are a couple Project specs and features that expect the Project's # path to be in the returned path, so let's patronize them. - File.join(Rails.root, 'tmp', 'tests', path) + File.join(Rails.root, 'tmp', 'repositories', path) else # For everything else, just give it the path to one of our real seeded # repos. - File.join(Rails.root, 'tmp', 'tests', 'gitlabhq_0') + File.join(Rails.root, 'tmp', 'repositories', 'gitlabhq') end end From 39ff033d1ab536c4e493510ee99e392b5fd25a07 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 28 Aug 2012 21:15:21 -0400 Subject: [PATCH 066/357] Remove pkey.example --- db/pkey.example | 3 --- spec/factories.rb | 8 +++++++- 2 files changed, 7 insertions(+), 4 deletions(-) delete mode 100644 db/pkey.example diff --git a/db/pkey.example b/db/pkey.example deleted file mode 100644 index ae045772..00000000 --- a/db/pkey.example +++ /dev/null @@ -1,3 +0,0 @@ -AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 -596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 -soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0= diff --git a/spec/factories.rb b/spec/factories.rb index 82fd0db2..929f9295 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -75,7 +75,13 @@ FactoryGirl.define do factory :key do title - key { File.read(File.join(Rails.root, "db", "pkey.example")) } + key do + """ + AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0= + """ + end factory :deploy_key do project From 5afb16e4965e41af420211fa35bff0d2d0a07de7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 29 Aug 2012 07:13:29 +0300 Subject: [PATCH 067/357] Add ssh key validation --- app/models/key.rb | 1 + spec/factories.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/key.rb b/app/models/key.rb index 8b61675a..3890814c 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -10,6 +10,7 @@ class Key < ActiveRecord::Base validates :key, presence: true, + :format => { :with => /ssh-.{3} / }, length: { within: 0..5000 } before_save :set_identifier diff --git a/spec/factories.rb b/spec/factories.rb index 929f9295..3f9673b4 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -77,7 +77,7 @@ FactoryGirl.define do title key do """ - AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 + ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0= """ From adc71b6a6ae06a96aa82052012ae6e61bd3a9cb1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 29 Aug 2012 07:58:22 +0300 Subject: [PATCH 068/357] Fix test i broke with ssk key validation. Added Key.user_id as attr_protected --- app/models/key.rb | 4 +++- features/profile/ssh_keys.feature | 4 ++-- features/step_definitions/profile/profile_keys_steps.rb | 2 +- spec/requests/projects_deploy_keys_spec.rb | 8 ++++---- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/models/key.rb b/app/models/key.rb index 3890814c..a39a4a16 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -4,13 +4,15 @@ class Key < ActiveRecord::Base belongs_to :user belongs_to :project + attr_protected :user_id + validates :title, presence: true, length: { within: 0..255 } validates :key, presence: true, - :format => { :with => /ssh-.{3} / }, + format: { :with => /ssh-.{3} / }, length: { within: 0..5000 } before_save :set_identifier diff --git a/features/profile/ssh_keys.feature b/features/profile/ssh_keys.feature index c3a92f30..c81503ed 100644 --- a/features/profile/ssh_keys.feature +++ b/features/profile/ssh_keys.feature @@ -3,8 +3,8 @@ Feature: SSH Keys Given I signin as a user And I have ssh keys: | title | - | Work | - | Home | + | ssh-rsa Work | + | ssh-rsa Home | And I visit profile keys page Scenario: I should see SSH keys diff --git a/features/step_definitions/profile/profile_keys_steps.rb b/features/step_definitions/profile/profile_keys_steps.rb index 5ab7e048..25926c53 100644 --- a/features/step_definitions/profile/profile_keys_steps.rb +++ b/features/step_definitions/profile/profile_keys_steps.rb @@ -16,7 +16,7 @@ end Given /^I submit new ssh key "(.*?)"$/ do |arg1| fill_in "key_title", :with => arg1 - fill_in "key_key", :with => "publickey234=" + fill_in "key_key", :with => "ssh-rsa publickey234=" click_button "Save" end diff --git a/spec/requests/projects_deploy_keys_spec.rb b/spec/requests/projects_deploy_keys_spec.rb index 0fea7b46..894aa6d3 100644 --- a/spec/requests/projects_deploy_keys_spec.rb +++ b/spec/requests/projects_deploy_keys_spec.rb @@ -42,7 +42,7 @@ describe "Projects", "DeployKeys" do describe "fill in" do before do fill_in "key_title", with: "laptop" - fill_in "key_key", with: "publickey234=" + fill_in "key_key", with: "ssh-rsa publickey234=" end it { expect { click_button "Save" }.to change {Key.count}.by(1) } @@ -55,12 +55,12 @@ describe "Projects", "DeployKeys" do end end - describe "Show page" do + describe "Show page" do before do @key = Factory :key, project: project - visit project_deploy_key_path(project, @key) + visit project_deploy_key_path(project, @key) end - + it { page.should have_content @key.title } it { page.should have_content @key.key[0..10] } end From 245806012019b93e210564f76fa2df9da915e274 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Wed, 29 Aug 2012 05:31:00 -0700 Subject: [PATCH 069/357] add docs for Milestones API --- doc/api/milestones.md | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 doc/api/milestones.md diff --git a/doc/api/milestones.md b/doc/api/milestones.md new file mode 100644 index 00000000..36a08fe4 --- /dev/null +++ b/doc/api/milestones.md @@ -0,0 +1,57 @@ +## List project milestones + +Get a list of project milestones. + +``` +GET /projects/:id/milestones +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project + +## Single milestone + +Get a single project milestone. + +``` +GET /projects/:id/milestones/:milestone_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `milestone_id` (required) - The ID of a project milestone + +## New milestone + +Create a new project milestone. + +``` +POST /projects/:id/milestones +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `title` (required) - The title of an milestone ++ `description` (optional) - The description of the milestone ++ `due_date` (optional) - The due date of the milestone ++ `closed` (optional) - The status of the milestone + +## Edit milestone + +Update an existing project milestone. + +``` +PUT /projects/:id/milestones/:milestone_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `milestone_id` (required) - The ID of a project milestone ++ `title` (optional) - The title of a milestone ++ `description` (optional) - The description of a milestone ++ `due_date` (optional) - The due date of the milestone ++ `closed` (optional) - The status of the milestone From 8a49cdc3b44579e64d50973df1a1d075e2766b97 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 08:45:00 -0400 Subject: [PATCH 070/357] Add milestone API docs to doc/README and views/help/api Also removes `closed` attribute option from create action. --- app/views/help/api.html.haml | 10 ++++++++++ doc/api/README.md | 1 + doc/api/milestones.md | 2 +- lib/api/milestones.rb | 5 ++--- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/views/help/api.html.haml b/app/views/help/api.html.haml index 4f7af193..d7d7aed4 100644 --- a/app/views/help/api.html.haml +++ b/app/views/help/api.html.haml @@ -63,3 +63,13 @@ .file_content.wiki = preserve do = markdown File.read(Rails.root.join("doc", "api", "issues.md")) + +%br + +.file_holder#milestones + .file_title + %i.icon-file + Milestones + .file_content.wiki + = preserve do + = markdown File.read(Rails.root.join("doc", "api", "milestones.md")) diff --git a/doc/api/README.md b/doc/api/README.md index d32573aa..53b4983e 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -29,3 +29,4 @@ The API uses JSON to serialize data. You don't need to specify `.json` at the en + [Projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md) + [Snippets](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/snippets.md) + [Issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/issues.md) ++ [Milestones](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/milestones.md) diff --git a/doc/api/milestones.md b/doc/api/milestones.md index 36a08fe4..f68d8eb7 100644 --- a/doc/api/milestones.md +++ b/doc/api/milestones.md @@ -34,10 +34,10 @@ POST /projects/:id/milestones Parameters: + `id` (required) - The ID or code name of a project ++ `milestone_id` (required) - The ID of a project milestone + `title` (required) - The title of an milestone + `description` (optional) - The description of the milestone + `due_date` (optional) - The due date of the milestone -+ `closed` (optional) - The status of the milestone ## Edit milestone diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb index 1ddcd1f8..f537b8e5 100644 --- a/lib/api/milestones.rb +++ b/lib/api/milestones.rb @@ -33,15 +33,13 @@ module Gitlab # title (required) - The title of the milestone # description (optional) - The description of the milestone # due_date (optional) - The due date of the milestone - # closed (optional) - The status of the milestone # Example Request: # POST /projects/:id/milestones post ":id/milestones" do @milestone = user_project.milestones.new( title: params[:title], description: params[:description], - due_date: params[:due_date], - closed: (params[:closed] || false) + due_date: params[:due_date] ) if @milestone.save @@ -55,6 +53,7 @@ module Gitlab # # Parameters: # id (required) - The ID or code name of a project + # milestone_id (required) - The ID of a project milestone # title (optional) - The title of a milestone # description (optional) - The description of a milestone # due_date (optional) - The due date of a milestone From e5adca1b813bf1646a08bbc239acc75a844c366d Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 08:13:38 +0300 Subject: [PATCH 071/357] Preview as button. Disable note submit unless content --- app/assets/javascripts/note.js | 11 +++++++++++ app/views/notes/_form.html.haml | 9 +++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/note.js b/app/assets/javascripts/note.js index d9ae45d9..dfa09986 100644 --- a/app/assets/javascripts/note.js +++ b/app/assets/javascripts/note.js @@ -24,6 +24,16 @@ init: $('.delete-note').live('ajax:success', function() { $(this).closest('li').fadeOut(); }); + $('#note_note').on('keyup', function(){ + var field = $(this); + var closest_submit = field.closest("form").find(".submit_note"); + if(field.val() == "") { + closest_submit.attr("disabled", "disabled").addClass("disabled"); + } else { + closest_submit.removeAttr("disabled").removeClass("disabled"); + } + }) + $("#new_note").live("ajax:before", function(){ $(".submit_note").attr("disabled", "disabled"); }) @@ -35,6 +45,7 @@ init: $("#note_note").live("focus", function(){ $(this).css("height", "80px"); $('.note_advanced_opts').show(); + $(this).closest("form").find(".submit_note").attr("disabled", "disabled"); }); $("#note_attachment").change(function(e){ diff --git a/app/views/notes/_form.html.haml b/app/views/notes/_form.html.haml index 326f1add..adb6e2b4 100644 --- a/app/views/notes/_form.html.haml +++ b/app/views/notes/_form.html.haml @@ -10,12 +10,13 @@ = f.text_area :note, size: 255 #preview-note.well.hide .hint - = link_to 'Preview', preview_project_notes_path(@project), id: 'preview-link' .right Comments are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. + .clearfix .row.note_advanced_opts.hide - .span2 - = f.submit 'Add Comment', class: "btn primary submit_note", id: "submit_note" + .span3 + = f.submit 'Add Comment', class: "btn primary submit_note grouped", id: "submit_note" + = link_to 'Preview', preview_project_notes_path(@project), class: 'btn grouped', id: 'preview-link' .span4.notify_opts %h6.left Notify via email: = label_tag :notify do @@ -26,7 +27,7 @@ = label_tag :notify_author do = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" %span Commit author - .span6.attachments + .span5.attachments %h6.left Attachment: %span.file_name File name... From 1dda08486b7751a677870486d4b576e6dd6071e7 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 01:55:41 -0400 Subject: [PATCH 072/357] Only include StubbedRepository in Project model --- spec/support/stubbed_repository.rb | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/spec/support/stubbed_repository.rb b/spec/support/stubbed_repository.rb index 8dd4f40e..90491e43 100644 --- a/spec/support/stubbed_repository.rb +++ b/spec/support/stubbed_repository.rb @@ -1,19 +1,7 @@ # Stubs out all Git repository access done by models so that specs can run # against fake repositories without Grit complaining that they don't exist. module StubbedRepository - extend ActiveSupport::Concern - - included do - # If a class defines the method we want to stub directly, rather than - # inheriting it from a module (as is the case in UsersProject), that method - # will overwrite our stub, so use alias_method to ensure it's our stub - # getting called. - - alias_method :path_to_repo, :fake_path_to_repo - alias_method :satellite, :fake_satellite - end - - def fake_path_to_repo + def path_to_repo if new_record? || path == 'newproject' # There are a couple Project specs and features that expect the Project's # path to be in the returned path, so let's patronize them. @@ -25,7 +13,7 @@ module StubbedRepository end end - def fake_satellite + def satellite FakeSatellite.new end @@ -40,6 +28,4 @@ module StubbedRepository end end -[Project, ProtectedBranch, UsersProject].each do |c| - c.send(:include, StubbedRepository) -end +Project.send(:include, StubbedRepository) From 4d65532158fb826b51290e0bbc30f34a1ec21d49 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Wed, 29 Aug 2012 09:49:39 +0300 Subject: [PATCH 073/357] Issue_status_changed email added --- app/mailers/notify.rb | 8 +++++++ .../issue_status_changed_email.html.haml | 16 +++++++++++++ spec/mailers/notify_spec.rb | 23 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 app/views/notify/issue_status_changed_email.html.haml diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 1d222eb1..91136fee 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -83,6 +83,14 @@ class Notify < ActionMailer::Base subject: subject("access to project was granted")) end + def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id) + @issue = Issue.find issue_id + @issue_status = status + @updated_by = User.find updated_by_user_id + mail(to: recipient(recipient_id), + subject: subject("changed issue ##{@issue.id}", @issue.title)) + end + private # Look up a User by their ID and return their email address diff --git a/app/views/notify/issue_status_changed_email.html.haml b/app/views/notify/issue_status_changed_email.html.haml new file mode 100644 index 00000000..59130f79 --- /dev/null +++ b/app/views/notify/issue_status_changed_email.html.haml @@ -0,0 +1,16 @@ +%td.content{align: "left", style: "font-family: Helvetica, Arial, sans-serif; padding: 20px 0 0;", valign: "top", width: "600"} + %table{border: "0", cellpadding: "0", cellspacing: "0", style: "color: #717171; font: normal 11px Helvetica, Arial, sans-serif; margin: 0; padding: 0;", width: "600"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = "Issue was #{@issue_status} by #{@updated_by.name}" + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464 !important; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = "Issue ##{@issue.id}" + = link_to_gfm truncate(@issue.title, length: 45), project_issue_url(@issue.project, @issue), title: @issue.title + %br + diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index 60f3231c..cf50b429 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -91,6 +91,29 @@ describe Notify do should have_body_text /#{project_issue_path project, issue}/ end end + + describe 'status changed' do + let(:current_user) { Factory.create :user, email: "current@email.com" } + let(:status) { 'closed' } + subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) } + + it 'has the correct subject' do + should have_subject /changed issue ##{issue.id} \| #{issue.title}/i + end + + it 'contains the new status' do + should have_body_text /#{status}/i + end + + it 'contains the user name' do + should have_body_text /#{current_user.name}/i + end + + it 'contains a link to the issue' do + should have_body_text /#{project_issue_path project, issue}/ + end + end + end context 'for merge requests' do From 2cb0a62f7d087c77c94c1b561fd2c9e3dd3d2661 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Wed, 29 Aug 2012 10:48:17 +0300 Subject: [PATCH 074/357] Notification sends to issue author and assignee if issue being reopened or closed --- app/observers/issue_observer.rb | 16 ++++++- spec/observers/issue_observer_spec.rb | 69 ++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/app/observers/issue_observer.rb b/app/observers/issue_observer.rb index 92b0f836..dc5995cb 100644 --- a/app/observers/issue_observer.rb +++ b/app/observers/issue_observer.rb @@ -9,8 +9,20 @@ class IssueObserver < ActiveRecord::Observer def after_update(issue) send_reassigned_email(issue) if issue.is_being_reassigned? - Note.create_status_change_note(issue, current_user, 'closed') if issue.is_being_closed? - Note.create_status_change_note(issue, current_user, 'reopened') if issue.is_being_reopened? + + if issue.is_being_closed? + Note.create_status_change_note(issue, current_user, 'closed') + [issue.author, issue.assignee].compact.each do |recipient| + Notify.issue_status_changed_email(recipient.id, issue.id, 'closed', current_user) + end + end + + if issue.is_being_reopened? + Note.create_status_change_note(issue, current_user, 'reopened') + [issue.author, issue.assignee].compact.each do |recipient| + Notify.issue_status_changed_email(recipient.id, issue.id, 'reopened', current_user) + end + end end protected diff --git a/spec/observers/issue_observer_spec.rb b/spec/observers/issue_observer_spec.rb index c6a405f1..b5943f2c 100644 --- a/spec/observers/issue_observer_spec.rb +++ b/spec/observers/issue_observer_spec.rb @@ -3,7 +3,8 @@ require 'spec_helper' describe IssueObserver do let(:some_user) { double(:user, id: 1) } let(:assignee) { double(:user, id: 2) } - let(:issue) { double(:issue, id: 42, assignee: assignee) } + let(:author) { double(:user, id: 3) } + let(:issue) { double(:issue, id: 42, assignee: assignee, author: author) } before(:each) { subject.stub(:current_user).and_return(some_user) } @@ -67,36 +68,90 @@ describe IssueObserver do end end - context 'a status "closed" note' do - it 'is created if the issue is being closed' do + context 'a status "closed"' do + it 'note is created if the issue is being closed' do issue.should_receive(:is_being_closed?).and_return(true) Note.should_receive(:create_status_change_note).with(issue, some_user, 'closed') subject.after_update(issue) end - it 'is not created if the issue is not being closed' do + it 'note is not created if the issue is not being closed' do issue.should_receive(:is_being_closed?).and_return(false) Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'closed') subject.after_update(issue) end + + it 'notification is delivered if the issue being closed' do + issue.stub(:is_being_closed?).and_return(true) + Notify.should_receive(:issue_status_changed_email).twice + Note.should_receive(:create_status_change_note).with(issue, some_user, 'closed') + + subject.after_update(issue) + end + + it 'notification is not delivered if the issue not being closed' do + issue.stub(:is_being_closed?).and_return(false) + Notify.should_not_receive(:issue_status_changed_email) + Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'closed') + + subject.after_update(issue) + end + + it 'notification is delivered only to author if the issue being closed' do + issue_without_assignee = double(:issue, id: 42, author: author, assignee: nil) + issue_without_assignee.stub(:is_being_reassigned?).and_return(false) + issue_without_assignee.stub(:is_being_closed?).and_return(true) + issue_without_assignee.stub(:is_being_reopened?).and_return(false) + Notify.should_receive(:issue_status_changed_email).once + Note.should_receive(:create_status_change_note).with(issue_without_assignee, some_user, 'closed') + + subject.after_update(issue_without_assignee) + end end - context 'a status "reopened" note' do - it 'is created if the issue is being reopened' do + context 'a status "reopened"' do + it 'note is created if the issue is being reopened' do issue.should_receive(:is_being_reopened?).and_return(true) Note.should_receive(:create_status_change_note).with(issue, some_user, 'reopened') subject.after_update(issue) end - it 'is not created if the issue is not being reopened' do + it 'note is not created if the issue is not being reopened' do issue.should_receive(:is_being_reopened?).and_return(false) Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'reopened') subject.after_update(issue) end + + it 'notification is delivered if the issue being reopened' do + issue.stub(:is_being_reopened?).and_return(true) + Notify.should_receive(:issue_status_changed_email).twice + Note.should_receive(:create_status_change_note).with(issue, some_user, 'reopened') + + subject.after_update(issue) + end + + it 'notification is not delivered if the issue not being reopened' do + issue.stub(:is_being_reopened?).and_return(false) + Notify.should_not_receive(:issue_status_changed_email) + Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'reopened') + + subject.after_update(issue) + end + + it 'notification is delivered only to author if the issue being reopened' do + issue_without_assignee = double(:issue, id: 42, author: author, assignee: nil) + issue_without_assignee.stub(:is_being_reassigned?).and_return(false) + issue_without_assignee.stub(:is_being_closed?).and_return(false) + issue_without_assignee.stub(:is_being_reopened?).and_return(true) + Notify.should_receive(:issue_status_changed_email).once + Note.should_receive(:create_status_change_note).with(issue_without_assignee, some_user, 'reopened') + + subject.after_update(issue_without_assignee) + end end end From 43cad71f1adbefe462f1c7216c8323c3f36704f4 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Wed, 29 Aug 2012 10:50:35 +0300 Subject: [PATCH 075/357] Duplicate code removed from IssueObserver#after_update --- app/observers/issue_observer.rb | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/app/observers/issue_observer.rb b/app/observers/issue_observer.rb index dc5995cb..62fd9bf8 100644 --- a/app/observers/issue_observer.rb +++ b/app/observers/issue_observer.rb @@ -10,17 +10,13 @@ class IssueObserver < ActiveRecord::Observer def after_update(issue) send_reassigned_email(issue) if issue.is_being_reassigned? - if issue.is_being_closed? - Note.create_status_change_note(issue, current_user, 'closed') + status = nil + status = 'closed' if issue.is_being_closed? + status = 'reopened' if issue.is_being_reopened? + if status + Note.create_status_change_note(issue, current_user, status) [issue.author, issue.assignee].compact.each do |recipient| - Notify.issue_status_changed_email(recipient.id, issue.id, 'closed', current_user) - end - end - - if issue.is_being_reopened? - Note.create_status_change_note(issue, current_user, 'reopened') - [issue.author, issue.assignee].compact.each do |recipient| - Notify.issue_status_changed_email(recipient.id, issue.id, 'reopened', current_user) + Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) end end end From b99372b75679e3c05eed7b81284fc1efc7fa956b Mon Sep 17 00:00:00 2001 From: logiblocs Date: Wed, 29 Aug 2012 13:04:37 +0200 Subject: [PATCH 076/357] Fixed one letter in doc/installation.md --- doc/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/installation.md b/doc/installation.md index 7d3c2c41..df106bc1 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -230,7 +230,7 @@ You can login via web using admin generated with setup: # causing the resque worker not to start via init script on next boot/service restart **Ok - we have a working application now. ** -**But keep going - there are some thing that should be done ** +**But keep going - there are some things that should be done ** # Nginx && Unicorn From 2c95074a5faec5e5420bfbf87134f5956d427cd1 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 01:35:48 -0400 Subject: [PATCH 077/357] Remove model specs that are covered by factories_spec --- spec/models/event_spec.rb | 10 ---------- spec/models/wiki_spec.rb | 2 -- 2 files changed, 12 deletions(-) diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 188f0997..645eabc1 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -29,16 +29,6 @@ describe Event do it { should respond_to(:commits) } end - describe "Creation" do - before do - @event = Factory :event - end - - it "should create a valid event" do - @event.should be_valid - end - end - describe "Push event" do before do project = Factory :project diff --git a/spec/models/wiki_spec.rb b/spec/models/wiki_spec.rb index 892d0e8f..67e6caff 100644 --- a/spec/models/wiki_spec.rb +++ b/spec/models/wiki_spec.rb @@ -11,8 +11,6 @@ describe Wiki do it { should validate_presence_of(:content) } it { should validate_presence_of(:user_id) } end - - it { Factory(:wiki).should be_valid } end # == Schema Information # From 14daf2e2ba9d75527b5de07d87a9027bd53d607e Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 01:49:26 -0400 Subject: [PATCH 078/357] Add `include_module` matcher --- spec/support/matchers.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb index e0672166..14a03870 100644 --- a/spec/support/matchers.rb +++ b/spec/support/matchers.rb @@ -28,6 +28,16 @@ RSpec::Matchers.define :be_404_for do |user| end end +RSpec::Matchers.define :include_module do |expected| + match do + described_class.included_modules.include?(expected) + end + + failure_message_for_should do + "expected #{described_class} to include the #{expected} module" + end +end + module UrlAccess def url_allowed?(user, url) emulate_user(user) From 9d4d40deed5ea649511f3aadd45b3da68c7c3217 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 01:52:19 -0400 Subject: [PATCH 079/357] Move IssueCommonality and Upvote specs out of models and into their own specs --- spec/models/issue_spec.rb | 39 ++-------------- spec/models/merge_request_spec.rb | 35 ++------------ spec/roles/issue_commonality_spec.rb | 69 ++++++++++++++++++++++++++++ spec/roles/upvote_spec.rb | 27 +++++++++++ 4 files changed, 104 insertions(+), 66 deletions(-) create mode 100644 spec/roles/issue_commonality_spec.rb create mode 100644 spec/roles/upvote_spec.rb diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 133f0734..a03405b5 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -19,6 +19,11 @@ describe Issue do it { Issue.should respond_to :opened } end + describe 'modules' do + it { should include_module(IssueCommonality) } + it { should include_module(Upvote) } + end + subject { Factory.create(:issue) } describe '#is_being_reassigned?' do @@ -61,40 +66,6 @@ describe Issue do subject.is_being_reopened?.should be_false end end - - describe "plus 1" do - subject { Factory.create(:issue) } - - it "with no notes has a 0/0 score" do - subject.upvotes.should == 0 - end - - it "should recognize non-+1 notes" do - subject.notes << Factory(:note, note: "No +1 here") - subject.should have(1).note - subject.notes.first.upvote?.should be_false - subject.upvotes.should == 0 - end - - it "should recognize a single +1 note" do - subject.notes << Factory(:note, note: "+1 This is awesome") - subject.upvotes.should == 1 - end - - it "should recognize a multiple +1 notes" do - subject.notes << Factory(:note, note: "+1 This is awesome") - subject.notes << Factory(:note, note: "+1 I want this") - subject.upvotes.should == 2 - end - end - - describe ".search" do - let!(:issue) { Factory.create(:issue, title: "Searchable issue") } - - it "matches by title" do - Issue.search('able').all.should == [issue] - end - end end # == Schema Information # diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index f4b93eea..10f0a01f 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -20,38 +20,9 @@ describe MergeRequest do it { MergeRequest.should respond_to :opened } end - describe "plus 1" do - subject { Factory.create(:merge_request) } - - it "with no notes has a 0/0 score" do - subject.upvotes.should == 0 - end - - it "should recognize non-+1 notes" do - subject.notes << Factory(:note, note: "No +1 here") - subject.should have(1).note - subject.notes.first.upvote?.should be_false - subject.upvotes.should == 0 - end - - it "should recognize a single +1 note" do - subject.notes << Factory(:note, note: "+1 This is awesome") - subject.upvotes.should == 1 - end - - it "should recognize a multiple +1 notes" do - subject.notes << Factory(:note, note: "+1 This is awesome") - subject.notes << Factory(:note, note: "+1 I want this") - subject.upvotes.should == 2 - end - end - - describe ".search" do - let!(:issue) { Factory.create(:issue, title: "Searchable issue") } - - it "matches by title" do - Issue.search('able').all.should == [issue] - end + describe 'modules' do + it { should include_module(IssueCommonality) } + it { should include_module(Upvote) } end end # == Schema Information diff --git a/spec/roles/issue_commonality_spec.rb b/spec/roles/issue_commonality_spec.rb new file mode 100644 index 00000000..77b98b46 --- /dev/null +++ b/spec/roles/issue_commonality_spec.rb @@ -0,0 +1,69 @@ +require 'spec_helper' + +describe Issue, "IssueCommonality" do + let(:issue) { create(:issue) } + + describe "Associations" do + it { should belong_to(:project) } + it { should belong_to(:author) } + it { should belong_to(:assignee) } + it { should have_many(:notes).dependent(:destroy) } + end + + describe "Validation" do + it { should validate_presence_of(:project_id) } + it { should validate_presence_of(:author_id) } + it { should validate_presence_of(:title) } + it { should ensure_length_of(:title).is_at_least(0).is_at_most(255) } + end + + describe "Scope" do + it { described_class.should respond_to(:opened) } + it { described_class.should respond_to(:closed) } + it { described_class.should respond_to(:assigned) } + end + + it "has an :author_id_of_changes accessor" do + issue.should respond_to(:author_id_of_changes) + issue.should respond_to(:author_id_of_changes=) + end + + describe ".search" do + let!(:searchable_issue) { create(:issue, title: "Searchable issue") } + + it "matches by title" do + described_class.search('able').all.should == [searchable_issue] + end + end + + describe "#today?" do + it "returns true when created today" do + # Avoid timezone differences and just return exactly what we want + Date.stub(:today).and_return(issue.created_at.to_date) + issue.today?.should be_true + end + + it "returns false when not created today" do + Date.stub(:today).and_return(Date.yesterday) + issue.today?.should be_false + end + end + + describe "#new?" do + it "returns true when created today and record hasn't been updated" do + issue.stub(:today?).and_return(true) + issue.new?.should be_true + end + + it "returns false when not created today" do + issue.stub(:today?).and_return(false) + issue.new?.should be_false + end + + it "returns false when record has been updated" do + issue.stub(:today?).and_return(true) + issue.touch + issue.new?.should be_false + end + end +end diff --git a/spec/roles/upvote_spec.rb b/spec/roles/upvote_spec.rb new file mode 100644 index 00000000..24288ada --- /dev/null +++ b/spec/roles/upvote_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe Issue, "Upvote" do + let(:issue) { create(:issue) } + + it "with no notes has a 0/0 score" do + issue.upvotes.should == 0 + end + + it "should recognize non-+1 notes" do + issue.notes << create(:note, note: "No +1 here") + issue.should have(1).note + issue.notes.first.upvote?.should be_false + issue.upvotes.should == 0 + end + + it "should recognize a single +1 note" do + issue.notes << create(:note, note: "+1 This is awesome") + issue.upvotes.should == 1 + end + + it "should recognize multiple +1 notes" do + issue.notes << create(:note, note: "+1 This is awesome") + issue.notes << create(:note, note: "+1 I want this") + issue.upvotes.should == 2 + end +end From 9e7d77cece06e48ac0f44ee808976ec6dcbff81d Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 02:05:08 -0400 Subject: [PATCH 080/357] Remove annotations from specs --- spec/models/event_spec.rb | 16 --------------- spec/models/issue_spec.rb | 19 ------------------ spec/models/key_spec.rb | 14 ------------- spec/models/merge_request_spec.rb | 20 ------------------- spec/models/milestone_spec.rb | 14 ------------- spec/models/note_spec.rb | 16 --------------- spec/models/project_spec.rb | 20 ------------------- spec/models/protected_branch_spec.rb | 11 ---------- spec/models/snippet_spec.rb | 15 -------------- spec/models/user_spec.rb | 30 ---------------------------- spec/models/users_project_spec.rb | 12 ----------- spec/models/web_hook_spec.rb | 11 ---------- spec/models/wiki_spec.rb | 14 ------------- 13 files changed, 212 deletions(-) diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 645eabc1..ef6e3ed2 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -1,19 +1,3 @@ -# == Schema Information -# -# Table name: events -# -# id :integer(4) not null, primary key -# target_type :string(255) -# target_id :integer(4) -# title :string(255) -# data :text -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# action :integer(4) -# author_id :integer(4) -# - require 'spec_helper' describe Event do diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index a03405b5..5c22d0cc 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -67,22 +67,3 @@ describe Issue do end end end -# == Schema Information -# -# Table name: issues -# -# id :integer(4) not null, primary key -# title :string(255) -# assignee_id :integer(4) -# author_id :integer(4) -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# closed :boolean(1) default(FALSE), not null -# position :integer(4) default(0) -# critical :boolean(1) default(FALSE), not null -# branch_name :string(255) -# description :text -# milestone_id :integer(4) -# - diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb index ea58fbd2..6efb21e9 100644 --- a/spec/models/key_spec.rb +++ b/spec/models/key_spec.rb @@ -44,17 +44,3 @@ describe Key do end end end -# == Schema Information -# -# Table name: keys -# -# id :integer(4) not null, primary key -# user_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# key :text -# title :string(255) -# identifier :string(255) -# project_id :integer(4) -# - diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 10f0a01f..78ec0110 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -25,23 +25,3 @@ describe MergeRequest do it { should include_module(Upvote) } end end -# == Schema Information -# -# Table name: merge_requests -# -# id :integer(4) not null, primary key -# target_branch :string(255) not null -# source_branch :string(255) not null -# project_id :integer(4) not null -# author_id :integer(4) -# assignee_id :integer(4) -# title :string(255) -# closed :boolean(1) default(FALSE), not null -# created_at :datetime not null -# updated_at :datetime not null -# st_commits :text(2147483647 -# st_diffs :text(2147483647 -# merged :boolean(1) default(FALSE), not null -# state :integer(4) default(1), not null -# - diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index ed805a24..fa15fc8f 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -1,17 +1,3 @@ -# == Schema Information -# -# Table name: milestones -# -# id :integer(4) not null, primary key -# title :string(255) not null -# project_id :integer(4) not null -# description :text -# due_date :date -# closed :boolean(1) default(FALSE), not null -# created_at :datetime not null -# updated_at :datetime not null -# - require 'spec_helper' describe Milestone do diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index 89e50479..c4010e64 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -130,19 +130,3 @@ describe Note do end end end -# == Schema Information -# -# Table name: notes -# -# id :integer(4) not null, primary key -# note :text -# noteable_id :string(255) -# noteable_type :string(255) -# author_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# project_id :integer(4) -# attachment :string(255) -# line_code :string(255) -# - diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index faaa9a91..eac8c3b5 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -236,23 +236,3 @@ describe Project do end end end -# == Schema Information -# -# Table name: projects -# -# id :integer(4) not null, primary key -# name :string(255) -# path :string(255) -# description :text -# created_at :datetime not null -# updated_at :datetime not null -# private_flag :boolean(1) default(TRUE), not null -# code :string(255) -# owner_id :integer(4) -# default_branch :string(255) default("master"), not null -# issues_enabled :boolean(1) default(TRUE), not null -# wall_enabled :boolean(1) default(TRUE), not null -# merge_requests_enabled :boolean(1) default(TRUE), not null -# wiki_enabled :boolean(1) default(TRUE), not null -# - diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb index 1654e3b6..77a214ff 100644 --- a/spec/models/protected_branch_spec.rb +++ b/spec/models/protected_branch_spec.rb @@ -1,14 +1,3 @@ -# == Schema Information -# -# Table name: protected_branches -# -# id :integer(4) not null, primary key -# project_id :integer(4) not null -# name :string(255) not null -# created_at :datetime not null -# updated_at :datetime not null -# - require 'spec_helper' describe ProtectedBranch do diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb index 9b4aaa13..2a63584e 100644 --- a/spec/models/snippet_spec.rb +++ b/spec/models/snippet_spec.rb @@ -14,18 +14,3 @@ describe Snippet do it { should validate_presence_of(:content) } end end -# == Schema Information -# -# Table name: snippets -# -# id :integer(4) not null, primary key -# title :string(255) -# content :text -# author_id :integer(4) not null -# project_id :integer(4) not null -# created_at :datetime not null -# updated_at :datetime not null -# file_name :string(255) -# expires_at :datetime -# - diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index ebc45fa4..a3443dc7 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -51,33 +51,3 @@ describe User do user.authentication_token.should_not == "" end end -# == Schema Information -# -# Table name: users -# -# id :integer(4) not null, primary key -# email :string(255) default(""), not null -# encrypted_password :string(128) default(""), not null -# reset_password_token :string(255) -# reset_password_sent_at :datetime -# remember_created_at :datetime -# sign_in_count :integer(4) default(0) -# current_sign_in_at :datetime -# last_sign_in_at :datetime -# current_sign_in_ip :string(255) -# last_sign_in_ip :string(255) -# created_at :datetime not null -# updated_at :datetime not null -# name :string(255) -# admin :boolean(1) default(FALSE), not null -# projects_limit :integer(4) default(10) -# skype :string(255) default(""), not null -# linkedin :string(255) default(""), not null -# twitter :string(255) default(""), not null -# authentication_token :string(255) -# dark_scheme :boolean(1) default(FALSE), not null -# theme_id :integer(4) default(1), not null -# bio :string(255) -# blocked :boolean(1) default(FALSE), not null -# - diff --git a/spec/models/users_project_spec.rb b/spec/models/users_project_spec.rb index 87fbfbf2..5103ae00 100644 --- a/spec/models/users_project_spec.rb +++ b/spec/models/users_project_spec.rb @@ -16,15 +16,3 @@ describe UsersProject do it { should respond_to(:user_email) } end end -# == Schema Information -# -# Table name: users_projects -# -# id :integer(4) not null, primary key -# user_id :integer(4) not null -# project_id :integer(4) not null -# created_at :datetime not null -# updated_at :datetime not null -# project_access :integer(4) default(0), not null -# - diff --git a/spec/models/web_hook_spec.rb b/spec/models/web_hook_spec.rb index 88594761..3cba5b64 100644 --- a/spec/models/web_hook_spec.rb +++ b/spec/models/web_hook_spec.rb @@ -52,14 +52,3 @@ describe ProjectHook do end end end -# == Schema Information -# -# Table name: web_hooks -# -# id :integer(4) not null, primary key -# url :string(255) -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# - diff --git a/spec/models/wiki_spec.rb b/spec/models/wiki_spec.rb index 67e6caff..8035280d 100644 --- a/spec/models/wiki_spec.rb +++ b/spec/models/wiki_spec.rb @@ -12,17 +12,3 @@ describe Wiki do it { should validate_presence_of(:user_id) } end end -# == Schema Information -# -# Table name: wikis -# -# id :integer(4) not null, primary key -# title :string(255) -# content :text -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# slug :string(255) -# user_id :integer(4) -# - From 2bdea8651fa3bd82418986ada84828c22d451405 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 02:21:50 -0400 Subject: [PATCH 081/357] Add is_within method for shoulda's EnsureLengthOf matcher --- spec/support/matchers.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb index 14a03870..cb1dcba3 100644 --- a/spec/support/matchers.rb +++ b/spec/support/matchers.rb @@ -67,3 +67,17 @@ module UrlAccess login_with(user) if user end end + +# Extend shoulda-matchers +module Shoulda::Matchers::ActiveModel + class EnsureLengthOfMatcher + # Shortcut for is_at_least and is_at_most + def is_within(range) + if range.exclude_end? + is_at_least(range.first) && is_at_most(range.last - 1) + else + is_at_least(range.first) && is_at_most(range.last) + end + end + end +end From 8c44789e6fc00a9cdbe3020232ad546941af18b9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 29 Aug 2012 18:09:41 +0300 Subject: [PATCH 082/357] Mark api milestone specs as pending --- spec/api/milestones_spec.rb | 1 + spec/requests/api/issues_spec.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/api/milestones_spec.rb b/spec/api/milestones_spec.rb index ba1d15cc..ce602367 100644 --- a/spec/api/milestones_spec.rb +++ b/spec/api/milestones_spec.rb @@ -6,6 +6,7 @@ describe Gitlab::API do let!(:milestone) { Factory :milestone, project: project } before { project.add_access(user, :read) } + before { return pending } describe "GET /projects/:id/milestones" do it "should return project milestones" do diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb index 4c680425..2917980b 100644 --- a/spec/requests/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -65,7 +65,7 @@ describe Gitlab::API do describe "DELETE /projects/:id/issues/:issue_id" do it "should delete a project issue" do - delete "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" + delete api("/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}") response.status.should == 405 end end From 97423a0bed1148f65f9ed2bd8bf540e764d9576c Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 11:36:02 -0400 Subject: [PATCH 083/357] Add more coverage for model validations and associations --- spec/factories.rb | 13 ++++++-- spec/models/event_spec.rb | 1 + spec/models/issue_spec.rb | 12 +------- spec/models/key_spec.rb | 5 +++- spec/models/merge_request_spec.rb | 14 --------- spec/models/note_spec.rb | 2 ++ spec/models/project_spec.rb | 45 +++++++++++++++++++++++----- spec/models/protected_branch_spec.rb | 20 ++++++------- spec/models/snippet_spec.rb | 11 +++++-- spec/models/user_spec.rb | 17 +++++++++-- spec/models/users_project_spec.rb | 4 +++ spec/models/wiki_spec.rb | 2 ++ 12 files changed, 96 insertions(+), 50 deletions(-) diff --git a/spec/factories.rb b/spec/factories.rb index 3f9673b4..2e4acf39 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -18,11 +18,15 @@ FactoryGirl.define do Faker::Lorem.sentence end + sequence :name, aliases: [:file_name] do + Faker::Name.name + end + sequence(:url) { Faker::Internet.uri('http') } factory :user, aliases: [:author, :assignee, :owner] do email { Faker::Internet.email } - name { Faker::Name.name } + name password "123456" password_confirmation "123456" @@ -116,6 +120,11 @@ FactoryGirl.define do author title content - file_name { Faker::Lorem.sentence } + file_name + end + + factory :protected_branch do + name + project end end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index ef6e3ed2..aaffda31 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' describe Event do describe "Associations" do it { should belong_to(:project) } + it { should belong_to(:target) } end describe "Respond to" do diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 5c22d0cc..69829a4d 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -2,21 +2,11 @@ require 'spec_helper' describe Issue do describe "Associations" do - it { should belong_to(:project) } - it { should belong_to(:author) } - it { should belong_to(:assignee) } it { should belong_to(:milestone) } end describe "Validation" do - it { should validate_presence_of(:title) } - it { should validate_presence_of(:author_id) } - it { should validate_presence_of(:project_id) } - end - - describe "Scope" do - it { Issue.should respond_to :closed } - it { Issue.should respond_to :opened } + it { should ensure_length_of(:description).is_within(0..2000) } end describe 'modules' do diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb index 6efb21e9..85cd291d 100644 --- a/spec/models/key_spec.rb +++ b/spec/models/key_spec.rb @@ -2,12 +2,15 @@ require 'spec_helper' describe Key do describe "Associations" do - it { should belong_to(:user) or belong_to(:project) } + it { should belong_to(:user) } + it { should belong_to(:project) } end describe "Validation" do it { should validate_presence_of(:title) } it { should validate_presence_of(:key) } + it { should ensure_length_of(:title).is_within(0..255) } + it { should ensure_length_of(:key).is_within(0..5000) } end describe "Methods" do diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 78ec0110..d1253b35 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -1,23 +1,9 @@ require 'spec_helper' describe MergeRequest do - describe "Associations" do - it { should belong_to(:project) } - it { should belong_to(:author) } - it { should belong_to(:assignee) } - end - describe "Validation" do it { should validate_presence_of(:target_branch) } it { should validate_presence_of(:source_branch) } - it { should validate_presence_of(:title) } - it { should validate_presence_of(:author_id) } - it { should validate_presence_of(:project_id) } - end - - describe "Scope" do - it { MergeRequest.should respond_to :closed } - it { MergeRequest.should respond_to :opened } end describe 'modules' do diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index c4010e64..ffaf442d 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' describe Note do describe "Associations" do it { should belong_to(:project) } + it { should belong_to(:noteable) } + it { should belong_to(:author).class_name('User') } end describe "Validation" do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index eac8c3b5..b947eeb2 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -2,23 +2,52 @@ require 'spec_helper' describe Project do describe "Associations" do + it { should belong_to(:owner).class_name('User') } it { should have_many(:users) } - it { should have_many(:protected_branches).dependent(:destroy) } it { should have_many(:events).dependent(:destroy) } - it { should have_many(:wikis).dependent(:destroy) } it { should have_many(:merge_requests).dependent(:destroy) } - it { should have_many(:users_projects).dependent(:destroy) } it { should have_many(:issues).dependent(:destroy) } + it { should have_many(:milestones).dependent(:destroy) } + it { should have_many(:users_projects).dependent(:destroy) } it { should have_many(:notes).dependent(:destroy) } it { should have_many(:snippets).dependent(:destroy) } - it { should have_many(:hooks).dependent(:destroy) } it { should have_many(:deploy_keys).dependent(:destroy) } + it { should have_many(:hooks).dependent(:destroy) } + it { should have_many(:wikis).dependent(:destroy) } + it { should have_many(:protected_branches).dependent(:destroy) } end describe "Validation" do + let!(:project) { create(:project) } + it { should validate_presence_of(:name) } + it { should validate_uniqueness_of(:name) } + it { should ensure_length_of(:name).is_within(0..255) } + it { should validate_presence_of(:path) } + it { should validate_uniqueness_of(:path) } + it { should ensure_length_of(:path).is_within(0..255) } + # TODO: Formats + + it { should ensure_length_of(:description).is_within(0..2000) } + it { should validate_presence_of(:code) } + it { should validate_uniqueness_of(:code) } + it { should ensure_length_of(:code).is_within(1..255) } + # TODO: Formats + + it { should validate_presence_of(:owner) } + + it "should not allow new projects beyond user limits" do + project.stub(:owner).and_return(double(can_create_project?: false, projects_limit: 1)) + project.should_not be_valid + project.errors[:base].first.should match(/Your own projects limit is 1/) + end + + it "should not allow 'gitolite-admin' as repo name" do + should allow_value("blah").for(:path) + should_not allow_value("gitolite-admin").for(:path) + end end describe "Respond to" do @@ -73,9 +102,11 @@ describe Project do it { should respond_to(:trigger_post_receive) } end - it "should not allow 'gitolite-admin' as repo name" do - should allow_value("blah").for(:path) - should_not allow_value("gitolite-admin").for(:path) + describe 'modules' do + it { should include_module(Repository) } + it { should include_module(PushObserver) } + it { should include_module(Authority) } + it { should include_module(Team) } end it "should return valid url to repo" do diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb index 77a214ff..9180bc3b 100644 --- a/spec/models/protected_branch_spec.rb +++ b/spec/models/protected_branch_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' describe ProtectedBranch do - let(:project) { Factory(:project) } - describe 'Associations' do it { should belong_to(:project) } end @@ -13,26 +11,26 @@ describe ProtectedBranch do end describe 'Callbacks' do - subject { ProtectedBranch.new(project: project, name: 'branch_name') } + let(:branch) { build(:protected_branch) } it 'call update_repository after save' do - subject.should_receive(:update_repository) - subject.save + branch.should_receive(:update_repository) + branch.save end it 'call update_repository after destroy' do - subject.should_receive(:update_repository) - subject.destroy + branch.save + branch.should_receive(:update_repository) + branch.destroy end end describe '#commit' do - subject { ProtectedBranch.new(project: project, name: 'cant_touch_this') } + let(:branch) { create(:protected_branch) } it 'commits itself to its project' do - project.should_receive(:commit).with('cant_touch_this') - - subject.commit + branch.project.should_receive(:commit).with(branch.name) + branch.commit end end end diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb index 2a63584e..ffb861c4 100644 --- a/spec/models/snippet_spec.rb +++ b/spec/models/snippet_spec.rb @@ -3,14 +3,21 @@ require 'spec_helper' describe Snippet do describe "Associations" do it { should belong_to(:project) } - it { should belong_to(:author) } + it { should belong_to(:author).class_name('User') } + it { should have_many(:notes).dependent(:destroy) } end describe "Validation" do - it { should validate_presence_of(:title) } it { should validate_presence_of(:author_id) } it { should validate_presence_of(:project_id) } + + it { should validate_presence_of(:title) } + it { should ensure_length_of(:title).is_within(0..255) } + it { should validate_presence_of(:file_name) } + it { should ensure_length_of(:title).is_within(0..255) } + it { should validate_presence_of(:content) } + it { should ensure_length_of(:content).is_within(0..10_000) } end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a3443dc7..ca34f07d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -2,13 +2,26 @@ require 'spec_helper' describe User do describe "Associations" do - it { should have_many(:projects) } it { should have_many(:users_projects).dependent(:destroy) } + it { should have_many(:projects) } + it { should have_many(:my_own_projects).class_name('Project') } + it { should have_many(:keys).dependent(:destroy) } + it { should have_many(:events).class_name('Event').dependent(:destroy) } + it { should have_many(:recent_events).class_name('Event') } it { should have_many(:issues).dependent(:destroy) } + it { should have_many(:notes).dependent(:destroy) } it { should have_many(:assigned_issues).dependent(:destroy) } it { should have_many(:merge_requests).dependent(:destroy) } it { should have_many(:assigned_merge_requests).dependent(:destroy) } - it { should have_many(:notes).dependent(:destroy) } + end + + describe 'validations' do + it { should validate_presence_of(:projects_limit) } + it { should validate_numericality_of(:projects_limit) } + it { should allow_value(0).for(:projects_limit) } + it { should_not allow_value(-1).for(:projects_limit) } + + it { should ensure_length_of(:bio).is_within(0..255) } end describe "Respond to" do diff --git a/spec/models/users_project_spec.rb b/spec/models/users_project_spec.rb index 5103ae00..3197ba6e 100644 --- a/spec/models/users_project_spec.rb +++ b/spec/models/users_project_spec.rb @@ -7,7 +7,11 @@ describe UsersProject do end describe "Validation" do + let!(:users_project) { create(:users_project) } + it { should validate_presence_of(:user_id) } + it { should validate_uniqueness_of(:user_id).scoped_to(:project_id) } + it { should validate_presence_of(:project_id) } end diff --git a/spec/models/wiki_spec.rb b/spec/models/wiki_spec.rb index 8035280d..de6ce426 100644 --- a/spec/models/wiki_spec.rb +++ b/spec/models/wiki_spec.rb @@ -4,10 +4,12 @@ describe Wiki do describe "Associations" do it { should belong_to(:project) } it { should belong_to(:user) } + it { should have_many(:notes).dependent(:destroy) } end describe "Validation" do it { should validate_presence_of(:title) } + it { should ensure_length_of(:title).is_within(1..250) } it { should validate_presence_of(:content) } it { should validate_presence_of(:user_id) } end From dde8ed44553626ec8db9ad97eed95c2d12dc4dc7 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 29 Aug 2012 11:58:33 -0400 Subject: [PATCH 084/357] Fix milestone API specs and moved to requests/api Closes #1331 --- spec/requests/api/issues_spec.rb | 2 +- spec/{ => requests}/api/milestones_spec.rb | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) rename spec/{ => requests}/api/milestones_spec.rb (72%) diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb index 2917980b..293ea83a 100644 --- a/spec/requests/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -65,7 +65,7 @@ describe Gitlab::API do describe "DELETE /projects/:id/issues/:issue_id" do it "should delete a project issue" do - delete api("/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}") + delete api("/projects/#{project.code}/issues/#{issue.id}", user) response.status.should == 405 end end diff --git a/spec/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb similarity index 72% rename from spec/api/milestones_spec.rb rename to spec/requests/api/milestones_spec.rb index ce602367..cf5f65f0 100644 --- a/spec/api/milestones_spec.rb +++ b/spec/requests/api/milestones_spec.rb @@ -1,16 +1,17 @@ require 'spec_helper' describe Gitlab::API do + include ApiHelpers + let(:user) { Factory :user } let!(:project) { Factory :project, owner: user } let!(:milestone) { Factory :milestone, project: project } before { project.add_access(user, :read) } - before { return pending } describe "GET /projects/:id/milestones" do it "should return project milestones" do - get "#{api_prefix}/projects/#{project.code}/milestones?private_token=#{user.private_token}" + get api("/projects/#{project.code}/milestones", user) response.status.should == 200 json_response.should be_an Array json_response.first['title'].should == milestone.title @@ -19,7 +20,7 @@ describe Gitlab::API do describe "GET /projects/:id/milestones/:milestone_id" do it "should return a project milestone by id" do - get "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}" + get api("/projects/#{project.code}/milestones/#{milestone.id}", user) response.status.should == 200 json_response['title'].should == milestone.title end @@ -27,7 +28,7 @@ describe Gitlab::API do describe "POST /projects/:id/milestones" do it "should create a new project milestone" do - post "#{api_prefix}/projects/#{project.code}/milestones?private_token=#{user.private_token}", + post api("/projects/#{project.code}/milestones", user), title: 'new milestone' response.status.should == 201 json_response['title'].should == 'new milestone' @@ -37,7 +38,7 @@ describe Gitlab::API do describe "PUT /projects/:id/milestones/:milestone_id" do it "should update a project milestone" do - put "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}", + put api("/projects/#{project.code}/milestones/#{milestone.id}", user), title: 'updated title' response.status.should == 200 json_response['title'].should == 'updated title' From 1dd938d20cb51a8068c9b3ab9041068292d97a9b Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 21:23:43 +0300 Subject: [PATCH 085/357] SCSS refactoring & cleanup. First iteration --- app/assets/stylesheets/common.scss | 159 +++- app/assets/stylesheets/gitlab_bootstrap.scss | 817 ------------------ .../stylesheets/gitlab_bootstrap/blocks.scss | 145 ++++ .../stylesheets/gitlab_bootstrap/buttons.scss | 72 ++ .../stylesheets/gitlab_bootstrap/common.scss | 51 ++ .../stylesheets/gitlab_bootstrap/files.scss | 156 ++++ .../stylesheets/gitlab_bootstrap/lists.scss | 30 + .../stylesheets/gitlab_bootstrap/tables.scss | 41 + .../gitlab_bootstrap/typography.scss | 71 ++ app/assets/stylesheets/main.scss | 31 +- app/assets/stylesheets/projects.css.scss | 385 --------- app/assets/stylesheets/sections/commits.scss | 5 + .../stylesheets/sections/merge_requests.scss | 11 + app/views/keys/_form.html.haml | 4 +- .../merge_requests/show/_mr_title.html.haml | 4 +- app/views/profile/password.html.haml | 2 +- app/views/profile/show.html.haml | 2 +- 17 files changed, 717 insertions(+), 1269 deletions(-) delete mode 100644 app/assets/stylesheets/gitlab_bootstrap.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/blocks.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/buttons.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/common.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/files.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/lists.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/tables.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/typography.scss delete mode 100644 app/assets/stylesheets/projects.css.scss diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 68f862b8..4fa65ac7 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -1,11 +1,9 @@ -.diff_file_header a, -.file_stats a { - color:$style_color; -} - - /** LAYOUT **/ +body { + margin-bottom:20px; +} + .container { padding-top:0; z-index:5; @@ -40,30 +38,6 @@ color: $link_color; } -.widget { - @include shade; - padding:20px; - margin-bottom:20px; - border: 1px solid #DDD; - border-radius: 5px; - background:#fafafa; - - .link_holder { - background:#eee; - position:relative; - left:-20px; - top:20px; - padding:10px 20px; - width:100%; - border-top:1px solid #ccc; - - a { - font-size:14px; - color:#666; - } - } -} - .help li { color:#111 } .back_link { @@ -88,16 +62,6 @@ padding-left:20px; } -.number { - border-radius: 4px; - text-shadow: none; - background: rgba(0,0,0,.12); - text-align: center; - padding: 2px 4px; - line-height:18px; - margin-left:2px; -} - table a code { position: relative; top: -2px; @@ -174,10 +138,6 @@ span.update-author { display:block; } /** END UPDATE ITEM **/ -.ajax-tab-loading { - padding:40px; - display:none; -} .dashboard-loader { float:left; margin:10px; @@ -200,6 +160,117 @@ a.project-update.titled { } } +.neib { + margin-right:10px; +} + +.label { + background-color: #474D57; + + &.label-issue { + background-color: #eee; + border: 1px solid #ccc; + padding:4px 6px; + color:#444; + text-shadow:0 0 1px #fff; + + &.grouped { + float: left; + margin-right: 6px; + padding: 6px; + } + } +} + +.event_label { + @extend .label; + background-color: #999; + + &.pushed { + background-color: #3A87AD; + } + + &.opened { + background-color: #468847; + } + + &.closed { + background-color: #B94A48; + } + + &.merged { + background-color: #2A2; + } +} + +form { + @extend .form-horizontal; + + .actions { + @extend .form-actions; + } + + .clearfix { + @extend .control-group; + } + + .input { + @extend .controls; + } + + label { + @extend .control-label; + } + .xlarge { + @extend .input-xlarge; + } + .xxlarge { + @extend .input-xxlarge; + } +} + + + + + + +.field_with_errors { + display:inline; +} + +ul.breadcrumb { + background:white; + border:none; + li { + display: inline; + text-shadow: 0 1px 0 white + } + + a { + color:#474D57; + font-weight:bold; + font-size:14px; + } + + .arrow { + background: url("images.png") no-repeat -85px -77px; + width: 19px; + height: 16px; + float: left; + position: relative; + left: -10px; + padding:0; + margin:0; + } +} + +input[type=text] { + &.large_text { + padding:6px; + font-size:16px; + } +} + input.git_clone_url { width:325px; } diff --git a/app/assets/stylesheets/gitlab_bootstrap.scss b/app/assets/stylesheets/gitlab_bootstrap.scss deleted file mode 100644 index a1faf060..00000000 --- a/app/assets/stylesheets/gitlab_bootstrap.scss +++ /dev/null @@ -1,817 +0,0 @@ -body { - margin-bottom:20px; -} - -pre { - font-family:'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; - - &.dark { - background: #333; - color:#f5f5f5; - } -} - -a { - outline: none; - color: $link_color; - &:hover { - text-decoration:none; - color: $blue_link; - } - - &.btn { - color: $style_color; - } - - &.dark { - color: $style_color; - } - - &.lined { - text-decoration:underline; - &:hover { text-decoration:underline; } - } - - &.gray { - color:gray; - } - - &.supp_diff_link { - text-align:center; - padding:20px 0; - background:#f1f1f1; - width:100%; - float:left; - } - - &.neib { - margin-right:15px; - } -} - -.neib { - margin-right:10px; -} - -.alert-message { - @extend .alert; - - &.success { - @extend .alert-success; - } - - &.error { - @extend .alert-error; - } -} - -.alert { - &.alert-well { - background:#ddd; - border:1px solid #ccc; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #ddd), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#ddd 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#ddd 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#ddd 6.6%, #dfdfdf); - color:#111; - } -} - -h3, h4, h5, h6 { - line-height: 36px; -} - -h5 { - font-size:14px; -} - - -table { - width:100%; - th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - th, td { - padding: 10px 10px 9px; - line-height: 18px; - text-align: left; - } - - &.bordered-table { - border: 1px solid #DDD; - border-collapse: separate; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - - &.zebra-striped { - @extend .table-striped; - } -} - -.btn { - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: -ms-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: -o-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - - &:hover { - } - - &.btn-primary { - background:$link_color; - border-color: #2A79A3; - &:hover { - background:$blue_link; - } - } - &.primary { - @extend .btn-primary; - } - - &.success { - color: #fff; - text-shadow: 0 0 1px #111; - background: #5bb75b;; - font-weight: bold; - - &:hover { - background-color: #51a351; - color: #fff; - } - } - - &.danger, - &.btn-danger { - color:#fff; - background: #DA4E49; - border-color: #BD362F; - - &:hover { - color:#fff; - background: #EE4E49; - } - } - - &.danger { - @extend .btn-danger; - } - - &.small { - @extend .btn-small; - } - - &.active { - border-color:#aaa; - background-color:#ccc; - } -} - -a:focus { - outline: none; -} - -.nav-pills a:hover { - background-color:#888; -} - -.nav-pills .active a { - background-color: $style_color; -} - -.label { - background-color: #474D57; - &.label-important { - background-color: #B94A48; - } - - &.label-issue { - background-color: #eee; - border: 1px solid #ccc; - padding:4px 6px; - color:#444; - text-shadow:0 0 1px #fff; - - &.grouped { - float: left; - margin-right: 6px; - padding: 6px; - } - } -} - -.nav-tabs > li > a, .nav-pills > li > a { - color:$style_color; -} - -.nav-tabs > .active > a { - font-weight:bold; -} - -/** COLORS **/ -.cgray { color:gray; } -.cred { color:#D12F19; } -.cgreen { color:#44aa22; } -.cblack { color:#111; } -.cdark { color:#444 } -.cwhite { color:#fff !important } -.bgred { background: #F2DEDE !important} - -/** COMMON STYLES **/ -.left { - float:left; -} -.right { - float:right !important; -} -.width-50p{ - width:50%; -} -.width-49p{ - width:49%; -} -.width-30p{ - width:30%; -} -.width-65p{ - width:65%; -} -.width-100p{ - width:100%; -} -.append-bottom-10 { - margin-bottom:10px; -} -.append-bottom-20 { - margin-bottom:20px; -} -.prepend-top-10 { - margin-top:10px; -} - -.prepend-top-20 { - margin-top:20px; -} - -.padded { - padding:20px; -} - -.ipadded { - padding:20px !important; -} -.lborder { - border-left:1px solid #eee; -} - -.borders { - border: 1px solid #ccc; - @include shade; -} -.no-borders { - border:none; -} -table.no-borders { - border:none; - tr, td { border:none } -} -.no-padding { - padding:0 !important; -} -.underlined { - border-bottom: 1px solid $border_color; -} -.vlink { - color: $link_color !important; -} - -.pretty_label { - @include round-borders-all(4px); - padding:2px 4px; - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8)); - background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8); - background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8); - background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8); - color: #777; - border: 1px solid #DEDFE1; - - &.branch { - border:none; - font-size:13px; - background: #474D57; - color:#fff; - font-weight:bold; - font-family: monospace; - } -} - -.event_label { - @extend .label; - background-color: #999; - - &.pushed { - background-color: #3A87AD; - } - - &.opened { - background-color: #468847; - } - - &.closed { - background-color: #B94A48; - } - - &.merged { - background-color: #2A2; - } -} - -img.avatar { - float:left; - margin-right:15px; - width:40px; - border:1px solid #ddd; - padding:1px; - - &.s16 { - width:16px; - height:16px; - } - &.s24 { - width:24px; - height:24px; - } - &.s32 { - width:32px; - height:32px; - } -} - -img.lil_av { - padding-left: 4px; - padding-right:3px; -} - -form { - @extend .form-horizontal; - - .actions { - @extend .form-actions; - } - - .clearfix { - @extend .control-group; - } - - .input { - @extend .controls; - } - - label { - @extend .control-label; - } - .xlarge { - @extend .input-xlarge; - } - .xxlarge { - @extend .input-xxlarge; - } -} - -/** - * List li block element #1 - * - */ -.wll { - background-color: #FFF; - padding: 10px 5px; - min-height: 20px; - border-bottom: 1px solid #eee; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - &.smoke { - background-color:#f5f5f5; - } - &:hover { - background:$hover; - } - &:last-child { border:none } - p { padding-top:5px; margin:0; color:$style_color;} - .author { color: #999; } - p { - color:#222; - margin-bottom: 0; - img { - position:relative; - top:3px; - } - } -} - - -/** - * Block element #2 - * - */ -.entry { - position: relative; - padding: 7px 15px; - margin-bottom: 18px; - color: #404040; - filter:none; - - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - - background:#F1F1F1; - border: 1px solid #ccc; - - - p { - color:$style_color; - margin-bottom: 0; - img { - position:relative; - top:3px; - } - } -} - - -/** - * Big UI Block for show page content - * - */ -.ui-box { - background:#F9F9F9; - margin-bottom: 25px; - @include round-borders-all(4px); - border-color: #CCC; - @include solid_shade; - - ul { - margin:0; - } - - h5, .title { - padding: 0 10px; - @include round-borders-top(4px); - @include bg-gray-gradient; - border-bottom: 1px solid #bbb; - - &.small { - line-height: 28px; - font-size: 14px; - line-height:28px; - text-shadow: 0 1px 1px white; - } - - form { - padding:9px 0; - margin:0px; - } - - .nav-pills { - li { - padding:3px 0; - &.active a { background-color:$style_color; } - a { - border-radius:7px; - } - } - } - } - - .bottom { - @include bg-gray-gradient; - @include round-borders-bottom(4px); - border-bottom:none; - border-top: 1px solid #bbb; - } - - &.padded { - h5, .title { - margin: -20px; - margin-bottom: 0; - padding: 5px 20px; - } - .middle_title { - background:#f5f5f5; - margin:20px -20px; - padding: 0 20px; - border-top:1px solid #eee; - border-bottom:1px solid #eee; - font-size:14px; - color:#777; - } - } - .row_title { - font-weight:bold; - color:#444; - &:hover { - color:#444; - text-decoration:underline; - } - } - - li, .wll { - padding:10px; - &:first-child { - @include round-borders-top(4px); - border-top:none; - } - - &:last-child { - @include round-borders-bottom(4px); - border:none; - } - } - -} - -table.admin-table { - @extend .table-bordered; - @extend .zebra-striped; - @include solid_shade; - th { - border-color: #CCC; - border-bottom: 1px solid #bbb; - @include bg-gray-gradient; - } -} - -.field_with_errors { - display:inline; -} - -ul.breadcrumb { - background:white; - border:none; - li { - display: inline; - text-shadow: 0 1px 0 white - } - - a { - color:#474D57; - font-weight:bold; - font-size:14px; - } - - .arrow { - background: url("images.png") no-repeat -85px -77px; - width: 19px; - height: 16px; - float: left; - position: relative; - left: -10px; - padding:0; - margin:0; - } -} - -.nothing_here_message { - text-align:center; - padding:20px; - color:#777; -} - -/** - * UI box element - * contains top, middle, bottom blocks - * - */ -.main_box { - @extend .borders; - @extend .prepend-top-20; - @extend .append-bottom-20; - border-width:1px; - @include solid_shade; - - - img { max-width: 100%; } - - pre { - code { - background: none !important; - } - } - - .top_box_content, - .middle_box_content, - .bottom_box_content { - padding:15px; - - pre { - background: none !important; - margin:0; - border:none; - padding:0; - } - } - - .middle_box_content { - border-radius:0; - border:none; - font-size:12px; - background-color:#f5f5f5; - border:none; - border-top:1px solid #eee; - } - - .bottom_box_content { - border-top:1px solid #eee; - } -} - -input[type=text] { - &.large_text { - padding:6px; - font-size:16px; - } -} - -p { - &.slead { - color:#456; - font-size:16px; - margin-bottom: 12px; - font-weight: 200; - line-height: 24px; - } -} - -h3.page_title { - color:#456; - font-size:20px; - font-weight: normal; - line-height: 28px; -} - -/** - * File content holder - * - */ -.file_holder { - border:1px solid #CCC; - margin-bottom:1em; - @include solid_shade; - - .file_title { - border-bottom: 1px solid #bbb; - @include bg-gray-gradient; - margin: 0; - font-weight: normal; - font-weight: bold; - text-align: left; - color: #666; - padding: 9px 10px; - height:18px; - - .options { - float:right; - margin-top: -5px; - } - - .file_name { - color:$style_color; - font-size:14px; - text-shadow: 0 1px 1px #fff; - small { - color:#999; - font-size:13px; - } - } - } - .file_content { - background:#fff; - font-size: 11px; - - &.wiki { - font-size: 13px; - code { - padding:0 4px; - } - padding:20px; - h1, h2 { - line-height: 46px; - } - h3, h4 { - line-height: 40px; - } - } - - &.image_file { - background:#eee; - text-align:center; - img { - padding:100px; - max-width:300px; - } - } - - &.blob_file { - - } - - /** - * Blame file - */ - &.blame { - tr { - border-bottom: 1px solid #eee; - } - td { - padding:5px; - } - .author, - .blame_commit { - background:#f5f5f5; - vertical-align:top; - } - .lines { - pre { - padding:0; - margin:0; - background:none; - border:none; - } - } - } - - &.logs { - background:#eee; - max-height: 700px; - overflow-y: auto; - - ol { - margin-left:40px; - padding: 10px 0; - border-left: 1px solid #CCC; - margin-bottom:0; - background: white; - li { - color:#888; - p { - margin:0; - color:#333; - line-height:24px; - padding-left: 10px; - } - - &:hover { - background:$hover; - } - } - } - } - - /** - * Code file - */ - &.code { - padding:0; - td.code { - width: 100%; - .highlight { - margin-left: 55px; - overflow:auto; - overflow-y:hidden; - } - } - .highlight pre { - white-space: pre; - word-wrap:normal; - } - - table.highlighttable { - border: none; - } - body.project-page table.highlighttable td { border: none } - table.highlighttable tr:hover { background:none;} - - table.highlighttable pre{ - line-height:16px !important; - font-size:12px !important; - } - - table.highlighttable .linenodiv pre { - text-align: right; - padding-right: 4px; - color:#666; - } - } - } -} diff --git a/app/assets/stylesheets/gitlab_bootstrap/blocks.scss b/app/assets/stylesheets/gitlab_bootstrap/blocks.scss new file mode 100644 index 00000000..894cb304 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/blocks.scss @@ -0,0 +1,145 @@ +/** + * =================================== + * Contain 3 main UI block elements: + * .main_box - for show pages + * .ui-box - for simple block & widgets + * =================================== + */ + +/** + * UI box element + * contains top, middle, bottom blocks + * + */ +.main_box { + @extend .borders; + @extend .prepend-top-20; + @extend .append-bottom-20; + border-width:1px; + @include solid_shade; + + + img { max-width: 100%; } + + pre { + code { + background: none !important; + } + } + + .top_box_content, + .middle_box_content, + .bottom_box_content { + padding:15px; + + pre { + background: none !important; + margin:0; + border:none; + padding:0; + } + } + + .middle_box_content { + border-radius:0; + border:none; + font-size:12px; + background-color:#f5f5f5; + border:none; + border-top:1px solid #eee; + } + + .bottom_box_content { + border-top:1px solid #eee; + } +} + +/** + * Big UI Block for show page content + * + */ +.ui-box { + background:#F9F9F9; + margin-bottom: 25px; + @include round-borders-all(4px); + border-color: #CCC; + @include solid_shade; + + ul { + margin:0; + } + + h5, .title { + padding: 0 10px; + @include round-borders-top(4px); + @include bg-gray-gradient; + border-bottom: 1px solid #bbb; + + &.small { + line-height: 28px; + font-size: 14px; + line-height:28px; + text-shadow: 0 1px 1px white; + } + + form { + padding:9px 0; + margin:0px; + } + + .nav-pills { + li { + padding:3px 0; + &.active a { background-color:$style_color; } + a { + border-radius:7px; + } + } + } + } + + .bottom { + @include bg-gray-gradient; + @include round-borders-bottom(4px); + border-bottom:none; + border-top: 1px solid #bbb; + } + + &.padded { + h5, .title { + margin: -20px; + margin-bottom: 0; + padding: 5px 20px; + } + .middle_title { + background:#f5f5f5; + margin:20px -20px; + padding: 0 20px; + border-top:1px solid #eee; + border-bottom:1px solid #eee; + font-size:14px; + color:#777; + } + } + .row_title { + font-weight:bold; + color:#444; + &:hover { + color:#444; + text-decoration:underline; + } + } + + li, .wll { + padding:10px; + &:first-child { + @include round-borders-top(4px); + border-top:none; + } + + &:last-child { + @include round-borders-bottom(4px); + border:none; + } + } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss new file mode 100644 index 00000000..8a01230c --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss @@ -0,0 +1,72 @@ +.btn { + @include bg-dark-gray-gradient; + border-color:#aaa; + &:hover { + @include bg-gray-gradient; + border-color:#bbb; + color:#333; + } + + &.btn-primary { + background:$link_color; + border-color: #2A79A3; + &:hover { + background:$blue_link; + color:#fff; + } + } + &.primary { + @extend .btn-primary; + } + + &.success { + color: #fff; + text-shadow: 0 0 1px #111; + background: #5bb75b;; + font-weight: bold; + + &:hover { + background-color: #51a351; + color: #fff; + } + } + + &.save-btn { + @extend .wide; + @extend .primary; + } + + &.cancel-btn { + float:right; + } + + &.wide { + padding-left:30px; + padding-right:30px; + } + + &.danger, + &.btn-danger { + color:#fff; + background: #DA4E49; + border-color: #BD362F; + + &:hover { + color:#fff; + background: #EE4E49; + } + } + + &.danger { + @extend .btn-danger; + } + + &.small { + @extend .btn-small; + } + + &.active { + border-color:#aaa; + background-color:#ccc; + } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/common.scss b/app/assets/stylesheets/gitlab_bootstrap/common.scss new file mode 100644 index 00000000..30f16472 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/common.scss @@ -0,0 +1,51 @@ +/** COLORS **/ +.cgray { color:gray } +.cred { color:#D12F19 } +.cgreen { color:#4a2 } +.cblack { color:#111 } +.cdark { color:#444 } +.cwhite { color:#fff!important } +.bgred { background:#F2DEDE!important } + +/** COMMON CLASSES **/ +.left { float:left } +.right { float:right!important } +.width-50p { width:50% } +.width-49p { width:49% } +.width-30p { width:30% } +.width-65p { width:65% } +.width-100p { width:100% } +.append-bottom-10 { margin-bottom:10px } +.append-bottom-20 { margin-bottom:20px } +.prepend-top-10 { margin-top:10px } +.prepend-top-20 { margin-top:20px } +.padded { padding:20px } +.ipadded { padding:20px!important } +.lborder { border-left:1px solid #eee } +.no-padding { padding:0 !important; } +.underlined { border-bottom: 1px solid #CCC; } +.no-borders { border:none; } +.vlink { color: $link_color !important; } +.borders { border: 1px solid #ccc; @include shade; } + +/** PILLS & TABS**/ +.nav-pills a:hover { background-color:#888; } +.nav-pills .active a { background-color: $style_color; } +.nav-tabs > li > a, .nav-pills > li > a { color:$style_color; } +.nav-tabs > .active > a { font-weight:bold; } + +/** ALERT MESSAGES **/ +.alert-message { @extend .alert; } +.alert-messag.success { @extend .alert-success; } +.alert-message.error { @extend .alert-error; } + +/** AVATARS **/ +img.avatar { float:left; margin-right:15px; width:40px; border:1px solid #ddd; padding:1px; } +img.avatar.s16 { width:16px; height:16px; } +img.avatar.s24 { width:24px; height:24px; } +img.avatar.s32 { width:32px; height:32px; } +img.lil_av { padding-left: 4px; padding-right:3px; } + +/** HELPERS **/ +.nothing_here_message { text-align:center; padding:20px; color:#777; } +p.slead { color:#456; font-size:16px; margin-bottom: 12px; font-weight: 200; line-height: 24px; } diff --git a/app/assets/stylesheets/gitlab_bootstrap/files.scss b/app/assets/stylesheets/gitlab_bootstrap/files.scss new file mode 100644 index 00000000..4ea5ed02 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/files.scss @@ -0,0 +1,156 @@ +/** + * File content holder + * + */ +.file_holder { + border:1px solid #CCC; + margin-bottom:1em; + @include solid_shade; + + .file_title { + border-bottom: 1px solid #bbb; + @include bg-gray-gradient; + margin: 0; + font-weight: normal; + font-weight: bold; + text-align: left; + color: #666; + padding: 9px 10px; + height:18px; + + .options { + float:right; + margin-top: -5px; + } + + .file_name { + color:$style_color; + font-size:14px; + text-shadow: 0 1px 1px #fff; + small { + color:#999; + font-size:13px; + } + } + } + .file_content { + background:#fff; + font-size: 11px; + + &.wiki { + font-size: 13px; + code { + padding:0 4px; + } + padding:20px; + h1, h2 { + line-height: 46px; + } + h3, h4 { + line-height: 40px; + } + } + + &.image_file { + background:#eee; + text-align:center; + img { + padding:100px; + max-width:300px; + } + } + + &.blob_file { + + } + + /** + * Blame file + */ + &.blame { + tr { + border-bottom: 1px solid #eee; + } + td { + padding:5px; + } + .author, + .blame_commit { + background:#f5f5f5; + vertical-align:top; + } + .lines { + pre { + padding:0; + margin:0; + background:none; + border:none; + } + } + } + + &.logs { + background:#eee; + max-height: 700px; + overflow-y: auto; + + ol { + margin-left:40px; + padding: 10px 0; + border-left: 1px solid #CCC; + margin-bottom:0; + background: white; + li { + color:#888; + p { + margin:0; + color:#333; + line-height:24px; + padding-left: 10px; + } + + &:hover { + background:$hover; + } + } + } + } + + /** + * Code file + */ + &.code { + padding:0; + td.code { + width: 100%; + .highlight { + margin-left: 55px; + overflow:auto; + overflow-y:hidden; + } + } + .highlight pre { + white-space: pre; + word-wrap:normal; + } + + table.highlighttable { + border: none; + } + body.project-page table.highlighttable td { border: none } + table.highlighttable tr:hover { background:none;} + + table.highlighttable pre{ + line-height:16px !important; + font-size:12px !important; + } + + table.highlighttable .linenodiv pre { + text-align: right; + padding-right: 4px; + color:#666; + } + } + } +} + diff --git a/app/assets/stylesheets/gitlab_bootstrap/lists.scss b/app/assets/stylesheets/gitlab_bootstrap/lists.scss new file mode 100644 index 00000000..402ba04b --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/lists.scss @@ -0,0 +1,30 @@ +/** LISTS **/ + +ul { + /** + * List li block element #1 + * + */ + .wll { + background-color: #FFF; + padding: 10px 5px; + min-height: 20px; + border-bottom: 1px solid #eee; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + + &.smoke { background-color:#f5f5f5; } + &:hover { background:$hover; } + &:last-child { border:none } + .author { color: #999; } + + p { + padding-top:5px; + margin:0; + color:#222; + img { + position:relative; + top:3px; + } + } + } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/tables.scss b/app/assets/stylesheets/gitlab_bootstrap/tables.scss new file mode 100644 index 00000000..f78b1dee --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/tables.scss @@ -0,0 +1,41 @@ +table { + width:100%; + th { + padding-top: 9px; + font-weight: bold; + vertical-align: middle; + } + th, td { + padding: 10px 10px 9px; + line-height: 18px; + text-align: left; + } + + &.bordered-table { + border: 1px solid #DDD; + border-collapse: separate; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + &.zebra-striped { + @extend .table-striped; + } +} + +table.admin-table { + @extend .table-bordered; + @extend .zebra-striped; + @include solid_shade; + th { + border-color: #CCC; + border-bottom: 1px solid #bbb; + @include bg-gray-gradient; + } +} + +table.no-borders { + border:none; + tr, td { border:none } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/typography.scss b/app/assets/stylesheets/gitlab_bootstrap/typography.scss new file mode 100644 index 00000000..c93a64bd --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/typography.scss @@ -0,0 +1,71 @@ +/** + * Headers + * + */ +h3, h4, h5, h6 { line-height: 36px; } +h5 { font-size:14px; } +h3.page_title { + color:#456; + font-size:20px; + font-weight: normal; + line-height: 28px; +} + +/** CODE **/ +pre { + font-family:'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; + + &.dark { + background: #333; + color:#f5f5f5; + } +} + +/** + * Links + * + */ +a { + outline: none; + color: $link_color; + &:hover { + text-decoration:none; + color: $blue_link; + } + + &.btn { + color: $style_color; + &:hover { + color: $style_color; + } + } + + &.dark { + color: $style_color; + } + + &.lined { + text-decoration:underline; + &:hover { text-decoration:underline; } + } + + &.gray { + color:gray; + } + + &.supp_diff_link { + text-align:center; + padding:20px 0; + background:#f1f1f1; + width:100%; + float:left; + } + + &.neib { + margin-right:15px; + } +} + +a:focus { + outline: none; +} diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index b4f0ebf8..4b7c0171 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -2,24 +2,8 @@ @import "bootstrap-responsive"; /** GITLAB colors **/ -$text_color:#222; -$lite_text_color: #666; $link_color:#2A79A3; -$active_link_color:#2FA0BB; -$active_bg_color:#79C3E0; -$active_bd_color: #2FA0BB; -$border_color:#CCC; -$lite_border_color:#EEE; -$min_app_width:980px; -$max_app_width:980px; -$app_padding:20px; -$bg_color: #FFF; -$styled_border_color: #2FA0BB; -$color: "#4BB8D2"; $blue_link: #2fa0bb; - - -/** Style colors **/ $style_color: #474D57; $hover: #FDF5D9; @@ -80,6 +64,13 @@ $hover: #FDF5D9; background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); } +@mixin bg-dark-gray-gradient { + background:#eee; + background-image: -webkit-linear-gradient(#e9e9e9, #d7d7d7); + background-image: -moz-linear-gradient(#e9e9e9, #d7d7d7); + background-image: -o-linear-gradient(#e9e9e9, #d7d7d7); +} + /** * Header of application. * Contain application logo, search panel, profile icon @@ -119,7 +110,13 @@ $hover: #FDF5D9; * Overrides some styles of twitter bootstrap. * Also give some common classes for gitlab app */ -@import "gitlab_bootstrap.scss"; +@import "gitlab_bootstrap/common.scss"; +@import "gitlab_bootstrap/typography.scss"; +@import "gitlab_bootstrap/buttons.scss"; +@import "gitlab_bootstrap/blocks.scss"; +@import "gitlab_bootstrap/files.scss"; +@import "gitlab_bootstrap/tables.scss"; +@import "gitlab_bootstrap/lists.scss"; /** diff --git a/app/assets/stylesheets/projects.css.scss b/app/assets/stylesheets/projects.css.scss deleted file mode 100644 index 4bdf5dee..00000000 --- a/app/assets/stylesheets/projects.css.scss +++ /dev/null @@ -1,385 +0,0 @@ -.git_url_wrapper { margin-right:50px } - -.sidebar aside a{ - display: block; - position: relative; - padding: 15px 10px; - margin: 10px 0 0 0; - - font-size:13px; - font-weight:bold; - color:#333; - - &.current { - color: white; - background: $active_bg_color; - border: 1px solid $active_bd_color; - border-radius:5px; - - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topright: 0px; - -moz-border-radius-bottomright: 0px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - margin-right: -1px; - } -} - -body table .commit a{color: #{$blue_link}} -body table th, body table td{ border-bottom: 1px solid #DEE2E3;} -body .fixed{position: fixed; } - -/** File stat **/ -.file_stats { - span { - img { - width:14px; - float:left; - margin-right: 6px; - padding:2px 0; - } - } -} - -.round-borders { - @include round-borders-all(4px); - padding: 4px 0px; -} - -table.round-borders { - float:left; - text-align: left; -} - - - -/** PROJECTS **/ -input.ssh_project_url { - padding:5px; - margin:0px; - float:right; - width:400px; - text-align:center; -} - -#projects-list .project { - height:50px; -} - -#tree-slider .tree-item, -#projects-list .project, -#snippets-table .snippet, -#issues-table .issue{ - cursor:pointer; -} - -.clear { - clear: both; -} - - - -#user_projects_limit{ - width: 60px; -} - -.handle:hover{ - cursor: move; -} - -.project-refs-form { - span { - background: none !important; - position:static !important; - width:auto !important; - height: auto !important; - } -} - -.project-refs-select { - width:200px; -} - -.filter .left { margin-right:15px; } - -body table .commit { - a.tree-commit-link { - color:#444; - &:hover { - text-decoration:underline; - } - } -} - -/** NEW PROJECT **/ -.new-project-hodler { - .icon span { background-position: -31px -70px; } - td { border-bottom: 1px solid #DEE2E3; } -} - -/** Feed entry **/ -.commit, -.snippet, -.message { - .title { - color:#666; - a { color:#666 !important; } - p { margin-top:0px; } - } - .author { color: #999 } -} - -/** JQuery UI **/ -.ui-autocomplete { @include round-borders-all(5px); } -.ui-menu-item { cursor: pointer } -.ui-selectmenu{ - @include round-borders-all(4px); - margin-right:10px; - font-size:1.5em; - height:auto; - font-weight:bold; - .ui-selectmenu-status { - padding:3px 10px; - } -} - -#holder { - background:#FAFAFA; - border: 1px solid #EEE; - cursor: move; - height: 70%; - overflow: hidden; -} - -/* Project Dashboard Page */ -html, body { height: 100%; } - -.news-feed h2{float: left;} -.news-feed .project-updates {margin-bottom: 20px; display: block; width: 100%;} -.news-feed .project-updates .data{ padding: 0} -.news-feed .project-updates a.project-update {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;} -.news-feed .project-updates a.project-update:last-child{border-bottom: 0} -.news-feed .project-updates a.project-update img{float: left; margin-right: 10px;} -.news-feed .project-updates a.project-update span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;} -.news-feed .project-updates a.project-update span.update-title{margin-bottom: 10px} -.news-feed .project-updates a.project-update span.update-author{color: #999; font-weight: normal; font-style: italic;} -.news-feed .project-updates a.project-update span.update-author strong{font-weight: bold; font-style: normal;} -/* eo Dashboard Page */ - - -/** Update entry **/ -.update-data { padding: 0 } -.update-data { width:100%; } -.update-data.ui-box .data { padding:0; } -a.update-item {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;} -a.update-item:last-child{border-bottom: 0} -a.update-item img{float: left; margin-right: 10px;} -a.update-item span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;} -a.update-item span.update-title{margin-bottom: 10px} -a.update-item span.update-author{color: #999; font-weight: normal; font-style: italic;} -a.update-item span.update-author strong{font-weight: bold; font-style: normal;} - - -body .team_member_new .span-6, .team_member_edit .span-6{ padding:10px 0; } - -body.projects-page input.text.git-url.project_list_url { width:165px; } - - -body table.no-borders th { - background:none; - border-bottom:1px solid #CCC; - color:#333; -} - -body table.no-borders tr, -body table.no-borders td{ - border:none; -} - -.ajax-tab-loading { - padding:40px; - display:none; -} - -#tree-content-holder { float:left; width:100%; } - -#tree-readme-holder { - float:left; - width:100%; - - .readme { - @include round-borders-all(4px); - padding: 4px 15px; - background:#F7F7F7; - } -} - - - -/* Commit Page */ -.entity-info {float: right;} -.entity-button{ - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.192, #fff), to(#f4f4f4)); - background-image: -webkit-linear-gradient(#fff 19.2%, #f4f4f4); - background-image: -moz-linear-gradient(#fff 19.2%, #f4f4f4); - background-image: -o-linear-gradient(#fff 19.2%, #f4f4f4); - box-shadow: 0 -1px 0 white inset; - display: block; - border: 1px solid #eee; - border-radius: 5px; - margin-bottom: 2px; - position: relative; - padding: 4px 10px; - font-size: 11px; - padding-right: 20px; -} - -.entity-button i{ - background: url('images.png') no-repeat -138px -27px; - width: 6px; - height: 9px; - float: right; - position: absolute; - top: 6px; - right: 5px; -} -.box-arrow{float: right; background: #E3E5EA; padding: 10px; border-radius: 5px; margin-top: 2px; text-shadow: none; color: #999; margin: 1.5em 0;} - -h4.dash-tabs { - margin: 0; - border-bottom: 1px solid #ccc; - padding: 10px 10px; - font-size: 11px; - padding-left:20px; - font-weight: bold; text-transform: uppercase; - background: #F7F7F7; - margin-bottom:20px; - height:13px; - -} - -.dash-button { - border-right: 1px solid #ddd; - background:none; - padding: 10px 15px; - float:left; - position:relative; - top:-10px; - left:0px; - height:13px; - - &:first-child { - border-left: 1px solid #ddd; - } - &.active { - background: #eaeaea; - } -} - - -.dashboard-loader { - float:right; - margin-right:30px; - display:none; -} - - -.merge-tabs { - margin: 0; - border: 1px solid #ccc; - padding: 5px; - font-size: 12px; - background: #F7F7F7; - margin-bottom:20px; - height:26px; - - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - - .tab { - font-weight: bold; - border-right: 1px solid #ddd; - background:none; - padding: 10px; - min-width:60px; - float:left; - position:relative; - top:-5px; - left:-5px; - height:16px; - padding-left:34px; - - span { - width: 20px; - height: 20px; - display: inline-block; - position: absolute; - left: 8px; - top: 8px; - } - - &.active { - background: #eaeaea; - } - } -} -.merge-tabs.repository .tab span{ background: url("images.png") no-repeat -38px -77px; } -.activities-tab span { background: url("images.png") no-repeat -161px -1px; } -.stat-tab span, -.team-tab span, -.snippets-tab span { background: url("images.png") no-repeat -38px -77px; } -.files-tab span { background: url("images.png") no-repeat -112px -23px; } - -.merge-notes-tab span { background: url("images.png") no-repeat -161px -1px; } -.merge-commits-tab span { background: url("images.png") no-repeat -86px 1px; } -.merge-diffs-tab span { background: url("images.png") no-repeat -118px 1px; } -.merge-tabs .dashboard-loader { padding:8px; } - -.user-mention { - color: #2FA0BB; - font-weight: bold; -} - -.author { - color: #999; -} - - - - -.dark_scheme_box { - padding:20px 0; - - label { - float:left; - box-shadow: 0 0px 5px rgba(0,0,0,.3); - - img { - } - } -} - -a.project-update.titled { - position: relative; - padding-left: 235px !important; - - .title-block { - padding: 10px; - width: 205px; - position: absolute; - left: 0; - top: 0; - } -} - -.add_new { - float: right; - background: #A6B807; - color: white; - padding: 4px 10px; - @include round-borders-all(4px); - font-size:11px; - margin: 10px 0; -} diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index e2db701d..d42c0077 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -207,3 +207,8 @@ font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; } } + +.diff_file_header a, +.file_stats a { + color:$style_color; +} diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index ec84a64e..d0486dcf 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -99,3 +99,14 @@ li.merge_request { @extend .padded; @extend .append-bottom-10; } + +.label_branch { + @include round-borders-all(4px); + padding:2px 4px; + border:none; + font-size:13px; + background: #474D57; + color:#fff; + font-weight:bold; + font-family: monospace; +} diff --git a/app/views/keys/_form.html.haml b/app/views/keys/_form.html.haml index 9c6e229b..26700803 100644 --- a/app/views/keys/_form.html.haml +++ b/app/views/keys/_form.html.haml @@ -19,6 +19,6 @@ .actions - = f.submit 'Save', class: "primary btn" - = link_to "Cancel", keys_path, class: "btn" + = f.submit 'Save', class: "btn save-btn" + = link_to "Cancel", keys_path, class: "btn cancel-btn" diff --git a/app/views/merge_requests/show/_mr_title.html.haml b/app/views/merge_requests/show/_mr_title.html.haml index 31fa0779..3ae1050d 100644 --- a/app/views/merge_requests/show/_mr_title.html.haml +++ b/app/views/merge_requests/show/_mr_title.html.haml @@ -1,9 +1,9 @@ %h3.page_title = "Merge Request ##{@merge_request.id}:"   - %span.pretty_label.branch= @merge_request.source_branch + %span.label_branch= @merge_request.source_branch → - %span.pretty_label.branch= @merge_request.target_branch + %span.label_branch= @merge_request.target_branch %span.right - if @merge_request.merged? diff --git a/app/views/profile/password.html.haml b/app/views/profile/password.html.haml index 257dacb1..d0aee7ac 100644 --- a/app/views/profile/password.html.haml +++ b/app/views/profile/password.html.haml @@ -16,4 +16,4 @@ = f.label :password_confirmation .input= f.password_field :password_confirmation .actions - = f.submit 'Save', class: "btn primary" + = f.submit 'Save', class: "btn save-btn" diff --git a/app/views/profile/show.html.haml b/app/views/profile/show.html.haml index a7b6a18a..22e840a0 100644 --- a/app/views/profile/show.html.haml +++ b/app/views/profile/show.html.haml @@ -67,4 +67,4 @@ = link_to "Add Public Key", new_key_path, class: "btn small right" .form-actions - = f.submit 'Save', class: "btn-primary btn" + = f.submit 'Save', class: "btn save-btn" From 51558bd57a7021a31d4e60342078e48a3dcb805a Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 29 Aug 2012 22:29:50 +0300 Subject: [PATCH 086/357] Refactoring scss & improving some UI elements --- app/assets/images/merge.png | Bin 0 -> 593 bytes app/assets/stylesheets/common.scss | 175 +----------------- .../stylesheets/gitlab_bootstrap/buttons.scss | 16 ++ .../stylesheets/gitlab_bootstrap/common.scss | 1 + app/assets/stylesheets/sections/commits.scss | 15 ++ app/assets/stylesheets/sections/issues.scss | 8 + .../stylesheets/sections/merge_requests.scss | 45 +++-- app/assets/stylesheets/sections/projects.scss | 5 +- app/views/commits/_commit.html.haml | 4 +- app/views/events/_event_last_push.html.haml | 2 +- app/views/issues/_form.html.haml | 11 +- app/views/merge_requests/_form.html.haml | 18 +- app/views/projects/_form.html.haml | 13 +- app/views/projects/_new_form.html.haml | 4 +- 14 files changed, 101 insertions(+), 216 deletions(-) create mode 100644 app/assets/images/merge.png diff --git a/app/assets/images/merge.png b/app/assets/images/merge.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6bb2e154d6f724080f232e5bbb9dc21f99f7fc GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo7>k44ofy`glX=O&z`&N| z?e41LH+c z7sn8f<7cOC?7A8t(6-+`j%Bv)7QqzhgYF-eh_OmLda`gwO6P77;MVSLVbS@*xJ^)A zkJzE_>(%I>tx0Q@^4ABdx`rT~jAqWH|XwyE3Cfa#hVWm7^^} zlD8F3PSW$P6TJS@vmqdrUAXJ@ABzpFIZSb~cXm643qEgeQ%I@kuU+kX+P`q>#U)Se z4zPW=Wx=sF+n{KCy{{(+%zlfSFBJVWy;b&;5HQBFlFCfM)0R!nyg3TRczZY~q}9WpxG9N1c$HlAX&he%Y*N5X3%bLzACU zWJB$G-&4;gGv#<+;(w!^8+ERIX9vU0YZDHwVz0KmUAu3I>|<$==+%qMRE~_;_=1Xae`>rf|`aIw{ zJ5$D*YYR_pQ@#7P^?y^zM$fLJCAYt9|IJpi(6j64{AqV4xh!UXC1Jq6&OCFY@T(p( sP4&Ig-yaFxSGZ*Qzr@}D=ikt`$UamPaiF-9fq{X+)78&qol`;+0GkQ|YXATM literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 4fa65ac7..d07912f4 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -105,16 +105,6 @@ table a code { .git_url_wrapper { margin-right:50px } -.file_stats { - span { - img { - width:14px; - float:left; - margin-right:6px; - padding:2px 0; - } - } -} .handle:hover { cursor:move; @@ -148,18 +138,6 @@ span.update-author { font-weight:bold; } -a.project-update.titled { - position:relative; - padding-left:35% !important; - .title-block { - padding:10px; - width:35%; - position:absolute; - left:0; - top:0; - } -} - .neib { margin-right:10px; } @@ -230,10 +208,6 @@ form { } - - - - .field_with_errors { display:inline; } @@ -343,40 +317,6 @@ p.time { } -/** - * Dashboard page - * - */ -.dashboard_category { - margin-bottom:30px; - h3 a { - color:#474D57; - &:hover { - text-decoration:underline; - } - } - - .dashboard_block { - .dash_project_item { - margin-bottom:10px; - border:none; - padding:0px 5px; - .project_link { - color:#888; - &:hover { - color:#111; - .ico.project { - background-position:-209px -21px; - } - } - } - h4 { - color:#666; - } - } - } -} - .styled_image { border:2px solid #ddd; } @@ -466,39 +406,6 @@ p.time { } } -.btn { - &.very_small { - font-size:11px; - padding:2px 6px; - margin:2px; - } - - &.grouped { - margin-right:7px; - float:left; - } - - &.padded { - margin-right:3px; - padding:4px 10px 4px; - } -} - - -.prettyprint { - background-color: #fefbf3; - padding: 9px; - border: 1px solid rgba(0,0,0,.2); - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 2px rgba(0,0,0,.1); - box-shadow: 0 1px 2px rgba(0,0,0,.1); -} - -.hint { - font-style: italic; - color: #999; -} - .upvotes { font-size: 14px; font-weight: bold; @@ -622,14 +529,6 @@ li.note { } -/** - * Milestones list - * - */ - -.milestone { - @extend .wll; -} /** * Admin area @@ -676,11 +575,10 @@ li.note { * */ .event_lp { - @extend .alert-info; + @extend .ui-box; + color:#777; margin-bottom:20px; padding:8px; - border-style: solid; - border-width: 1px; @include border-radius(4px); min-height:22px; @@ -694,88 +592,19 @@ li.note { cursor:pointer; } -/** - * Issues, MRs legend - * - */ - -.list_legend { - float:left; - margin-right:20px; - .icon { - width:12px; - height:12px; - float:left; - margin-right:5px; - margin-top: 2px; - @include border-radius(4px); - &.today{ - background: #ADA; - border:1px solid #8B8; - } - &.closed { - background: #DDD; - border:1px solid #BBB; - } - &.yours { - background: #AAD; - border:1px solid #88B; - } - &.merged { - background: #DAD; - border:1px solid #B8B; - } - } - .text { - padding-bottom: 10px; - float:left; - } -} - .merge_request, .issue { - .list_legend { - margin-right: 5px; - margin-top: 14px; - .icon { - width:8px; - height:8px; - float:left; - margin-right:5px; - @include border-radius(4px); - border:1px solid #ddd; - } - } - &.today{ background: #EFE; border-color:#CEC; - .icon { - background: #ADA; - border:1px solid #8B8; - } } &.closed { background: #F5f5f5; border-color:#E5E5E5; - .icon { - background: #DDD; - border:1px solid #BBB; - } - } - &.yours { - .icon { - background: #AAD; - border:1px solid #88B; - } } &.merged { background: #F5f5f5; border-color:#E5E5E5; - .icon { - background: #DAD; - border:1px solid #B8B; - } } } diff --git a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss index 8a01230c..89b292dc 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss @@ -69,4 +69,20 @@ border-color:#aaa; background-color:#ccc; } + + &.very_small { + font-size:11px; + padding:2px 6px; + margin:2px; + } + + &.grouped { + margin-right:7px; + float:left; + } + + &.padded { + margin-right:3px; + padding:4px 10px 4px; + } } diff --git a/app/assets/stylesheets/gitlab_bootstrap/common.scss b/app/assets/stylesheets/gitlab_bootstrap/common.scss index 30f16472..cd7145c9 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/common.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/common.scss @@ -27,6 +27,7 @@ .no-borders { border:none; } .vlink { color: $link_color !important; } .borders { border: 1px solid #ccc; @include shade; } +.hint { font-style: italic; color: #999; } /** PILLS & TABS**/ .nav-pills a:hover { background-color:#888; } diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index d42c0077..75e38aee 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -206,9 +206,24 @@ min-width:65px; font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; } + + .commit-author-name { + color: #777; + } } .diff_file_header a, .file_stats a { color:$style_color; } + +.file_stats { + span { + img { + width:14px; + float:left; + margin-right:6px; + padding:2px 0; + } + } +} diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 1b61ec3f..6db4b987 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -99,3 +99,11 @@ input.check_all_issues { #update_status { width:100px; } + +/** + * Milestones list + * + */ +.milestone { + @extend .wll; +} diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index d0486dcf..3a134531 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -11,23 +11,6 @@ background:#f1f1f1; } - .commit { - margin:0; - padding:0; - padding: 5px; - margin-bottom: 5px; - - .committed_ago { - display:none; - } - .browse_code_link_holder { - display:none; - } - list-style:none; - &:hover { - background:none; - } - } } /** @@ -110,3 +93,31 @@ li.merge_request { font-weight:bold; font-family: monospace; } + +.mr_source_commit, +.mr_target_commit { + .commit { + margin:0; + padding:0; + padding: 5px; + margin-bottom: 5px; + .avatar { position:relative } + .row_title { + color:#444; + } + .commit-author-name, + .dash, + .committed_ago, + .browse_code_link_holder { + display:none; + } + list-style:none; + &:hover { + background:none; + } + } +} + +.mr_direction_tip { + margin-top:40px +} diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 20fd2cbf..7aa40029 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -33,11 +33,14 @@ color:#888; } .btn { - padding:6px; + padding:6px 10px; margin-left:10px; margin-bottom:8px; } } + .adv_settings { + h6 { margin-left:40px; } + } } .project_clone_panel { diff --git a/app/views/commits/_commit.html.haml b/app/views/commits/_commit.html.haml index 686a4337..61371d14 100644 --- a/app/views/commits/_commit.html.haml +++ b/app/views/commits/_commit.html.haml @@ -4,8 +4,8 @@ %strong= link_to "Browse Code »", tree_project_ref_path(@project, commit.id), class: "right" %p = link_to commit.short_id(8), project_commit_path(@project, id: commit.id), class: "commit_short_id" - %strong.cgray= commit.author_name - – + %strong.commit-author-name= commit.author_name + %span.dash – = image_tag gravatar_icon(commit.author_email), class: "avatar", width: 16 = link_to_gfm truncate(commit.title, length: 50), project_commit_path(@project, id: commit.id), class: "row_title" diff --git a/app/views/events/_event_last_push.html.haml b/app/views/events/_event_last_push.html.haml index 4ef92749..66e14936 100644 --- a/app/views/events/_event_last_push.html.haml +++ b/app/views/events/_event_last_push.html.haml @@ -9,5 +9,5 @@ at %strong= link_to event.project.name, event.project - = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn very_small primary" do + = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn very_small" do Create Merge Request diff --git a/app/views/issues/_form.html.haml b/app/views/issues/_form.html.haml index 65bf605a..db7920b9 100644 --- a/app/views/issues/_form.html.haml +++ b/app/views/issues/_form.html.haml @@ -43,14 +43,15 @@ .actions - if @issue.new_record? - = f.submit 'Submit new issue', class: "primary btn" + = f.submit 'Submit new issue', class: "btn save-btn" -else - = f.submit 'Save changes', class: "primary btn" + = f.submit 'Save changes', class: "save-btn btn" + - cancel_class = 'btn cancel-btn' - if request.xhr? - = link_to "Cancel", "#back", onclick: "backToIssues();", class: "btn" + = link_to "Cancel", "#back", onclick: "backToIssues();", class: cancel_class - else - if @issue.new_record? - = link_to "Cancel", project_issues_path(@project), class: "btn" + = link_to "Cancel", project_issues_path(@project), class: cancel_class - else - = link_to "Cancel", project_issue_path(@project, @issue), class: "btn" + = link_to "Cancel", project_issue_path(@project, @issue), class: cancel_class diff --git a/app/views/merge_requests/_form.html.haml b/app/views/merge_requests/_form.html.haml index b6c12397..7e5c851b 100644 --- a/app/views/merge_requests/_form.html.haml +++ b/app/views/merge_requests/_form.html.haml @@ -9,7 +9,7 @@ %br .row - .span6 + .span5 .mr_branch_box %h5 From (Head Branch) .body @@ -17,10 +17,11 @@ = f.label :source_branch, "From", class: "control-label" .controls = f.select(:source_branch, @project.heads.map(&:name), { include_blank: "Select branch" }, style: "width:250px") - .bottom_commit - .mr_source_commit + .mr_source_commit - .span6 + .span2 + %center= image_tag "merge.png", class: 'mr_direction_tip' + .span5 .mr_branch_box %h5 To (Base Branch) .body @@ -28,8 +29,7 @@ = f.label :target_branch, "To", class: "control-label" .controls = f.select(:target_branch, @project.heads.map(&:name), { include_blank: "Select branch" }, style: "width:250px") - .bottom_commit - .mr_target_commit + .mr_target_commit %h4.cdark 2. Fill info @@ -48,12 +48,12 @@ .control-group .form-actions - = f.submit 'Save', class: "btn-primary btn" + = f.submit 'Save', class: "btn save-btn" - if @merge_request.new_record? - = link_to project_merge_requests_path(@project), class: "btn" do + = link_to project_merge_requests_path(@project), class: "btn cancel-btn" do Cancel - else - = link_to project_merge_request_path(@project, @merge_request), class: "btn" do + = link_to project_merge_request_path(@project, @merge_request), class: "btn cancel-btn" do Cancel diff --git a/app/views/projects/_form.html.haml b/app/views/projects/_form.html.haml index ce66b2cf..8bdeda1c 100644 --- a/app/views/projects/_form.html.haml +++ b/app/views/projects/_form.html.haml @@ -10,9 +10,9 @@ .input = f.text_field :name, placeholder: "Example Project", class: "xxlarge" - %h5.page_title - .alert.alert-info - %h5 Advanced settings: + %hr + .adv_settings + %h6 Advanced settings: .clearfix = f.label :path do Path @@ -34,8 +34,9 @@ .input= f.select(:default_branch, @project.heads.map(&:name), {}, style: "width:210px;") - unless @project.new_record? - .alert.alert-info - %h5 Features: + %hr + .adv_settings + %h6 Features: .clearfix = f.label :issues_enabled, "Issues" @@ -56,7 +57,7 @@ %br .actions - = f.submit 'Save', class: "btn primary" + = f.submit 'Save', class: "btn save-btn" = link_to 'Cancel', @project, class: "btn" - unless @project.new_record? .right diff --git a/app/views/projects/_new_form.html.haml b/app/views/projects/_new_form.html.haml index 5104df83..b1aafc37 100644 --- a/app/views/projects/_new_form.html.haml +++ b/app/views/projects/_new_form.html.haml @@ -10,8 +10,8 @@ = f.submit 'Create project', class: "btn primary" %hr - .alert.alert-info - %h5 Advanced settings: + %div.adv_settings + %h6 Advanced settings: .clearfix = f.label :path do Git Clone From 491f63794b40a7ca13de8d30227ad92a1ea04bbe Mon Sep 17 00:00:00 2001 From: Marvin Monge Date: Wed, 29 Aug 2012 19:11:22 -0600 Subject: [PATCH 087/357] nginx vhost standard --- doc/installation.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/installation.md b/doc/installation.md index 7d3c2c41..8c77d4f0 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -246,12 +246,13 @@ You can login via web using admin generated with setup: Add gitlab to nginx sites & change with your host specific settings - cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-enabled/gitlab + sudo cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-available/gitlab + sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab # Change **YOUR_SERVER_IP** and **YOUR_SERVER_FQDN** # to the IP address and fully-qualified domain name # of the host serving GitLab. - vim /etc/nginx/sites-enabled/nginx-gitlab + sudo vim /etc/nginx/sites-enabled/gitlab Restart nginx: From 793db070f0fe61c05359f34b34af0dd6f91d129a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 30 Aug 2012 08:13:36 +0300 Subject: [PATCH 088/357] Restyled projects list on dashboard --- app/assets/stylesheets/sections/projects.scss | 28 ++++++++++++++++++- app/helpers/application_helper.rb | 15 ++++++++-- app/views/dashboard/index.html.haml | 17 ++++++----- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 7aa40029..3d5aa80b 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -14,6 +14,32 @@ text-shadow: 0 1px 1px #fff; padding: 2px 10px; } + ul { + li { + padding:0; + a { + display:block; + .project_name { + color:#4fa2bd; + font-size:14px; + line-height:18px; + } + .arrow { + float:right; + padding:10px; + margin:0; + } + .last_activity { + padding-top:5px; + display:block; + span, strong { + font-size:12px; + color:#666; + } + } + } + } + } @extend .leftbar; @extend .ui-box; } @@ -39,7 +65,7 @@ } } .adv_settings { - h6 { margin-left:40px; } + h6 { margin-left:40px; } } } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 38191f55..3dafb753 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -78,16 +78,16 @@ module ApplicationHelper end def show_last_push_widget?(event) - event && + event && event.last_push_to_non_root? && !event.rm_ref? && - event.project && + event.project && event.project.merge_requests_enabled end def tab_class(tab_key) active = case tab_key - + # Project Area when :wall; wall_tab? when :wiki; controller.controller_name == "wikis" @@ -126,4 +126,13 @@ module ApplicationHelper def hexdigest(string) Digest::SHA1.hexdigest string end + + def project_last_activity project + activity = project.last_activity + if activity && activity.created_at + time_ago_in_words(activity.created_at) + " ago" + else + "Never" + end + end end diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml index ba7d019c..e13640fb 100644 --- a/app/views/dashboard/index.html.haml +++ b/app/views/dashboard/index.html.haml @@ -19,13 +19,16 @@ = link_to new_project_path, class: "btn very_small info" do %i.icon-plus New Project - - @projects.each do |project| - = link_to project_path(project), class: dom_class(project) do - %h4 - %span.ico.project - = truncate(project.name, length: 25) - %span.right - → + %ul.unstyled + - @projects.each do |project| + %li.wll + = link_to project_path(project), class: dom_class(project) do + %strong.project_name= truncate(project.name, length: 25) + %span.arrow + → + %span.last_activity + %strong Last activity: + %span= project_last_activity(project) .bottom= paginate @projects, theme: "gitlab" %hr From 4e4740285261a098b364e804a906a349731e71a3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 30 Aug 2012 09:09:42 +0300 Subject: [PATCH 089/357] Fixed project last_activity. Links color changed a bit --- app/assets/stylesheets/gitlab_bootstrap/buttons.scss | 8 ++++---- .../stylesheets/gitlab_bootstrap/typography.scss | 12 ++++++------ app/assets/stylesheets/main.scss | 12 ++++++------ app/models/project.rb | 8 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss index 89b292dc..9966e81b 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss @@ -8,7 +8,7 @@ } &.btn-primary { - background:$link_color; + background:#2a79A3; border-color: #2A79A3; &:hover { background:$blue_link; @@ -31,16 +31,16 @@ } } - &.save-btn { + &.save-btn { @extend .wide; @extend .primary; } - &.cancel-btn { + &.cancel-btn { float:right; } - &.wide { + &.wide { padding-left:30px; padding-right:30px; } diff --git a/app/assets/stylesheets/gitlab_bootstrap/typography.scss b/app/assets/stylesheets/gitlab_bootstrap/typography.scss index c93a64bd..97e85492 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/typography.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/typography.scss @@ -1,10 +1,10 @@ -/** +/** * Headers - * + * */ h3, h4, h5, h6 { line-height: 36px; } h5 { font-size:14px; } -h3.page_title { +h3.page_title { color:#456; font-size:20px; font-weight: normal; @@ -21,9 +21,9 @@ pre { } } -/** +/** * Links - * + * */ a { outline: none; @@ -35,7 +35,7 @@ a { &.btn { color: $style_color; - &:hover { + &:hover { color: $style_color; } } diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 4b7c0171..be27d754 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -2,13 +2,13 @@ @import "bootstrap-responsive"; /** GITLAB colors **/ -$link_color:#2A79A3; +$link_color:#3A89A3; $blue_link: #2fa0bb; -$style_color: #474D57; -$hover: #FDF5D9; +$style_color: #474d57; +$hover: #fdf5d9; /** GITLAB Fonts **/ -@font-face { font-family: Korolev; src: url('korolev-medium-compressed.otf'); } +@font-face { font-family: Korolev; src: url('korolev-medium-compressed.otf'); } /** MIXINS **/ @mixin shade { @@ -56,7 +56,7 @@ $hover: #FDF5D9; border-radius: $radius; } -@mixin bg-gray-gradient { +@mixin bg-gray-gradient { background:#eee; background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); @@ -64,7 +64,7 @@ $hover: #FDF5D9; background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); } -@mixin bg-dark-gray-gradient { +@mixin bg-dark-gray-gradient { background:#eee; background-image: -webkit-linear-gradient(#e9e9e9, #d7d7d7); background-image: -moz-linear-gradient(#e9e9e9, #d7d7d7); diff --git a/app/models/project.rb b/app/models/project.rb index 3fe11916..3c7287f8 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -8,7 +8,7 @@ class Project < ActiveRecord::Base # # Relations - # + # belongs_to :owner, class_name: "User" has_many :users, through: :users_projects has_many :events, dependent: :destroy @@ -25,12 +25,12 @@ class Project < ActiveRecord::Base attr_accessor :error_code - # + # # Protected attributes # attr_protected :private_flag, :owner_id - # + # # Scopes # scope :public_only, where(private_flag: false) @@ -158,7 +158,7 @@ class Project < ActiveRecord::Base end def last_activity - events.last || nil + events.order("created_at DESC").first || nil end def last_activity_date From a6026c9c8237020370e5499db5afb7ddab58532f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 30 Aug 2012 08:41:43 +0300 Subject: [PATCH 090/357] Gitlab cli for development need at first --- gitlab | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 gitlab diff --git a/gitlab b/gitlab new file mode 100755 index 00000000..12cebd89 --- /dev/null +++ b/gitlab @@ -0,0 +1,70 @@ +#!/usr/bin/env ruby + +class GitlabCli + def initialize + @path = File.dirname(__FILE__) + @command = ARGV.shift + @mode = ARGV.shift + end + + def execute + case @command + when 'start' then start + when 'stop' then stop + else + puts "-- Usage gitlab start production or gitlab stop development" + end + end + + private + + def start + case @mode + when 'production'; + system(unicorn_start_cmd) + else + system(rails_start_cmd) + end + system(resque_start_cmd) + end + + def stop + case @mode + when 'production'; + system(unicorn_stop_cmd) + else + system(rails_stop_cmd) + end + system(resque_stop_cmd) + end + + def rails_start_cmd + "bundle exec rails s -d" + end + + def rails_stop_cmd + pid = File.join(@path, "tmp/pids/server.pid") + "kill -QUIT `cat #{pid}`" + end + + def unicorn_start_cmd + unicorn_conf = File.join(@path, "config/unicorn.rb") + "bundle exec unicorn_rails -c #{unicorn_conf} -E production -D" + end + + def unicorn_stop_cmd + pid = File.join(@path, "/tmp/pids/unicorn.pid") + "kill -QUIT `cat #{pid}`" + end + + def resque_start_cmd + "./resque.sh > /dev/null 2>&1" + end + + def resque_stop_cmd + pid = File.join(@path, "tmp/pids/resque_worker.pid") + "kill -QUIT `cat #{pid}`" + end +end + +GitlabCli.new.execute From cd3d50caf2691116424a8df73939f095814c7ab5 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 30 Aug 2012 09:26:45 +0300 Subject: [PATCH 091/357] Changed colors for buttons. Imporved preview area. Added clone panel to empty project --- app/assets/javascripts/note.js | 4 +- .../stylesheets/gitlab_bootstrap/buttons.scss | 35 +++++++--- app/assets/stylesheets/sections/notes.scss | 64 ++++++++++--------- app/views/commits/compare.html.haml | 2 +- app/views/notes/_form.html.haml | 6 +- app/views/projects/_clone_panel.html.haml | 21 ++++++ app/views/projects/empty.html.haml | 21 ++++++ app/views/projects/show.html.haml | 27 +------- app/views/search/show.html.haml | 2 +- 9 files changed, 113 insertions(+), 69 deletions(-) create mode 100644 app/views/projects/_clone_panel.html.haml diff --git a/app/assets/javascripts/note.js b/app/assets/javascripts/note.js index dfa09986..212c203a 100644 --- a/app/assets/javascripts/note.js +++ b/app/assets/javascripts/note.js @@ -45,7 +45,9 @@ init: $("#note_note").live("focus", function(){ $(this).css("height", "80px"); $('.note_advanced_opts').show(); - $(this).closest("form").find(".submit_note").attr("disabled", "disabled"); + if($(this).val() == "") { + $(this).closest("form").find(".submit_note").attr("disabled", "disabled").addClass("disabled"); + } }); $("#note_attachment").change(function(e){ diff --git a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss index 9966e81b..c838f3b2 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss @@ -1,5 +1,8 @@ .btn { - @include bg-dark-gray-gradient; + background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #f7f7f7), to(#d5d5d5)); + background-image: -webkit-linear-gradient(#f7f7f7 7.6%, #d5d5d5); + background-image: -moz-linear-gradient(#f7f7f7 7.6%, #d5d5d5); + background-image: -o-linear-gradient(#f7f7f7 7.6%, #d5d5d5); border-color:#aaa; &:hover { @include bg-gray-gradient; @@ -7,28 +10,42 @@ color:#333; } - &.btn-primary { + &.primary { background:#2a79A3; border-color: #2A79A3; + background-image: -webkit-linear-gradient(#47A7b7 7.6%, #2585b5); + background-image: -moz-linear-gradient(#47A7b7 7.6%, #2585b5); + background-image: -o-linear-gradient(#47A7b7 7.6%, #2585b5); + color:#fff; + text-shadow: 0 1px 1px #268; &:hover { background:$blue_link; color:#fff; } - } - &.primary { - @extend .btn-primary; + + &.disabled { + color:#fff; + background:#29B; + } } &.success { + border-color: #4A4; + background-image: -webkit-linear-gradient(#82D482 7.6%, #22B442); + background-image: -moz-linear-gradient(#82D482 7.6%, #22B442); + background-image: -o-linear-gradient(#82D482 7.6%, #22B442); color: #fff; - text-shadow: 0 0 1px #111; - background: #5bb75b;; - font-weight: bold; + text-shadow: 0 1px 1px #141; &:hover { - background-color: #51a351; + background: #6C6; color: #fff; } + + &.disabled { + color:#fff; + background:#2b2; + } } &.save-btn { diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index afa50952..6259939e 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -2,7 +2,7 @@ * Notes * */ -#notes-list, +#notes-list, #new_notes_list { display:block; list-style:none; @@ -10,7 +10,7 @@ padding:0px; } -#new_notes_list li:last-child{ +#new_notes_list li:last-child{ border-bottom:1px solid #aaa; } @@ -38,12 +38,16 @@ } } -#preview-note { - margin-bottom: 0; +.preview_note { + margin: 2px; + border: 1px solid #ddd; + padding: 10px; + min-height: 60px; + background:#f5f5f5; } -.note { - padding: 8px 0; +.note { + padding: 8px 0; border-bottom: 1px solid #eee; overflow: hidden; display: block; @@ -53,16 +57,16 @@ .note-author { color: $style_color;} .note-title { margin-left:45px; padding-top: 5px;} - .avatar { + .avatar { margin-top:3px; } - .delete-note { - display:none; + .delete-note { + display:none; float:right; } - &:hover { + &:hover { .delete-note { display:block; } } } @@ -76,18 +80,18 @@ p.notify_controls span{ font-weight: 700; } -tr.line_notes_row { +tr.line_notes_row { border-bottom:1px solid #DDD; border-left: 7px solid #2A79A3; - &.reply { + &.reply { background:#eee; border-left: 7px solid #2A79A3; border-top:1px solid #ddd; - td { + td { padding:7px 10px; } - a.line_note_reply_link { + a.line_note_reply_link { @include round-borders-all(4px); padding: 3px 10px; margin-left:5px; @@ -96,9 +100,9 @@ tr.line_notes_row { border-color: #2A79A3; } } - ul { + ul { margin:0; - li { + li { padding:0; border:none; } @@ -107,26 +111,26 @@ tr.line_notes_row { .line_notes_row, .per_line_form { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } -.per_line_form { +.per_line_form { background:#f5f5f5; border-top:1px solid #eee; form { margin: 0; } - td { + td { border-bottom:1px solid #ddd; } - .note_actions { + .note_actions { margin:0; padding-top: 10px; - .buttons { + .buttons { float:left; width:300px; } - .options { - .labels { + .options { + .labels { float:left; padding-left:10px; - label { + label { padding: 6px 0; margin: 0; width:120px; @@ -136,7 +140,7 @@ tr.line_notes_row { } } -td .line_note_link { +td .line_note_link { position:absolute; margin-left:-70px; margin-top:-10px; @@ -148,14 +152,14 @@ td .line_note_link { opacity: 0.0; filter: alpha(opacity=0); - &:hover { + &:hover { opacity: 1.0; filter: alpha(opacity=100); } } .diff_file_content tr.line_holder:hover > td { background: $hover !important; } -.diff_file_content tr.line_holder:hover > td .line_note_link { +.diff_file_content tr.line_holder:hover > td .line_note_link { opacity: 1.0; filter: alpha(opacity=100); } @@ -173,8 +177,8 @@ td .line_note_link { margin: 0; } - .note_advanced_opts { - h6 { + .note_advanced_opts { + h6 { line-height: 32px; padding-right: 15px; } @@ -187,7 +191,7 @@ td .line_note_link { overflow:hidden; margin:0 0 5px !important; - .input_file { + .input_file { .file_upload { position: absolute; right:14px; @@ -200,7 +204,7 @@ td .line_note_link { height:28px; overflow:hidden; } - .input-file { + .input-file { width: 260px; height: 41px; float: right; diff --git a/app/views/commits/compare.html.haml b/app/views/commits/compare.html.haml index be915cd1..7dab1f5c 100644 --- a/app/views/commits/compare.html.haml +++ b/app/views/commits/compare.html.haml @@ -20,7 +20,7 @@ = "..." = text_field_tag :to, params[:to], placeholder: "aa8b4ef", class: "xlarge" .actions - = submit_tag "Compare", class: "btn btn-primary" + = submit_tag "Compare", class: "btn primary" - unless @commits.empty? diff --git a/app/views/notes/_form.html.haml b/app/views/notes/_form.html.haml index adb6e2b4..50829a97 100644 --- a/app/views/notes/_form.html.haml +++ b/app/views/notes/_form.html.haml @@ -8,14 +8,14 @@ = f.hidden_field :noteable_id = f.hidden_field :noteable_type = f.text_area :note, size: 255 - #preview-note.well.hide + #preview-note.preview_note.hide .hint .right Comments are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. .clearfix .row.note_advanced_opts.hide .span3 - = f.submit 'Add Comment', class: "btn primary submit_note grouped", id: "submit_note" + = f.submit 'Add Comment', class: "btn success submit_note grouped", id: "submit_note" = link_to 'Preview', preview_project_notes_path(@project), class: 'btn grouped', id: 'preview-link' .span4.notify_opts %h6.left Notify via email: @@ -30,7 +30,7 @@ .span5.attachments %h6.left Attachment: %span.file_name File name... - + .input.input_file %a.file_upload.btn.small Upload File = f.file_field :attachment, class: "input-file" diff --git a/app/views/projects/_clone_panel.html.haml b/app/views/projects/_clone_panel.html.haml new file mode 100644 index 00000000..839a98a0 --- /dev/null +++ b/app/views/projects/_clone_panel.html.haml @@ -0,0 +1,21 @@ +.project_clone_panel + .row + .span7 + .form-horizontal + .input-prepend.project_clone_holder + = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo + = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo + = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" + .span4.right + .right + - if can? current_user, :download_code, @project + = link_to archive_project_repository_path(@project), class: "btn small grouped" do + %i.icon-download-alt + Download + - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) + = link_to new_project_merge_request_path(@project), title: "New Merge Request", class: "btn small grouped" do + Merge Request + - if @project.issues_enabled && can?(current_user, :write_issue, @project) + = link_to new_project_issue_path(@project), title: "New Issue", class: "btn small grouped" do + Issue + diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 907d5ef4..d408c0a6 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -1,4 +1,12 @@ = render 'shared/no_ssh' +.project_clone_panel + .row + .span7 + .form-horizontal + .input-prepend.project_clone_holder + = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo + = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo + = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" %div.git-empty %h4 Git global setup: %pre.dark @@ -28,3 +36,16 @@ - if can? current_user, :admin_project, @project .prepend-top-20 = link_to 'Remove project', @project, confirm: 'Are you sure?', method: :delete, class: "btn danger right" + + + +:javascript + $(function(){ + var link_sel = ".project_clone_holder a"; + $(link_sel).bind("click", function() { + $(link_sel).removeClass("active"); + $(this).addClass("active"); + $("#project_clone").val($(this).attr("data-clone")); + }) + }) + diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 628dc53d..77a0ef1a 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,33 +1,12 @@ = render "project_head" - -.project_clone_panel - .row - .span7 - .form-horizontal - .input-prepend.project_clone_holder - = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo - = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo - = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" - .span4.right - .right - - if can? current_user, :download_code, @project - = link_to archive_project_repository_path(@project), class: "btn small grouped" do - %i.icon-download-alt - Download - - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) - = link_to new_project_merge_request_path(@project), title: "New Merge Request", class: "btn small grouped" do - Merge Request - - if @project.issues_enabled && can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), title: "New Issue", class: "btn small grouped" do - Issue - += render 'clone_panel' = render "events/event_last_push", event: @last_push .content_list= render @events -:javascript +:javascript $(function(){ var link_sel = ".project_clone_holder a"; - $(link_sel).bind("click", function() { + $(link_sel).bind("click", function() { $(link_sel).removeClass("active"); $(this).addClass("active"); $("#project_clone").val($(this).attr("data-clone")); diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml index 9a0b4789..d37ef670 100644 --- a/app/views/search/show.html.haml +++ b/app/views/search/show.html.haml @@ -4,7 +4,7 @@ %strong Looking for .input = text_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge", id: "dashboard_search" - = submit_tag 'Search', class: "btn btn-primary" + = submit_tag 'Search', class: "btn primary" - if params[:search].present? %br %h3 From d246a68a242e28c106ab8916ccdc3ac2643b2d96 Mon Sep 17 00:00:00 2001 From: randx Date: Thu, 30 Aug 2012 19:45:05 +0300 Subject: [PATCH 092/357] fix project.last_activity spec --- app/models/project.rb | 2 +- spec/models/project_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 3c7287f8..a7735a42 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -158,7 +158,7 @@ class Project < ActiveRecord::Base end def last_activity - events.order("created_at DESC").first || nil + events.order("created_at ASC").last end def last_activity_date diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index b947eeb2..5add7ff8 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -141,7 +141,7 @@ describe Project do let(:last_event) { double } before do - project.stub(:events).and_return( [ double, double, last_event ] ) + project.stub_chain(:events, :order).and_return( [ double, double, last_event ] ) end it { project.last_activity.should == last_event } From 92137b7bebb2b6f9c5225776e3f30d0e5dfab9e6 Mon Sep 17 00:00:00 2001 From: randx Date: Thu, 30 Aug 2012 20:00:16 +0300 Subject: [PATCH 093/357] Removed class 'small' for some buttons. Fixed issue creation --- app/assets/stylesheets/sections/merge_requests.scss | 1 + app/controllers/issues_controller.rb | 8 +++++++- app/views/admin/users/_form.html.haml | 6 +++--- app/views/issues/index.html.haml | 2 +- app/views/keys/index.html.haml | 2 +- app/views/merge_requests/index.html.haml | 2 +- app/views/refs/_tree_item.html.haml | 2 +- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 3a134531..73171915 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -38,6 +38,7 @@ background: #CEB; .accept_merge_request { + font-size:13px; float:left; } .remove_branch_holder { diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 889a7d98..e90fad9c 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -60,7 +60,13 @@ class IssuesController < ApplicationController @issue.save respond_to do |format| - format.html { redirect_to project_issue_path(@project, @issue) } + format.html do + if @issue.valid? + redirect_to project_issue_path(@project, @issue) + else + render :new + end + end format.js end end diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index 20144723..7010c272 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -73,8 +73,8 @@ .span6 .span6 .actions - = f.submit 'Save', class: "btn primary" + = f.submit 'Save', class: "btn save-btn" - if @admin_user.new_record? - = link_to 'Cancel', admin_users_path, class: "btn" + = link_to 'Cancel', admin_users_path, class: "btn cancel-btn" - else - = link_to 'Cancel', admin_user_path(@admin_user), class: "btn" + = link_to 'Cancel', admin_user_path(@admin_user), class: "btn cancel-btn" diff --git a/app/views/issues/index.html.haml b/app/views/issues/index.html.haml index a6836fd4..010b8856 100644 --- a/app/views/issues/index.html.haml +++ b/app/views/issues/index.html.haml @@ -6,7 +6,7 @@ .right .span5 - if can? current_user, :write_issue, @project - = link_to new_project_issue_path(@project), class: "right btn small", title: "New Issue", remote: true do + = link_to new_project_issue_path(@project), class: "right btn", title: "New Issue", remote: true do %i.icon-plus New Issue = form_tag search_project_issues_path(@project), method: :get, remote: true, id: "issue_search_form", class: :right do diff --git a/app/views/keys/index.html.haml b/app/views/keys/index.html.haml index 04e9e4cb..9b5663ed 100644 --- a/app/views/keys/index.html.haml +++ b/app/views/keys/index.html.haml @@ -1,6 +1,6 @@ %h3.page_title SSH Keys - = link_to "Add new", new_key_path, class: "btn small right" + = link_to "Add new", new_key_path, class: "btn right" %hr %p.slead diff --git a/app/views/merge_requests/index.html.haml b/app/views/merge_requests/index.html.haml index 4ad6e5c1..e7a43251 100644 --- a/app/views/merge_requests/index.html.haml +++ b/app/views/merge_requests/index.html.haml @@ -1,7 +1,7 @@ %h3.page_title Merge Requests - if can? current_user, :write_issue, @project - = link_to new_project_merge_request_path(@project), class: "right btn small", title: "New Merge Request" do + = link_to new_project_merge_request_path(@project), class: "right btn", title: "New Merge Request" do New Merge Request %br diff --git a/app/views/refs/_tree_item.html.haml b/app/views/refs/_tree_item.html.haml index 2e6bbf62..d4c4ee8d 100644 --- a/app/views/refs/_tree_item.html.haml +++ b/app/views/refs/_tree_item.html.haml @@ -2,7 +2,7 @@ %tr{ class: "tree-item #{tree_hex_class(content)}", url: tree_file_project_ref_path(@project, @ref, file) } %td.tree-item-file-name = tree_icon(content) - = link_to truncate(content.name, length: 40), tree_file_project_ref_path(@project, @ref || @commit.id, file), remote: :true + %strong= link_to truncate(content.name, length: 40), tree_file_project_ref_path(@project, @ref || @commit.id, file), remote: :true %td.tree_time_ago.cgray - if index == 1 %span.log_loading From 4a6596af274c01036aaf9f49a5b38cd678716873 Mon Sep 17 00:00:00 2001 From: randx Date: Thu, 30 Aug 2012 21:31:55 +0300 Subject: [PATCH 094/357] Fixed bunch of js bugs with comments. Also added development tips --- README.md | 1 + app/assets/javascripts/application.js | 20 ++ app/assets/javascripts/note.js | 250 ++++++++++----------- app/assets/stylesheets/sections/notes.scss | 2 +- app/views/commits/show.html.haml | 10 +- app/views/notes/_create_common.js.haml | 11 +- app/views/notes/_create_line.js.haml | 2 +- app/views/notes/_form.html.haml | 67 +++--- app/views/notes/_per_line_form.html.haml | 51 ++--- doc/development.md | 45 ++++ gitlab | 7 +- resque_dev.sh | 3 +- 12 files changed, 269 insertions(+), 200 deletions(-) create mode 100644 doc/development.md diff --git a/README.md b/README.md index 26ed209e..122cd984 100644 --- a/README.md +++ b/README.md @@ -39,5 +39,6 @@ Email ## Contribute +[Development Tips](https://github.com/gitlabhq/gitlabhq/blob/master/doc/development.md) Want to help - send a pull request. We'll accept good pull requests. diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 24d99a62..f69fd6f9 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -128,3 +128,23 @@ function showDiff(link) { function ajaxGet(url) { $.ajax({type: "GET", url: url, dataType: "script"}); } + +/** + * Disable button if text field is empty + */ +function disableButtonIfEmtpyField(field_selector, button_selector) { + field = $(field_selector); + if(field.val() == "") { + field.closest("form").find(button_selector).attr("disabled", "disabled").addClass("disabled"); + } + + field.on('keyup', function(){ + var field = $(this); + var closest_submit = field.closest("form").find(button_selector); + if(field.val() == "") { + closest_submit.attr("disabled", "disabled").addClass("disabled"); + } else { + closest_submit.removeAttr("disabled").removeClass("disabled"); + } + }) +} diff --git a/app/assets/javascripts/note.js b/app/assets/javascripts/note.js index 212c203a..9cd3e36e 100644 --- a/app/assets/javascripts/note.js +++ b/app/assets/javascripts/note.js @@ -1,174 +1,160 @@ var NoteList = { -notes_path: null, -target_params: null, -target_id: 0, -target_type: null, -first_id: 0, -last_id: 0, -disable:false, + notes_path: null, + target_params: null, + target_id: 0, + target_type: null, + first_id: 0, + last_id: 0, + disable:false, -init: - function(tid, tt, path) { - this.notes_path = path + ".js"; - this.target_id = tid; - this.target_type = tt; - this.target_params = "&target_type=" + this.target_type + "&target_id=" + this.target_id; + init: + function(tid, tt, path) { + this.notes_path = path + ".js"; + this.target_id = tid; + this.target_type = tt; + this.target_params = "&target_type=" + this.target_type + "&target_id=" + this.target_id; - // get notes - this.getContent(); + // get notes + this.getContent(); - // get new notes every n seconds - this.initRefresh(); + // get new notes every n seconds + this.initRefresh(); - $('.delete-note').live('ajax:success', function() { - $(this).closest('li').fadeOut(); }); + $('.delete-note').live('ajax:success', function() { + $(this).closest('li').fadeOut(); }); - $('#note_note').on('keyup', function(){ - var field = $(this); - var closest_submit = field.closest("form").find(".submit_note"); - if(field.val() == "") { - closest_submit.attr("disabled", "disabled").addClass("disabled"); - } else { - closest_submit.removeAttr("disabled").removeClass("disabled"); - } - }) + $(".note-form-holder").live("ajax:before", function(){ + $(".submit_note").attr("disabled", "disabled"); + }) - $("#new_note").live("ajax:before", function(){ - $(".submit_note").attr("disabled", "disabled"); - }) + $(".note-form-holder").live("ajax:complete", function(){ + $(".submit_note").removeAttr("disabled"); + }) - $("#new_note").live("ajax:complete", function(){ - $(".submit_note").removeAttr("disabled"); - }) + disableButtonIfEmtpyField(".note-text", ".submit_note"); - $("#note_note").live("focus", function(){ - $(this).css("height", "80px"); - $('.note_advanced_opts').show(); - if($(this).val() == "") { - $(this).closest("form").find(".submit_note").attr("disabled", "disabled").addClass("disabled"); - } - }); + $(".note-text").live("focus", function(){ + $(this).css("height", "80px"); + $('.note_advanced_opts').show(); + }); - $("#note_attachment").change(function(e){ + $("#note_attachment").change(function(e){ var val = $('.input-file').val(); var filename = val.replace(/^.*[\\\/]/, ''); $(".file_name").text(filename); - }); + }); - }, + }, -/** - * Load new notes to fresh list called 'new_notes_list': - * - Replace 'new_notes_list' with new list every n seconds - * - Append new notes to this list after submit - */ + /** + * Load new notes to fresh list called 'new_notes_list': + * - Replace 'new_notes_list' with new list every n seconds + * - Append new notes to this list after submit + */ -initRefresh: - function() { - // init timer - var intNew = setInterval("NoteList.getNew()", 10000); - }, + initRefresh: + function() { + // init timer + var intNew = setInterval("NoteList.getNew()", 10000); + }, -replace: - function(html) { - $("#new_notes_list").html(html); - }, + replace: + function(html) { + $("#new_notes_list").html(html); + }, -prepend: - function(id, html) { - if(id != this.last_id) { - $("#new_notes_list").prepend(html); - } - }, + prepend: + function(id, html) { + if(id != this.last_id) { + $("#new_notes_list").prepend(html); + } + }, -getNew: - function() { - // refersh notes list - $.ajax({ - type: "GET", + getNew: + function() { + // refersh notes list + $.ajax({ + type: "GET", url: this.notes_path, data: "last_id=" + this.last_id + this.target_params, dataType: "script"}); - }, + }, -refresh: - function() { - // refersh notes list - $.ajax({ - type: "GET", + refresh: + function() { + // refersh notes list + $.ajax({ + type: "GET", url: this.notes_path, data: "first_id=" + this.first_id + "&last_id=" + this.last_id + this.target_params, dataType: "script"}); - }, + }, -/** - * Init load of notes: - * 1. Get content with ajax call - * 2. Set content of notes list with loaded one - */ + /** + * Init load of notes: + * 1. Get content with ajax call + * 2. Set content of notes list with loaded one + */ -getContent: - function() { - $.ajax({ - type: "GET", + getContent: + function() { + $.ajax({ + type: "GET", url: this.notes_path, data: "?" + this.target_params, complete: function(){ $('.status').removeClass("loading")}, beforeSend: function() { $('.status').addClass("loading") }, dataType: "script"}); - }, + }, -setContent: - function(fid, lid, html) { + setContent: + function(fid, lid, html) { this.last_id = lid; this.first_id = fid; $("#notes-list").html(html); // Init infinite scrolling this.initLoadMore(); - }, + }, -/** - * Paging for old notes when scroll to bottom: - * 1. Init scroll events with 'initLoadMore' - * 2. Load onlder notes with 'getOld' method - * 3. append old notes to bottom of list with 'append' - * - */ + /** + * Paging for old notes when scroll to bottom: + * 1. Init scroll events with 'initLoadMore' + * 2. Load onlder notes with 'getOld' method + * 3. append old notes to bottom of list with 'append' + * + */ + getOld: + function() { + $('.loading').show(); + $.ajax({ + type: "GET", + url: this.notes_path, + data: "first_id=" + this.first_id + this.target_params, + complete: function(){ $('.status').removeClass("loading")}, + beforeSend: function() { $('.status').addClass("loading") }, + dataType: "script"}); + }, + append: + function(id, html) { + if(this.first_id == id) { + this.disable = true; + } else { + this.first_id = id; + $("#notes-list").append(html); + } + }, -getOld: - function() { - $('.loading').show(); - $.ajax({ - type: "GET", - url: this.notes_path, - data: "first_id=" + this.first_id + this.target_params, - complete: function(){ $('.status').removeClass("loading")}, - beforeSend: function() { $('.status').addClass("loading") }, - dataType: "script"}); - }, - -append: - function(id, html) { - if(this.first_id == id) { - this.disable = true; - } else { - this.first_id = id; - $("#notes-list").append(html); - } - }, - - -initLoadMore: - function() { - $(document).endlessScroll({ - bottomPixels: 400, + initLoadMore: + function() { + $(document).endlessScroll({ + bottomPixels: 400, fireDelay: 1000, fireOnce:true, ceaseFire: function() { @@ -177,6 +163,20 @@ initLoadMore: callback: function(i) { NoteList.getOld(); } - }); - } + }); + } +}; + +var PerLineNotes = { + init: + function() { + $(".line_note_link, .line_note_reply_link").live("click", function(e) { + var form = $(".per_line_form"); + $(this).closest("tr").after(form); + form.find("#note_line_code").val($(this).attr("line_code")); + form.show(); + return false; + }); + disableButtonIfEmtpyField(".line-note-text", ".submit_inline_note"); + } } diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 6259939e..21dff4cf 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -30,7 +30,7 @@ } #new_note { - #note_note { + .note-text { height:25px; } .attach_holder { diff --git a/app/views/commits/show.html.haml b/app/views/commits/show.html.haml index 9a483aa2..e01f8ea5 100644 --- a/app/views/commits/show.html.haml +++ b/app/views/commits/show.html.haml @@ -5,12 +5,6 @@ :javascript - $(document).ready(function(){ - $(".line_note_link, .line_note_reply_link").live("click", function(e) { - var form = $(".per_line_form"); - $(this).parent().parent().after(form); - form.find("#note_line_code").val($(this).attr("line_code")); - form.show(); - return false; - }); + $(function(){ + PerLineNotes.init(); }); diff --git a/app/views/notes/_create_common.js.haml b/app/views/notes/_create_common.js.haml index e9538902..e80eccb1 100644 --- a/app/views/notes/_create_common.js.haml +++ b/app/views/notes/_create_common.js.haml @@ -1,11 +1,12 @@ - if note.valid? :plain - $("#new_note .error").remove(); - $('#new_note textarea').val(""); - $('#preview-link').text('Preview'); - $('#preview-note').hide(); $('#note_note').show(); + $(".note-form-holder .error").remove(); + $('.note-form-holder textarea').val(""); + $('.note-form-holder #preview-link').text('Preview'); + $('.note-form-holder #preview-note').hide(); + $('.note-form-holder').show(); NoteList.prepend(#{note.id}, "#{escape_javascript(render partial: "notes/show", locals: {note: note})}"); - else :plain - $("#new_note").replaceWith("#{escape_javascript(render('form'))}"); + $(".note-form-holder").replaceWith("#{escape_javascript(render('form'))}"); diff --git a/app/views/notes/_create_line.js.haml b/app/views/notes/_create_line.js.haml index 13809bec..662909f7 100644 --- a/app/views/notes/_create_line.js.haml +++ b/app/views/notes/_create_line.js.haml @@ -1,7 +1,7 @@ - if note.valid? :plain $(".per_line_form").hide(); - $('#new_note textarea').val(""); + $('.line-note-form-holder textarea').val(""); $("a.line_note_reply_link[line_code='#{note.line_code}']").closest("tr").remove(); var trEl = $(".#{note.line_code}").parent(); trEl.after("#{escape_javascript(render partial: "notes/per_line_show", locals: {note: note})}"); diff --git a/app/views/notes/_form.html.haml b/app/views/notes/_form.html.haml index 50829a97..7211a0ae 100644 --- a/app/views/notes/_form.html.haml +++ b/app/views/notes/_form.html.haml @@ -1,38 +1,39 @@ -= form_for [@project, @note], remote: "true", multipart: true do |f| - %h3.page_title Leave a comment - -if @note.errors.any? - .alert-message.block-message.error - - @note.errors.full_messages.each do |msg| - %div= msg +.note-form-holder + = form_for [@project, @note], remote: "true", multipart: true do |f| + %h3.page_title Leave a comment + -if @note.errors.any? + .alert-message.block-message.error + - @note.errors.full_messages.each do |msg| + %div= msg - = f.hidden_field :noteable_id - = f.hidden_field :noteable_type - = f.text_area :note, size: 255 - #preview-note.preview_note.hide - .hint - .right Comments are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. - .clearfix + = f.hidden_field :noteable_id + = f.hidden_field :noteable_type + = f.text_area :note, size: 255, class: 'note-text' + #preview-note.preview_note.hide + .hint + .right Comments are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. + .clearfix - .row.note_advanced_opts.hide - .span3 - = f.submit 'Add Comment', class: "btn success submit_note grouped", id: "submit_note" - = link_to 'Preview', preview_project_notes_path(@project), class: 'btn grouped', id: 'preview-link' - .span4.notify_opts - %h6.left Notify via email: - = label_tag :notify do - = check_box_tag :notify, 1, @note.noteable_type != "Commit" - %span Project team + .row.note_advanced_opts.hide + .span3 + = f.submit 'Add Comment', class: "btn success submit_note grouped", id: "submit_note" + = link_to 'Preview', preview_project_notes_path(@project), class: 'btn grouped', id: 'preview-link' + .span4.notify_opts + %h6.left Notify via email: + = label_tag :notify do + = check_box_tag :notify, 1, @note.noteable_type != "Commit" + %span Project team - - if @note.notify_only_author?(current_user) - = label_tag :notify_author do - = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" - %span Commit author - .span5.attachments - %h6.left Attachment: - %span.file_name File name... + - if @note.notify_only_author?(current_user) + = label_tag :notify_author do + = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" + %span Commit author + .span5.attachments + %h6.left Attachment: + %span.file_name File name... - .input.input_file - %a.file_upload.btn.small Upload File - = f.file_field :attachment, class: "input-file" - %span.hint Any file less than 10 MB + .input.input_file + %a.file_upload.btn.small Upload File + = f.file_field :attachment, class: "input-file" + %span.hint Any file less than 10 MB diff --git a/app/views/notes/_per_line_form.html.haml b/app/views/notes/_per_line_form.html.haml index afb0b30d..b6d34a04 100644 --- a/app/views/notes/_per_line_form.html.haml +++ b/app/views/notes/_per_line_form.html.haml @@ -1,33 +1,34 @@ %table{style: "display:none;"} %tr.per_line_form %td{colspan: 3 } - = form_for [@project, @note], remote: "true", multipart: true do |f| - %h3.page_title Leave a note - %div.span10 - -if @note.errors.any? - .alert-message.block-message.error - - @note.errors.full_messages.each do |msg| - %div= msg + .line-note-form-holder + = form_for [@project, @note], remote: "true", multipart: true do |f| + %h3.page_title Leave a note + %div.span10 + -if @note.errors.any? + .alert-message.block-message.error + - @note.errors.full_messages.each do |msg| + %div= msg - = f.hidden_field :noteable_id - = f.hidden_field :noteable_type - = f.hidden_field :line_code - = f.text_area :note, size: 255 - .note_actions - .buttons - = f.submit 'Add note', class: "btn primary submit_note", id: "submit_note" - = link_to "Cancel", "#", class: "btn hide-button" - .options - %h6.left Notify via email: - .labels - = label_tag :notify do - = check_box_tag :notify, 1, @note.noteable_type != "Commit" - %span Project team + = f.hidden_field :noteable_id + = f.hidden_field :noteable_type + = f.hidden_field :line_code + = f.text_area :note, size: 255, class: 'line-note-text' + .note_actions + .buttons + = f.submit 'Add note', class: "btn primary submit_note submit_inline_note", id: "submit_note" + = link_to "Cancel", "#", class: "btn hide-button" + .options + %h6.left Notify via email: + .labels + = label_tag :notify do + = check_box_tag :notify, 1, @note.noteable_type != "Commit" + %span Project team - - if @note.notify_only_author?(current_user) - = label_tag :notify_author do - = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" - %span Commit author + - if @note.notify_only_author?(current_user) + = label_tag :notify_author do + = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" + %span Commit author :javascript $(function(){ diff --git a/doc/development.md b/doc/development.md new file mode 100644 index 00000000..55be2bc3 --- /dev/null +++ b/doc/development.md @@ -0,0 +1,45 @@ +## Development tips: + +### Start application in development mode + +#### 1. Via foreman + + bundle exec foreman -p 3000 + +#### 2. Via gitlab cli + + ./gitlab start + +#### 3. Manually + + bundle exec rails s + bundle exec rake environment resque:work QUEUE=* VVERBOSE=1 + + +### Run tests: + +#### 1. Packages + + # ubuntu + sudo apt-get install libqt4-dev libqtwebkit-dev + sudo apt-get install xvfb + + # Mac + brew install qt + brew install xvfb + +#### 2. DB & seeds + + bundle exec rake db:setup RAILS_ENV=test + bundle exec rake db:seed_fu RAILS_ENV=test + +### 3. Run Tests + + # All in one + bundle exec gitlab:test + + # Rspec + bundle exec rake spec + + # Cucumber + bundle exec rake cucumber diff --git a/gitlab b/gitlab index 12cebd89..acafb3f1 100755 --- a/gitlab +++ b/gitlab @@ -22,10 +22,11 @@ class GitlabCli case @mode when 'production'; system(unicorn_start_cmd) + system(resque_start_cmd) else system(rails_start_cmd) + system(resque_dev_start_cmd) end - system(resque_start_cmd) end def stop @@ -57,6 +58,10 @@ class GitlabCli "kill -QUIT `cat #{pid}`" end + def resque_dev_start_cmd + "./resque_dev.sh > /dev/null 2>&1" + end + def resque_start_cmd "./resque.sh > /dev/null 2>&1" end diff --git a/resque_dev.sh b/resque_dev.sh index b09cfd9e..0f1d6edb 100755 --- a/resque_dev.sh +++ b/resque_dev.sh @@ -1 +1,2 @@ -bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1 +mkdir -p tmp/pids +bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid RAILS_ENV=development BACKGROUND=yes From b9ff0c79b49c24dfcfc8e3188c76a861b2035770 Mon Sep 17 00:00:00 2001 From: randx Date: Thu, 30 Aug 2012 22:15:34 +0300 Subject: [PATCH 095/357] Changed filters to readable one. Styled some stuff --- app/assets/javascripts/projects.js | 4 ++- app/assets/stylesheets/common.scss | 4 +-- app/assets/stylesheets/sections/projects.scss | 11 +++++++ app/contexts/merge_requests_load.rb | 8 ++--- app/controllers/issues_controller.rb | 8 ++--- app/controllers/milestones_controller.rb | 4 +-- app/views/admin/projects/_form.html.haml | 12 ++++---- app/views/admin/projects/_new_form.html.haml | 29 +++++++++++++++++++ app/views/admin/projects/new.html.haml | 15 ++++++++-- app/views/merge_requests/index.html.haml | 16 +++++----- app/views/milestones/_form.html.haml | 13 +++------ app/views/milestones/index.html.haml | 8 ++--- app/views/projects/_new_form.html.haml | 2 +- app/views/projects/new.html.haml | 6 ++-- app/views/wikis/_form.html.haml | 4 +-- 15 files changed, 96 insertions(+), 48 deletions(-) create mode 100644 app/views/admin/projects/_new_form.html.haml diff --git a/app/assets/javascripts/projects.js b/app/assets/javascripts/projects.js index 84272698..be1b75b9 100644 --- a/app/assets/javascripts/projects.js +++ b/app/assets/javascripts/projects.js @@ -7,8 +7,10 @@ function Projects() { $('.new_project, .edit_project').live('ajax:before', function() { $('.project_new_holder, .project_edit_holder').hide(); - $('.ajax_loader').show(); + $('.save-project-loader').show(); }); $('form #project_default_branch').chosen(); + + disableButtonIfEmtpyField("#project_name", ".project-submit") } diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index d07912f4..aa27a280 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -165,11 +165,11 @@ span.update-author { background-color: #999; &.pushed { - background-color: #3A87AD; + background-color: #4A97BD; } &.opened { - background-color: #468847; + background-color: #469847; } &.closed { diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 3d5aa80b..721b569d 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -79,3 +79,14 @@ border: 1px solid #BBB; } } + +.save-project-loader { + img { + margin-top:50px; + margin-bottom:50px; + } + h3 { + @extend .page_title; + } + +} diff --git a/app/contexts/merge_requests_load.rb b/app/contexts/merge_requests_load.rb index 6778db3b..e2f68e38 100644 --- a/app/contexts/merge_requests_load.rb +++ b/app/contexts/merge_requests_load.rb @@ -1,13 +1,13 @@ class MergeRequestsLoad < BaseContext def execute - type = params[:f].to_i + type = params[:f] merge_requests = project.merge_requests merge_requests = case type - when 1 then merge_requests - when 2 then merge_requests.closed - when 3 then merge_requests.opened.assigned(current_user) + when 'all' then merge_requests + when 'closed' then merge_requests.closed + when 'assigned-to-me' then merge_requests.opened.assigned(current_user) else merge_requests.opened end.page(params[:page]).per(20) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index e90fad9c..a47b3843 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -168,10 +168,10 @@ class IssuesController < ApplicationController def issues_filter { - all: "1", - closed: "2", - to_me: "3", - open: "0" + all: "all", + closed: "closed", + to_me: "assigned-to-me", + open: "open" } end end diff --git a/app/controllers/milestones_controller.rb b/app/controllers/milestones_controller.rb index 7acb3781..10f089f1 100644 --- a/app/controllers/milestones_controller.rb +++ b/app/controllers/milestones_controller.rb @@ -17,8 +17,8 @@ class MilestonesController < ApplicationController respond_to :html def index - @milestones = case params[:f].to_i - when 1; @project.milestones + @milestones = case params[:f] + when 'all'; @project.milestones else @project.milestones.active end diff --git a/app/views/admin/projects/_form.html.haml b/app/views/admin/projects/_form.html.haml index 7cebddf2..b78d92ca 100644 --- a/app/views/admin/projects/_form.html.haml +++ b/app/views/admin/projects/_form.html.haml @@ -13,8 +13,8 @@ = f.submit project.new_record? ? 'Create project' : 'Save Project', class: "btn primary" %hr - .alert.alert-info - %h5 Advanced settings: + .adv_settings + %h6 Advanced settings: .clearfix = f.label :path do Git Clone @@ -42,8 +42,9 @@ .input= f.select(:default_branch, project.heads.map(&:name), {}, style: "width:210px;") - unless project.new_record? - .alert.alert-info - %h5 Features: + %hr + .adv_settings + %h6 Features: .clearfix = f.label :issues_enabled, "Issues" @@ -63,7 +64,8 @@ - unless project.new_record? .actions - = f.submit 'Save Project', class: "btn primary" + = f.submit 'Save Project', class: "btn save-btn" + = link_to 'Cancel', admin_projects_path, class: "btn cancel-btn" diff --git a/app/views/admin/projects/_new_form.html.haml b/app/views/admin/projects/_new_form.html.haml new file mode 100644 index 00000000..d793b6f3 --- /dev/null +++ b/app/views/admin/projects/_new_form.html.haml @@ -0,0 +1,29 @@ += form_for [:admin, @admin_project] do |f| + - if @admin_project.errors.any? + .alert-message.block-message.error + %span= @admin_project.errors.full_messages.first + .clearfix.project_name_holder + = f.label :name do + Project name is + .input + = f.text_field :name, placeholder: "Example Project", class: "xxlarge" + = f.submit 'Create project', class: "btn primary project-submit" + + %hr + %div.adv_settings + %h6 Advanced settings: + .clearfix + = f.label :path do + Git Clone + .input + .input-prepend + %span.add-on= Gitlab.config.ssh_path + = f.text_field :path, placeholder: "example_project", disabled: !@admin_project.new_record? + %span.add-on= ".git" + .clearfix + = f.label :code do + URL + .input + .input-prepend + %span.add-on= web_app_url + = f.text_field :code, placeholder: "example" diff --git a/app/views/admin/projects/new.html.haml b/app/views/admin/projects/new.html.haml index ac6526bf..933cb671 100644 --- a/app/views/admin/projects/new.html.haml +++ b/app/views/admin/projects/new.html.haml @@ -1,3 +1,12 @@ -%h3.page_title New project -%hr -= render 'form', project: @admin_project +.project_new_holder + %h3.page_title + New Project + %hr + = render 'new_form' +%div.save-project-loader.hide + %center + = image_tag "ajax_loader.gif" + %h3 Creating project & repository. Please wait a few minutes + +:javascript + $(function(){ new Projects(); }); diff --git a/app/views/merge_requests/index.html.haml b/app/views/merge_requests/index.html.haml index e7a43251..bbf35dc7 100644 --- a/app/views/merge_requests/index.html.haml +++ b/app/views/merge_requests/index.html.haml @@ -10,17 +10,17 @@ .ui-box .title %ul.nav.nav-pills - %li{class: ("active" if (params[:f] == "0" || !params[:f]))} - = link_to project_merge_requests_path(@project, f: 0) do + %li{class: ("active" if (params[:f] == 'open' || !params[:f]))} + = link_to project_merge_requests_path(@project, f: 'open') do Open - %li{class: ("active" if params[:f] == "2")} - = link_to project_merge_requests_path(@project, f: 2) do + %li{class: ("active" if params[:f] == "closed")} + = link_to project_merge_requests_path(@project, f: "closed") do Closed - %li{class: ("active" if params[:f] == "3")} - = link_to project_merge_requests_path(@project, f: 3) do + %li{class: ("active" if params[:f] == 'assigned-to-me')} + = link_to project_merge_requests_path(@project, f: 'assigned-to-me') do To Me - %li{class: ("active" if params[:f] == "1")} - = link_to project_merge_requests_path(@project, f: 1) do + %li{class: ("active" if params[:f] == 'all')} + = link_to project_merge_requests_path(@project, f: 'all') do All %ul.unstyled diff --git a/app/views/milestones/_form.html.haml b/app/views/milestones/_form.html.haml index 49200c67..334c153a 100644 --- a/app/views/milestones/_form.html.haml +++ b/app/views/milestones/_form.html.haml @@ -32,17 +32,12 @@ .form-actions - if @milestone.new_record? - = f.submit 'Create milestone', class: "primary btn" + = f.submit 'Create milestone', class: "save-btn btn" + = link_to "Cancel", project_milestones_path(@project), class: "btn cancel-btn" -else - = f.submit 'Save changes', class: "primary btn" + = f.submit 'Save changes', class: "save-btn btn" + = link_to "Cancel", project_milestone_path(@project, @milestone), class: "btn cancel-btn" - - if request.xhr? - = link_to "Cancel", "#back", onclick: "backToIssues();", class: "btn" - - else - - if @milestone.new_record? - = link_to "Cancel", project_milestones_path(@project), class: "btn" - - else - = link_to "Cancel", project_milestone_path(@project, @milestone), class: "btn" :javascript $(function() { diff --git a/app/views/milestones/index.html.haml b/app/views/milestones/index.html.haml index ecb008dc..c5333b08 100644 --- a/app/views/milestones/index.html.haml +++ b/app/views/milestones/index.html.haml @@ -8,11 +8,11 @@ %div.ui-box .title %ul.nav.nav-pills - %li{class: ("active" if (params[:f] == "0" || !params[:f]))} - = link_to project_milestones_path(@project, f: 0) do + %li{class: ("active" if (params[:f] == "active" || !params[:f]))} + = link_to project_milestones_path(@project, f: "active") do Active - %li{class: ("active" if params[:f] == "1")} - = link_to project_milestones_path(@project, f: 1) do + %li{class: ("active" if params[:f] == "all")} + = link_to project_milestones_path(@project, f: "all") do All %ul.unstyled diff --git a/app/views/projects/_new_form.html.haml b/app/views/projects/_new_form.html.haml index b1aafc37..e6d5e93f 100644 --- a/app/views/projects/_new_form.html.haml +++ b/app/views/projects/_new_form.html.haml @@ -7,7 +7,7 @@ Project name is .input = f.text_field :name, placeholder: "Example Project", class: "xxlarge" - = f.submit 'Create project', class: "btn primary" + = f.submit 'Create project', class: "btn primary project-submit" %hr %div.adv_settings diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 703e558a..933cb671 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -3,10 +3,10 @@ New Project %hr = render 'new_form' -%div.ajax_loader.hide +%div.save-project-loader.hide %center - %div.padded= image_tag "ajax_loader.gif" - %h3.prepend-top Creating project & repository. Please wait a few minutes + = image_tag "ajax_loader.gif" + %h3 Creating project & repository. Please wait a few minutes :javascript $(function(){ new Projects(); }); diff --git a/app/views/wikis/_form.html.haml b/app/views/wikis/_form.html.haml index 305607d4..12b57e03 100644 --- a/app/views/wikis/_form.html.haml +++ b/app/views/wikis/_form.html.haml @@ -23,5 +23,5 @@ = f.label :content .input= f.text_area :content, class: 'span8' .actions - = f.submit 'Save', class: "primary btn" - = link_to "Cancel", project_wiki_path(@project, :index), class: "btn" + = f.submit 'Save', class: "save-btn btn" + = link_to "Cancel", project_wiki_path(@project, :index), class: "btn cancel-btn" From 5e510ada7a4ca4e8537d9c14ba50cfc9f509f325 Mon Sep 17 00:00:00 2001 From: randx Date: Thu, 30 Aug 2012 22:28:45 +0300 Subject: [PATCH 096/357] Js validation for title presence in issue, mr, milestone --- app/assets/javascripts/issues.js | 2 ++ app/views/merge_requests/_form.html.haml | 1 + app/views/milestones/_form.html.haml | 1 + 3 files changed, 4 insertions(+) diff --git a/app/assets/javascripts/issues.js b/app/assets/javascripts/issues.js index bc056965..aae818de 100644 --- a/app/assets/javascripts/issues.js +++ b/app/assets/javascripts/issues.js @@ -5,6 +5,7 @@ function switchToNewIssue(form){ $('select#issue_milestone_id').chosen(); $("#new_issue_dialog").show("fade", { direction: "right" }, 150); $('.top-tabs .add_new').hide(); + disableButtonIfEmtpyField("#issue_title", ".save-btn"); }); } @@ -15,6 +16,7 @@ function switchToEditIssue(form){ $('select#issue_milestone_id').chosen(); $("#edit_issue_dialog").show("fade", { direction: "right" }, 150); $('.add_new').hide(); + disableButtonIfEmtpyField("#issue_title", ".save-btn"); }); } diff --git a/app/views/merge_requests/_form.html.haml b/app/views/merge_requests/_form.html.haml index 7e5c851b..b554c051 100644 --- a/app/views/merge_requests/_form.html.haml +++ b/app/views/merge_requests/_form.html.haml @@ -60,6 +60,7 @@ :javascript $(function(){ + disableButtonIfEmtpyField("#merge_request_title", ".save-btn"); $('select#merge_request_assignee_id').chosen(); $('select#merge_request_source_branch').chosen(); $('select#merge_request_target_branch').chosen(); diff --git a/app/views/milestones/_form.html.haml b/app/views/milestones/_form.html.haml index 334c153a..41cbd6ab 100644 --- a/app/views/milestones/_form.html.haml +++ b/app/views/milestones/_form.html.haml @@ -41,6 +41,7 @@ :javascript $(function() { + disableButtonIfEmtpyField("#milestone_title", ".save-btn"); $( ".datepicker" ).datepicker({ dateFormat: "yy-mm-dd", onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } From c80581e49bc7c144a9353611995d58344831eb40 Mon Sep 17 00:00:00 2001 From: randx Date: Thu, 30 Aug 2012 22:45:28 +0300 Subject: [PATCH 097/357] v2.9.0pre --- CHANGELOG | 14 ++++++++++++++ VERSION | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 6868c07b..7322efbf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,17 @@ +v 2.9.0 + - fixed inline notes bugs + - refactored rspecs + - refactored gitolite backend + - added factory_girl + - restyled projects list on dashboard + - ssh keys validation to prevent gitolite crash + - send notifications if changed premission in project + - scss refactoring. gitlab_bootstrap/ dir + - fix git push http body bigger than 112k problem + - list of labels page under issues tab + - API for milestones + - restyled buttons + v 2.8.1 - ability to disable gravatars - improved MR diff logic diff --git a/VERSION b/VERSION index 1817afea..a564e653 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.8.2 +2.9.0pre From ed8912507dd9abed42c1a0992402341fd46e3d69 Mon Sep 17 00:00:00 2001 From: randx Date: Thu, 30 Aug 2012 22:48:01 +0300 Subject: [PATCH 098/357] gitlab_meta to 2.9 --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 4905169f..b0724fad 100644 --- a/Gemfile +++ b/Gemfile @@ -120,5 +120,5 @@ group :test do end group :production do - gem "gitlab_meta", '2.8' + gem "gitlab_meta", '2.9' end diff --git a/Gemfile.lock b/Gemfile.lock index b8e97aa0..f226c931 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -178,7 +178,7 @@ GEM gherkin (2.11.0) json (>= 1.4.6) git (1.2.5) - gitlab_meta (2.8) + gitlab_meta (2.9) grape (0.2.1) hashie (~> 1.2) multi_json @@ -397,7 +397,7 @@ DEPENDENCIES ffaker foreman git - gitlab_meta (= 2.8) + gitlab_meta (= 2.9) gitolite! grack! grape (~> 0.2.1) From 65abd8b20ab047016e2fc30e5cd1edf5bf4554ea Mon Sep 17 00:00:00 2001 From: randx Date: Fri, 31 Aug 2012 09:05:44 +0300 Subject: [PATCH 099/357] Freeze project path in admin area --- app/views/admin/projects/_form.html.haml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/views/admin/projects/_form.html.haml b/app/views/admin/projects/_form.html.haml index b78d92ca..87d212e5 100644 --- a/app/views/admin/projects/_form.html.haml +++ b/app/views/admin/projects/_form.html.haml @@ -10,19 +10,17 @@ Project name is .input = f.text_field :name, placeholder: "Example Project", class: "xxlarge" - = f.submit project.new_record? ? 'Create project' : 'Save Project', class: "btn primary" %hr .adv_settings %h6 Advanced settings: .clearfix = f.label :path do - Git Clone + Path .input .input-prepend - %span.add-on= Gitlab.config.ssh_path - = f.text_field :path, placeholder: "example_project", disabled: !!project.id - %span.add-on= ".git" + %strong + = text_field_tag :ppath, @admin_project.path_to_repo, class: "xlarge", disabled: true .clearfix = f.label :code do URL From c1173e27071b83399cd92406b229be7f0eca59f1 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Fri, 31 Aug 2012 10:15:37 +0300 Subject: [PATCH 100/357] API on Projects creation implemented --- lib/api/projects.rb | 21 +++++++++++++++++ spec/requests/api/projects_spec.rb | 37 ++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/lib/api/projects.rb b/lib/api/projects.rb index eb23641c..7ac2fd4a 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -23,6 +23,27 @@ module Gitlab present user_project, with: Entities::Project end + # Create new project + # + # Parameters: + # name (required) - name for new project + # code (optional) - code for new project, if not set used name + # path (optional) - oath for new project, if not set used name + # Example Request + # POST /projects + post do + project = {} + project[:name] = params[:name] + project[:code] = params[:code] || project[:name] + project[:path] = params[:path] || project[:name] + @project = Project.create_by_user(project, current_user) + if @project.saved? + present @project, with: Entities::Project + else + error!({'message' => '404 Not found'}, 404) + end + end + # Get a project repository branches # # Parameters: diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 0cbc12af..cc6843cc 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -25,6 +25,43 @@ describe Gitlab::API do end end + describe "POST /projects" do + it "should create new project without code and path" do + lambda { + name = "foo" + post api("/projects", user), { + name: name + } + response.status.should == 201 + json_response["name"].should == name + json_response["code"].should == name + json_response["path"].should == name + }.should change{Project.count}.by(1) + end + it "should create new project" do + lambda { + name = "foo" + path = "bar" + code = "bazz" + post api("/projects", user), { + code: code, + path: path, + name: name + } + response.status.should == 201 + json_response["name"].should == name + json_response["path"].should == path + json_response["code"].should == code + }.should change{Project.count}.by(1) + end + it "should not create project without name" do + lambda { + post api("/projects", user) + response.status.should == 404 + }.should_not change{Project.count} + end + end + describe "GET /projects/:id" do it "should return a project by id" do get api("/projects/#{project.id}", user) From 985ecf0f045ce0d8a6fd0524935f12152bfe3918 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Fri, 31 Aug 2012 10:25:36 +0300 Subject: [PATCH 101/357] Docs added for Create Project API --- doc/api/projects.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/doc/api/projects.md b/doc/api/projects.md index d680b5d8..f015b2f5 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -89,6 +89,44 @@ Parameters: } ``` +## Create project + +Create new project owned by user + +``` +POST /projects +``` + +Parameters: + ++ `name` (required) - new project name ++ `code` (optional) - new project code, used project name if not set ++ `path` (optional) - new project path, user project name if not set + +```json +{ + "id": 5, + "code": "gitlab", + "name": "gitlab", + "description": null, + "path": "gitlab", + "default_branch": "api", + "owner": { + "id": 1, + "email": "john@example.com", + "name": "John Smith", + "blocked": false, + "created_at": "2012-05-23T08:00:58Z" + }, + "private": true, + "issues_enabled": true, + "merge_requests_enabled": true, + "wall_enabled": true, + "wiki_enabled": true, + "created_at": "2012-05-30T12:49:20Z" +} +``` + ## Project repository branches Get a list of project repository branches sorted by name alphabetically. From b6a0407e7a3ba5bc77f332dbacb9cae3acb11cce Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Fri, 31 Aug 2012 10:27:45 +0300 Subject: [PATCH 102/357] Docs changed for Create Project API --- doc/api/projects.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/api/projects.md b/doc/api/projects.md index f015b2f5..8c34f4d0 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -103,6 +103,9 @@ Parameters: + `code` (optional) - new project code, used project name if not set + `path` (optional) - new project path, user project name if not set +Will return created project with status `201 Created` on success, or `404 Not +found` on fail. + ```json { "id": 5, From acac1547a06e120a05010fbe556e5836f35248d0 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Fri, 31 Aug 2012 10:28:38 +0300 Subject: [PATCH 103/357] JSON for new project removed from API docs --- doc/api/projects.md | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/doc/api/projects.md b/doc/api/projects.md index 8c34f4d0..97a31696 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -106,29 +106,6 @@ Parameters: Will return created project with status `201 Created` on success, or `404 Not found` on fail. -```json -{ - "id": 5, - "code": "gitlab", - "name": "gitlab", - "description": null, - "path": "gitlab", - "default_branch": "api", - "owner": { - "id": 1, - "email": "john@example.com", - "name": "John Smith", - "blocked": false, - "created_at": "2012-05-23T08:00:58Z" - }, - "private": true, - "issues_enabled": true, - "merge_requests_enabled": true, - "wall_enabled": true, - "wiki_enabled": true, - "created_at": "2012-05-30T12:49:20Z" -} -``` ## Project repository branches From 9811e64d71d050554c952221c4fdaf48ce1f06a6 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Fri, 31 Aug 2012 11:11:12 +0300 Subject: [PATCH 104/357] Typo and mistakes fixed --- doc/api/projects.md | 4 ++-- lib/api/projects.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/api/projects.md b/doc/api/projects.md index 97a31696..b0c1e657 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -100,8 +100,8 @@ POST /projects Parameters: + `name` (required) - new project name -+ `code` (optional) - new project code, used project name if not set -+ `path` (optional) - new project path, user project name if not set ++ `code` (optional) - new project code, uses project name if not set ++ `path` (optional) - new project path, uses project name if not set Will return created project with status `201 Created` on success, or `404 Not found` on fail. diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 7ac2fd4a..f42849cd 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -27,8 +27,8 @@ module Gitlab # # Parameters: # name (required) - name for new project - # code (optional) - code for new project, if not set used name - # path (optional) - oath for new project, if not set used name + # code (optional) - code for new project, uses project name if not set + # path (optional) - path for new project, uses project name if not set # Example Request # POST /projects post do From 6d6c7a17ea2d2a61d4f251d6d746ebe9438405ca Mon Sep 17 00:00:00 2001 From: Florian Unglaub Date: Fri, 31 Aug 2012 15:45:50 +0200 Subject: [PATCH 105/357] Allow single-sign-on with Omniauth --- .../omniauth_callbacks_controller.rb | 4 +-- app/models/user.rb | 34 ++++++++++++++++++- config/gitlab.yml.example | 2 ++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index 00ec7c42..248a75a8 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -38,7 +38,8 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController current_user.save redirect_to profile_path else - @user = User.find_by_provider_and_extern_uid(provider, uid) + @user = User.find_or_new_for_omniauth(oauth) + @user.save! if @user.try('new_record?') if @user sign_in_and_redirect @user @@ -48,5 +49,4 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController end end end - end diff --git a/app/models/user.rb b/app/models/user.rb index ad6af6a6..b956d4ed 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -86,6 +86,39 @@ class User < ActiveRecord::Base where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') end + def self.find_or_new_for_omniauth(oauth) + provider, uid = oauth['provider'], oauth['uid'] + + if @user = User.find_by_provider_and_extern_uid(provider, uid) + @user + else + if Gitlab.config.omniauth.allow_single_sign_on + # Ensure here that all required attributes were passed along with the + # oauth request: + %w(first_name last_name email).each do |attr| + unless oauth[:info][attr].present? + raise OmniAuth::Error, + "#{provider} does not provide the required field #{attr}" + end + end + + password = Devise.friendly_token[0, 8].downcase + @user = User.new( + extern_uid: uid, + provider: provider, + name: "#{oauth[:info][:first_name]} #{oauth[:info][:last_name]}", + email: oauth[:info][:email], + password: password, + password_confirmation: password, + projects_limit: Gitlab.config.default_projects_limit, + ) + + @user.blocked = true if Gitlab.config.omniauth.block_auto_created_users + @user + end + end + end + def self.find_for_ldap_auth(auth, signed_in_resource=nil) uid = auth.info.uid provider = auth.provider @@ -148,4 +181,3 @@ end # bio :string(255) # blocked :boolean(1) default(FALSE), not null # - diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 1934029d..b5aae497 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -53,6 +53,8 @@ git: omniauth: enabled: false providers: + allow_single_sign_on: false + block_auto_created_users: true # omniauth: # enabled: true From 1b0198f1d3fc621b339af0e7fd79a74919856d46 Mon Sep 17 00:00:00 2001 From: Florian Unglaub Date: Fri, 31 Aug 2012 16:24:12 +0200 Subject: [PATCH 106/357] save newly created users directly in the model --- app/controllers/omniauth_callbacks_controller.rb | 1 - app/models/user.rb | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index 248a75a8..3be285ba 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -39,7 +39,6 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController redirect_to profile_path else @user = User.find_or_new_for_omniauth(oauth) - @user.save! if @user.try('new_record?') if @user sign_in_and_redirect @user diff --git a/app/models/user.rb b/app/models/user.rb index b956d4ed..0d45b6e5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -114,6 +114,8 @@ class User < ActiveRecord::Base ) @user.blocked = true if Gitlab.config.omniauth.block_auto_created_users + @user.save! + @user end end From 0dd94cd86ec0680432e58f2630a3a35fa84afd73 Mon Sep 17 00:00:00 2001 From: Florian Unglaub Date: Fri, 31 Aug 2012 16:44:23 +0200 Subject: [PATCH 107/357] DRY'ed up the user model --- app/models/user.rb | 69 +++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 0d45b6e5..fa5d6834 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -86,36 +86,42 @@ class User < ActiveRecord::Base where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') end - def self.find_or_new_for_omniauth(oauth) - provider, uid = oauth['provider'], oauth['uid'] + def self.create_from_omniauth(auth, ldap = false) + provider, uid = auth.provider, auth.uid + name = auth.info.name.force_encoding("utf-8") + email = auth.info.email.downcase unless auth.info.email.nil? + + ldap_prefix = ldap ? '(LDAP) ' : '' + raise OmniAuth::Error, "#{ldap_prefix}#{provider} does not provide an email"\ + " address" if auth.info.email.blank? + + logger.info "#{ldap_prefix}Creating user from #{provider} login"\ + " {uid => #{uid}, name => #{name}, email => #{email}}" + password = Devise.friendly_token[0, 8].downcase + @user = User.new( + extern_uid: uid, + provider: provider, + name: name, + email: email, + password: password, + password_confirmation: password, + projects_limit: Gitlab.config.default_projects_limit, + ) + if Gitlab.config.omniauth.block_auto_created_users && !ldap + @user.blocked = true + end + @user.save! + @user + end + + def self.find_or_new_for_omniauth(auth) + provider, uid = auth.provider, auth.uid if @user = User.find_by_provider_and_extern_uid(provider, uid) @user else if Gitlab.config.omniauth.allow_single_sign_on - # Ensure here that all required attributes were passed along with the - # oauth request: - %w(first_name last_name email).each do |attr| - unless oauth[:info][attr].present? - raise OmniAuth::Error, - "#{provider} does not provide the required field #{attr}" - end - end - - password = Devise.friendly_token[0, 8].downcase - @user = User.new( - extern_uid: uid, - provider: provider, - name: "#{oauth[:info][:first_name]} #{oauth[:info][:last_name]}", - email: oauth[:info][:email], - password: password, - password_confirmation: password, - projects_limit: Gitlab.config.default_projects_limit, - ) - - @user.blocked = true if Gitlab.config.omniauth.block_auto_created_users - @user.save! - + @user = User.create_from_omniauth(auth) @user end end @@ -124,7 +130,6 @@ class User < ActiveRecord::Base def self.find_for_ldap_auth(auth, signed_in_resource=nil) uid = auth.info.uid provider = auth.provider - name = auth.info.name.force_encoding("utf-8") email = auth.info.email.downcase unless auth.info.email.nil? raise OmniAuth::Error, "LDAP accounts must provide an uid and email address" if uid.nil? or email.nil? @@ -136,17 +141,7 @@ class User < ActiveRecord::Base @user.update_attributes(:extern_uid => uid, :provider => provider) @user else - logger.info "Creating user from LDAP login {uid => #{uid}, name => #{name}, email => #{email}}" - password = Devise.friendly_token[0, 8].downcase - @user = User.create( - :extern_uid => uid, - :provider => provider, - :name => name, - :email => email, - :password => password, - :password_confirmation => password, - :projects_limit => Gitlab.config.default_projects_limit - ) + create_from_omniauth(auth) end end From 0de5d08e371923871d75fbdc68732c2402006c91 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Fri, 31 Aug 2012 19:28:32 -0400 Subject: [PATCH 108/357] Give Resque route a name and use that for the iframe src Closes #1350 --- app/views/admin/resque/show.html.haml | 2 +- config/routes.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/admin/resque/show.html.haml b/app/views/admin/resque/show.html.haml index 0375d94b..d889a5d0 100644 --- a/app/views/admin/resque/show.html.haml +++ b/app/views/admin/resque/show.html.haml @@ -1,2 +1,2 @@ %h3 Resque -%iframe{src: "/info/resque", width: 1168, height: 600, style: "border: none"} \ No newline at end of file +%iframe{src: resque_url, width: 1168, height: 600, style: "border: none"} diff --git a/config/routes.rb b/config/routes.rb index f895478f..51e65721 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,7 +10,7 @@ Gitlab::Application.routes.draw do # Optionally, enable Resque here require 'resque/server' - mount Resque::Server.new, at: '/info/resque' + mount Resque::Server.new, at: '/info/resque', as: 'resque' # Enable Grack support mount Grack::Bundle.new({ From adeeae9f73c9a0cef7a197e10c00361a5f6ed814 Mon Sep 17 00:00:00 2001 From: randx Date: Sat, 1 Sep 2012 22:21:28 +0300 Subject: [PATCH 109/357] Few fixes for ~ 1000px resolution --- app/assets/stylesheets/sections/issues.scss | 5 +++++ app/assets/stylesheets/sections/nav.scss | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 6db4b987..230a7aea 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -65,6 +65,11 @@ input.check_all_issues { } } +@media (min-width: 800px) { .issues_filters select { width:160px; } } +@media (min-width: 1000px) { .issues_filters select { width:200px; } } +@media (min-width: 1200px) { .issues_filters select { width:220px; } } + + #issues-table-holder { .issues_filters { form { diff --git a/app/assets/stylesheets/sections/nav.scss b/app/assets/stylesheets/sections/nav.scss index fc7293b2..097e8197 100644 --- a/app/assets/stylesheets/sections/nav.scss +++ b/app/assets/stylesheets/sections/nav.scss @@ -6,7 +6,7 @@ ul.main_menu { border-radius: 4px; margin: auto; margin:30px 0; - border:1px solid #bbb; + border:1px solid #AAA; height:37px; @include bg-gray-gradient; position:relative; @@ -85,7 +85,7 @@ ul.main_menu { line-height:36px; color: $style_color; text-shadow:0 1px 1px white; - + padding:0 10px; } } /* From beb5e1bd6b6656b7c4f412a72c02c3e72ec5253c Mon Sep 17 00:00:00 2001 From: randx Date: Sat, 1 Sep 2012 23:35:04 +0300 Subject: [PATCH 110/357] Sanitize glm helper --- app/assets/stylesheets/sections/notes.scss | 7 ++++++- app/helpers/gitlab_markdown_helper.rb | 2 +- app/views/notes/_per_line_form.html.haml | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 21dff4cf..6a965fa4 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -31,7 +31,7 @@ #new_note { .note-text { - height:25px; + height:40px; } .attach_holder { display:none; @@ -212,3 +212,8 @@ td .line_note_link { } } } + +.note-text { + border: 1px solid #aaa; + box-shadow:none; +} diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index b4e3b962..18ce07a2 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -31,7 +31,7 @@ module GitlabMarkdownHelper extractions[$1] end - text.html_safe + sanitize text.html_safe end # Use this in places where you would normally use link_to(gfm(...), ...). diff --git a/app/views/notes/_per_line_form.html.haml b/app/views/notes/_per_line_form.html.haml index b6d34a04..8e31b59e 100644 --- a/app/views/notes/_per_line_form.html.haml +++ b/app/views/notes/_per_line_form.html.haml @@ -16,7 +16,7 @@ = f.text_area :note, size: 255, class: 'line-note-text' .note_actions .buttons - = f.submit 'Add note', class: "btn primary submit_note submit_inline_note", id: "submit_note" + = f.submit 'Add note', class: "btn save-btn submit_note submit_inline_note", id: "submit_note" = link_to "Cancel", "#", class: "btn hide-button" .options %h6.left Notify via email: From 877aa5458627d42d03a7f204d02db9d326af006c Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sat, 1 Sep 2012 22:56:54 -0400 Subject: [PATCH 111/357] Rename gitlab_flavored_markdown_spec to gitlab_markdown_helper_spec --- ...b_flavored_markdown_spec.rb => gitlab_markdown_helper_spec.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename spec/helpers/{gitlab_flavored_markdown_spec.rb => gitlab_markdown_helper_spec.rb} (100%) diff --git a/spec/helpers/gitlab_flavored_markdown_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb similarity index 100% rename from spec/helpers/gitlab_flavored_markdown_spec.rb rename to spec/helpers/gitlab_markdown_helper_spec.rb From aecbd313bc2792a54bbecf6333fc293cd6b059a4 Mon Sep 17 00:00:00 2001 From: randx Date: Sun, 2 Sep 2012 15:25:54 +0300 Subject: [PATCH 112/357] Fix glm by adding id and classes to sanitize white attrs --- app/helpers/gitlab_markdown_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 18ce07a2..9da695b5 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -31,7 +31,7 @@ module GitlabMarkdownHelper extractions[$1] end - sanitize text.html_safe + sanitize text.html_safe, attributes: ActionView::Base.sanitized_allowed_attributes + %w(id class ) end # Use this in places where you would normally use link_to(gfm(...), ...). From eae41ad1df37cec184179df02fce7faa9434cb2a Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Sun, 26 Aug 2012 16:18:13 +0200 Subject: [PATCH 113/357] Non-interactive AWS install by running a single script. Non-interactive AWS install by running a single script. Complete non-interactive AWS install with one line. Squash of 28 commits: Initial commit of complete install script. Must be sudo. Non interactive prostgres. Install mysql with unique password. Service file. Add init file. Nginx config. Script contains aws specific settings. Update references after rename. Prevent localhost ssh prompt. Postfix with policyd. Typo in localhost. Postfix package has other name. sudo -l session needs oneliners. More sudo commands to prevent permission problems. Change in existing file. Change in existing file must be referenced. Switch order. Postfix comment. Old way to generate password, less sudo. todo login Must use private ip and login instructions. Starting up. Fixed and checked various todos. Use service. Set host name. Go to default dir. Only works on next login. Only replace first host. Cleaned up the comments. Link to nginx config. Move to aws dir. Update links to aws for interactive install. Existing script stays at the same location. Change directory. Use the new init scripts for gitlab service and nginx. Use the branch for file downloads. Update with newest changes to installation.md. Correct reference. Use master branch since we need the nginx condfig and use absolute paths. Need to copy with sudo. --- doc/debian_ubuntu.sh | 3 +- doc/installation.md | 70 +++++++-------- lib/support/aws/debian_ubuntu_aws.sh | 125 +++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 36 deletions(-) create mode 100644 lib/support/aws/debian_ubuntu_aws.sh diff --git a/doc/debian_ubuntu.sh b/doc/debian_ubuntu.sh index a0b4710b..5ed1e2a2 100644 --- a/doc/debian_ubuntu.sh +++ b/doc/debian_ubuntu.sh @@ -3,7 +3,8 @@ sudo apt-get update sudo apt-get upgrade -sudo apt-get install -y git git-core wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline-gplv2-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server python-dev python-pip libyaml-dev postfix +sudo DEBIAN_FRONTEND='noninteractive' apt-get install -y postfix-policyd-spf-python # Install postfix without prompting. +sudo apt-get install -y git git-core wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline-gplv2-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server python-dev python-pip libyaml-dev wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz tar xfvz ruby-1.9.3-p194.tar.gz diff --git a/doc/installation.md b/doc/installation.md index 5611c3b3..b6f1869b 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -1,4 +1,4 @@ -## Platform requirements: +## Platform requirements: **The project is designed for the Linux operating system.** @@ -22,7 +22,7 @@ You might have some luck using these, but no guarantees: Gitlab does **not** run on Windows and we have no plans of making Gitlab compatible. -## This installation guide created for Debian/Ubuntu and properly tested. +## This installation guide created for Debian/Ubuntu and properly tested. The installation consists of 6 steps: @@ -43,13 +43,13 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq > - - - > First 3 steps can be easily skipped with simply install script: -> -> # Install curl and sudo +> +> # Install curl and sudo > apt-get install curl sudo -> +> > # 3 steps in 1 command :) > curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh -> +> > Now you can go to step 4" > - - - @@ -61,7 +61,7 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq sudo apt-get upgrade sudo apt-get install -y wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline6-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server git-core python-dev python-pip libyaml-dev postfix - + # If you want to use MySQL: sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev @@ -77,7 +77,7 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq # 3. Install gitolite Create user for git: - + sudo adduser \ --system \ --shell /bin/sh \ @@ -90,7 +90,7 @@ Create user for git: Create user for gitlab: # ubuntu/debian - sudo adduser --disabled-login --gecos 'gitlab system' gitlab + sudo adduser --disabled-login --gecos 'gitlab system' gitlab Add your user to git group: @@ -103,7 +103,7 @@ Generate key: Get gitolite source code: cd /home/git - sudo -H -u git git clone git://github.com/gitlabhq/gitolite /home/git/gitolite + sudo -H -u git git clone git://github.com/gitlabhq/gitolite /home/git/gitolite Setup: @@ -114,21 +114,21 @@ Setup: sudo -u git -H sed -i 's/0077/0007/g' /home/git/share/gitolite/conf/example.gitolite.rc sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gl-setup -q /home/git/gitlab.pub" - + Permissions: sudo chmod -R g+rwX /home/git/repositories/ sudo chown -R git:git /home/git/repositories/ - sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive + sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive #### CHECK: Logout & login again to apply git group to your user - + # clone admin repo to add localhost to known_hosts # & be sure your user has access to gitolite - sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin + sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin # if succeed you can remove it - sudo rm -rf /tmp/gitolite-admin + sudo rm -rf /tmp/gitolite-admin **IMPORTANT! If you cant clone `gitolite-admin` repository - DONT PROCEED INSTALLATION** @@ -140,7 +140,7 @@ Permissions: cd /home/gitlab sudo -H -u gitlab git clone -b stable git://github.com/gitlabhq/gitlabhq.git gitlab cd gitlab - + sudo -u gitlab mkdir tmp # Rename config files @@ -151,22 +151,22 @@ Permissions: # SQLite sudo -u gitlab cp config/database.yml.sqlite config/database.yml - # Or + # Or # Mysql # Install MySQL as directed in Step #1 - + # Login to MySQL - $ mysql -u root -p - + $ mysql -u root -p + # Create the gitlabhq production database mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`; - + # Create the MySQL User change $password to a real password - mysql> CREATE USER 'gitlab'@'localhost' IDENTIFIED BY '$password'; - + mysql> CREATE USER 'gitlab'@'localhost' IDENTIFIED BY '$password'; + # Grant proper permissions to the MySQL User mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost'; - + # Exit MySQL Server and copy the example config, make sure to update username/password in config/database.yml sudo -u gitlab cp config/database.yml.example config/database.yml @@ -177,7 +177,7 @@ Permissions: #### Setup DB sudo -u gitlab bundle exec rake gitlab:app:setup RAILS_ENV=production - + Checking status: sudo -u gitlab bundle exec rake gitlab:app:status RAILS_ENV=production @@ -197,13 +197,13 @@ Checking status: Can clone gitolite-admin?............YES UMASK for .gitolite.rc is 0007? ............YES -If you got all YES - congrats! You can go to next step. +If you got all YES - congrats! You can go to next step. # 5. Server up Application can be started with next command: - # For test purposes + # For test purposes sudo -u gitlab bundle exec rails s -e production # As daemon @@ -239,7 +239,7 @@ You can login via web using admin generated with setup: sudo -u gitlab cp config/unicorn.rb.orig config/unicorn.rb sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D -Edit /etc/nginx/nginx.conf. In the *http* section add: +Edit /etc/nginx/nginx.conf. In the *http* section add the following section of code or replace it completely with https://raw.github.com/dosire/gitlabhq/master/aws/nginx.conf upstream gitlab { server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket; @@ -249,27 +249,27 @@ Edit /etc/nginx/nginx.conf. In the *http* section add: listen YOUR_SERVER_IP:80; # e.g., listen 192.168.1.1:80; server_name YOUR_SERVER_FQDN; # e.g., server_name source.example.com; root /home/gitlab/gitlab/public; - + # individual nginx logs for this gitlab vhost access_log /var/log/nginx/gitlab_access.log; error_log /var/log/nginx/gitlab_error.log; - + location / { # serve static files from defined root folder;. # @gitlab is a named location for the upstream fallback, see below try_files $uri $uri/index.html $uri.html @gitlab; } - - # if a file, which is not found in the root folder is requested, + + # if a file, which is not found in the root folder is requested, # then the proxy pass the request to the upsteam (gitlab unicorn) location @gitlab { proxy_redirect off; - + # you need to change this to "https", if you set "ssl" directive to "on" proxy_set_header X-FORWARDED_PROTO http; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; - + proxy_pass http://gitlab; } } @@ -292,7 +292,7 @@ Create init script in /etc/init.d/gitlab: # Short-Description: GitLab git repository management # Description: GitLab git repository management ### END INIT INFO - + DAEMON_OPTS="-c /home/gitlab/gitlab/config/unicorn.rb -E production -D" NAME=unicorn DESC="Gitlab service" diff --git a/lib/support/aws/debian_ubuntu_aws.sh b/lib/support/aws/debian_ubuntu_aws.sh new file mode 100644 index 00000000..962ee008 --- /dev/null +++ b/lib/support/aws/debian_ubuntu_aws.sh @@ -0,0 +1,125 @@ +#!/bin/sh + +# ABOUT +# This script performs a complete installation of Gitlab (master branch). +# Is can be run with one command without needing _any_ user input after that. +# This script only works on Amazon Web Services (AWS). +# The operating system used is Ubuntu 12.04 64bit. + +# TODO +# @dosire will send a pull request after this is merged in to change dosire/gitlabhq/non-interactive-aws-install links to gitlabhq/gitlabhq/master and reference this script from installation.md + +# HOWTO +# Signup for AWS, free tier are available at http://aws.amazon.com/free/ +# Go to EC2 tab in the AWS console EC2 https://console.aws.amazon.com/ec2/home +# Click the 'Launch Instance' button +# Select: 'Quick launch wizard' and continue +# Choose a key pair => Create New => Name it => Download it +# Choose a Launch Configuration => Select 'More Amazon Marketplace Images' +# Press 'Continue' +# Enter 'ubuntu/images/ubuntu-precise-12.04-amd64-server-20120424' and press 'Search' +# Select the only result (ami-3c994355) and press 'Continue' +# Press 'Edit details' if you want to modify something, for example make the type 'c1.medium' to make the install faster. +# Press the 'Launch' button +# Press 'Close' +# Click 'Security Groups' under the left hand menu 'NETWORK & SECURITY' +# Select the newly create seciruty group, probably named 'quicklaunch-1' +# Click on the Inbound tab +# In the 'Create a new rule' dropdown select 'HTTP' +# Press 'Add Rule' +# In the 'Create a new rule' dropdown select 'HTTPS' +# Press 'Add Rule' +# Press 'Apply Rule Changes' +# Give the following command in your local terminal while suptituting the UPPERCASE items +# 'ssh -i LOCATION_OF_AWS_KEY_PAIR_PRIVATE_KEY PUBLIC_DNS_OF_THE_NEW_SERVER' +# Execute the curl command below and when its ready follow the printed 'Log in instuctions' +# curl https://raw.github.com/dosire/gitlabhq/non-interactive-aws-install/lib/support/aws/debian_ubuntu_aws.sh | sh + +# Prevent fingerprint prompt for localhost in step 1 to 3. +echo "Host localhost + StrictHostKeyChecking no + UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config + +# Existing script for Step 1 to 3 +curl https://raw.github.com/dosire/gitlabhq/non-interactive-aws-install/doc/debian_ubuntu.sh | sh + +# Install MySQL +sudo apt-get install -y makepasswd # Needed to create a unique password non-interactively. +userPassword=$(makepasswd --char=10) # Generate a random MySQL password +# Note that the lines below creates a cleartext copy of the random password in /var/cache/debconf/passwords.dat +# This file is normally only readable by root and the password will be deleted by the package management system after install. +echo mysql-server mysql-server/root_password password $userPassword | sudo debconf-set-selections +echo mysql-server mysql-server/root_password_again password $userPassword | sudo debconf-set-selections +sudo apt-get install -y mysql-server + +# Gitlab install +sudo gem install charlock_holmes --version '0.6.8' +sudo pip install pygments +sudo gem install bundler +sudo su -l gitlab -c "git clone git://github.com/gitlabhq/gitlabhq.git gitlab" # Using master everywhere. +sudo su -l gitlab -c "cd gitlab && mkdir tmp" +sudo su -l gitlab -c "cd gitlab/config && cp gitlab.yml.example gitlab.yml" +sudo su -l gitlab -c "cd gitlab/config && cp database.yml.example database.yml" +sudo sed -i 's/"secure password"/"'$userPassword'"/' /home/gitlab/gitlab/config/database.yml # Insert the mysql root password. +sudo su -l gitlab -c "cd gitlab && bundle install --without development test --deployment" +sudo su -l gitlab -c "cd gitlab && bundle exec rake gitlab:app:setup RAILS_ENV=production" + +# Setup gitlab hooks +sudo cp /home/gitlab/gitlab/lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive +sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive + +# Set the first occurrence of host in the Gitlab config to the publicly available domain name +sudo sed -i '0,/host/s/localhost/'`wget -qO- http://instance-data/latest/meta-data/public-hostname`'/' /home/gitlab/gitlab/config/gitlab.yml + +# Gitlab installation test (optional) +# sudo -u gitlab bundle exec rake gitlab:app:status RAILS_ENV=production +# sudo -u gitlab bundle exec rails s -e production +# sudo -u gitlab bundle exec rake environment resque:work QUEUE=* RAILS_ENV=production BACKGROUND=no + +# Install and configure Nginx +sudo apt-get install -y nginx +sudo cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-available/gitlab +sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab +sudo sed -i 's/YOUR_SERVER_IP/'`wget -qO- http://instance-data/latest/meta-data/local-ipv4`'/' /etc/nginx/sites-available/gitlab # Set private ip address (public won't work). +sudo sed -i 's/YOUR_SERVER_FQDN/'`wget -qO- http://instance-data/latest/meta-data/public-hostname`'/' /etc/nginx/sites-available/gitlab # Set public dns domain name. + +# Configure Unicorn +sudo -u gitlab cp /home/gitlab/gitlab/config/unicorn.rb.orig /home/gitlab/gitlab/config/unicorn.rb + +# Create a Gitlab service +sudo cp /home/gitlab/gitlab/lib/support/init-gitlab /etc/init.d/gitlab +sudo chmod +x /etc/init.d/gitlab && sudo update-rc.d gitlab defaults + +## Gitlab service commands (unicorn and resque) +## restart doesn't restart resque, only start/stop effect it. +sudo -u gitlab service gitlab start +# sudo -u gitlab service gitlab restart +# sudo -u gitlab service gitlab stop + +# nginx Service commands +# sudo service nginx start +sudo service nginx restart +# sudo service nginx stop + +# Manual startup commands for troubleshooting when the service commands do not work +# sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D +# sudo su -l gitlab -c "cd gitlab && ./resque.sh" + +# Monitoring commands +# sudo tail -f /var/log/nginx/access.log; +# sudo tail -f /var/log/nginx/error.log; + +# Go to gitlab directory by default on next login. +echo 'cd /home/gitlab/gitlab' >> /home/ubuntu/.bashrc + +echo '' +echo '###########################################' +echo '# Log in instuctions #' +echo '###########################################' +echo '' +echo "Surf to this Gitlab installation in your browser:" +echo "http://`wget -qO- http://instance-data/latest/meta-data/public-hostname`/" +echo '' +echo 'and login with the following Email and Password:' +echo 'admin@local.host' +echo '5iveL!fe' \ No newline at end of file From b80dd3d2422b59a1b241ccdae32140ca19f33dc3 Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Sun, 2 Sep 2012 18:31:16 +0200 Subject: [PATCH 114/357] Non-interactive AWS install by running a single script. Merge branch 'master' into non-interactive-aws-install Conflicts: doc/installation.md Fix merge mess in installation.md --- .rails_footnotes | 3 - CHANGELOG | 24 + Gemfile | 10 +- Gemfile.lock | 23 +- README.md | 1 + VERSION | 2 +- app/assets/images/file_dir.png | Bin 517 -> 1648 bytes app/assets/images/merge.png | Bin 0 -> 593 bytes app/assets/javascripts/application.js | 22 +- app/assets/javascripts/issues.js | 2 + app/assets/javascripts/note.js | 239 ++--- app/assets/javascripts/projects.js | 4 +- app/assets/stylesheets/common.scss | 334 +++---- app/assets/stylesheets/gitlab_bootstrap.scss | 818 ------------------ .../stylesheets/gitlab_bootstrap/blocks.scss | 145 ++++ .../stylesheets/gitlab_bootstrap/buttons.scss | 105 +++ .../stylesheets/gitlab_bootstrap/common.scss | 52 ++ .../stylesheets/gitlab_bootstrap/files.scss | 156 ++++ .../stylesheets/gitlab_bootstrap/lists.scss | 30 + .../stylesheets/gitlab_bootstrap/tables.scss | 41 + .../gitlab_bootstrap/typography.scss | 71 ++ app/assets/stylesheets/main.scss | 45 +- app/assets/stylesheets/projects.css.scss | 385 --------- app/assets/stylesheets/ref_select.scss | 4 +- app/assets/stylesheets/sections/commits.scss | 20 + app/assets/stylesheets/sections/graph.scss | 6 +- app/assets/stylesheets/sections/issues.scss | 13 + .../stylesheets/sections/merge_requests.scss | 57 +- app/assets/stylesheets/sections/nav.scss | 10 +- app/assets/stylesheets/sections/notes.scss | 73 +- app/assets/stylesheets/sections/projects.scss | 75 +- app/assets/stylesheets/sections/tree.scss | 6 +- app/assets/stylesheets/themes/ui_mars.scss | 8 + app/contexts/merge_requests_load.rb | 8 +- app/controllers/application_controller.rb | 4 + app/controllers/issues_controller.rb | 16 +- app/controllers/labels_controller.rb | 25 + app/controllers/merge_requests_controller.rb | 2 + app/controllers/milestones_controller.rb | 4 +- .../omniauth_callbacks_controller.rb | 3 +- app/controllers/team_members_controller.rb | 1 + app/decorators/application_decorator.rb | 2 +- app/helpers/application_helper.rb | 26 +- app/helpers/gitlab_markdown_helper.rb | 52 +- app/mailers/notify.rb | 77 +- app/models/key.rb | 8 +- app/models/merge_request.rb | 7 +- app/models/milestone.rb | 14 +- app/models/project.rb | 10 +- app/models/protected_branch.rb | 4 +- app/models/user.rb | 34 +- app/models/users_project.rb | 6 +- app/observers/issue_observer.rb | 12 +- app/observers/key_observer.rb | 7 +- app/observers/users_project_observer.rb | 9 + app/roles/git_host.rb | 5 + app/roles/git_merge.rb | 2 - .../{project_push.rb => push_observer.rb} | 2 +- app/roles/repository.rb | 31 +- app/roles/ssh_key.rb | 18 - app/views/admin/dashboard/index.html.haml | 8 +- app/views/admin/hooks/index.html.haml | 2 +- app/views/admin/projects/_form.html.haml | 20 +- app/views/admin/projects/_new_form.html.haml | 29 + app/views/admin/projects/index.html.haml | 4 +- app/views/admin/projects/new.html.haml | 15 +- app/views/admin/users/_form.html.haml | 124 +-- app/views/admin/users/edit.html.haml | 2 +- app/views/admin/users/index.html.haml | 4 +- app/views/admin/users/new.html.haml | 4 +- app/views/commits/_commit.html.haml | 4 +- app/views/commits/compare.html.haml | 2 +- app/views/commits/show.html.haml | 10 +- app/views/dashboard/index.html.haml | 28 +- app/views/errors/gitolite.html.haml | 6 +- app/views/errors/invalid_ssh_key.html.haml | 3 + app/views/events/_event_last_push.html.haml | 2 +- app/views/help/api.html.haml | 22 + app/views/help/index.html.haml | 3 + app/views/help/markdown.html.haml | 114 ++- app/views/help/permissions.html.haml | 4 +- app/views/help/ssh.html.haml | 25 + app/views/help/system_hooks.html.haml | 4 +- app/views/help/web_hooks.html.haml | 8 +- app/views/help/workflow.html.haml | 13 +- app/views/hooks/_data_ex.html.erb | 2 +- app/views/hooks/index.html.haml | 2 +- app/views/issues/_form.html.haml | 13 +- app/views/issues/_head.html.haml | 3 + app/views/issues/index.html.haml | 2 +- app/views/keys/_form.html.haml | 14 +- app/views/keys/index.html.haml | 2 +- app/views/keys/new.html.haml | 2 +- app/views/labels/_label.html.haml | 4 + app/views/labels/index.html.haml | 14 + app/views/merge_requests/_form.html.haml | 19 +- app/views/merge_requests/index.html.haml | 18 +- .../show/_how_to_merge.html.haml | 11 +- .../merge_requests/show/_mr_title.html.haml | 4 +- app/views/milestones/_form.html.haml | 16 +- app/views/milestones/index.html.haml | 8 +- app/views/notes/_create_common.js.haml | 9 +- app/views/notes/_create_line.js.haml | 2 +- app/views/notes/_form.html.haml | 69 +- app/views/notes/_per_line_form.html.haml | 51 +- .../issue_status_changed_email.html.haml | 16 + .../project_access_granted_email.html.haml | 14 + app/views/profile/password.html.haml | 2 +- app/views/profile/show.html.haml | 9 +- app/views/projects/_clone_panel.html.haml | 21 + app/views/projects/_form.html.haml | 13 +- app/views/projects/_new_form.html.haml | 6 +- app/views/projects/empty.html.haml | 88 +- app/views/projects/new.html.haml | 6 +- app/views/projects/show.html.haml | 29 +- app/views/refs/_tree_item.html.haml | 2 +- app/views/search/show.html.haml | 4 +- app/views/shared/_no_ssh.html.haml | 8 + app/views/team_members/_show.html.haml | 2 +- app/views/team_members/show.html.haml | 2 +- app/views/wikis/_form.html.haml | 9 +- config/application.rb | 2 +- config/environment.rb | 2 - config/gitlab.yml.example | 14 +- config/initializers/1_settings.rb | 8 + config/initializers/5_backend.rb | 5 + config/initializers/rails_footnotes.rb | 3 - config/routes.rb | 3 + db/fixtures/test/001_repo.rb | 32 +- ...31232_add_extern_auth_provider_to_users.rb | 8 + db/pkey.example | 3 - db/schema.rb | 5 +- doc/api/README.md | 2 + doc/api/milestones.md | 57 ++ doc/api/projects.md | 102 --- doc/api/snippets.md | 100 +++ doc/development.md | 45 + doc/installation.md | 103 +-- features/profile/ssh_keys.feature | 4 +- features/projects/issues/labels.feature | 13 + features/projects/network.feature | 4 +- features/step_definitions/dashboard_steps.rb | 24 +- .../profile/profile_keys_steps.rb | 2 +- .../project/project_issues_steps.rb | 21 +- .../project/projects_steps.rb | 11 +- features/support/env.rb | 23 +- gitlab | 75 ++ lib/api.rb | 1 + lib/api/issues.rb | 5 +- lib/api/milestones.rb | 80 ++ lib/gitlab/{ => backend}/gitolite.rb | 115 ++- .../gitlab/backend}/grack_auth.rb | 10 +- lib/gitlab/git_host.rb | 17 - lib/gitlab/markdown.rb | 19 +- lib/{post-receive-hook => hooks/post-receive} | 0 lib/support/init-gitlab | 54 ++ lib/support/nginx-gitlab | 33 + lib/tasks/bulk_add_permission.rake | 26 + lib/tasks/gitlab/backup.rake | 3 +- lib/tasks/gitlab/enable_automerge.rake | 4 +- lib/tasks/gitlab/gitolite_rebuild.rake | 2 +- lib/tasks/gitlab/setup.rake | 6 +- lib/tasks/gitlab/status.rake | 22 +- lib/tasks/gitlab/update_hooks.rake | 19 - lib/tasks/gitlab/write_hook.rake | 23 + resque_dev.sh | 3 +- spec/factories.rb | 188 ++-- spec/factories_spec.rb | 91 ++ spec/factory.rb | 29 - spec/helpers/application_helper_spec.rb | 26 + spec/helpers/gitlab_flavored_markdown_spec.rb | 4 +- spec/mailers/notify_spec.rb | 49 +- spec/models/event_spec.rb | 27 +- spec/models/issue_spec.rb | 91 +- spec/models/key_spec.rb | 36 +- spec/models/merge_request_spec.rb | 81 +- spec/models/milestone_spec.rb | 48 +- spec/models/note_spec.rb | 39 +- spec/models/project_spec.rb | 70 +- spec/models/protected_branch_spec.rb | 31 +- spec/models/snippet_spec.rb | 26 +- spec/models/system_hook_spec.rb | 11 +- spec/models/user_spec.rb | 69 +- spec/models/users_project_spec.rb | 16 +- spec/models/web_hook_spec.rb | 11 - spec/models/wiki_spec.rb | 18 +- spec/monkeypatch.rb | 51 -- .../activity_observer_spec.rb | 0 .../issue_observer_spec.rb | 69 +- spec/observers/key_observer_spec.rb | 34 + .../user_observer_spec.rb | 0 spec/observers/users_project_observer_spec.rb | 40 + spec/requests/admin/admin_projects_spec.rb | 2 +- spec/requests/admin/security_spec.rb | 24 +- spec/{ => requests}/api/issues_spec.rb | 19 +- spec/requests/api/milestones_spec.rb | 47 + spec/{ => requests}/api/projects_spec.rb | 37 +- spec/{ => requests}/api/users_spec.rb | 10 +- spec/requests/atom/dashboard_issues_spec.rb | 8 +- spec/requests/projects_deploy_keys_spec.rb | 8 +- spec/requests/security/profile_access_spec.rb | 30 +- spec/requests/security/project_access_spec.rb | 230 ++--- spec/roles/issue_commonality_spec.rb | 69 ++ spec/roles/upvote_spec.rb | 27 + spec/spec_helper.rb | 45 +- spec/support/api.rb | 7 - spec/support/api_helpers.rb | 34 + spec/support/db_cleaner.rb | 18 + spec/support/gitolite_stub.rb | 35 + spec/support/js_patch.rb | 6 - spec/support/login.rb | 30 - spec/support/login_helpers.rb | 23 + spec/support/matchers.rb | 24 + spec/support/shared_examples.rb | 16 - spec/support/stubbed_repository.rb | 31 + 215 files changed, 3829 insertions(+), 3348 deletions(-) delete mode 100644 .rails_footnotes create mode 100644 app/assets/images/merge.png delete mode 100644 app/assets/stylesheets/gitlab_bootstrap.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/blocks.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/buttons.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/common.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/files.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/lists.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/tables.scss create mode 100644 app/assets/stylesheets/gitlab_bootstrap/typography.scss delete mode 100644 app/assets/stylesheets/projects.css.scss create mode 100644 app/controllers/labels_controller.rb create mode 100644 app/observers/users_project_observer.rb create mode 100644 app/roles/git_host.rb delete mode 100644 app/roles/git_merge.rb rename app/roles/{project_push.rb => push_observer.rb} (99%) delete mode 100644 app/roles/ssh_key.rb create mode 100644 app/views/admin/projects/_new_form.html.haml create mode 100644 app/views/errors/invalid_ssh_key.html.haml create mode 100644 app/views/help/ssh.html.haml create mode 100644 app/views/labels/_label.html.haml create mode 100644 app/views/labels/index.html.haml create mode 100644 app/views/notify/issue_status_changed_email.html.haml create mode 100644 app/views/notify/project_access_granted_email.html.haml create mode 100644 app/views/projects/_clone_panel.html.haml create mode 100644 app/views/shared/_no_ssh.html.haml create mode 100644 config/initializers/5_backend.rb delete mode 100644 config/initializers/rails_footnotes.rb create mode 100644 db/migrate/20120729131232_add_extern_auth_provider_to_users.rb delete mode 100644 db/pkey.example create mode 100644 doc/api/milestones.md create mode 100644 doc/api/snippets.md create mode 100644 doc/development.md create mode 100644 features/projects/issues/labels.feature create mode 100755 gitlab create mode 100644 lib/api/milestones.rb rename lib/gitlab/{ => backend}/gitolite.rb (72%) rename {config/initializers => lib/gitlab/backend}/grack_auth.rb (87%) delete mode 100644 lib/gitlab/git_host.rb rename lib/{post-receive-hook => hooks/post-receive} (100%) create mode 100644 lib/support/init-gitlab create mode 100644 lib/support/nginx-gitlab create mode 100644 lib/tasks/bulk_add_permission.rake delete mode 100644 lib/tasks/gitlab/update_hooks.rake create mode 100644 lib/tasks/gitlab/write_hook.rake create mode 100644 spec/factories_spec.rb delete mode 100644 spec/factory.rb create mode 100644 spec/helpers/application_helper_spec.rb delete mode 100644 spec/monkeypatch.rb rename spec/{models => observers}/activity_observer_spec.rb (100%) rename spec/{models => observers}/issue_observer_spec.rb (58%) create mode 100644 spec/observers/key_observer_spec.rb rename spec/{models => observers}/user_observer_spec.rb (100%) create mode 100644 spec/observers/users_project_observer_spec.rb rename spec/{ => requests}/api/issues_spec.rb (73%) create mode 100644 spec/requests/api/milestones_spec.rb rename spec/{ => requests}/api/projects_spec.rb (67%) rename spec/{ => requests}/api/users_spec.rb (76%) create mode 100644 spec/roles/issue_commonality_spec.rb create mode 100644 spec/roles/upvote_spec.rb delete mode 100644 spec/support/api.rb create mode 100644 spec/support/api_helpers.rb create mode 100644 spec/support/db_cleaner.rb create mode 100644 spec/support/gitolite_stub.rb delete mode 100644 spec/support/js_patch.rb delete mode 100644 spec/support/login.rb create mode 100644 spec/support/login_helpers.rb delete mode 100644 spec/support/shared_examples.rb create mode 100644 spec/support/stubbed_repository.rb diff --git a/.rails_footnotes b/.rails_footnotes deleted file mode 100644 index 1019a70a..00000000 --- a/.rails_footnotes +++ /dev/null @@ -1,3 +0,0 @@ -#this code temporarily disables notes for all controllers -# Footnotes::Filter.notes = [] - diff --git a/CHANGELOG b/CHANGELOG index 80b68b0a..7322efbf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,8 +1,32 @@ +v 2.9.0 + - fixed inline notes bugs + - refactored rspecs + - refactored gitolite backend + - added factory_girl + - restyled projects list on dashboard + - ssh keys validation to prevent gitolite crash + - send notifications if changed premission in project + - scss refactoring. gitlab_bootstrap/ dir + - fix git push http body bigger than 112k problem + - list of labels page under issues tab + - API for milestones + - restyled buttons + +v 2.8.1 + - ability to disable gravatars + - improved MR diff logic + - ssh key help page + v 2.8.0 - Gitlab Flavored Markdown - Bulk issues update - Issues API - Cucumber coverage increased + - Post-receive files fixed + - UI improved + - Application cleanup + - more cucumber + - capybara-webkit + headless v 2.7.0 - Issue Labels diff --git a/Gemfile b/Gemfile index e8b0b244..b0724fad 100644 --- a/Gemfile +++ b/Gemfile @@ -54,7 +54,7 @@ gem "unicorn" gem "acts-as-taggable-on", "2.3.1" # Decorators -gem "drapper" +gem "draper" # Background jobs gem "resque", "~> 1.20.0" @@ -92,7 +92,6 @@ end group :development do gem "letter_opener" - gem "rails-footnotes" gem "annotate", :git => "https://github.com/ctran/annotate_models.git" gem 'rack-mini-profiler' end @@ -108,15 +107,18 @@ group :development, :test do gem "awesome_print" gem "database_cleaner" gem "launchy" + gem 'factory_girl_rails' end group :test do gem 'cucumber-rails', :require => false - gem 'minitest', ">= 2.10" - gem "turn", :require => false gem "simplecov", :require => false gem "shoulda-matchers" gem 'email_spec' gem 'resque_spec' gem "webmock" end + +group :production do + gem "gitlab_meta", '2.9' +end diff --git a/Gemfile.lock b/Gemfile.lock index b23bc47c..f226c931 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -99,7 +99,6 @@ GEM acts-as-taggable-on (2.3.1) rails (~> 3.0) addressable (2.2.8) - ansi (1.4.2) arel (3.0.2) autotest (4.4.6) ZenTest (>= 4.4.1) @@ -156,7 +155,9 @@ GEM railties (~> 3.1) warden (~> 1.2.1) diff-lcs (1.1.3) - drapper (0.8.4) + draper (0.17.0) + actionpack (~> 3.2) + activesupport (~> 3.2) email_spec (1.2.1) mail (~> 2.2) rspec (~> 2.0) @@ -165,6 +166,11 @@ GEM eventmachine (0.12.10) execjs (1.4.0) multi_json (~> 1.0) + factory_girl (4.0.0) + activesupport (>= 3.0.0) + factory_girl_rails (4.0.0) + factory_girl (~> 4.0.0) + railties (>= 3.0.0) ffaker (1.14.0) ffi (1.0.11) foreman (0.47.0) @@ -172,6 +178,7 @@ GEM gherkin (2.11.0) json (>= 1.4.6) git (1.2.5) + gitlab_meta (2.9) grape (0.2.1) hashie (~> 1.2) multi_json @@ -218,7 +225,6 @@ GEM treetop (~> 1.4.8) method_source (0.7.1) mime-types (1.19) - minitest (3.1.0) modernizr (2.5.3) sprockets (~> 2.0) multi_json (1.3.6) @@ -258,8 +264,6 @@ GEM activesupport (= 3.2.8) bundler (~> 1.0) railties (= 3.2.8) - rails-footnotes (3.7.8) - rails (>= 3.0.0) railties (3.2.8) actionpack (= 3.2.8) activesupport (= 3.2.8) @@ -349,8 +353,6 @@ GEM treetop (1.4.10) polyglot polyglot (>= 0.3.1) - turn (0.9.5) - ansi tzinfo (0.3.33) uglifier (1.0.3) execjs (>= 0.3.0) @@ -389,11 +391,13 @@ DEPENDENCIES cucumber-rails database_cleaner devise (~> 2.1.0) - drapper + draper email_spec + factory_girl_rails ffaker foreman git + gitlab_meta (= 2.9) gitolite! grack! grape (~> 0.2.1) @@ -407,7 +411,6 @@ DEPENDENCIES launchy letter_opener linguist (~> 1.0.0)! - minitest (>= 2.10) modernizr (= 2.5.3) mysql2 omniauth-ldap! @@ -415,7 +418,6 @@ DEPENDENCIES pygments.rb! rack-mini-profiler rails (= 3.2.8) - rails-footnotes raphael-rails (= 1.5.2) redcarpet (~> 2.1.1) resque (~> 1.20.0) @@ -432,7 +434,6 @@ DEPENDENCIES stamp therubyracer thin - turn uglifier (= 1.0.3) unicorn webmock diff --git a/README.md b/README.md index 26ed209e..122cd984 100644 --- a/README.md +++ b/README.md @@ -39,5 +39,6 @@ Email ## Contribute +[Development Tips](https://github.com/gitlabhq/gitlabhq/blob/master/doc/development.md) Want to help - send a pull request. We'll accept good pull requests. diff --git a/VERSION b/VERSION index 3f80e494..a564e653 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.8.0pre +2.9.0pre diff --git a/app/assets/images/file_dir.png b/app/assets/images/file_dir.png index 97b0539393d29c78a596f565087b9282df0f0291..ea277bb14dba38fa633a32675ee58b88b88f80a4 100644 GIT binary patch delta 1613 zcmZo=`M@(lxt>KO)7d$|)7e=epeR2rGbfdS!9uV#^nU*B5D~l1{GcUb_6ia1?OjLL zhXzOQl$Kh1jLmcM(zjk>OJCm5Qh8!!-nmkm{r1aktNg1Q&Ds7iI^1OD_pnjqWlO5Q z`R%|K&){~gRh}NzFOKjls=Z|meYm?UNj>;T%-3J1E$>@Cx2}I4ciY7_K6C3V$`=Pccsyo0~-EdZX~~$Sij;# zaOQ)=2M4`sSIvx{RT%cH+f}wu^0b)Ov5PO&>er@Kr3>D=!Mb~% z_^k=^?_PRS!X{C9!+wvI{xde2+p$-IlC~{AQ1AZ2#YNdqOgHK3N-ygr0rQNe9NFt; zW}|9!qNVll=|n>%|4TwScPlOXA0Kb&*(APKcTwO{>*MPS_MhAsVIO>x@sE7c<~Ih? z>B37knBSQFhQs@y)j>X1uA*EkQLW3h8ec!}@h=S#v+@i0^v9uAqa*O#&G%Bj&i4On zo3+7P`-^hD{{=&n=(oZO?7|tP=9lc2XJ^~L;j=l#w)@AqxBIfQOa2so?!DWcd)#b8 z-mz_me%x5UQTI=75R-L6RoAqIr#_S&;;c}XwT)rCtjha3|3T!1TS2!rE?)ZTXX6EB zwS)F2?9N=;`S8N3e~bRD%v%w^Lj1~o>#P<@>t!mnTD97LHEQeCYxV#7bd^NzQu?bB zJ9XbgJyy%z@AuAEy-~eBK2i8?S8T@B?D?kZ!G5QzpNK!5@@LPVO*YaSM0Uo@O-_G*5UB4CRaO! zy{%=pBA?3Z96hAa(VD7r)QjmLi}0b-x9{HkIOp!~N7^ic;?LflJ2%HNJ#D?Q@z439 z9C9(ScO!Og{g$!o!gT-L)-PYTZ@*k#Z*`rC#lEiMKcn!9`r`-VE(`w5X53!${^jP@ zpGSAUF3*eq*mq&uy|;CLj$M8)U8S@yH)z9qd6_-@-NnU+pWlu?>=oM_86%#OT=6;R z5|5`E=cYxenm3n3tlYgrvhw4r)HS*?a`N4&Z?lWvXC-NA$%ROYxh@qE2@pQ|F0i4h z>Diq6d0I=BsqxR^)p=0Ann5Per|@|~2*doNBJpQ67esaLcxCjYN+pop;n|5cNd}gu z3{kz34QDhZ+L&Z+OjbMLl3--`q;)go93|QG5xl(@;2&LH0_hh)$s^R zt(IHaD|um;2v>}zo`}oi3Z9u08eN&zac2JxUf5T@VV`H9d0VA;fW@5pBPt7*c(U8> zNO~oyd}Q~RdKdlsR;!Ad58PU8Y%}NREI0YhYna#A`(B^%^InL<=N}XJo(Rnm?S4Fw z=M;x?CR6pKW1U(oTh(sOEbL+9Gl{uf^J!T`IpaHf{r6wmch~$qcIo@x^MV;2w&ttm oZ|mgXS~xLYUr+b^AEuJYD!+IP#hZ8-7#J8lUHx3vIVCg!08}~)N&o-= delta 474 zcmeys)5*c$D`4~)BVrlvN^55I~Z2oh?0tY5vm%n!3?liO-A{zU^Mx_h%Ys(DCiNCy3WK zmgv8$&QEredbqxH&ZBDCssN#co`PNKWuihSe0J@#3VqUVb?)tsEt^VpFJ&pstljGS zt!3ZxWQo4lC$IQ*on!f>Yw&Vufo=5TOGa&qe^>vLdA@PVroZ*?*Rt)gI+iqHOMSTC zYm4n_C#}4b`^y~Lm=qqWDx5qwk44ofy`glX=O&z`&N| z?e41LH+c z7sn8f<7cOC?7A8t(6-+`j%Bv)7QqzhgYF-eh_OmLda`gwO6P77;MVSLVbS@*xJ^)A zkJzE_>(%I>tx0Q@^4ABdx`rT~jAqWH|XwyE3Cfa#hVWm7^^} zlD8F3PSW$P6TJS@vmqdrUAXJ@ABzpFIZSb~cXm643qEgeQ%I@kuU+kX+P`q>#U)Se z4zPW=Wx=sF+n{KCy{{(+%zlfSFBJVWy;b&;5HQBFlFCfM)0R!nyg3TRczZY~q}9WpxG9N1c$HlAX&he%Y*N5X3%bLzACU zWJB$G-&4;gGv#<+;(w!^8+ERIX9vU0YZDHwVz0KmUAu3I>|<$==+%qMRE~_;_=1Xae`>rf|`aIw{ zJ5$D*YYR_pQ@#7P^?y^zM$fLJCAYt9|IJpi(6j64{AqV4xh!UXC1Jq6&OCFY@T(p( sP4&Ig-yaFxSGZ*Qzr@}D=ikt`$UamPaiF-9fq{X+)78&qol`;+0GkQ|YXATM literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index d9cbd5d6..f69fd6f9 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -72,7 +72,7 @@ $(document).ready(function(){ * Note markdown preview * */ - $('#preview-link').on('click', function(e) { + $(document).on('click', '#preview-link', function(e) { $('#preview-note').text('Loading...'); var previewLinkText = ($(this).text() == 'Preview' ? 'Edit' : 'Preview'); @@ -128,3 +128,23 @@ function showDiff(link) { function ajaxGet(url) { $.ajax({type: "GET", url: url, dataType: "script"}); } + +/** + * Disable button if text field is empty + */ +function disableButtonIfEmtpyField(field_selector, button_selector) { + field = $(field_selector); + if(field.val() == "") { + field.closest("form").find(button_selector).attr("disabled", "disabled").addClass("disabled"); + } + + field.on('keyup', function(){ + var field = $(this); + var closest_submit = field.closest("form").find(button_selector); + if(field.val() == "") { + closest_submit.attr("disabled", "disabled").addClass("disabled"); + } else { + closest_submit.removeAttr("disabled").removeClass("disabled"); + } + }) +} diff --git a/app/assets/javascripts/issues.js b/app/assets/javascripts/issues.js index bc056965..aae818de 100644 --- a/app/assets/javascripts/issues.js +++ b/app/assets/javascripts/issues.js @@ -5,6 +5,7 @@ function switchToNewIssue(form){ $('select#issue_milestone_id').chosen(); $("#new_issue_dialog").show("fade", { direction: "right" }, 150); $('.top-tabs .add_new').hide(); + disableButtonIfEmtpyField("#issue_title", ".save-btn"); }); } @@ -15,6 +16,7 @@ function switchToEditIssue(form){ $('select#issue_milestone_id').chosen(); $("#edit_issue_dialog").show("fade", { direction: "right" }, 150); $('.add_new').hide(); + disableButtonIfEmtpyField("#issue_title", ".save-btn"); }); } diff --git a/app/assets/javascripts/note.js b/app/assets/javascripts/note.js index d9ae45d9..9cd3e36e 100644 --- a/app/assets/javascripts/note.js +++ b/app/assets/javascripts/note.js @@ -1,161 +1,160 @@ var NoteList = { -notes_path: null, -target_params: null, -target_id: 0, -target_type: null, -first_id: 0, -last_id: 0, -disable:false, + notes_path: null, + target_params: null, + target_id: 0, + target_type: null, + first_id: 0, + last_id: 0, + disable:false, -init: - function(tid, tt, path) { - this.notes_path = path + ".js"; - this.target_id = tid; - this.target_type = tt; - this.target_params = "&target_type=" + this.target_type + "&target_id=" + this.target_id; + init: + function(tid, tt, path) { + this.notes_path = path + ".js"; + this.target_id = tid; + this.target_type = tt; + this.target_params = "&target_type=" + this.target_type + "&target_id=" + this.target_id; - // get notes - this.getContent(); + // get notes + this.getContent(); - // get new notes every n seconds - this.initRefresh(); + // get new notes every n seconds + this.initRefresh(); - $('.delete-note').live('ajax:success', function() { - $(this).closest('li').fadeOut(); }); + $('.delete-note').live('ajax:success', function() { + $(this).closest('li').fadeOut(); }); - $("#new_note").live("ajax:before", function(){ - $(".submit_note").attr("disabled", "disabled"); - }) + $(".note-form-holder").live("ajax:before", function(){ + $(".submit_note").attr("disabled", "disabled"); + }) - $("#new_note").live("ajax:complete", function(){ - $(".submit_note").removeAttr("disabled"); - }) + $(".note-form-holder").live("ajax:complete", function(){ + $(".submit_note").removeAttr("disabled"); + }) - $("#note_note").live("focus", function(){ - $(this).css("height", "80px"); - $('.note_advanced_opts').show(); - }); + disableButtonIfEmtpyField(".note-text", ".submit_note"); - $("#note_attachment").change(function(e){ + $(".note-text").live("focus", function(){ + $(this).css("height", "80px"); + $('.note_advanced_opts').show(); + }); + + $("#note_attachment").change(function(e){ var val = $('.input-file').val(); var filename = val.replace(/^.*[\\\/]/, ''); $(".file_name").text(filename); - }); + }); - }, + }, -/** - * Load new notes to fresh list called 'new_notes_list': - * - Replace 'new_notes_list' with new list every n seconds - * - Append new notes to this list after submit - */ + /** + * Load new notes to fresh list called 'new_notes_list': + * - Replace 'new_notes_list' with new list every n seconds + * - Append new notes to this list after submit + */ -initRefresh: - function() { - // init timer - var intNew = setInterval("NoteList.getNew()", 10000); - }, + initRefresh: + function() { + // init timer + var intNew = setInterval("NoteList.getNew()", 10000); + }, -replace: - function(html) { - $("#new_notes_list").html(html); - }, + replace: + function(html) { + $("#new_notes_list").html(html); + }, -prepend: - function(id, html) { - if(id != this.last_id) { - $("#new_notes_list").prepend(html); - } - }, + prepend: + function(id, html) { + if(id != this.last_id) { + $("#new_notes_list").prepend(html); + } + }, -getNew: - function() { - // refersh notes list - $.ajax({ - type: "GET", + getNew: + function() { + // refersh notes list + $.ajax({ + type: "GET", url: this.notes_path, data: "last_id=" + this.last_id + this.target_params, dataType: "script"}); - }, + }, -refresh: - function() { - // refersh notes list - $.ajax({ - type: "GET", + refresh: + function() { + // refersh notes list + $.ajax({ + type: "GET", url: this.notes_path, data: "first_id=" + this.first_id + "&last_id=" + this.last_id + this.target_params, dataType: "script"}); - }, + }, -/** - * Init load of notes: - * 1. Get content with ajax call - * 2. Set content of notes list with loaded one - */ + /** + * Init load of notes: + * 1. Get content with ajax call + * 2. Set content of notes list with loaded one + */ -getContent: - function() { - $.ajax({ - type: "GET", + getContent: + function() { + $.ajax({ + type: "GET", url: this.notes_path, data: "?" + this.target_params, complete: function(){ $('.status').removeClass("loading")}, beforeSend: function() { $('.status').addClass("loading") }, dataType: "script"}); - }, + }, -setContent: - function(fid, lid, html) { + setContent: + function(fid, lid, html) { this.last_id = lid; this.first_id = fid; $("#notes-list").html(html); // Init infinite scrolling this.initLoadMore(); - }, + }, -/** - * Paging for old notes when scroll to bottom: - * 1. Init scroll events with 'initLoadMore' - * 2. Load onlder notes with 'getOld' method - * 3. append old notes to bottom of list with 'append' - * - */ + /** + * Paging for old notes when scroll to bottom: + * 1. Init scroll events with 'initLoadMore' + * 2. Load onlder notes with 'getOld' method + * 3. append old notes to bottom of list with 'append' + * + */ + getOld: + function() { + $('.loading').show(); + $.ajax({ + type: "GET", + url: this.notes_path, + data: "first_id=" + this.first_id + this.target_params, + complete: function(){ $('.status').removeClass("loading")}, + beforeSend: function() { $('.status').addClass("loading") }, + dataType: "script"}); + }, + append: + function(id, html) { + if(this.first_id == id) { + this.disable = true; + } else { + this.first_id = id; + $("#notes-list").append(html); + } + }, -getOld: - function() { - $('.loading').show(); - $.ajax({ - type: "GET", - url: this.notes_path, - data: "first_id=" + this.first_id + this.target_params, - complete: function(){ $('.status').removeClass("loading")}, - beforeSend: function() { $('.status').addClass("loading") }, - dataType: "script"}); - }, - -append: - function(id, html) { - if(this.first_id == id) { - this.disable = true; - } else { - this.first_id = id; - $("#notes-list").append(html); - } - }, - - -initLoadMore: - function() { - $(document).endlessScroll({ - bottomPixels: 400, + initLoadMore: + function() { + $(document).endlessScroll({ + bottomPixels: 400, fireDelay: 1000, fireOnce:true, ceaseFire: function() { @@ -164,6 +163,20 @@ initLoadMore: callback: function(i) { NoteList.getOld(); } - }); - } + }); + } +}; + +var PerLineNotes = { + init: + function() { + $(".line_note_link, .line_note_reply_link").live("click", function(e) { + var form = $(".per_line_form"); + $(this).closest("tr").after(form); + form.find("#note_line_code").val($(this).attr("line_code")); + form.show(); + return false; + }); + disableButtonIfEmtpyField(".line-note-text", ".submit_inline_note"); + } } diff --git a/app/assets/javascripts/projects.js b/app/assets/javascripts/projects.js index 84272698..be1b75b9 100644 --- a/app/assets/javascripts/projects.js +++ b/app/assets/javascripts/projects.js @@ -7,8 +7,10 @@ function Projects() { $('.new_project, .edit_project').live('ajax:before', function() { $('.project_new_holder, .project_edit_holder').hide(); - $('.ajax_loader').show(); + $('.save-project-loader').show(); }); $('form #project_default_branch').chosen(); + + disableButtonIfEmtpyField("#project_name", ".project-submit") } diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 6103d05c..aa27a280 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -1,11 +1,9 @@ -.diff_file_header a, -.file_stats a { - color:$style_color; -} - - /** LAYOUT **/ +body { + margin-bottom:20px; +} + .container { padding-top:0; z-index:5; @@ -40,30 +38,6 @@ color: $link_color; } -.widget { - @include shade; - padding:20px; - margin-bottom:20px; - border: 1px solid #DDD; - border-radius: 5px; - background:#fafafa; - - .link_holder { - background:#eee; - position:relative; - left:-20px; - top:20px; - padding:10px 20px; - width:100%; - border-top:1px solid #ccc; - - a { - font-size:14px; - color:#666; - } - } -} - .help li { color:#111 } .back_link { @@ -88,16 +62,6 @@ padding-left:20px; } -.number { - border-radius: 4px; - text-shadow: none; - background: rgba(0,0,0,.12); - text-align: center; - padding: 2px 4px; - line-height:18px; - margin-left:2px; -} - table a code { position: relative; top: -2px; @@ -129,26 +93,18 @@ table a code { border-bottom:1px solid #ccc; h4 { - color:#444; - font-size:22px; + color:#666; + font-size:18px; + line-height:38px; padding-top:5px; margin:2px; + font-weight:normal; } } .git_url_wrapper { margin-right:50px } -.file_stats { - span { - img { - width:14px; - float:left; - margin-right:6px; - padding:2px 0; - } - } -} .handle:hover { cursor:move; @@ -172,10 +128,6 @@ span.update-author { display:block; } /** END UPDATE ITEM **/ -.ajax-tab-loading { - padding:40px; - display:none; -} .dashboard-loader { float:left; margin:10px; @@ -186,15 +138,110 @@ span.update-author { font-weight:bold; } -a.project-update.titled { - position:relative; - padding-left:35% !important; - .title-block { - padding:10px; - width:35%; - position:absolute; - left:0; - top:0; +.neib { + margin-right:10px; +} + +.label { + background-color: #474D57; + + &.label-issue { + background-color: #eee; + border: 1px solid #ccc; + padding:4px 6px; + color:#444; + text-shadow:0 0 1px #fff; + + &.grouped { + float: left; + margin-right: 6px; + padding: 6px; + } + } +} + +.event_label { + @extend .label; + background-color: #999; + + &.pushed { + background-color: #4A97BD; + } + + &.opened { + background-color: #469847; + } + + &.closed { + background-color: #B94A48; + } + + &.merged { + background-color: #2A2; + } +} + +form { + @extend .form-horizontal; + + .actions { + @extend .form-actions; + } + + .clearfix { + @extend .control-group; + } + + .input { + @extend .controls; + } + + label { + @extend .control-label; + } + .xlarge { + @extend .input-xlarge; + } + .xxlarge { + @extend .input-xxlarge; + } +} + + +.field_with_errors { + display:inline; +} + +ul.breadcrumb { + background:white; + border:none; + li { + display: inline; + text-shadow: 0 1px 0 white + } + + a { + color:#474D57; + font-weight:bold; + font-size:14px; + } + + .arrow { + background: url("images.png") no-repeat -85px -77px; + width: 19px; + height: 16px; + float: left; + position: relative; + left: -10px; + padding:0; + margin:0; + } +} + +input[type=text] { + &.large_text { + padding:6px; + font-size:16px; } } @@ -270,40 +317,6 @@ p.time { } -/** - * Dashboard page - * - */ -.dashboard_category { - margin-bottom:30px; - h3 a { - color:#474D57; - &:hover { - text-decoration:underline; - } - } - - .dashboard_block { - .dash_project_item { - margin-bottom:10px; - border:none; - padding:0px 5px; - .project_link { - color:#888; - &:hover { - color:#111; - .ico.project { - background-position:-209px -21px; - } - } - } - h4 { - color:#666; - } - } - } -} - .styled_image { border:2px solid #ddd; } @@ -393,39 +406,6 @@ p.time { } } -.btn { - &.very_small { - font-size:11px; - padding:2px 6px; - margin:2px; - } - - &.grouped { - margin-right:7px; - float:left; - } - - &.padded { - margin-right:3px; - padding:4px 10px 4px; - } -} - - -.prettyprint { - background-color: #fefbf3; - padding: 9px; - border: 1px solid rgba(0,0,0,.2); - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 2px rgba(0,0,0,.1); - box-shadow: 0 1px 2px rgba(0,0,0,.1); -} - -.hint { - font-style: italic; - color: #999; -} - .upvotes { font-size: 14px; font-weight: bold; @@ -549,14 +529,6 @@ li.note { } -/** - * Milestones list - * - */ - -.milestone { - @extend .wll; -} /** * Admin area @@ -603,11 +575,10 @@ li.note { * */ .event_lp { - @extend .alert-info; + @extend .ui-box; + color:#777; margin-bottom:20px; padding:8px; - border-style: solid; - border-width: 1px; @include border-radius(4px); min-height:22px; @@ -621,88 +592,19 @@ li.note { cursor:pointer; } -/** - * Issues, MRs legend - * - */ - -.list_legend { - float:left; - margin-right:20px; - .icon { - width:12px; - height:12px; - float:left; - margin-right:5px; - margin-top: 2px; - @include border-radius(4px); - &.today{ - background: #ADA; - border:1px solid #8B8; - } - &.closed { - background: #DDD; - border:1px solid #BBB; - } - &.yours { - background: #AAD; - border:1px solid #88B; - } - &.merged { - background: #DAD; - border:1px solid #B8B; - } - } - .text { - padding-bottom: 10px; - float:left; - } -} - .merge_request, .issue { - .list_legend { - margin-right: 5px; - margin-top: 14px; - .icon { - width:8px; - height:8px; - float:left; - margin-right:5px; - @include border-radius(4px); - border:1px solid #ddd; - } - } - &.today{ background: #EFE; border-color:#CEC; - .icon { - background: #ADA; - border:1px solid #8B8; - } } &.closed { background: #F5f5f5; border-color:#E5E5E5; - .icon { - background: #DDD; - border:1px solid #BBB; - } - } - &.yours { - .icon { - background: #AAD; - border:1px solid #88B; - } } &.merged { background: #F5f5f5; border-color:#E5E5E5; - .icon { - background: #DAD; - border:1px solid #B8B; - } } } @@ -735,3 +637,11 @@ li.note { font-size: 12px; } } + +.error_message { + @extend .cred; + border-bottom: 1px solid #D21; + padding-bottom:20px; + text-align:center; + margin-bottom:10px; +} diff --git a/app/assets/stylesheets/gitlab_bootstrap.scss b/app/assets/stylesheets/gitlab_bootstrap.scss deleted file mode 100644 index 550046d0..00000000 --- a/app/assets/stylesheets/gitlab_bootstrap.scss +++ /dev/null @@ -1,818 +0,0 @@ -body { - margin-bottom:20px; -} -a { - outline: none; - color: $link_color; - &:hover { - text-decoration:none; - color: $blue_link; - } - - &.btn { - color: $style_color; - } - - &.dark { - color: $style_color; - } - - &.lined { - text-decoration:underline; - &:hover { text-decoration:underline; } - } - - &.gray { - color:gray; - } - - &.supp_diff_link { - text-align:center; - padding:20px 0; - background:#f1f1f1; - width:100%; - float:left; - } - - &.neib { - margin-right:15px; - } -} - -.neib { - margin-right:10px; -} - -.alert-message { - @extend .alert; - - &.success { - @extend .alert-success; - } - - &.error { - @extend .alert-error; - } -} - -.alert { - &.alert-well { - background:#ddd; - border:1px solid #ccc; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #ddd), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#ddd 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#ddd 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#ddd 6.6%, #dfdfdf); - color:#111; - } -} - -h3, h4, h5, h6 { - line-height: 36px; -} - -h5 { - font-size:14px; -} - - -table { - width:100%; - th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - th, td { - padding: 10px 10px 9px; - line-height: 18px; - text-align: left; - } - - &.bordered-table { - border: 1px solid #DDD; - border-collapse: separate; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - - &.zebra-striped { - @extend .table-striped; - } -} - -.btn { - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: -ms-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: -o-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - background-image: linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); - - &:hover { - } - - &.btn-primary { - background:$link_color; - border-color: #2A79A3; - &:hover { - background:$blue_link; - } - } - &.primary { - @extend .btn-primary; - } - - &.success { - color: #fff; - text-shadow: 0 0 1px #111; - background: #5bb75b;; - font-weight: bold; - - &:hover { - background-color: #51a351; - color: #fff; - } - } - - &.danger, - &.btn-danger { - color:#fff; - background: #DA4E49; - border-color: #BD362F; - - &:hover { - color:#fff; - background: #EE4E49; - } - } - - &.danger { - @extend .btn-danger; - } - - &.small { - @extend .btn-small; - } - - &.active { - border-color:#aaa; - background-color:#ccc; - } -} - -a:focus { - outline: none; -} - -.nav-pills a:hover { - background-color:#888; -} - -.nav-pills .active a { - background-color: $style_color; -} - -.label { - background-color: #474D57; - &.label-important { - background-color: #B94A48; - } - - &.label-issue { - background-color: #eee; - border: 1px solid #ccc; - padding:4px 6px; - color:#444; - text-shadow:0 0 1px #fff; - - &.grouped { - float: left; - margin-right: 6px; - padding: 6px; - } - } -} - -.nav-tabs > li > a, .nav-pills > li > a { - color:$style_color; -} - -.nav-tabs > .active > a { - font-weight:bold; -} - -/** COLORS **/ -.cgray { color:gray; } -.cred { color:#D12F19; } -.cgreen { color:#44aa22; } -.cblack { color:#111; } -.cdark { color:#444 } -.cwhite { color:#fff !important } -.bgred { background: #F2DEDE !important} - -/** COMMON STYLES **/ -.left { - float:left; -} -.right { - float:right !important; -} -.width-50p{ - width:50%; -} -.width-49p{ - width:49%; -} -.width-30p{ - width:30%; -} -.width-65p{ - width:65%; -} -.width-100p{ - width:100%; -} -.append-bottom-10 { - margin-bottom:10px; -} -.append-bottom-20 { - margin-bottom:20px; -} -.prepend-top-10 { - margin-top:10px; -} - -.prepend-top-20 { - margin-top:20px; -} - -.padded { - padding:20px; -} - -.ipadded { - padding:20px !important; -} -.lborder { - border-left:1px solid #eee; -} - -.borders { - border: 1px solid #ccc; - @include shade; -} -.no-borders { - border:none; -} -table.no-borders { - border:none; - tr, td { border:none } -} -.no-padding { - padding:0 !important; -} -.underlined { - border-bottom: 1px solid $border_color; -} -.vlink { - color: $link_color !important; -} - -.pretty_label { - @include round-borders-all(4px); - padding:2px 4px; - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8)); - background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8); - background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8); - background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8); - color: #777; - border: 1px solid #DEDFE1; - - &.branch { - border:none; - font-size:13px; - background: #474D57; - color:#fff; - font-weight:bold; - font-family: monospace; - } -} - -.event_label { - @extend .label; - background-color: #999; - - &.pushed { - background-color: #3A87AD; - } - - &.opened { - background-color: #468847; - } - - &.closed { - background-color: #B94A48; - } - - &.merged { - background-color: #2A2; - } -} - -img.avatar { - float:left; - margin-right:15px; - width:40px; - border:2px solid #ddd; - - &.s16 { - width:16px; - } - &.s24 { - width:24px; - } - &.s32 { - width:32px; - } -} - -img.lil_av { - padding-left: 4px; - padding-right:3px; -} - -form { - @extend .form-horizontal; - - .actions { - @extend .form-actions; - } - - .clearfix { - @extend .control-group; - } - - .input { - @extend .controls; - } - - label { - @extend .control-label; - } - .xlarge { - @extend .input-xlarge; - } - .xxlarge { - @extend .input-xxlarge; - } -} - -/** - * List li block element #1 - * - */ -.wll { - background-color: #FFF; - padding: 10px 5px; - min-height: 20px; - border-bottom: 1px solid #eee; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - &.smoke { - background-color:#f5f5f5; - } - &:hover { - background:$hover; - } - &:last-child { border:none } - p { padding-top:5px; margin:0; color:$style_color;} - .author { color: #999; } - p { - color:#222; - margin-bottom: 0; - img { - position:relative; - top:3px; - } - } -} - - -/** - * Block element #2 - * - */ -.entry { - position: relative; - padding: 7px 15px; - margin-bottom: 18px; - color: #404040; - filter:none; - - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - - background:#F1F1F1; - border: 1px solid #ccc; - - - p { - color:$style_color; - margin-bottom: 0; - img { - position:relative; - top:3px; - } - } -} - - -/** - * Big UI Block for show page content - * - */ -.ui-box { - background:#F9F9F9; - margin-bottom: 25px; - @include round-borders-all(4px); - border-color: #CCC; - @include solid_shade; - - ul { - margin:0; - } - - h5, .title { - padding: 0 10px; - @include round-borders-top(4px); - border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); - - &.small { - line-height: 28px; - font-size: 14px; - line-height:28px; - text-shadow: 0 1px 1px white; - } - - form { - padding:9px 0; - margin:0px; - } - - .nav-pills { - li { - padding:3px 0; - &.active a { background-color:$style_color; } - a { - border-radius:7px; - } - } - } - } - - .bottom { - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); - @include round-borders-bottom(4px); - border-bottom:none; - border-top: 1px solid #bbb; - } - - &.padded { - h5, .title { - margin: -20px; - margin-bottom: 0; - padding: 5px 20px; - } - .middle_title { - background:#f5f5f5; - margin:20px -20px; - padding: 0 20px; - border-top:1px solid #eee; - border-bottom:1px solid #eee; - font-size:14px; - color:#777; - } - } - .row_title { - font-weight:bold; - color:#444; - &:hover { - color:#444; - text-decoration:underline; - } - } - - li, .wll { - padding:10px; - &:first-child { - @include round-borders-top(4px); - border-top:none; - } - - &:last-child { - @include round-borders-bottom(4px); - border:none; - } - } - -} - -table.admin-table { - @extend .table-bordered; - @extend .zebra-striped; - @include solid_shade; - th { - border-color: #CCC; - border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); - } -} - -.field_with_errors { - display:inline; -} - -ul.breadcrumb { - background:white; - border:none; - li { - display: inline; - text-shadow: 0 1px 0 white - } - - a { - color:#474D57; - font-weight:bold; - font-size:14px; - } - - .arrow { - background: url("images.png") no-repeat -85px -77px; - width: 19px; - height: 16px; - float: left; - position: relative; - left: -10px; - padding:0; - margin:0; - } -} - -.nothing_here_message { - text-align:center; - padding:20px; - color:#777; -} - -/** - * UI box element - * contains top, middle, bottom blocks - * - */ -.main_box { - @extend .borders; - @extend .prepend-top-20; - @extend .append-bottom-20; - border-width:1px; - @include solid_shade; - - - img { max-width: 100%; } - - pre { - code { - background: none !important; - } - } - - .top_box_content, - .middle_box_content, - .bottom_box_content { - padding:15px; - - pre { - background: none !important; - margin:0; - border:none; - padding:0; - } - } - - .middle_box_content { - border-radius:0; - border:none; - font-size:12px; - background-color:#f5f5f5; - border:none; - border-top:1px solid #eee; - } - - .bottom_box_content { - border-top:1px solid #eee; - } -} - -input[type=text] { - &.large_text { - padding:6px; - font-size:16px; - } -} - -p { - &.slead { - color:#456; - font-size:16px; - margin-bottom: 12px; - font-weight: 200; - line-height: 24px; - } -} - -h3.page_title { - color:#456; - font-size:20px; - font-weight: normal; - line-height: 28px; -} - -/** - * File content holder - * - */ -.file_holder { - border:1px solid #CCC; - margin-bottom:1em; - @include solid_shade; - - .file_title { - border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); - margin: 0; - font-weight: normal; - font-weight: bold; - text-align: left; - color: #666; - padding: 9px 10px; - height:18px; - - .options { - float:right; - margin-top: -5px; - } - - .file_name { - color:$style_color; - font-size:14px; - text-shadow: 0 1px 1px #fff; - small { - color:#999; - font-size:13px; - } - } - } - .file_content { - background:#fff; - font-size: 11px; - - &.wiki { - font-size: 13px; - code { - padding:0 4px; - } - padding:20px; - h1, h2 { - line-height: 46px; - } - h3, h4 { - line-height: 40px; - } - } - - &.image_file { - background:#eee; - text-align:center; - img { - padding:100px; - max-width:300px; - } - } - - &.blob_file { - - } - - /** - * Blame file - */ - &.blame { - tr { - border-bottom: 1px solid #eee; - } - td { - padding:5px; - } - .author, - .blame_commit { - background:#f5f5f5; - vertical-align:top; - } - .lines { - pre { - padding:0; - margin:0; - background:none; - border:none; - } - } - } - - &.logs { - background:#eee; - max-height: 700px; - overflow-y: auto; - - ol { - margin-left:40px; - padding: 10px 0; - border-left: 1px solid #CCC; - margin-bottom:0; - background: white; - li { - color:#888; - p { - margin:0; - color:#333; - line-height:24px; - padding-left: 10px; - } - - &:hover { - background:$hover; - } - } - } - } - - /** - * Code file - */ - &.code { - padding:0; - td.code { - width: 100%; - .highlight { - margin-left: 55px; - overflow:auto; - overflow-y:hidden; - } - } - .highlight pre { - white-space: pre; - word-wrap:normal; - } - - table.highlighttable { - border: none; - } - body.project-page table.highlighttable td { border: none } - table.highlighttable tr:hover { background:none;} - - table.highlighttable pre{ - line-height:16px !important; - font-size:12px !important; - } - - table.highlighttable .linenodiv pre { - text-align: right; - padding-right: 4px; - color:#666; - } - } - } -} diff --git a/app/assets/stylesheets/gitlab_bootstrap/blocks.scss b/app/assets/stylesheets/gitlab_bootstrap/blocks.scss new file mode 100644 index 00000000..894cb304 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/blocks.scss @@ -0,0 +1,145 @@ +/** + * =================================== + * Contain 3 main UI block elements: + * .main_box - for show pages + * .ui-box - for simple block & widgets + * =================================== + */ + +/** + * UI box element + * contains top, middle, bottom blocks + * + */ +.main_box { + @extend .borders; + @extend .prepend-top-20; + @extend .append-bottom-20; + border-width:1px; + @include solid_shade; + + + img { max-width: 100%; } + + pre { + code { + background: none !important; + } + } + + .top_box_content, + .middle_box_content, + .bottom_box_content { + padding:15px; + + pre { + background: none !important; + margin:0; + border:none; + padding:0; + } + } + + .middle_box_content { + border-radius:0; + border:none; + font-size:12px; + background-color:#f5f5f5; + border:none; + border-top:1px solid #eee; + } + + .bottom_box_content { + border-top:1px solid #eee; + } +} + +/** + * Big UI Block for show page content + * + */ +.ui-box { + background:#F9F9F9; + margin-bottom: 25px; + @include round-borders-all(4px); + border-color: #CCC; + @include solid_shade; + + ul { + margin:0; + } + + h5, .title { + padding: 0 10px; + @include round-borders-top(4px); + @include bg-gray-gradient; + border-bottom: 1px solid #bbb; + + &.small { + line-height: 28px; + font-size: 14px; + line-height:28px; + text-shadow: 0 1px 1px white; + } + + form { + padding:9px 0; + margin:0px; + } + + .nav-pills { + li { + padding:3px 0; + &.active a { background-color:$style_color; } + a { + border-radius:7px; + } + } + } + } + + .bottom { + @include bg-gray-gradient; + @include round-borders-bottom(4px); + border-bottom:none; + border-top: 1px solid #bbb; + } + + &.padded { + h5, .title { + margin: -20px; + margin-bottom: 0; + padding: 5px 20px; + } + .middle_title { + background:#f5f5f5; + margin:20px -20px; + padding: 0 20px; + border-top:1px solid #eee; + border-bottom:1px solid #eee; + font-size:14px; + color:#777; + } + } + .row_title { + font-weight:bold; + color:#444; + &:hover { + color:#444; + text-decoration:underline; + } + } + + li, .wll { + padding:10px; + &:first-child { + @include round-borders-top(4px); + border-top:none; + } + + &:last-child { + @include round-borders-bottom(4px); + border:none; + } + } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss new file mode 100644 index 00000000..c838f3b2 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss @@ -0,0 +1,105 @@ +.btn { + background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #f7f7f7), to(#d5d5d5)); + background-image: -webkit-linear-gradient(#f7f7f7 7.6%, #d5d5d5); + background-image: -moz-linear-gradient(#f7f7f7 7.6%, #d5d5d5); + background-image: -o-linear-gradient(#f7f7f7 7.6%, #d5d5d5); + border-color:#aaa; + &:hover { + @include bg-gray-gradient; + border-color:#bbb; + color:#333; + } + + &.primary { + background:#2a79A3; + border-color: #2A79A3; + background-image: -webkit-linear-gradient(#47A7b7 7.6%, #2585b5); + background-image: -moz-linear-gradient(#47A7b7 7.6%, #2585b5); + background-image: -o-linear-gradient(#47A7b7 7.6%, #2585b5); + color:#fff; + text-shadow: 0 1px 1px #268; + &:hover { + background:$blue_link; + color:#fff; + } + + &.disabled { + color:#fff; + background:#29B; + } + } + + &.success { + border-color: #4A4; + background-image: -webkit-linear-gradient(#82D482 7.6%, #22B442); + background-image: -moz-linear-gradient(#82D482 7.6%, #22B442); + background-image: -o-linear-gradient(#82D482 7.6%, #22B442); + color: #fff; + text-shadow: 0 1px 1px #141; + + &:hover { + background: #6C6; + color: #fff; + } + + &.disabled { + color:#fff; + background:#2b2; + } + } + + &.save-btn { + @extend .wide; + @extend .primary; + } + + &.cancel-btn { + float:right; + } + + &.wide { + padding-left:30px; + padding-right:30px; + } + + &.danger, + &.btn-danger { + color:#fff; + background: #DA4E49; + border-color: #BD362F; + + &:hover { + color:#fff; + background: #EE4E49; + } + } + + &.danger { + @extend .btn-danger; + } + + &.small { + @extend .btn-small; + } + + &.active { + border-color:#aaa; + background-color:#ccc; + } + + &.very_small { + font-size:11px; + padding:2px 6px; + margin:2px; + } + + &.grouped { + margin-right:7px; + float:left; + } + + &.padded { + margin-right:3px; + padding:4px 10px 4px; + } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/common.scss b/app/assets/stylesheets/gitlab_bootstrap/common.scss new file mode 100644 index 00000000..cd7145c9 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/common.scss @@ -0,0 +1,52 @@ +/** COLORS **/ +.cgray { color:gray } +.cred { color:#D12F19 } +.cgreen { color:#4a2 } +.cblack { color:#111 } +.cdark { color:#444 } +.cwhite { color:#fff!important } +.bgred { background:#F2DEDE!important } + +/** COMMON CLASSES **/ +.left { float:left } +.right { float:right!important } +.width-50p { width:50% } +.width-49p { width:49% } +.width-30p { width:30% } +.width-65p { width:65% } +.width-100p { width:100% } +.append-bottom-10 { margin-bottom:10px } +.append-bottom-20 { margin-bottom:20px } +.prepend-top-10 { margin-top:10px } +.prepend-top-20 { margin-top:20px } +.padded { padding:20px } +.ipadded { padding:20px!important } +.lborder { border-left:1px solid #eee } +.no-padding { padding:0 !important; } +.underlined { border-bottom: 1px solid #CCC; } +.no-borders { border:none; } +.vlink { color: $link_color !important; } +.borders { border: 1px solid #ccc; @include shade; } +.hint { font-style: italic; color: #999; } + +/** PILLS & TABS**/ +.nav-pills a:hover { background-color:#888; } +.nav-pills .active a { background-color: $style_color; } +.nav-tabs > li > a, .nav-pills > li > a { color:$style_color; } +.nav-tabs > .active > a { font-weight:bold; } + +/** ALERT MESSAGES **/ +.alert-message { @extend .alert; } +.alert-messag.success { @extend .alert-success; } +.alert-message.error { @extend .alert-error; } + +/** AVATARS **/ +img.avatar { float:left; margin-right:15px; width:40px; border:1px solid #ddd; padding:1px; } +img.avatar.s16 { width:16px; height:16px; } +img.avatar.s24 { width:24px; height:24px; } +img.avatar.s32 { width:32px; height:32px; } +img.lil_av { padding-left: 4px; padding-right:3px; } + +/** HELPERS **/ +.nothing_here_message { text-align:center; padding:20px; color:#777; } +p.slead { color:#456; font-size:16px; margin-bottom: 12px; font-weight: 200; line-height: 24px; } diff --git a/app/assets/stylesheets/gitlab_bootstrap/files.scss b/app/assets/stylesheets/gitlab_bootstrap/files.scss new file mode 100644 index 00000000..4ea5ed02 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/files.scss @@ -0,0 +1,156 @@ +/** + * File content holder + * + */ +.file_holder { + border:1px solid #CCC; + margin-bottom:1em; + @include solid_shade; + + .file_title { + border-bottom: 1px solid #bbb; + @include bg-gray-gradient; + margin: 0; + font-weight: normal; + font-weight: bold; + text-align: left; + color: #666; + padding: 9px 10px; + height:18px; + + .options { + float:right; + margin-top: -5px; + } + + .file_name { + color:$style_color; + font-size:14px; + text-shadow: 0 1px 1px #fff; + small { + color:#999; + font-size:13px; + } + } + } + .file_content { + background:#fff; + font-size: 11px; + + &.wiki { + font-size: 13px; + code { + padding:0 4px; + } + padding:20px; + h1, h2 { + line-height: 46px; + } + h3, h4 { + line-height: 40px; + } + } + + &.image_file { + background:#eee; + text-align:center; + img { + padding:100px; + max-width:300px; + } + } + + &.blob_file { + + } + + /** + * Blame file + */ + &.blame { + tr { + border-bottom: 1px solid #eee; + } + td { + padding:5px; + } + .author, + .blame_commit { + background:#f5f5f5; + vertical-align:top; + } + .lines { + pre { + padding:0; + margin:0; + background:none; + border:none; + } + } + } + + &.logs { + background:#eee; + max-height: 700px; + overflow-y: auto; + + ol { + margin-left:40px; + padding: 10px 0; + border-left: 1px solid #CCC; + margin-bottom:0; + background: white; + li { + color:#888; + p { + margin:0; + color:#333; + line-height:24px; + padding-left: 10px; + } + + &:hover { + background:$hover; + } + } + } + } + + /** + * Code file + */ + &.code { + padding:0; + td.code { + width: 100%; + .highlight { + margin-left: 55px; + overflow:auto; + overflow-y:hidden; + } + } + .highlight pre { + white-space: pre; + word-wrap:normal; + } + + table.highlighttable { + border: none; + } + body.project-page table.highlighttable td { border: none } + table.highlighttable tr:hover { background:none;} + + table.highlighttable pre{ + line-height:16px !important; + font-size:12px !important; + } + + table.highlighttable .linenodiv pre { + text-align: right; + padding-right: 4px; + color:#666; + } + } + } +} + diff --git a/app/assets/stylesheets/gitlab_bootstrap/lists.scss b/app/assets/stylesheets/gitlab_bootstrap/lists.scss new file mode 100644 index 00000000..402ba04b --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/lists.scss @@ -0,0 +1,30 @@ +/** LISTS **/ + +ul { + /** + * List li block element #1 + * + */ + .wll { + background-color: #FFF; + padding: 10px 5px; + min-height: 20px; + border-bottom: 1px solid #eee; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + + &.smoke { background-color:#f5f5f5; } + &:hover { background:$hover; } + &:last-child { border:none } + .author { color: #999; } + + p { + padding-top:5px; + margin:0; + color:#222; + img { + position:relative; + top:3px; + } + } + } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/tables.scss b/app/assets/stylesheets/gitlab_bootstrap/tables.scss new file mode 100644 index 00000000..f78b1dee --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/tables.scss @@ -0,0 +1,41 @@ +table { + width:100%; + th { + padding-top: 9px; + font-weight: bold; + vertical-align: middle; + } + th, td { + padding: 10px 10px 9px; + line-height: 18px; + text-align: left; + } + + &.bordered-table { + border: 1px solid #DDD; + border-collapse: separate; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + &.zebra-striped { + @extend .table-striped; + } +} + +table.admin-table { + @extend .table-bordered; + @extend .zebra-striped; + @include solid_shade; + th { + border-color: #CCC; + border-bottom: 1px solid #bbb; + @include bg-gray-gradient; + } +} + +table.no-borders { + border:none; + tr, td { border:none } +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/typography.scss b/app/assets/stylesheets/gitlab_bootstrap/typography.scss new file mode 100644 index 00000000..97e85492 --- /dev/null +++ b/app/assets/stylesheets/gitlab_bootstrap/typography.scss @@ -0,0 +1,71 @@ +/** + * Headers + * + */ +h3, h4, h5, h6 { line-height: 36px; } +h5 { font-size:14px; } +h3.page_title { + color:#456; + font-size:20px; + font-weight: normal; + line-height: 28px; +} + +/** CODE **/ +pre { + font-family:'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; + + &.dark { + background: #333; + color:#f5f5f5; + } +} + +/** + * Links + * + */ +a { + outline: none; + color: $link_color; + &:hover { + text-decoration:none; + color: $blue_link; + } + + &.btn { + color: $style_color; + &:hover { + color: $style_color; + } + } + + &.dark { + color: $style_color; + } + + &.lined { + text-decoration:underline; + &:hover { text-decoration:underline; } + } + + &.gray { + color:gray; + } + + &.supp_diff_link { + text-align:center; + padding:20px 0; + background:#f1f1f1; + width:100%; + float:left; + } + + &.neib { + margin-right:15px; + } +} + +a:focus { + outline: none; +} diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index ad8be0bc..be27d754 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -2,29 +2,13 @@ @import "bootstrap-responsive"; /** GITLAB colors **/ -$text_color:#222; -$lite_text_color: #666; -$link_color:#2A79A3; -$active_link_color:#2FA0BB; -$active_bg_color:#79C3E0; -$active_bd_color: #2FA0BB; -$border_color:#CCC; -$lite_border_color:#EEE; -$min_app_width:980px; -$max_app_width:980px; -$app_padding:20px; -$bg_color: #FFF; -$styled_border_color: #2FA0BB; -$color: "#4BB8D2"; +$link_color:#3A89A3; $blue_link: #2fa0bb; - - -/** Style colors **/ -$style_color: #474D57; -$hover: #FDF5D9; +$style_color: #474d57; +$hover: #fdf5d9; /** GITLAB Fonts **/ -@font-face { font-family: Korolev; src: url('korolev-medium-compressed.otf'); } +@font-face { font-family: Korolev; src: url('korolev-medium-compressed.otf'); } /** MIXINS **/ @mixin shade { @@ -72,7 +56,20 @@ $hover: #FDF5D9; border-radius: $radius; } +@mixin bg-gray-gradient { + background:#eee; + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); + background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); + background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); + background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); +} +@mixin bg-dark-gray-gradient { + background:#eee; + background-image: -webkit-linear-gradient(#e9e9e9, #d7d7d7); + background-image: -moz-linear-gradient(#e9e9e9, #d7d7d7); + background-image: -o-linear-gradient(#e9e9e9, #d7d7d7); +} /** * Header of application. @@ -113,7 +110,13 @@ $hover: #FDF5D9; * Overrides some styles of twitter bootstrap. * Also give some common classes for gitlab app */ -@import "gitlab_bootstrap.scss"; +@import "gitlab_bootstrap/common.scss"; +@import "gitlab_bootstrap/typography.scss"; +@import "gitlab_bootstrap/buttons.scss"; +@import "gitlab_bootstrap/blocks.scss"; +@import "gitlab_bootstrap/files.scss"; +@import "gitlab_bootstrap/tables.scss"; +@import "gitlab_bootstrap/lists.scss"; /** diff --git a/app/assets/stylesheets/projects.css.scss b/app/assets/stylesheets/projects.css.scss deleted file mode 100644 index 4bdf5dee..00000000 --- a/app/assets/stylesheets/projects.css.scss +++ /dev/null @@ -1,385 +0,0 @@ -.git_url_wrapper { margin-right:50px } - -.sidebar aside a{ - display: block; - position: relative; - padding: 15px 10px; - margin: 10px 0 0 0; - - font-size:13px; - font-weight:bold; - color:#333; - - &.current { - color: white; - background: $active_bg_color; - border: 1px solid $active_bd_color; - border-radius:5px; - - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topright: 0px; - -moz-border-radius-bottomright: 0px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - margin-right: -1px; - } -} - -body table .commit a{color: #{$blue_link}} -body table th, body table td{ border-bottom: 1px solid #DEE2E3;} -body .fixed{position: fixed; } - -/** File stat **/ -.file_stats { - span { - img { - width:14px; - float:left; - margin-right: 6px; - padding:2px 0; - } - } -} - -.round-borders { - @include round-borders-all(4px); - padding: 4px 0px; -} - -table.round-borders { - float:left; - text-align: left; -} - - - -/** PROJECTS **/ -input.ssh_project_url { - padding:5px; - margin:0px; - float:right; - width:400px; - text-align:center; -} - -#projects-list .project { - height:50px; -} - -#tree-slider .tree-item, -#projects-list .project, -#snippets-table .snippet, -#issues-table .issue{ - cursor:pointer; -} - -.clear { - clear: both; -} - - - -#user_projects_limit{ - width: 60px; -} - -.handle:hover{ - cursor: move; -} - -.project-refs-form { - span { - background: none !important; - position:static !important; - width:auto !important; - height: auto !important; - } -} - -.project-refs-select { - width:200px; -} - -.filter .left { margin-right:15px; } - -body table .commit { - a.tree-commit-link { - color:#444; - &:hover { - text-decoration:underline; - } - } -} - -/** NEW PROJECT **/ -.new-project-hodler { - .icon span { background-position: -31px -70px; } - td { border-bottom: 1px solid #DEE2E3; } -} - -/** Feed entry **/ -.commit, -.snippet, -.message { - .title { - color:#666; - a { color:#666 !important; } - p { margin-top:0px; } - } - .author { color: #999 } -} - -/** JQuery UI **/ -.ui-autocomplete { @include round-borders-all(5px); } -.ui-menu-item { cursor: pointer } -.ui-selectmenu{ - @include round-borders-all(4px); - margin-right:10px; - font-size:1.5em; - height:auto; - font-weight:bold; - .ui-selectmenu-status { - padding:3px 10px; - } -} - -#holder { - background:#FAFAFA; - border: 1px solid #EEE; - cursor: move; - height: 70%; - overflow: hidden; -} - -/* Project Dashboard Page */ -html, body { height: 100%; } - -.news-feed h2{float: left;} -.news-feed .project-updates {margin-bottom: 20px; display: block; width: 100%;} -.news-feed .project-updates .data{ padding: 0} -.news-feed .project-updates a.project-update {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;} -.news-feed .project-updates a.project-update:last-child{border-bottom: 0} -.news-feed .project-updates a.project-update img{float: left; margin-right: 10px;} -.news-feed .project-updates a.project-update span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;} -.news-feed .project-updates a.project-update span.update-title{margin-bottom: 10px} -.news-feed .project-updates a.project-update span.update-author{color: #999; font-weight: normal; font-style: italic;} -.news-feed .project-updates a.project-update span.update-author strong{font-weight: bold; font-style: normal;} -/* eo Dashboard Page */ - - -/** Update entry **/ -.update-data { padding: 0 } -.update-data { width:100%; } -.update-data.ui-box .data { padding:0; } -a.update-item {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;} -a.update-item:last-child{border-bottom: 0} -a.update-item img{float: left; margin-right: 10px;} -a.update-item span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;} -a.update-item span.update-title{margin-bottom: 10px} -a.update-item span.update-author{color: #999; font-weight: normal; font-style: italic;} -a.update-item span.update-author strong{font-weight: bold; font-style: normal;} - - -body .team_member_new .span-6, .team_member_edit .span-6{ padding:10px 0; } - -body.projects-page input.text.git-url.project_list_url { width:165px; } - - -body table.no-borders th { - background:none; - border-bottom:1px solid #CCC; - color:#333; -} - -body table.no-borders tr, -body table.no-borders td{ - border:none; -} - -.ajax-tab-loading { - padding:40px; - display:none; -} - -#tree-content-holder { float:left; width:100%; } - -#tree-readme-holder { - float:left; - width:100%; - - .readme { - @include round-borders-all(4px); - padding: 4px 15px; - background:#F7F7F7; - } -} - - - -/* Commit Page */ -.entity-info {float: right;} -.entity-button{ - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.192, #fff), to(#f4f4f4)); - background-image: -webkit-linear-gradient(#fff 19.2%, #f4f4f4); - background-image: -moz-linear-gradient(#fff 19.2%, #f4f4f4); - background-image: -o-linear-gradient(#fff 19.2%, #f4f4f4); - box-shadow: 0 -1px 0 white inset; - display: block; - border: 1px solid #eee; - border-radius: 5px; - margin-bottom: 2px; - position: relative; - padding: 4px 10px; - font-size: 11px; - padding-right: 20px; -} - -.entity-button i{ - background: url('images.png') no-repeat -138px -27px; - width: 6px; - height: 9px; - float: right; - position: absolute; - top: 6px; - right: 5px; -} -.box-arrow{float: right; background: #E3E5EA; padding: 10px; border-radius: 5px; margin-top: 2px; text-shadow: none; color: #999; margin: 1.5em 0;} - -h4.dash-tabs { - margin: 0; - border-bottom: 1px solid #ccc; - padding: 10px 10px; - font-size: 11px; - padding-left:20px; - font-weight: bold; text-transform: uppercase; - background: #F7F7F7; - margin-bottom:20px; - height:13px; - -} - -.dash-button { - border-right: 1px solid #ddd; - background:none; - padding: 10px 15px; - float:left; - position:relative; - top:-10px; - left:0px; - height:13px; - - &:first-child { - border-left: 1px solid #ddd; - } - &.active { - background: #eaeaea; - } -} - - -.dashboard-loader { - float:right; - margin-right:30px; - display:none; -} - - -.merge-tabs { - margin: 0; - border: 1px solid #ccc; - padding: 5px; - font-size: 12px; - background: #F7F7F7; - margin-bottom:20px; - height:26px; - - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - - .tab { - font-weight: bold; - border-right: 1px solid #ddd; - background:none; - padding: 10px; - min-width:60px; - float:left; - position:relative; - top:-5px; - left:-5px; - height:16px; - padding-left:34px; - - span { - width: 20px; - height: 20px; - display: inline-block; - position: absolute; - left: 8px; - top: 8px; - } - - &.active { - background: #eaeaea; - } - } -} -.merge-tabs.repository .tab span{ background: url("images.png") no-repeat -38px -77px; } -.activities-tab span { background: url("images.png") no-repeat -161px -1px; } -.stat-tab span, -.team-tab span, -.snippets-tab span { background: url("images.png") no-repeat -38px -77px; } -.files-tab span { background: url("images.png") no-repeat -112px -23px; } - -.merge-notes-tab span { background: url("images.png") no-repeat -161px -1px; } -.merge-commits-tab span { background: url("images.png") no-repeat -86px 1px; } -.merge-diffs-tab span { background: url("images.png") no-repeat -118px 1px; } -.merge-tabs .dashboard-loader { padding:8px; } - -.user-mention { - color: #2FA0BB; - font-weight: bold; -} - -.author { - color: #999; -} - - - - -.dark_scheme_box { - padding:20px 0; - - label { - float:left; - box-shadow: 0 0px 5px rgba(0,0,0,.3); - - img { - } - } -} - -a.project-update.titled { - position: relative; - padding-left: 235px !important; - - .title-block { - padding: 10px; - width: 205px; - position: absolute; - left: 0; - top: 0; - } -} - -.add_new { - float: right; - background: #A6B807; - color: white; - padding: 4px 10px; - @include round-borders-all(4px); - font-size:11px; - margin: 10px 0; -} diff --git a/app/assets/stylesheets/ref_select.scss b/app/assets/stylesheets/ref_select.scss index 6f6a1bc9..5b52e11b 100644 --- a/app/assets/stylesheets/ref_select.scss +++ b/app/assets/stylesheets/ref_select.scss @@ -33,9 +33,7 @@ } .chzn-single { - background:#ddd; - //border:none; - //box-shadow:none; + @include bg-gray-gradient; div { background:transparent; diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index e2db701d..75e38aee 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -206,4 +206,24 @@ min-width:65px; font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; } + + .commit-author-name { + color: #777; + } +} + +.diff_file_header a, +.file_stats a { + color:$style_color; +} + +.file_stats { + span { + img { + width:14px; + float:left; + margin-right:6px; + padding:2px 0; + } + } } diff --git a/app/assets/stylesheets/sections/graph.scss b/app/assets/stylesheets/sections/graph.scss index 33d91de5..2aa4463e 100644 --- a/app/assets/stylesheets/sections/graph.scss +++ b/app/assets/stylesheets/sections/graph.scss @@ -6,11 +6,7 @@ h4 { padding:0 10px; border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; } .graph { diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 1b61ec3f..230a7aea 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -65,6 +65,11 @@ input.check_all_issues { } } +@media (min-width: 800px) { .issues_filters select { width:160px; } } +@media (min-width: 1000px) { .issues_filters select { width:200px; } } +@media (min-width: 1200px) { .issues_filters select { width:220px; } } + + #issues-table-holder { .issues_filters { form { @@ -99,3 +104,11 @@ input.check_all_issues { #update_status { width:100px; } + +/** + * Milestones list + * + */ +.milestone { + @extend .wll; +} diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index ec84a64e..73171915 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -11,23 +11,6 @@ background:#f1f1f1; } - .commit { - margin:0; - padding:0; - padding: 5px; - margin-bottom: 5px; - - .committed_ago { - display:none; - } - .browse_code_link_holder { - display:none; - } - list-style:none; - &:hover { - background:none; - } - } } /** @@ -55,6 +38,7 @@ background: #CEB; .accept_merge_request { + font-size:13px; float:left; } .remove_branch_holder { @@ -99,3 +83,42 @@ li.merge_request { @extend .padded; @extend .append-bottom-10; } + +.label_branch { + @include round-borders-all(4px); + padding:2px 4px; + border:none; + font-size:13px; + background: #474D57; + color:#fff; + font-weight:bold; + font-family: monospace; +} + +.mr_source_commit, +.mr_target_commit { + .commit { + margin:0; + padding:0; + padding: 5px; + margin-bottom: 5px; + .avatar { position:relative } + .row_title { + color:#444; + } + .commit-author-name, + .dash, + .committed_ago, + .browse_code_link_holder { + display:none; + } + list-style:none; + &:hover { + background:none; + } + } +} + +.mr_direction_tip { + margin-top:40px +} diff --git a/app/assets/stylesheets/sections/nav.scss b/app/assets/stylesheets/sections/nav.scss index 4a773644..097e8197 100644 --- a/app/assets/stylesheets/sections/nav.scss +++ b/app/assets/stylesheets/sections/nav.scss @@ -6,13 +6,9 @@ ul.main_menu { border-radius: 4px; margin: auto; margin:30px 0; - background:#eee; - border:1px solid #bbb; + border:1px solid #AAA; height:37px; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; position:relative; overflow:hidden; @include shade; @@ -89,7 +85,7 @@ ul.main_menu { line-height:36px; color: $style_color; text-shadow:0 1px 1px white; - + padding:0 10px; } } /* diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 30587ef5..6a965fa4 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -2,7 +2,7 @@ * Notes * */ -#notes-list, +#notes-list, #new_notes_list { display:block; list-style:none; @@ -10,7 +10,7 @@ padding:0px; } -#new_notes_list li:last-child{ +#new_notes_list li:last-child{ border-bottom:1px solid #aaa; } @@ -30,16 +30,24 @@ } #new_note { - #note_note { - height:25px; + .note-text { + height:40px; } .attach_holder { display:none; } } -.note { - padding: 8px 0; +.preview_note { + margin: 2px; + border: 1px solid #ddd; + padding: 10px; + min-height: 60px; + background:#f5f5f5; +} + +.note { + padding: 8px 0; border-bottom: 1px solid #eee; overflow: hidden; display: block; @@ -49,16 +57,16 @@ .note-author { color: $style_color;} .note-title { margin-left:45px; padding-top: 5px;} - .avatar { + .avatar { margin-top:3px; } - .delete-note { - display:none; + .delete-note { + display:none; float:right; } - &:hover { + &:hover { .delete-note { display:block; } } } @@ -72,18 +80,18 @@ p.notify_controls span{ font-weight: 700; } -tr.line_notes_row { +tr.line_notes_row { border-bottom:1px solid #DDD; border-left: 7px solid #2A79A3; - &.reply { + &.reply { background:#eee; border-left: 7px solid #2A79A3; border-top:1px solid #ddd; - td { + td { padding:7px 10px; } - a.line_note_reply_link { + a.line_note_reply_link { @include round-borders-all(4px); padding: 3px 10px; margin-left:5px; @@ -92,9 +100,9 @@ tr.line_notes_row { border-color: #2A79A3; } } - ul { + ul { margin:0; - li { + li { padding:0; border:none; } @@ -103,26 +111,26 @@ tr.line_notes_row { .line_notes_row, .per_line_form { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } -.per_line_form { +.per_line_form { background:#f5f5f5; border-top:1px solid #eee; form { margin: 0; } - td { + td { border-bottom:1px solid #ddd; } - .note_actions { + .note_actions { margin:0; padding-top: 10px; - .buttons { + .buttons { float:left; width:300px; } - .options { - .labels { + .options { + .labels { float:left; padding-left:10px; - label { + label { padding: 6px 0; margin: 0; width:120px; @@ -132,7 +140,7 @@ tr.line_notes_row { } } -td .line_note_link { +td .line_note_link { position:absolute; margin-left:-70px; margin-top:-10px; @@ -144,14 +152,14 @@ td .line_note_link { opacity: 0.0; filter: alpha(opacity=0); - &:hover { + &:hover { opacity: 1.0; filter: alpha(opacity=100); } } .diff_file_content tr.line_holder:hover > td { background: $hover !important; } -.diff_file_content tr.line_holder:hover > td .line_note_link { +.diff_file_content tr.line_holder:hover > td .line_note_link { opacity: 1.0; filter: alpha(opacity=100); } @@ -169,8 +177,8 @@ td .line_note_link { margin: 0; } - .note_advanced_opts { - h6 { + .note_advanced_opts { + h6 { line-height: 32px; padding-right: 15px; } @@ -183,7 +191,7 @@ td .line_note_link { overflow:hidden; margin:0 0 5px !important; - .input_file { + .input_file { .file_upload { position: absolute; right:14px; @@ -196,7 +204,7 @@ td .line_note_link { height:28px; overflow:hidden; } - .input-file { + .input-file { width: 260px; height: 41px; float: right; @@ -204,3 +212,8 @@ td .line_note_link { } } } + +.note-text { + border: 1px solid #aaa; + box-shadow:none; +} diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 8c79e45e..721b569d 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -1,17 +1,44 @@ -.projects { +.projects { @extend .row; .activities { } - .side { + .side { @extend .span4; @extend .right; - .projects_box { - h5 { + .projects_box { + h5 { color:$style_color; font-size:16px; text-shadow: 0 1px 1px #fff; + padding: 2px 10px; + } + ul { + li { + padding:0; + a { + display:block; + .project_name { + color:#4fa2bd; + font-size:14px; + line-height:18px; + } + .arrow { + float:right; + padding:10px; + margin:0; + } + .last_activity { + padding-top:5px; + display:block; + span, strong { + font-size:12px; + color:#666; + } + } + } + } } @extend .leftbar; @extend .ui-box; @@ -19,21 +46,47 @@ } } -.new_project, -.edit_project { - .project_name_holder { +.new_project, +.edit_project { + .project_name_holder { input, - label { + label { font-size:16px; line-height:20px; padding:8px; } - label { + label { color:#888; } - .btn { - padding:6px; + .btn { + padding:6px 10px; margin-left:10px; + margin-bottom:8px; } } + .adv_settings { + h6 { margin-left:40px; } + } +} + +.project_clone_panel { + @include border-radius(4px); + @include bg-gray-gradient; + padding: 4px 7px; + border: 1px solid #CCC; + margin-bottom:5px; + input[type=text] { + border: 1px solid #BBB; + } +} + +.save-project-loader { + img { + margin-top:50px; + margin-bottom:50px; + } + h3 { + @extend .page_title; + } + } diff --git a/app/assets/stylesheets/sections/tree.scss b/app/assets/stylesheets/sections/tree.scss index 2663fc9a..891f5e20 100644 --- a/app/assets/stylesheets/sections/tree.scss +++ b/app/assets/stylesheets/sections/tree.scss @@ -72,11 +72,7 @@ th { border-color: #CCC; border-bottom: 1px solid #bbb; - background:#eee; - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); + @include bg-gray-gradient; } } diff --git a/app/assets/stylesheets/themes/ui_mars.scss b/app/assets/stylesheets/themes/ui_mars.scss index 2808ad32..c630f388 100644 --- a/app/assets/stylesheets/themes/ui_mars.scss +++ b/app/assets/stylesheets/themes/ui_mars.scss @@ -20,6 +20,10 @@ .fbtn { .btn { + i { + position: relative; + top: 1px; + } margin-left:8px; background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595D63), to(#31363E)); background-image: -webkit-linear-gradient(#595D63 6.6%, #31363E); @@ -32,6 +36,10 @@ background-image: -moz-linear-gradient(#595D63 6.6%, #202227); background-image: -o-linear-gradient(#595D63 6.6%, #202227); background-position:0 0; + color:#fff; + i { + @extend .icon-white; + } } border: 1px solid #31363E; diff --git a/app/contexts/merge_requests_load.rb b/app/contexts/merge_requests_load.rb index 6778db3b..e2f68e38 100644 --- a/app/contexts/merge_requests_load.rb +++ b/app/contexts/merge_requests_load.rb @@ -1,13 +1,13 @@ class MergeRequestsLoad < BaseContext def execute - type = params[:f].to_i + type = params[:f] merge_requests = project.merge_requests merge_requests = case type - when 1 then merge_requests - when 2 then merge_requests.closed - when 3 then merge_requests.opened.assigned(current_user) + when 'all' then merge_requests + when 'closed' then merge_requests.closed + when 'assigned-to-me' then merge_requests.opened.assigned(current_user) else merge_requests.opened end.page(params[:page]).per(20) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7c1941ec..9aab250d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -14,6 +14,10 @@ class ApplicationController < ActionController::Base render "errors/gitolite", layout: "error" end + rescue_from Gitlab::Gitolite::InvalidKey do |exception| + render "errors/invalid_ssh_key", layout: "error" + end + rescue_from Encoding::CompatibilityError do |exception| render "errors/encoding", layout: "error", status: 404 end diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 889a7d98..a47b3843 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -60,7 +60,13 @@ class IssuesController < ApplicationController @issue.save respond_to do |format| - format.html { redirect_to project_issue_path(@project, @issue) } + format.html do + if @issue.valid? + redirect_to project_issue_path(@project, @issue) + else + render :new + end + end format.js end end @@ -162,10 +168,10 @@ class IssuesController < ApplicationController def issues_filter { - all: "1", - closed: "2", - to_me: "3", - open: "0" + all: "all", + closed: "closed", + to_me: "assigned-to-me", + open: "open" } end end diff --git a/app/controllers/labels_controller.rb b/app/controllers/labels_controller.rb new file mode 100644 index 00000000..e703f822 --- /dev/null +++ b/app/controllers/labels_controller.rb @@ -0,0 +1,25 @@ +class LabelsController < ApplicationController + before_filter :authenticate_user! + before_filter :project + before_filter :module_enabled + + layout "project" + + # Authorize + before_filter :add_project_abilities + + # Allow read any issue + before_filter :authorize_read_issue! + + respond_to :js, :html + + def index + @labels = @project.issues.tag_counts_on(:labels).order('count DESC') + end + + protected + + def module_enabled + return render_404 unless @project.issues_enabled + end +end diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index 4938a294..187bb407 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -103,10 +103,12 @@ class MergeRequestsController < ApplicationController def branch_from @commit = project.commit(params[:ref]) + @commit = CommitDecorator.decorate(@commit) end def branch_to @commit = project.commit(params[:ref]) + @commit = CommitDecorator.decorate(@commit) end protected diff --git a/app/controllers/milestones_controller.rb b/app/controllers/milestones_controller.rb index 7acb3781..10f089f1 100644 --- a/app/controllers/milestones_controller.rb +++ b/app/controllers/milestones_controller.rb @@ -17,8 +17,8 @@ class MilestonesController < ApplicationController respond_to :html def index - @milestones = case params[:f].to_i - when 1; @project.milestones + @milestones = case params[:f] + when 'all'; @project.milestones else @project.milestones.active end diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index d19931e9..d472936b 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -12,8 +12,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController def ldap # We only find ourselves here if the authentication to LDAP was successful. - info = request.env["omniauth.auth"]["info"] - @user = User.find_for_ldap_auth(info) + @user = User.find_for_ldap_auth(request.env["omniauth.auth"], current_user) if @user.persisted? @user.remember_me = true end diff --git a/app/controllers/team_members_controller.rb b/app/controllers/team_members_controller.rb index 0cc58c3e..0846f096 100644 --- a/app/controllers/team_members_controller.rb +++ b/app/controllers/team_members_controller.rb @@ -9,6 +9,7 @@ class TeamMembersController < ApplicationController def show @team_member = project.users_projects.find(params[:id]) + @events = @team_member.user.recent_events.where(:project_id => @project.id).limit(7) end def new diff --git a/app/decorators/application_decorator.rb b/app/decorators/application_decorator.rb index 7bc88648..3023699e 100644 --- a/app/decorators/application_decorator.rb +++ b/app/decorators/application_decorator.rb @@ -1,4 +1,4 @@ -class ApplicationDecorator < Drapper::Base +class ApplicationDecorator < Draper::Base # Lazy Helpers # PRO: Call Rails helpers without the h. proxy # ex: number_to_currency(model.price) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 51569b06..3dafb753 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -2,10 +2,13 @@ require 'digest/md5' module ApplicationHelper def gravatar_icon(user_email = '', size = 40) - return unless user_email - gravatar_host = request.ssl? ? "https://secure.gravatar.com" : "http://www.gravatar.com" - user_email.strip! - "#{gravatar_host}/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=identicon" + if Gitlab.config.disable_gravatar? || user_email.blank? + 'no_avatar.png' + else + gravatar_prefix = request.ssl? ? "https://secure" : "http://www" + user_email.strip! + "#{gravatar_prefix}.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=identicon" + end end def request_protocol @@ -75,16 +78,16 @@ module ApplicationHelper end def show_last_push_widget?(event) - event && + event && event.last_push_to_non_root? && !event.rm_ref? && - event.project && + event.project && event.project.merge_requests_enabled end def tab_class(tab_key) active = case tab_key - + # Project Area when :wall; wall_tab? when :wiki; controller.controller_name == "wikis" @@ -123,4 +126,13 @@ module ApplicationHelper def hexdigest(string) Digest::SHA1.hexdigest string end + + def project_last_activity project + activity = project.last_activity + if activity && activity.created_at + time_ago_in_words(activity.created_at) + " ago" + else + "Never" + end + end end diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 24bc3e85..9da695b5 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -1,9 +1,18 @@ module GitlabMarkdownHelper + # Replaces references (i.e. @abc, #123, !456, ...) in the text with links to + # the appropriate items in Gitlab. + # + # text - the source text + # html_options - extra options for the reference links as given to link_to + # + # note: reference links will only be generated if @project is set + # + # see Gitlab::Markdown for details on the supported syntax def gfm(text, html_options = {}) return text if text.nil? return text if @project.nil? - # Extract pre blocks + # Extract pre blocks so they are not altered # from http://github.github.com/github-flavored-markdown/ extractions = {} text.gsub!(%r{
.*?
|.*?}m) do |match| @@ -22,10 +31,18 @@ module GitlabMarkdownHelper extractions[$1] end - text.html_safe + sanitize text.html_safe, attributes: ActionView::Base.sanitized_allowed_attributes + %w(id class ) end - # circumvents nesting links, which will behave bad in browsers + # Use this in places where you would normally use link_to(gfm(...), ...). + # + # It solves a problem occurring with nested links (i.e. + # "outer text gfm ref more outer text"). This will not be + # interpreted as intended. Browsers will parse something like + # "outer text gfm ref more outer text" (notice the last part is + # not linked any more). link_to_gfm corrects that. It wraps all parts to + # explicitly produce the correct linking behavior (i.e. + # "outer text gfm ref more outer text"). def link_to_gfm(body, url, html_options = {}) gfm_body = gfm(body, html_options) @@ -37,17 +54,24 @@ module GitlabMarkdownHelper end def markdown(text) - @__renderer ||= Redcarpet::Markdown.new(Redcarpet::Render::GitlabHTML.new(self, filter_html: true, with_toc_data: true), { - no_intra_emphasis: true, - tables: true, - fenced_code_blocks: true, - autolink: true, - strikethrough: true, - lax_html_blocks: true, - space_after_headers: true, - superscript: true - }) + unless @markdown + gitlab_renderer = Redcarpet::Render::GitlabHTML.new(self, + # see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch- + filter_html: true, + with_toc_data: true, + hard_wrap: true) + @markdown ||= Redcarpet::Markdown.new(gitlab_renderer, + # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use + no_intra_emphasis: true, + tables: true, + fenced_code_blocks: true, + autolink: true, + strikethrough: true, + lax_html_blocks: true, + space_after_headers: true, + superscript: true) + end - @__renderer.render(text).html_safe + @markdown.render(text).html_safe end end diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 9563fdbc..91136fee 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -12,74 +12,117 @@ class Notify < ActionMailer::Base def new_user_email(user_id, password) @user = User.find(user_id) @password = password - mail(to: @user.email, subject: "gitlab | Account was created for you") + mail(to: @user.email, subject: subject("Account was created for you")) end def new_issue_email(issue_id) @issue = Issue.find(issue_id) @project = @issue.project - mail(to: @issue.assignee_email, subject: "gitlab | new issue ##{@issue.id} | #{@issue.title} | #{@project.name}") + mail(to: @issue.assignee_email, subject: subject("new issue ##{@issue.id}", @issue.title)) end def note_wall_email(recipient_id, note_id) - recipient = User.find(recipient_id) @note = Note.find(note_id) @project = @note.project - mail(to: recipient.email, subject: "gitlab | #{@project.name}") + mail(to: recipient(recipient_id), subject: subject) end def note_commit_email(recipient_id, note_id) - recipient = User.find(recipient_id) @note = Note.find(note_id) @commit = @note.target @commit = CommitDecorator.decorate(@commit) @project = @note.project - mail(to: recipient.email, subject: "gitlab | note for commit #{@commit.short_id} | #{@commit.title} | #{@project.name}") + mail(to: recipient(recipient_id), subject: subject("note for commit #{@commit.short_id}", @commit.title)) end def note_merge_request_email(recipient_id, note_id) - recipient = User.find(recipient_id) @note = Note.find(note_id) @merge_request = @note.noteable @project = @note.project - mail(to: recipient.email, subject: "gitlab | note for merge request !#{@merge_request.id} | #{@project.name}") + mail(to: recipient(recipient_id), subject: subject("note for merge request !#{@merge_request.id}")) end def note_issue_email(recipient_id, note_id) - recipient = User.find(recipient_id) @note = Note.find(note_id) @issue = @note.noteable @project = @note.project - mail(to: recipient.email, subject: "gitlab | note for issue ##{@issue.id} | #{@project.name}") + mail(to: recipient(recipient_id), subject: subject("note for issue ##{@issue.id}")) end def note_wiki_email(recipient_id, note_id) - recipient = User.find(recipient_id) @note = Note.find(note_id) @wiki = @note.noteable @project = @note.project - mail(to: recipient.email, subject: "gitlab | note for wiki | #{@project.name}") + mail(to: recipient(recipient_id), subject: subject("note for wiki")) end def new_merge_request_email(merge_request_id) @merge_request = MergeRequest.find(merge_request_id) @project = @merge_request.project - mail(to: @merge_request.assignee_email, subject: "gitlab | new merge request !#{@merge_request.id} | #{@merge_request.title} | #{@project.name}") + mail(to: @merge_request.assignee_email, subject: subject("new merge request !#{@merge_request.id}", @merge_request.title)) end def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id) - recipient = User.find(recipient_id) @merge_request = MergeRequest.find(merge_request_id) @previous_assignee ||= User.find(previous_assignee_id) @project = @merge_request.project - mail(to: recipient.email, subject: "gitlab | changed merge request !#{@merge_request.id} | #{@merge_request.title} | #{@project.name}") + mail(to: recipient(recipient_id), subject: subject("changed merge request !#{@merge_request.id}", @merge_request.title)) end def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id) - recipient = User.find(recipient_id) @issue = Issue.find(issue_id) @previous_assignee ||= User.find(previous_assignee_id) @project = @issue.project - mail(to: recipient.email, subject: "gitlab | changed issue ##{@issue.id} | #{@issue.title} | #{@project.name}") + mail(to: recipient(recipient_id), subject: subject("changed issue ##{@issue.id}", @issue.title)) + end + + def project_access_granted_email(user_project_id) + @users_project = UsersProject.find user_project_id + @project = @users_project.project + mail(to: @users_project.user.email, + subject: subject("access to project was granted")) + end + + def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id) + @issue = Issue.find issue_id + @issue_status = status + @updated_by = User.find updated_by_user_id + mail(to: recipient(recipient_id), + subject: subject("changed issue ##{@issue.id}", @issue.title)) + end + + private + + # Look up a User by their ID and return their email address + # + # recipient_id - User ID + # + # Returns a String containing the User's email address. + def recipient(recipient_id) + if recipient = User.find(recipient_id) + recipient.email + end + end + + # Formats arguments into a String suitable for use as an email subject + # + # extra - Extra Strings to be inserted into the subject + # + # Examples + # + # >> subject('Lorem ipsum') + # => "gitlab | Lorem ipsum" + # + # # Automatically inserts Project name when @project is set + # >> @project = Project.last + # => # + # >> subject('Lorem ipsum') + # => "gitlab | Lorem ipsum | Ruby on Rails" + # + # # Accepts multiple arguments + # >> subject('Lorem ipsum', 'Dolor sit amet') + # => "gitlab | Lorem ipsum | Dolor sit amet" + def subject(*extra) + "gitlab | " << extra.join(' | ') << (@project ? " | #{@project.name}" : "") end end diff --git a/app/models/key.rb b/app/models/key.rb index cfcb1f63..a39a4a16 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -1,16 +1,18 @@ require 'digest/md5' class Key < ActiveRecord::Base - include SshKey belongs_to :user belongs_to :project + attr_protected :user_id + validates :title, presence: true, length: { within: 0..255 } validates :key, presence: true, + format: { :with => /ssh-.{3} / }, length: { within: 0..5000 } before_save :set_identifier @@ -50,6 +52,10 @@ class Key < ActiveRecord::Base user.projects end end + + def last_deploy? + Key.where(identifier: identifier).count == 0 + end end # == Schema Information # diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 47966d66..542817b0 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -88,8 +88,11 @@ class MergeRequest < ActiveRecord::Base end def unmerged_diffs - commits = project.repo.commits_between(target_branch, source_branch).map {|c| Commit.new(c)} - diffs = project.repo.diff(commits.first.prev_commit.id, commits.last.id) rescue [] + # Only show what is new in the source branch compared to the target branch, not the other way around. + # The linex below with merge_base is equivalent to diff with three dots (git diff branch1...branch2) + # From the git documentation: "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B" + common_commit = project.repo.git.native(:merge_base, {}, [target_branch, source_branch]).strip + diffs = project.repo.diff(common_commit, source_branch) end def last_commit diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 592c57f9..d416fb63 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -28,17 +28,9 @@ class Milestone < ActiveRecord::Base end def percent_complete - @percent_complete ||= begin - total_i = self.issues.count - closed_i = self.issues.closed.count - if total_i > 0 - (closed_i * 100) / total_i - else - 100 - end - rescue => ex - 0 - end + ((self.issues.closed.count * 100) / self.issues.count).abs + rescue ZeroDivisionError + 100 end def expires_at diff --git a/app/models/project.rb b/app/models/project.rb index 714953c6..a7735a42 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -2,13 +2,13 @@ require "grit" class Project < ActiveRecord::Base include Repository - include ProjectPush + include PushObserver include Authority include Team # # Relations - # + # belongs_to :owner, class_name: "User" has_many :users, through: :users_projects has_many :events, dependent: :destroy @@ -25,12 +25,12 @@ class Project < ActiveRecord::Base attr_accessor :error_code - # + # # Protected attributes # attr_protected :private_flag, :owner_id - # + # # Scopes # scope :public_only, where(private_flag: false) @@ -158,7 +158,7 @@ class Project < ActiveRecord::Base end def last_activity - events.last || nil + events.order("created_at ASC").last end def last_activity_date diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb index 4da1432c..7c30f7a0 100644 --- a/app/models/protected_branch.rb +++ b/app/models/protected_branch.rb @@ -1,4 +1,6 @@ class ProtectedBranch < ActiveRecord::Base + include GitHost + belongs_to :project validates_presence_of :project_id validates_presence_of :name @@ -7,7 +9,7 @@ class ProtectedBranch < ActiveRecord::Base after_destroy :update_repository def update_repository - Gitlab::GitHost.system.update_project(project.path, project) + git_host.update_repository(project) end def commit diff --git a/app/models/user.rb b/app/models/user.rb index 92c81c83..ad6af6a6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,7 +7,7 @@ class User < ActiveRecord::Base attr_accessible :email, :password, :password_confirmation, :remember_me, :bio, :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme, - :theme_id, :force_random_password + :theme_id, :force_random_password, :extern_uid, :provider attr_accessor :force_random_password @@ -54,6 +54,8 @@ class User < ActiveRecord::Base validates :bio, length: { within: 0..255 } + validates :extern_uid, :allow_blank => true, :uniqueness => {:scope => :provider} + before_save :ensure_authentication_token alias_attribute :private_token, :authentication_token @@ -84,21 +86,31 @@ class User < ActiveRecord::Base where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') end - def self.find_for_ldap_auth(omniauth_info) - name = omniauth_info.name.force_encoding("utf-8") - email = omniauth_info.email.downcase unless omniauth_info.email.nil? - raise OmniAuth::Error, "LDAP accounts must provide an email address" if email.nil? + def self.find_for_ldap_auth(auth, signed_in_resource=nil) + uid = auth.info.uid + provider = auth.provider + name = auth.info.name.force_encoding("utf-8") + email = auth.info.email.downcase unless auth.info.email.nil? + raise OmniAuth::Error, "LDAP accounts must provide an uid and email address" if uid.nil? or email.nil? - if @user = User.find_by_email(email) + if @user = User.find_by_extern_uid_and_provider(uid, provider) + @user + # workaround for backward compatibility + elsif @user = User.find_by_email(email) + logger.info "Updating legacy LDAP user #{email} with extern_uid => #{uid}" + @user.update_attributes(:extern_uid => uid, :provider => provider) @user else + logger.info "Creating user from LDAP login {uid => #{uid}, name => #{name}, email => #{email}}" password = Devise.friendly_token[0, 8].downcase @user = User.create( - name: name, - email: email, - password: password, - password_confirmation: password, - projects_limit: Gitlab.config.default_projects_limit + :extern_uid => uid, + :provider => provider, + :name => name, + :email => email, + :password => password, + :password_confirmation => password, + :projects_limit => Gitlab.config.default_projects_limit ) end end diff --git a/app/models/users_project.rb b/app/models/users_project.rb index 36e6d904..7d172934 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -1,4 +1,6 @@ class UsersProject < ActiveRecord::Base + include GitHost + GUEST = 10 REPORTER = 20 DEVELOPER = 30 @@ -58,9 +60,7 @@ class UsersProject < ActiveRecord::Base end def update_repository - Gitlab::GitHost.system.new.configure do |c| - c.update_project(project.path, project) - end + git_host.update_repository(project) end def project_access_human diff --git a/app/observers/issue_observer.rb b/app/observers/issue_observer.rb index 92b0f836..62fd9bf8 100644 --- a/app/observers/issue_observer.rb +++ b/app/observers/issue_observer.rb @@ -9,8 +9,16 @@ class IssueObserver < ActiveRecord::Observer def after_update(issue) send_reassigned_email(issue) if issue.is_being_reassigned? - Note.create_status_change_note(issue, current_user, 'closed') if issue.is_being_closed? - Note.create_status_change_note(issue, current_user, 'reopened') if issue.is_being_reopened? + + status = nil + status = 'closed' if issue.is_being_closed? + status = 'reopened' if issue.is_being_reopened? + if status + Note.create_status_change_note(issue, current_user, status) + [issue.author, issue.assignee].compact.each do |recipient| + Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) + end + end end protected diff --git a/app/observers/key_observer.rb b/app/observers/key_observer.rb index fac53a67..a3f17bde 100644 --- a/app/observers/key_observer.rb +++ b/app/observers/key_observer.rb @@ -1,9 +1,12 @@ class KeyObserver < ActiveRecord::Observer + include GitHost + def after_save(key) - key.update_repository + git_host.set_key(key.identifier, key.key, key.projects) end def after_destroy(key) - key.repository_delete_key + return if key.is_deploy_key && !key.last_deploy? + git_host.remove_key(key.identifier, key.projects) end end diff --git a/app/observers/users_project_observer.rb b/app/observers/users_project_observer.rb new file mode 100644 index 00000000..763b2c87 --- /dev/null +++ b/app/observers/users_project_observer.rb @@ -0,0 +1,9 @@ +class UsersProjectObserver < ActiveRecord::Observer + def after_create(users_project) + Notify.project_access_granted_email(users_project.id).deliver + end + + def after_update(users_project) + Notify.project_access_granted_email(users_project.id).deliver + end +end diff --git a/app/roles/git_host.rb b/app/roles/git_host.rb new file mode 100644 index 00000000..aa620f77 --- /dev/null +++ b/app/roles/git_host.rb @@ -0,0 +1,5 @@ +module GitHost + def git_host + Gitlab::Gitolite.new + end +end diff --git a/app/roles/git_merge.rb b/app/roles/git_merge.rb deleted file mode 100644 index 95e5942f..00000000 --- a/app/roles/git_merge.rb +++ /dev/null @@ -1,2 +0,0 @@ -module GitMerge -end diff --git a/app/roles/project_push.rb b/app/roles/push_observer.rb similarity index 99% rename from app/roles/project_push.rb rename to app/roles/push_observer.rb index 02025384..1067404d 100644 --- a/app/roles/project_push.rb +++ b/app/roles/push_observer.rb @@ -1,4 +1,4 @@ -module ProjectPush +module PushObserver def observe_push(oldrev, newrev, ref, user) data = post_receive_data(oldrev, newrev, ref, user) diff --git a/app/roles/repository.rb b/app/roles/repository.rb index 8d5b018d..5fa950db 100644 --- a/app/roles/repository.rb +++ b/app/roles/repository.rb @@ -1,4 +1,6 @@ module Repository + include GitHost + def valid_repo? repo rescue @@ -30,26 +32,10 @@ module Repository Commit.commits_between(repo, from, to) end - def write_hooks - %w(post-receive).each do |hook| - write_hook(hook, File.read(File.join(Rails.root, 'lib', "#{hook}-hook"))) - end - end - def satellite @satellite ||= Gitlab::Satellite.new(self) end - def write_hook(name, content) - hook_file = File.join(path_to_repo, 'hooks', name) - - File.open(hook_file, 'w') do |f| - f.write(content) - end - - File.chmod(0775, hook_file) - end - def has_post_receive_file? hook_file = File.join(path_to_repo, 'hooks', 'post-receive') File.exists?(hook_file) @@ -64,7 +50,7 @@ module Repository end def url_to_repo - Gitlab::GitHost.url_to_repo(path) + git_host.url_to_repo(path) end def path_to_repo @@ -72,13 +58,11 @@ module Repository end def update_repository - Gitlab::GitHost.system.update_project(path, self) - - write_hooks if File.exists?(path_to_repo) + git_host.update_repository(self) end def destroy_repository - Gitlab::GitHost.system.destroy_project(self) + git_host.remove_repository(self) end def repo_exists? @@ -133,10 +117,13 @@ module Repository storage_path = File.join(Rails.root, "tmp", "repositories", self.code) file_path = File.join(storage_path, file_name) + # Put files into a directory before archiving + prefix = self.code + "/" + # Create file if not exists unless File.exists?(file_path) FileUtils.mkdir_p storage_path - file = self.repo.archive_to_file(ref, nil, file_path) + file = self.repo.archive_to_file(ref, prefix, file_path) end file_path diff --git a/app/roles/ssh_key.rb b/app/roles/ssh_key.rb deleted file mode 100644 index 5e1d2c23..00000000 --- a/app/roles/ssh_key.rb +++ /dev/null @@ -1,18 +0,0 @@ -module SshKey - def update_repository - Gitlab::GitHost.system.new.configure do |c| - c.update_keys(identifier, key) - c.update_projects(projects) - end - end - - def repository_delete_key - Gitlab::GitHost.system.new.configure do |c| - #delete key file is there is no identically deploy keys - if !is_deploy_key || Key.where(identifier: identifier).count() == 0 - c.delete_key(identifier) - end - c.update_projects(projects) - end - end -end diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 2e67abfc..3e26f566 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -35,11 +35,13 @@ %h3 Latest projects %hr - @projects.each do |project| - %h5 + %p = link_to project.name, [:admin, project] .span6 %h3 Latest users %hr - @users.each do |user| - %h5 - = link_to user.name, [:admin, user] + %p + = link_to [:admin, user] do + = user.name + %small= user.email diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml index d34acffe..43288424 100644 --- a/app/views/admin/hooks/index.html.haml +++ b/app/views/admin/hooks/index.html.haml @@ -5,7 +5,7 @@ Read more about system hooks %strong #{link_to "here", help_system_hooks_path, class: "vlink"} -= form_for @hook, as: :hook, url: admin_hooks_path do |f| += form_for @hook, as: :hook, url: admin_hooks_path, html: { class: 'form-inline' } do |f| -if @hook.errors.any? .alert-message.block-message.error - @hook.errors.full_messages.each do |msg| diff --git a/app/views/admin/projects/_form.html.haml b/app/views/admin/projects/_form.html.haml index 7cebddf2..87d212e5 100644 --- a/app/views/admin/projects/_form.html.haml +++ b/app/views/admin/projects/_form.html.haml @@ -10,19 +10,17 @@ Project name is .input = f.text_field :name, placeholder: "Example Project", class: "xxlarge" - = f.submit project.new_record? ? 'Create project' : 'Save Project', class: "btn primary" %hr - .alert.alert-info - %h5 Advanced settings: + .adv_settings + %h6 Advanced settings: .clearfix = f.label :path do - Git Clone + Path .input .input-prepend - %span.add-on= Gitlab.config.ssh_path - = f.text_field :path, placeholder: "example_project", disabled: !!project.id - %span.add-on= ".git" + %strong + = text_field_tag :ppath, @admin_project.path_to_repo, class: "xlarge", disabled: true .clearfix = f.label :code do URL @@ -42,8 +40,9 @@ .input= f.select(:default_branch, project.heads.map(&:name), {}, style: "width:210px;") - unless project.new_record? - .alert.alert-info - %h5 Features: + %hr + .adv_settings + %h6 Features: .clearfix = f.label :issues_enabled, "Issues" @@ -63,7 +62,8 @@ - unless project.new_record? .actions - = f.submit 'Save Project', class: "btn primary" + = f.submit 'Save Project', class: "btn save-btn" + = link_to 'Cancel', admin_projects_path, class: "btn cancel-btn" diff --git a/app/views/admin/projects/_new_form.html.haml b/app/views/admin/projects/_new_form.html.haml new file mode 100644 index 00000000..d793b6f3 --- /dev/null +++ b/app/views/admin/projects/_new_form.html.haml @@ -0,0 +1,29 @@ += form_for [:admin, @admin_project] do |f| + - if @admin_project.errors.any? + .alert-message.block-message.error + %span= @admin_project.errors.full_messages.first + .clearfix.project_name_holder + = f.label :name do + Project name is + .input + = f.text_field :name, placeholder: "Example Project", class: "xxlarge" + = f.submit 'Create project', class: "btn primary project-submit" + + %hr + %div.adv_settings + %h6 Advanced settings: + .clearfix + = f.label :path do + Git Clone + .input + .input-prepend + %span.add-on= Gitlab.config.ssh_path + = f.text_field :path, placeholder: "example_project", disabled: !@admin_project.new_record? + %span.add-on= ".git" + .clearfix + = f.label :code do + URL + .input + .input-prepend + %span.add-on= web_app_url + = f.text_field :code, placeholder: "example" diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 4512bb7e..f7dd486d 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -1,8 +1,8 @@ -%h3 +%h3.page_title Projects = link_to 'New Project', new_admin_project_path, class: "btn small right" %br -= form_tag admin_projects_path, method: :get do += form_tag admin_projects_path, method: :get, class: 'form-inline' do = text_field_tag :name, params[:name], class: "xlarge" = submit_tag "Search", class: "btn submit primary" diff --git a/app/views/admin/projects/new.html.haml b/app/views/admin/projects/new.html.haml index ac6526bf..933cb671 100644 --- a/app/views/admin/projects/new.html.haml +++ b/app/views/admin/projects/new.html.haml @@ -1,3 +1,12 @@ -%h3.page_title New project -%hr -= render 'form', project: @admin_project +.project_new_holder + %h3.page_title + New Project + %hr + = render 'new_form' +%div.save-project-loader.hide + %center + = image_tag "ajax_loader.gif" + %h3 Creating project & repository. Please wait a few minutes + +:javascript + $(function(){ new Projects(); }); diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index 5e68a23f..7010c272 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -2,71 +2,79 @@ = form_for [:admin, @admin_user] do |f| -if @admin_user.errors.any? #error_explanation - %ul + %ul.unstyled.alert.alert-error - @admin_user.errors.full_messages.each do |msg| %li= msg .row - .span6 - .clearfix - = f.label :name - .input - = f.text_field :name - %span.help-inline * required - .clearfix - = f.label :email - .input - = f.text_field :email - %span.help-inline * required - %hr + .span7 + .ui-box + %br + .clearfix + = f.label :name + .input + = f.text_field :name + %span.help-inline * required + .clearfix + = f.label :email + .input + = f.text_field :email + %span.help-inline * required + %hr + -if f.object.new_record? + .clearfix + = f.label :force_random_password do + %span Generate random password + .input= f.check_box :force_random_password, {}, true, nil + + %div.password-fields + .clearfix + = f.label :password + .input= f.password_field :password, disabled: f.object.force_random_password + .clearfix + = f.label :password_confirmation + .input= f.password_field :password_confirmation, disabled: f.object.force_random_password + %hr + .clearfix + = f.label :skype + .input= f.text_field :skype + .clearfix + = f.label :linkedin + .input= f.text_field :linkedin + .clearfix + = f.label :twitter + .input= f.text_field :twitter + .span5 + .ui-box + %br + .clearfix + = f.label :projects_limit + .input= f.number_field :projects_limit - -if f.object.new_record? - .clearfix - = f.label :admin, class: "checkbox" do - = f.check_box :force_random_password, {}, true, nil - %span Generate random password - - %div.password-fields .clearfix - = f.label :password - .input= f.password_field :password, disabled: f.object.force_random_password - .clearfix - = f.label :password_confirmation - .input= f.password_field :password_confirmation, disabled: f.object.force_random_password - %hr - .clearfix - = f.label :skype - .input= f.text_field :skype - .clearfix - = f.label :linkedin - .input= f.text_field :linkedin - .clearfix - = f.label :twitter - .input= f.text_field :twitter - .span6 - .clearfix - = f.label :projects_limit - .input= f.text_field :projects_limit, class: "small_input" + = f.label :admin do + %strong.cred Administrator + .input= f.check_box :admin + - unless @admin_user.new_record? + %hr + .padded.cred + - if @admin_user.blocked + %span + This user is blocked and is not able to login to GitLab + .clearfix + = link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn small right" + - else + %span + Blocked users will be removed from all projects & will not be able to login to GitLab. + .clearfix + = link_to 'Block User', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small right danger" - .alert - .clearfix - %p Make the user a GitLab administrator. - = f.label :admin, class: "checkbox" do - = f.check_box :admin - %span Administrator - - unless @admin_user.new_record? - .alert.alert-error - - if @admin_user.blocked - %span - = link_to 'Unblock', unblock_admin_user_path(@admin_user), method: :put, class: "btn small" - This user is blocked and is not able to login to GitLab - - else - %span - = link_to 'Block', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small danger" - Blocked users will be removed from all projects & will not be able to login to GitLab. + .row + .span6 + .span6 .actions - = f.submit 'Save', class: "btn primary" + = f.submit 'Save', class: "btn save-btn" - if @admin_user.new_record? - = link_to 'Cancel', admin_users_path, class: "btn" + = link_to 'Cancel', admin_users_path, class: "btn cancel-btn" - else - = link_to 'Cancel', admin_user_path(@admin_user), class: "btn" + = link_to 'Cancel', admin_user_path(@admin_user), class: "btn cancel-btn" diff --git a/app/views/admin/users/edit.html.haml b/app/views/admin/users/edit.html.haml index 0e94be9e..032e3cfa 100644 --- a/app/views/admin/users/edit.html.haml +++ b/app/views/admin/users/edit.html.haml @@ -1,3 +1,3 @@ -%h3= @admin_user.name +%h3.page_title #{@admin_user.name} → Edit user %hr = render 'form' diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 5edca312..f21baabf 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -1,9 +1,9 @@ -%h3 +%h3.page_title Users = link_to 'New User', new_admin_user_path, class: "btn small right" %br -= form_tag admin_users_path, method: :get do += form_tag admin_users_path, method: :get, class: 'form-inline' do = text_field_tag :name, params[:name], class: "xlarge" = submit_tag "Search", class: "btn submit primary" %ul.nav.nav-pills diff --git a/app/views/admin/users/new.html.haml b/app/views/admin/users/new.html.haml index 87d6b0f2..70ead0d3 100644 --- a/app/views/admin/users/new.html.haml +++ b/app/views/admin/users/new.html.haml @@ -1,3 +1,3 @@ -%h2 New user -%hr +%h3.page_title New user +%br = render 'form' diff --git a/app/views/commits/_commit.html.haml b/app/views/commits/_commit.html.haml index 686a4337..61371d14 100644 --- a/app/views/commits/_commit.html.haml +++ b/app/views/commits/_commit.html.haml @@ -4,8 +4,8 @@ %strong= link_to "Browse Code »", tree_project_ref_path(@project, commit.id), class: "right" %p = link_to commit.short_id(8), project_commit_path(@project, id: commit.id), class: "commit_short_id" - %strong.cgray= commit.author_name - – + %strong.commit-author-name= commit.author_name + %span.dash – = image_tag gravatar_icon(commit.author_email), class: "avatar", width: 16 = link_to_gfm truncate(commit.title, length: 50), project_commit_path(@project, id: commit.id), class: "row_title" diff --git a/app/views/commits/compare.html.haml b/app/views/commits/compare.html.haml index be915cd1..7dab1f5c 100644 --- a/app/views/commits/compare.html.haml +++ b/app/views/commits/compare.html.haml @@ -20,7 +20,7 @@ = "..." = text_field_tag :to, params[:to], placeholder: "aa8b4ef", class: "xlarge" .actions - = submit_tag "Compare", class: "btn btn-primary" + = submit_tag "Compare", class: "btn primary" - unless @commits.empty? diff --git a/app/views/commits/show.html.haml b/app/views/commits/show.html.haml index 9a483aa2..e01f8ea5 100644 --- a/app/views/commits/show.html.haml +++ b/app/views/commits/show.html.haml @@ -5,12 +5,6 @@ :javascript - $(document).ready(function(){ - $(".line_note_link, .line_note_reply_link").live("click", function(e) { - var form = $(".per_line_form"); - $(this).parent().parent().after(form); - form.find("#note_line_code").val($(this).attr("line_code")); - form.show(); - return false; - }); + $(function(){ + PerLineNotes.init(); }); diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml index 9fea5acb..e13640fb 100644 --- a/app/views/dashboard/index.html.haml +++ b/app/views/dashboard/index.html.haml @@ -1,14 +1,7 @@ - if @projects.any? .projects .activities.span8 - - if current_user.require_ssh_key? - .alert.alert-error.padded - %span - You wont be able to pull/push project code unless you - %strong - = link_to new_key_path, class: "vlink" do - add new key - to your profile + = render 'shared/no_ssh' - if @events.any? .content_list= render @events - else @@ -26,13 +19,16 @@ = link_to new_project_path, class: "btn very_small info" do %i.icon-plus New Project - - @projects.each do |project| - = link_to project_path(project), class: dom_class(project) do - %h4 - %span.ico.project - = truncate(project.name, length: 25) - %span.right - → + %ul.unstyled + - @projects.each do |project| + %li.wll + = link_to project_path(project), class: dom_class(project) do + %strong.project_name= truncate(project.name, length: 25) + %span.arrow + → + %span.last_activity + %strong Last activity: + %span= project_last_activity(project) .bottom= paginate @projects, theme: "gitlab" %hr @@ -57,5 +53,5 @@ If you will be added to project - it will be displayed here -:javascript +:javascript $(function(){ Pager.init(20); }); diff --git a/app/views/errors/gitolite.html.haml b/app/views/errors/gitolite.html.haml index 4788c2e5..d5f51951 100644 --- a/app/views/errors/gitolite.html.haml +++ b/app/views/errors/gitolite.html.haml @@ -21,7 +21,5 @@ Permissions: %pre = preserve do - sudo chmod -R 770 /home/git/repositories/ - sudo chown -R git:git /home/git/repositories/ - sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive - + sudo chmod -R 770 #{Gitlab.config.git_base_path} + sudo chown -R git:git #{Gitlab.config.git_base_path} diff --git a/app/views/errors/invalid_ssh_key.html.haml b/app/views/errors/invalid_ssh_key.html.haml new file mode 100644 index 00000000..fb7922b0 --- /dev/null +++ b/app/views/errors/invalid_ssh_key.html.haml @@ -0,0 +1,3 @@ +%h1 Git Error +%hr +%p Seems like SSH Key you provided is not a valid SSH key. diff --git a/app/views/events/_event_last_push.html.haml b/app/views/events/_event_last_push.html.haml index 4ef92749..66e14936 100644 --- a/app/views/events/_event_last_push.html.haml +++ b/app/views/events/_event_last_push.html.haml @@ -9,5 +9,5 @@ at %strong= link_to event.project.name, event.project - = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn very_small primary" do + = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn very_small" do Create Merge Request diff --git a/app/views/help/api.html.haml b/app/views/help/api.html.haml index 344f8ade..d7d7aed4 100644 --- a/app/views/help/api.html.haml +++ b/app/views/help/api.html.haml @@ -9,6 +9,8 @@ %a{href: "#README"} README %li %a{href: "#projects"} Projects + %li + %a{href: "#snippets"} Snippets %li %a{href: "#users"} Users %li @@ -34,6 +36,16 @@ %br +.file_holder#snippets + .file_title + %i.icon-file + Projects Snippets + .file_content.wiki + = preserve do + = markdown File.read(Rails.root.join("doc", "api", "snippets.md")) + +%br + .file_holder#users .file_title %i.icon-file @@ -51,3 +63,13 @@ .file_content.wiki = preserve do = markdown File.read(Rails.root.join("doc", "api", "issues.md")) + +%br + +.file_holder#milestones + .file_title + %i.icon-file + Milestones + .file_content.wiki + = preserve do + = markdown File.read(Rails.root.join("doc", "api", "milestones.md")) diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml index 66f7c722..02549577 100644 --- a/app/views/help/index.html.haml +++ b/app/views/help/index.html.haml @@ -31,3 +31,6 @@ %li %h5= link_to "Gitlab Markdown", help_markdown_path + + %li + %h5= link_to "SSH keys", help_ssh_path diff --git a/app/views/help/markdown.html.haml b/app/views/help/markdown.html.haml index 8d6fb2a5..6a4bbb02 100644 --- a/app/views/help/markdown.html.haml +++ b/app/views/help/markdown.html.haml @@ -1,25 +1,105 @@ -- bash_lexer = Pygments::Lexer[:bash] -%h3.page_title Gitlab Markdown +%h3.page_title Gitlab Flavored Markdown .back_link = link_to help_path do ← to index %hr -%p.slead We extend Markdown with some GITLAB specific syntax. It allows you to link to: +.row + .span8 + %p + For Gitlab we developed something we call "Gitlab Flavored Markdown" (GFM). + It extends the standard Markdown in a few significant ways adds some useful functionality. -%ul - %li issues (#123) - %li merge request (!123) - %li commits (1234567) - %li team members (@foo) - %li snippets ($123) + %p You can use GFM in: + %ul + %li commit messages + %li comments + %li wall posts + %li issues + %li merge requests + %li milestones + %li wiki pages -%p.slead in + %h3 Differences from traditional Markdown -%ul - %li commit messages - %li notes/comments/wall posts - %li issues - %li merge requests - %li milestones - %li wiki pages + %h4 Newlines + + %p + The biggest difference that GFM introduces is in the handling of linebreaks. + With traditional Markdown you can hard wrap paragraphs of text and they will be combined into a single paragraph. We find this to be the cause of a huge number of unintentional formatting errors. + GFM treats newlines in paragraph-like content as real line breaks, which is probably what you intended. + + + %p The next paragraph contains two phrases separated by a single newline character: + %pre= "Roses are red\nViolets are blue" + %p becomes + = markdown "Roses are red\nViolets are blue" + + %h4 Multiple underscores in words + + %p + It is not reasonable to italicize just part of a word, especially when you're dealing with code and names often appear with multiple underscores. + Therefore, GFM ignores multiple underscores in words. + + %pre= "perform_complicated_task\ndo_this_and_do_that_and_another_thing" + %p becomes + = markdown "perform_complicated_task\ndo_this_and_do_that_and_another_thing" + + %h4 URL autolinking + + %p + GFM will autolink standard URLs you copy and paste into your text. + So if you want to link to a URL (instead of a textual link), you can simply put the URL in verbatim and it will be turned into a link to that URL. + + %h4 Fenced code blocks + + %p + Markdown converts text with four spaces at the front of each line to code blocks. + GFM supports that, but we also support fenced blocks. + Just wrap your code blocks in ``` and you won't need to indent manually to trigger a code block. + + %pre= %Q{```ruby\nrequire 'redcarpet'\nmarkdown = Redcarpet.new("Hello World!")\nputs markdown.to_html\n```} + %p becomes + = markdown %Q{```ruby\nrequire 'redcarpet'\nmarkdown = Redcarpet.new("Hello World!")\nputs markdown.to_html\n```} + + %h4 Special Gitlab references + + %p + GFM recognizes special references. + You can easily reference e.g. a team member, an issue or a commit within a project. + GFM will turn that reference into a link so you can navigate between them easily. + + %p GFM will recognize the following references: + %ul + %li + %code @foo + for team members + %li + %code #123 + for issues + %li + %code !123 + for merge request + %li + %code $123 + for snippets + %li + %code 1234567 + for commits + + -# this example will only be shown if the user has a project with at least one issue + - if @project = current_user.projects.first + - if issue = @project.issues.first + %p For example in your #{link_to @project.name, project_path(@project)} project something like + %pre= "This is related to ##{issue.id}. @#{current_user.name} is working on solving it." + %p becomes + = markdown "This is related to ##{issue.id}. @#{current_user.name} is working on solving it." + + + + .span4.right + .alert.alert-info + %p + If you're not already familiar with Markdown, you should spend 15 minutes and go over the excellent + %strong= link_to "Markdown Syntax Guide", "http://daringfireball.net/projects/markdown/syntax" + at Daring Fireball. diff --git a/app/views/help/permissions.html.haml b/app/views/help/permissions.html.haml index 7511d15d..f9287fa0 100644 --- a/app/views/help/permissions.html.haml +++ b/app/views/help/permissions.html.haml @@ -1,6 +1,6 @@ -%h3 Permissions +%h3.page_title Permissions .back_link - = link_to help_path do + = link_to help_path do ← to index %hr diff --git a/app/views/help/ssh.html.haml b/app/views/help/ssh.html.haml new file mode 100644 index 00000000..6a581204 --- /dev/null +++ b/app/views/help/ssh.html.haml @@ -0,0 +1,25 @@ +%h3.page_title SSH Keys +.back_link + = link_to help_path do + ← to index +%hr + +%p.slead + SSH key allows you to establish a secure connection between your computer and Gitlab + +%p.slead + To generate a new SSH key just open your terminal and use code below. + +%pre.dark + ssh-keygen -t rsa -C "#{current_user.email}" + + \# Creates a new ssh key using the provided email + \# Generating public/private rsa key pair... + +%p.slead + Next just use code below to dump your public key and add to GITLAB SSH Keys + +%pre.dark + cat ~/.ssh/id_rsa.pub + + \# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc.... diff --git a/app/views/help/system_hooks.html.haml b/app/views/help/system_hooks.html.haml index 2088208a..9fc8cbab 100644 --- a/app/views/help/system_hooks.html.haml +++ b/app/views/help/system_hooks.html.haml @@ -1,10 +1,10 @@ %h3 System hooks .back_link - = link_to :back do + = link_to :back do ← back %hr -%p.slead +%p.slead Your Gitlab instance can perform HTTP POST request on next event: create_project, delete_project, create_user, delete_user, change_team_member. %br System Hooks can be used for logging or change information in LDAP server. diff --git a/app/views/help/web_hooks.html.haml b/app/views/help/web_hooks.html.haml index 3acea62c..263eadf6 100644 --- a/app/views/help/web_hooks.html.haml +++ b/app/views/help/web_hooks.html.haml @@ -1,11 +1,11 @@ -%h3 Web hooks +%h3.page_title Web hooks .back_link - = link_to help_path do + = link_to help_path do ← to index %hr -%p.slead - Every Gitlab project can trigger a web server whenever the repo is pushed to. +%p.slead + Every Gitlab project can trigger a web server whenever the repo is pushed to. %br Web Hooks can be used to update an external issue tracker, trigger CI builds, update a backup mirror, or even deploy to your production server. %br diff --git a/app/views/help/workflow.html.haml b/app/views/help/workflow.html.haml index 7db8133b..a3fe3b01 100644 --- a/app/views/help/workflow.html.haml +++ b/app/views/help/workflow.html.haml @@ -1,7 +1,6 @@ -- bash_lexer = Pygments::Lexer[:bash] -%h3 Workflow +%h3.page_title Workflow .back_link - = link_to help_path do + = link_to help_path do ← to index %hr @@ -9,25 +8,25 @@ %li %p Clone project .bash - %pre + %pre.dark git clone git@example.com:project-name.git %li %p Create branch with your feature .bash - %pre + %pre.dark git checkout -b $feature_name %li %p Write code. Commit changes .bash - %pre + %pre.dark git commit -am "My feature is ready" %li %p Push your branch to gitlabhq .bash - %pre + %pre.dark git push origin $feature_name %li diff --git a/app/views/hooks/_data_ex.html.erb b/app/views/hooks/_data_ex.html.erb index 8d3de3f0..e43714e9 100644 --- a/app/views/hooks/_data_ex.html.erb +++ b/app/views/hooks/_data_ex.html.erb @@ -37,7 +37,7 @@ } } ], - total_commits_count => 3 + total_commits_count => 4 } eos %> diff --git a/app/views/hooks/index.html.haml b/app/views/hooks/index.html.haml index 4e15dc50..3d2a381e 100644 --- a/app/views/hooks/index.html.haml +++ b/app/views/hooks/index.html.haml @@ -8,7 +8,7 @@ Read more about web hooks %strong #{link_to "here", help_web_hooks_path, class: "vlink"} -= form_for [@project, @hook], as: :hook, url: project_hooks_path(@project) do |f| += form_for [@project, @hook], as: :hook, url: project_hooks_path(@project), html: { class: 'form-inline' } do |f| -if @hook.errors.any? .alert-message.block-message.error - @hook.errors.full_messages.each do |msg| diff --git a/app/views/issues/_form.html.haml b/app/views/issues/_form.html.haml index 1b67eabd..db7920b9 100644 --- a/app/views/issues/_form.html.haml +++ b/app/views/issues/_form.html.haml @@ -38,19 +38,20 @@ = f.label :description, "Details" .input = f.text_area :description, maxlength: 2000, class: "xxlarge", rows: 14 - %p.hint Markdown is enabled. + %p.hint Issues are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. .actions - if @issue.new_record? - = f.submit 'Submit new issue', class: "primary btn" + = f.submit 'Submit new issue', class: "btn save-btn" -else - = f.submit 'Save changes', class: "primary btn" + = f.submit 'Save changes', class: "save-btn btn" + - cancel_class = 'btn cancel-btn' - if request.xhr? - = link_to "Cancel", "#back", onclick: "backToIssues();", class: "btn" + = link_to "Cancel", "#back", onclick: "backToIssues();", class: cancel_class - else - if @issue.new_record? - = link_to "Cancel", project_issues_path(@project), class: "btn" + = link_to "Cancel", project_issues_path(@project), class: cancel_class - else - = link_to "Cancel", project_issue_path(@project, @issue), class: "btn" + = link_to "Cancel", project_issue_path(@project, @issue), class: cancel_class diff --git a/app/views/issues/_head.html.haml b/app/views/issues/_head.html.haml index 1f6e7d7f..8ebe3e05 100644 --- a/app/views/issues/_head.html.haml +++ b/app/views/issues/_head.html.haml @@ -5,6 +5,9 @@ %li{class: "#{'active' if current_page?(project_milestones_path(@project))}"} = link_to project_milestones_path(@project), class: "tab" do Milestones + %li{class: "#{'active' if current_page?(project_labels_path(@project))}"} + = link_to project_labels_path(@project), class: "tab" do + Labels %li.right %span.rss-icon = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do diff --git a/app/views/issues/index.html.haml b/app/views/issues/index.html.haml index a6836fd4..010b8856 100644 --- a/app/views/issues/index.html.haml +++ b/app/views/issues/index.html.haml @@ -6,7 +6,7 @@ .right .span5 - if can? current_user, :write_issue, @project - = link_to new_project_issue_path(@project), class: "right btn small", title: "New Issue", remote: true do + = link_to new_project_issue_path(@project), class: "right btn", title: "New Issue", remote: true do %i.icon-plus New Issue = form_tag search_project_issues_path(@project), method: :get, remote: true, id: "issue_search_form", class: :right do diff --git a/app/views/keys/_form.html.haml b/app/views/keys/_form.html.haml index ee2eafdd..26700803 100644 --- a/app/views/keys/_form.html.haml +++ b/app/views/keys/_form.html.haml @@ -11,8 +11,14 @@ .input= f.text_field :title .clearfix = f.label :key - .input= f.text_area :key, class: [:xxlarge, :thin_area] - .actions - = f.submit 'Save', class: "primary btn" - = link_to "Cancel", keys_path, class: "btn" + .input + = f.text_area :key, class: [:xxlarge, :thin_area] + %p.hint + Paste your public key here. Read more about how generate it + = link_to "here", help_ssh_path + + + .actions + = f.submit 'Save', class: "btn save-btn" + = link_to "Cancel", keys_path, class: "btn cancel-btn" diff --git a/app/views/keys/index.html.haml b/app/views/keys/index.html.haml index 04e9e4cb..9b5663ed 100644 --- a/app/views/keys/index.html.haml +++ b/app/views/keys/index.html.haml @@ -1,6 +1,6 @@ %h3.page_title SSH Keys - = link_to "Add new", new_key_path, class: "btn small right" + = link_to "Add new", new_key_path, class: "btn right" %hr %p.slead diff --git a/app/views/keys/new.html.haml b/app/views/keys/new.html.haml index 02e782b9..fff38058 100644 --- a/app/views/keys/new.html.haml +++ b/app/views/keys/new.html.haml @@ -1,4 +1,4 @@ -%h3.page_title New key +%h3.page_title Add an SSH Key %hr = render 'form' diff --git a/app/views/labels/_label.html.haml b/app/views/labels/_label.html.haml new file mode 100644 index 00000000..32158c20 --- /dev/null +++ b/app/views/labels/_label.html.haml @@ -0,0 +1,4 @@ +%li.wll + %strong= label.name + .right + %span= pluralize label.count, 'issue' diff --git a/app/views/labels/index.html.haml b/app/views/labels/index.html.haml new file mode 100644 index 00000000..4e41d375 --- /dev/null +++ b/app/views/labels/index.html.haml @@ -0,0 +1,14 @@ += render "issues/head" + +%h3.page_title + Labels +%br +%div.ui-box + %ul.unstyled.labels-table + - @labels.each do |label| + = render 'label', label: label + + - unless @labels.present? + %li + %h3.nothing_here_message Nothing to show here + diff --git a/app/views/merge_requests/_form.html.haml b/app/views/merge_requests/_form.html.haml index b6c12397..b554c051 100644 --- a/app/views/merge_requests/_form.html.haml +++ b/app/views/merge_requests/_form.html.haml @@ -9,7 +9,7 @@ %br .row - .span6 + .span5 .mr_branch_box %h5 From (Head Branch) .body @@ -17,10 +17,11 @@ = f.label :source_branch, "From", class: "control-label" .controls = f.select(:source_branch, @project.heads.map(&:name), { include_blank: "Select branch" }, style: "width:250px") - .bottom_commit - .mr_source_commit + .mr_source_commit - .span6 + .span2 + %center= image_tag "merge.png", class: 'mr_direction_tip' + .span5 .mr_branch_box %h5 To (Base Branch) .body @@ -28,8 +29,7 @@ = f.label :target_branch, "To", class: "control-label" .controls = f.select(:target_branch, @project.heads.map(&:name), { include_blank: "Select branch" }, style: "width:250px") - .bottom_commit - .mr_target_commit + .mr_target_commit %h4.cdark 2. Fill info @@ -48,18 +48,19 @@ .control-group .form-actions - = f.submit 'Save', class: "btn-primary btn" + = f.submit 'Save', class: "btn save-btn" - if @merge_request.new_record? - = link_to project_merge_requests_path(@project), class: "btn" do + = link_to project_merge_requests_path(@project), class: "btn cancel-btn" do Cancel - else - = link_to project_merge_request_path(@project, @merge_request), class: "btn" do + = link_to project_merge_request_path(@project, @merge_request), class: "btn cancel-btn" do Cancel :javascript $(function(){ + disableButtonIfEmtpyField("#merge_request_title", ".save-btn"); $('select#merge_request_assignee_id').chosen(); $('select#merge_request_source_branch').chosen(); $('select#merge_request_target_branch').chosen(); diff --git a/app/views/merge_requests/index.html.haml b/app/views/merge_requests/index.html.haml index 4ad6e5c1..bbf35dc7 100644 --- a/app/views/merge_requests/index.html.haml +++ b/app/views/merge_requests/index.html.haml @@ -1,7 +1,7 @@ %h3.page_title Merge Requests - if can? current_user, :write_issue, @project - = link_to new_project_merge_request_path(@project), class: "right btn small", title: "New Merge Request" do + = link_to new_project_merge_request_path(@project), class: "right btn", title: "New Merge Request" do New Merge Request %br @@ -10,17 +10,17 @@ .ui-box .title %ul.nav.nav-pills - %li{class: ("active" if (params[:f] == "0" || !params[:f]))} - = link_to project_merge_requests_path(@project, f: 0) do + %li{class: ("active" if (params[:f] == 'open' || !params[:f]))} + = link_to project_merge_requests_path(@project, f: 'open') do Open - %li{class: ("active" if params[:f] == "2")} - = link_to project_merge_requests_path(@project, f: 2) do + %li{class: ("active" if params[:f] == "closed")} + = link_to project_merge_requests_path(@project, f: "closed") do Closed - %li{class: ("active" if params[:f] == "3")} - = link_to project_merge_requests_path(@project, f: 3) do + %li{class: ("active" if params[:f] == 'assigned-to-me')} + = link_to project_merge_requests_path(@project, f: 'assigned-to-me') do To Me - %li{class: ("active" if params[:f] == "1")} - = link_to project_merge_requests_path(@project, f: 1) do + %li{class: ("active" if params[:f] == 'all')} + = link_to project_merge_requests_path(@project, f: 'all') do All %ul.unstyled diff --git a/app/views/merge_requests/show/_how_to_merge.html.haml b/app/views/merge_requests/show/_how_to_merge.html.haml index c21f2727..69881d43 100644 --- a/app/views/merge_requests/show/_how_to_merge.html.haml +++ b/app/views/merge_requests/show/_how_to_merge.html.haml @@ -3,13 +3,12 @@ %a.close{href: "#"} × %h3 How To Merge .modal-body - %pre + %pre.dark = preserve do - :erb - git checkout <%= @merge_request.target_branch %> - git fetch origin - git merge origin/<%= @merge_request.source_branch %> - git push origin <%= @merge_request.target_branch %> + git checkout #{@merge_request.target_branch} + git fetch origin + git merge origin/#{@merge_request.source_branch} + git push origin #{@merge_request.target_branch} :javascript diff --git a/app/views/merge_requests/show/_mr_title.html.haml b/app/views/merge_requests/show/_mr_title.html.haml index 31fa0779..3ae1050d 100644 --- a/app/views/merge_requests/show/_mr_title.html.haml +++ b/app/views/merge_requests/show/_mr_title.html.haml @@ -1,9 +1,9 @@ %h3.page_title = "Merge Request ##{@merge_request.id}:"   - %span.pretty_label.branch= @merge_request.source_branch + %span.label_branch= @merge_request.source_branch → - %span.pretty_label.branch= @merge_request.target_branch + %span.label_branch= @merge_request.target_branch %span.right - if @merge_request.merged? diff --git a/app/views/milestones/_form.html.haml b/app/views/milestones/_form.html.haml index 1cd08ac3..41cbd6ab 100644 --- a/app/views/milestones/_form.html.haml +++ b/app/views/milestones/_form.html.haml @@ -22,7 +22,7 @@ = f.label :description, "Description", class: "control-label" .controls = f.text_area :description, maxlength: 2000, class: "input-xlarge", rows: 10 - %p.hint Markdown is enabled. + %p.hint Milestones are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. .span6 .control-group = f.label :due_date, "Due Date", class: "control-label" @@ -32,20 +32,16 @@ .form-actions - if @milestone.new_record? - = f.submit 'Create milestone', class: "primary btn" + = f.submit 'Create milestone', class: "save-btn btn" + = link_to "Cancel", project_milestones_path(@project), class: "btn cancel-btn" -else - = f.submit 'Save changes', class: "primary btn" + = f.submit 'Save changes', class: "save-btn btn" + = link_to "Cancel", project_milestone_path(@project, @milestone), class: "btn cancel-btn" - - if request.xhr? - = link_to "Cancel", "#back", onclick: "backToIssues();", class: "btn" - - else - - if @milestone.new_record? - = link_to "Cancel", project_milestones_path(@project), class: "btn" - - else - = link_to "Cancel", project_milestone_path(@project, @milestone), class: "btn" :javascript $(function() { + disableButtonIfEmtpyField("#milestone_title", ".save-btn"); $( ".datepicker" ).datepicker({ dateFormat: "yy-mm-dd", onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } diff --git a/app/views/milestones/index.html.haml b/app/views/milestones/index.html.haml index ecb008dc..c5333b08 100644 --- a/app/views/milestones/index.html.haml +++ b/app/views/milestones/index.html.haml @@ -8,11 +8,11 @@ %div.ui-box .title %ul.nav.nav-pills - %li{class: ("active" if (params[:f] == "0" || !params[:f]))} - = link_to project_milestones_path(@project, f: 0) do + %li{class: ("active" if (params[:f] == "active" || !params[:f]))} + = link_to project_milestones_path(@project, f: "active") do Active - %li{class: ("active" if params[:f] == "1")} - = link_to project_milestones_path(@project, f: 1) do + %li{class: ("active" if params[:f] == "all")} + = link_to project_milestones_path(@project, f: "all") do All %ul.unstyled diff --git a/app/views/notes/_create_common.js.haml b/app/views/notes/_create_common.js.haml index 847ff383..e80eccb1 100644 --- a/app/views/notes/_create_common.js.haml +++ b/app/views/notes/_create_common.js.haml @@ -1,9 +1,12 @@ - if note.valid? :plain - $("#new_note .errors").remove(); - $('#new_note textarea').val(""); + $(".note-form-holder .error").remove(); + $('.note-form-holder textarea').val(""); + $('.note-form-holder #preview-link').text('Preview'); + $('.note-form-holder #preview-note').hide(); + $('.note-form-holder').show(); NoteList.prepend(#{note.id}, "#{escape_javascript(render partial: "notes/show", locals: {note: note})}"); - else :plain - $("#new_note").replaceWith("#{escape_javascript(render('form'))}"); + $(".note-form-holder").replaceWith("#{escape_javascript(render('form'))}"); diff --git a/app/views/notes/_create_line.js.haml b/app/views/notes/_create_line.js.haml index 13809bec..662909f7 100644 --- a/app/views/notes/_create_line.js.haml +++ b/app/views/notes/_create_line.js.haml @@ -1,7 +1,7 @@ - if note.valid? :plain $(".per_line_form").hide(); - $('#new_note textarea').val(""); + $('.line-note-form-holder textarea').val(""); $("a.line_note_reply_link[line_code='#{note.line_code}']").closest("tr").remove(); var trEl = $(".#{note.line_code}").parent(); trEl.after("#{escape_javascript(render partial: "notes/per_line_show", locals: {note: note})}"); diff --git a/app/views/notes/_form.html.haml b/app/views/notes/_form.html.haml index dac026bd..7211a0ae 100644 --- a/app/views/notes/_form.html.haml +++ b/app/views/notes/_form.html.haml @@ -1,38 +1,39 @@ -= form_for [@project, @note], remote: "true", multipart: true do |f| - %h3.page_title Leave a comment - -if @note.errors.any? - .alert-message.block-message.error - - @note.errors.full_messages.each do |msg| - %div= msg +.note-form-holder + = form_for [@project, @note], remote: "true", multipart: true do |f| + %h3.page_title Leave a comment + -if @note.errors.any? + .alert-message.block-message.error + - @note.errors.full_messages.each do |msg| + %div= msg - = f.hidden_field :noteable_id - = f.hidden_field :noteable_type - = f.text_area :note, size: 255 - #preview-note.well.hide - %p.hint - = link_to "Gitlab Markdown", help_markdown_path, target: '_blank' - is enabled. - = link_to 'Preview', preview_project_notes_path(@project), id: 'preview-link' + = f.hidden_field :noteable_id + = f.hidden_field :noteable_type + = f.text_area :note, size: 255, class: 'note-text' + #preview-note.preview_note.hide + .hint + .right Comments are parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. + .clearfix - .row.note_advanced_opts.hide - .span2 - = f.submit 'Add Comment', class: "btn primary submit_note", id: "submit_note" - .span4.notify_opts - %h6.left Notify via email: - = label_tag :notify do - = check_box_tag :notify, 1, @note.noteable_type != "Commit" - %span Project team + .row.note_advanced_opts.hide + .span3 + = f.submit 'Add Comment', class: "btn success submit_note grouped", id: "submit_note" + = link_to 'Preview', preview_project_notes_path(@project), class: 'btn grouped', id: 'preview-link' + .span4.notify_opts + %h6.left Notify via email: + = label_tag :notify do + = check_box_tag :notify, 1, @note.noteable_type != "Commit" + %span Project team - - if @note.notify_only_author?(current_user) - = label_tag :notify_author do - = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" - %span Commit author - .span6.attachments - %h6.left Attachment: - %span.file_name File name... - - .input.input_file - %a.file_upload.btn.small Upload File - = f.file_field :attachment, class: "input-file" - %span.hint Any file less than 10 MB + - if @note.notify_only_author?(current_user) + = label_tag :notify_author do + = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" + %span Commit author + .span5.attachments + %h6.left Attachment: + %span.file_name File name... + + .input.input_file + %a.file_upload.btn.small Upload File + = f.file_field :attachment, class: "input-file" + %span.hint Any file less than 10 MB diff --git a/app/views/notes/_per_line_form.html.haml b/app/views/notes/_per_line_form.html.haml index afb0b30d..8e31b59e 100644 --- a/app/views/notes/_per_line_form.html.haml +++ b/app/views/notes/_per_line_form.html.haml @@ -1,33 +1,34 @@ %table{style: "display:none;"} %tr.per_line_form %td{colspan: 3 } - = form_for [@project, @note], remote: "true", multipart: true do |f| - %h3.page_title Leave a note - %div.span10 - -if @note.errors.any? - .alert-message.block-message.error - - @note.errors.full_messages.each do |msg| - %div= msg + .line-note-form-holder + = form_for [@project, @note], remote: "true", multipart: true do |f| + %h3.page_title Leave a note + %div.span10 + -if @note.errors.any? + .alert-message.block-message.error + - @note.errors.full_messages.each do |msg| + %div= msg - = f.hidden_field :noteable_id - = f.hidden_field :noteable_type - = f.hidden_field :line_code - = f.text_area :note, size: 255 - .note_actions - .buttons - = f.submit 'Add note', class: "btn primary submit_note", id: "submit_note" - = link_to "Cancel", "#", class: "btn hide-button" - .options - %h6.left Notify via email: - .labels - = label_tag :notify do - = check_box_tag :notify, 1, @note.noteable_type != "Commit" - %span Project team + = f.hidden_field :noteable_id + = f.hidden_field :noteable_type + = f.hidden_field :line_code + = f.text_area :note, size: 255, class: 'line-note-text' + .note_actions + .buttons + = f.submit 'Add note', class: "btn save-btn submit_note submit_inline_note", id: "submit_note" + = link_to "Cancel", "#", class: "btn hide-button" + .options + %h6.left Notify via email: + .labels + = label_tag :notify do + = check_box_tag :notify, 1, @note.noteable_type != "Commit" + %span Project team - - if @note.notify_only_author?(current_user) - = label_tag :notify_author do - = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" - %span Commit author + - if @note.notify_only_author?(current_user) + = label_tag :notify_author do + = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" + %span Commit author :javascript $(function(){ diff --git a/app/views/notify/issue_status_changed_email.html.haml b/app/views/notify/issue_status_changed_email.html.haml new file mode 100644 index 00000000..59130f79 --- /dev/null +++ b/app/views/notify/issue_status_changed_email.html.haml @@ -0,0 +1,16 @@ +%td.content{align: "left", style: "font-family: Helvetica, Arial, sans-serif; padding: 20px 0 0;", valign: "top", width: "600"} + %table{border: "0", cellpadding: "0", cellspacing: "0", style: "color: #717171; font: normal 11px Helvetica, Arial, sans-serif; margin: 0; padding: 0;", width: "600"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = "Issue was #{@issue_status} by #{@updated_by.name}" + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464 !important; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = "Issue ##{@issue.id}" + = link_to_gfm truncate(@issue.title, length: 45), project_issue_url(@issue.project, @issue), title: @issue.title + %br + diff --git a/app/views/notify/project_access_granted_email.html.haml b/app/views/notify/project_access_granted_email.html.haml new file mode 100644 index 00000000..154c2aaa --- /dev/null +++ b/app/views/notify/project_access_granted_email.html.haml @@ -0,0 +1,14 @@ +%td.content{align: "left", style: "font-family: Helvetica, Arial, sans-serif; padding: 20px 0 0;", valign: "top", width: "600"} + %table{border: "0", cellpadding: "0", cellspacing: "0", style: "color: #717171; font: normal 11px Helvetica, Arial, sans-serif; margin: 0; padding: 0;", width: "600"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = "You got granted #{@users_project.project_access_human} access to project" + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %tr + %td{style: "font-size: 1px; line-height: 1px;", width: "21"} + %td{align: "left", style: "padding: 20px 0 0;"} + %h2{style: "color:#646464 !important; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "} + = link_to_gfm truncate(@project.name, length: 45), project_url(@project), title: @project.name + %br diff --git a/app/views/profile/password.html.haml b/app/views/profile/password.html.haml index 257dacb1..d0aee7ac 100644 --- a/app/views/profile/password.html.haml +++ b/app/views/profile/password.html.haml @@ -16,4 +16,4 @@ = f.label :password_confirmation .input= f.password_field :password_confirmation .actions - = f.submit 'Save', class: "btn primary" + = f.submit 'Save', class: "btn save-btn" diff --git a/app/views/profile/show.html.haml b/app/views/profile/show.html.haml index 95cce2bb..22e840a0 100644 --- a/app/views/profile/show.html.haml +++ b/app/views/profile/show.html.haml @@ -45,9 +45,10 @@ %span.help-block Tell us about yourself in fewer than 250 characters. .span5.right - %p.alert.alert-info - %strong Tip: - You can change your avatar at gravatar.com + -unless Gitlab.config.disable_gravatar? + %p.alert.alert-info + %strong Tip: + You can change your avatar at gravatar.com %h4 Personal projects: @@ -66,4 +67,4 @@ = link_to "Add Public Key", new_key_path, class: "btn small right" .form-actions - = f.submit 'Save', class: "btn-primary btn" + = f.submit 'Save', class: "btn save-btn" diff --git a/app/views/projects/_clone_panel.html.haml b/app/views/projects/_clone_panel.html.haml new file mode 100644 index 00000000..839a98a0 --- /dev/null +++ b/app/views/projects/_clone_panel.html.haml @@ -0,0 +1,21 @@ +.project_clone_panel + .row + .span7 + .form-horizontal + .input-prepend.project_clone_holder + = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo + = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo + = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" + .span4.right + .right + - if can? current_user, :download_code, @project + = link_to archive_project_repository_path(@project), class: "btn small grouped" do + %i.icon-download-alt + Download + - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) + = link_to new_project_merge_request_path(@project), title: "New Merge Request", class: "btn small grouped" do + Merge Request + - if @project.issues_enabled && can?(current_user, :write_issue, @project) + = link_to new_project_issue_path(@project), title: "New Issue", class: "btn small grouped" do + Issue + diff --git a/app/views/projects/_form.html.haml b/app/views/projects/_form.html.haml index ce66b2cf..8bdeda1c 100644 --- a/app/views/projects/_form.html.haml +++ b/app/views/projects/_form.html.haml @@ -10,9 +10,9 @@ .input = f.text_field :name, placeholder: "Example Project", class: "xxlarge" - %h5.page_title - .alert.alert-info - %h5 Advanced settings: + %hr + .adv_settings + %h6 Advanced settings: .clearfix = f.label :path do Path @@ -34,8 +34,9 @@ .input= f.select(:default_branch, @project.heads.map(&:name), {}, style: "width:210px;") - unless @project.new_record? - .alert.alert-info - %h5 Features: + %hr + .adv_settings + %h6 Features: .clearfix = f.label :issues_enabled, "Issues" @@ -56,7 +57,7 @@ %br .actions - = f.submit 'Save', class: "btn primary" + = f.submit 'Save', class: "btn save-btn" = link_to 'Cancel', @project, class: "btn" - unless @project.new_record? .right diff --git a/app/views/projects/_new_form.html.haml b/app/views/projects/_new_form.html.haml index 5104df83..e6d5e93f 100644 --- a/app/views/projects/_new_form.html.haml +++ b/app/views/projects/_new_form.html.haml @@ -7,11 +7,11 @@ Project name is .input = f.text_field :name, placeholder: "Example Project", class: "xxlarge" - = f.submit 'Create project', class: "btn primary" + = f.submit 'Create project', class: "btn primary project-submit" %hr - .alert.alert-info - %h5 Advanced settings: + %div.adv_settings + %h6 Advanced settings: .clearfix = f.label :path do Git Clone diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index b8d0dad9..d408c0a6 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -1,47 +1,51 @@ -- if current_user.require_ssh_key? - .alert-message.block-message.error - %ul - %li You have no ssh keys added to your profile. - %li You wont be able to pull/push repository. - %li Visit profile → keys and add public key of every machine you want to use for work with gitlabhq. - -.alert-message.block-message.error - %ul.unstyled.alert_holder - %li You should push repository to proceed. - %li After push you will be able to browse code, commits etc. - -- bash_lexer = Pygments::Lexer[:bash] += render 'shared/no_ssh' +.project_clone_panel + .row + .span7 + .form-horizontal + .input-prepend.project_clone_holder + = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo + = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo + = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" %div.git-empty - %h3 Git global setup: - - setup_str = ["git config --global user.name \"#{current_user.name}\"", - "git config --global user.email \"#{current_user.email}\""].join("\n") - = preserve do - = raw bash_lexer.highlight(setup_str, lexer: 'bash', options: {encoding: 'utf-8'}) + %h4 Git global setup: + %pre.dark + = preserve do + git config --global user.name "#{current_user.name}" + git config --global user.email "#{current_user.email}" - %br - %br - %h3 Create Repository - - repo_setup_str = ["mkdir #{@project.path}", - "cd #{@project.path}", - "git init", - "touch README", - "git add README", - "git commit -m 'first commit'", - "git remote add origin #{@project.url_to_repo}", - "git push -u origin master"].join("\n") + %h4.prepend-top-20 Create Repository + %pre.dark + = preserve do + mkdir #{@project.path} + cd #{@project.path} + git init + touch README + git add README + git commit -m 'first commit' + git remote add origin #{@project.url_to_repo} + git push -u origin master - = preserve do - = raw bash_lexer.highlight(repo_setup_str) - - %br - %br - %h3 Existing Git Repo? - - exist_repo_setup_str = ["cd existing_git_repo", - "git remote add origin #{@project.url_to_repo}", - "git push -u origin master"].join("\n") - = preserve do - = raw bash_lexer.highlight(exist_repo_setup_str) + %h4.prepend-top-20 Existing Git Repo? + %pre.dark + = preserve do + cd existing_git_repo + git remote add origin #{@project.url_to_repo} + git push -u origin master - if can? current_user, :admin_project, @project - .alert-message.block-message.error.prepend-top-20 - = link_to 'Remove project', @project, confirm: 'Are you sure?', method: :delete, class: "btn danger" + .prepend-top-20 + = link_to 'Remove project', @project, confirm: 'Are you sure?', method: :delete, class: "btn danger right" + + + +:javascript + $(function(){ + var link_sel = ".project_clone_holder a"; + $(link_sel).bind("click", function() { + $(link_sel).removeClass("active"); + $(this).addClass("active"); + $("#project_clone").val($(this).attr("data-clone")); + }) + }) + diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 703e558a..933cb671 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -3,10 +3,10 @@ New Project %hr = render 'new_form' -%div.ajax_loader.hide +%div.save-project-loader.hide %center - %div.padded= image_tag "ajax_loader.gif" - %h3.prepend-top Creating project & repository. Please wait a few minutes + = image_tag "ajax_loader.gif" + %h3 Creating project & repository. Please wait a few minutes :javascript $(function(){ new Projects(); }); diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index ebd2c8e4..77a0ef1a 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,35 +1,12 @@ = render "project_head" - -.entry - .row - .span7 - .form-horizontal - .input-prepend.project_clone_holder - - %span.add-on git clone - = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo - = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo - = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" - .span4.right - .right - - if can? current_user, :download_code, @project - = link_to archive_project_repository_path(@project), class: "btn small grouped" do - %i.icon-download-alt - Download - - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) - = link_to new_project_merge_request_path(@project), title: "New Merge Request", class: "btn small grouped" do - Merge Request - - if @project.issues_enabled && can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), title: "New Issue", class: "btn small grouped" do - Issue - += render 'clone_panel' = render "events/event_last_push", event: @last_push .content_list= render @events -:javascript +:javascript $(function(){ var link_sel = ".project_clone_holder a"; - $(link_sel).bind("click", function() { + $(link_sel).bind("click", function() { $(link_sel).removeClass("active"); $(this).addClass("active"); $("#project_clone").val($(this).attr("data-clone")); diff --git a/app/views/refs/_tree_item.html.haml b/app/views/refs/_tree_item.html.haml index 2e6bbf62..d4c4ee8d 100644 --- a/app/views/refs/_tree_item.html.haml +++ b/app/views/refs/_tree_item.html.haml @@ -2,7 +2,7 @@ %tr{ class: "tree-item #{tree_hex_class(content)}", url: tree_file_project_ref_path(@project, @ref, file) } %td.tree-item-file-name = tree_icon(content) - = link_to truncate(content.name, length: 40), tree_file_project_ref_path(@project, @ref || @commit.id, file), remote: :true + %strong= link_to truncate(content.name, length: 40), tree_file_project_ref_path(@project, @ref || @commit.id, file), remote: :true %td.tree_time_ago.cgray - if index == 1 %span.log_loading diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml index ed9da1f0..d37ef670 100644 --- a/app/views/search/show.html.haml +++ b/app/views/search/show.html.haml @@ -1,10 +1,10 @@ -= form_tag search_path, method: :get do |f| += form_tag search_path, method: :get, class: 'form-inline' do |f| .padded = label_tag :search do %strong Looking for .input = text_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge", id: "dashboard_search" - = submit_tag 'Search', class: "btn btn-primary" + = submit_tag 'Search', class: "btn primary" - if params[:search].present? %br %h3 diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml new file mode 100644 index 00000000..b6ab666b --- /dev/null +++ b/app/views/shared/_no_ssh.html.haml @@ -0,0 +1,8 @@ +- if current_user.require_ssh_key? + %h6.error_message + %span + You wont be able to pull/push project code unless you + %strong + = link_to new_key_path, class: "vlink" do + add SSH key + to your profile diff --git a/app/views/team_members/_show.html.haml b/app/views/team_members/_show.html.haml index f47554c1..2dc4fb65 100644 --- a/app/views/team_members/_show.html.haml +++ b/app/views/team_members/_show.html.haml @@ -9,7 +9,7 @@ %span.label Blocked = link_to project_team_member_path(@project, member), title: user.name, class: "dark" do - = image_tag gravatar_icon(user.email, 40), class: "avatar" + = image_tag gravatar_icon(user.email, 40), class: "avatar s32" = link_to project_team_member_path(@project, member), title: user.name, class: "dark" do %strong= truncate(user.name, lenght: 40) %br diff --git a/app/views/team_members/show.html.haml b/app/views/team_members/show.html.haml index d7e09bce..6cb357cd 100644 --- a/app/views/team_members/show.html.haml +++ b/app/views/team_members/show.html.haml @@ -51,7 +51,7 @@ = form_for(@team_member, as: :team_member, url: project_team_member_path(@project, @team_member)) do |f| = f.select :project_access, options_for_select(Project.access_options, @team_member.project_access), {}, class: "project-access-select", disabled: !allow_admin %hr - = render user.recent_events.limit(5) + = render @events :javascript $(function(){ $('.repo-access-select, .project-access-select').live("change", function() { diff --git a/app/views/wikis/_form.html.haml b/app/views/wikis/_form.html.haml index 6b6411be..12b57e03 100644 --- a/app/views/wikis/_form.html.haml +++ b/app/views/wikis/_form.html.haml @@ -14,13 +14,14 @@ .middle_box_content .input %span.cgray - Wiki content is parsed with #{link_to "Markdown", "http://en.wikipedia.org/wiki/Markdown"}. - To add link to new page you can just type + Wiki content is parsed with #{link_to "Gitlab Flavored Markdown", help_markdown_path, target: '_blank'}. + To link to a (new) page you can just type %code [Link Title](page-slug) + \. .bottom_box_content = f.label :content .input= f.text_area :content, class: 'span8' .actions - = f.submit 'Save', class: "primary btn" - = link_to "Cancel", project_wiki_path(@project, :index), class: "btn" + = f.submit 'Save', class: "save-btn btn" + = link_to "Cancel", project_wiki_path(@project, :index), class: "btn cancel-btn" diff --git a/config/application.rb b/config/application.rb index ecd88b15..ad41f196 100644 --- a/config/application.rb +++ b/config/application.rb @@ -23,7 +23,7 @@ module Gitlab # config.plugins = [ :exception_notification, :ssl_requirement, :all ] # Activate observers that should always be running. - config.active_record.observers = :mailer_observer, :activity_observer, :project_observer, :key_observer, :issue_observer, :user_observer, :system_hook_observer + config.active_record.observers = :mailer_observer, :activity_observer, :project_observer, :key_observer, :issue_observer, :user_observer, :system_hook_observer, :users_project_observer # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. diff --git a/config/environment.rb b/config/environment.rb index c880a7ad..3b186a9d 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -3,5 +3,3 @@ require File.expand_path('../application', __FILE__) # Initialize the rails application Gitlab::Application.initialize! - -require File.join(Rails.root, "lib", "gitlab", "git_host") diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 1818f2c0..d05cc1be 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -1,4 +1,4 @@ -# # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # Gitlab application config file # # # # # # # # # # # # # # # # # # # @@ -19,27 +19,27 @@ email: # Application specific settings # Like default project limit for user etc -app: - default_projects_limit: 10 +app: + default_projects_limit: 10 # backup_path: "/vol/backups" # default: Rails.root + backups/ # backup_keep_time: 604800 # default: 0 (forever) (in seconds) + # disable_gravatar: true # default: false - Disable user avatars from Gravatar.com - -# -# 2. Advanced settings: +# +# 2. Advanced settings: # ========================== # Git Hosting configuration git_host: admin_uri: git@localhost:gitolite-admin base_path: /home/git/repositories/ + # hooks_path: /var/lib/gitolite/.gitolite/hooks/ # only needed when gitolite is not installed according the manual # host: localhost git_user: git upload_pack: true receive_pack: true # port: 22 - # Git settings # Use default values unless you understand it git: diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 5c5987a8..27c5bc22 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -66,6 +66,10 @@ class Settings < Settingslogic git_host['base_path'] || '/home/git/repositories/' end + def git_hooks_path + git_host['hooks_path'] || '/home/git/share/gitolite/hooks/' + end + def git_upload_pack if git_host['upload_pack'] != false true @@ -111,5 +115,9 @@ class Settings < Settingslogic def backup_keep_time app['backup_keep_time'] || 0 end + + def disable_gravatar? + app['disable_gravatar'] || false + end end end diff --git a/config/initializers/5_backend.rb b/config/initializers/5_backend.rb new file mode 100644 index 00000000..85f747ac --- /dev/null +++ b/config/initializers/5_backend.rb @@ -0,0 +1,5 @@ +# GIT over HTTP +require Rails.root.join("lib", "gitlab", "backend", "grack_auth") + +# GITOLITE backend +require Rails.root.join("lib", "gitlab", "backend", "gitolite") diff --git a/config/initializers/rails_footnotes.rb b/config/initializers/rails_footnotes.rb deleted file mode 100644 index afe6f3ad..00000000 --- a/config/initializers/rails_footnotes.rb +++ /dev/null @@ -1,3 +0,0 @@ -#if defined?(Footnotes) && Rails.env.development? - #Footnotes.run! # first of all -#end diff --git a/config/routes.rb b/config/routes.rb index 04e13bc4..f895478f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,6 +30,7 @@ Gitlab::Application.routes.draw do get 'help/web_hooks' => 'help#web_hooks' get 'help/system_hooks' => 'help#system_hooks' get 'help/markdown' => 'help#markdown' + get 'help/ssh' => 'help#ssh' # # Admin Area @@ -196,7 +197,9 @@ Gitlab::Application.routes.draw do end resources :team_members resources :milestones + resources :labels, :only => [:index] resources :issues do + collection do post :sort post :bulk_update diff --git a/db/fixtures/test/001_repo.rb b/db/fixtures/test/001_repo.rb index ebf005a1..67d4e7bf 100644 --- a/db/fixtures/test/001_repo.rb +++ b/db/fixtures/test/001_repo.rb @@ -1,15 +1,23 @@ -# create tmp dir if not exist -tmp_dir = File.join(Rails.root, "tmp") -Dir.mkdir(tmp_dir) unless File.exists?(tmp_dir) +require 'fileutils' -# Create dir for test repo -repo_dir = File.join(Rails.root, "tmp", "tests") -Dir.mkdir(repo_dir) unless File.exists?(repo_dir) +print "Unpacking seed repository..." -`cp spec/seed_project.tar.gz tmp/tests/` -Dir.chdir(repo_dir) -`tar -xf seed_project.tar.gz` -3.times do |i| -`cp -r gitlabhq/ gitlabhq_#{i}/` -puts "Unpacked seed repo - tmp/tests/gitlabhq_#{i}" +SEED_REPO = 'seed_project.tar.gz' +REPO_PATH = File.join(Rails.root, 'tmp', 'repositories') + +# Make whatever directories we need to make +FileUtils.mkdir_p(REPO_PATH) + +# Copy the archive to the repo path +FileUtils.cp(File.join(Rails.root, 'spec', SEED_REPO), REPO_PATH) + +# chdir to the repo path +FileUtils.cd(REPO_PATH) do + # Extract the archive + `tar -xf #{SEED_REPO}` + + # Remove the copy + FileUtils.rm(SEED_REPO) end + +puts ' done.' diff --git a/db/migrate/20120729131232_add_extern_auth_provider_to_users.rb b/db/migrate/20120729131232_add_extern_auth_provider_to_users.rb new file mode 100644 index 00000000..d5e66ba4 --- /dev/null +++ b/db/migrate/20120729131232_add_extern_auth_provider_to_users.rb @@ -0,0 +1,8 @@ +class AddExternAuthProviderToUsers < ActiveRecord::Migration + def change + add_column :users, :extern_uid, :string + add_column :users, :provider, :string + + add_index :users, [:extern_uid, :provider], :unique => true + end +end diff --git a/db/pkey.example b/db/pkey.example deleted file mode 100644 index ae045772..00000000 --- a/db/pkey.example +++ /dev/null @@ -1,3 +0,0 @@ -AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 -596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 -soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0= diff --git a/db/schema.rb b/db/schema.rb index c4c54f56..46461e44 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120712080407) do +ActiveRecord::Schema.define(:version => 20120729131232) do create_table "events", :force => true do |t| t.string "target_type" @@ -171,9 +171,12 @@ ActiveRecord::Schema.define(:version => 20120712080407) do t.boolean "blocked", :default => false, :null => false t.integer "failed_attempts", :default => 0 t.datetime "locked_at" + t.string "extern_uid" + t.string "provider" end add_index "users", ["email"], :name => "index_users_on_email", :unique => true + add_index "users", ["extern_uid", "provider"], :name => "index_users_on_extern_uid_and_provider", :unique => true add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true create_table "users_projects", :force => true do |t| diff --git a/doc/api/README.md b/doc/api/README.md index e0111966..53b4983e 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -27,4 +27,6 @@ The API uses JSON to serialize data. You don't need to specify `.json` at the en + [Users](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/users.md) + [Projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md) ++ [Snippets](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/snippets.md) + [Issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/issues.md) ++ [Milestones](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/milestones.md) diff --git a/doc/api/milestones.md b/doc/api/milestones.md new file mode 100644 index 00000000..f68d8eb7 --- /dev/null +++ b/doc/api/milestones.md @@ -0,0 +1,57 @@ +## List project milestones + +Get a list of project milestones. + +``` +GET /projects/:id/milestones +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project + +## Single milestone + +Get a single project milestone. + +``` +GET /projects/:id/milestones/:milestone_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `milestone_id` (required) - The ID of a project milestone + +## New milestone + +Create a new project milestone. + +``` +POST /projects/:id/milestones +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `milestone_id` (required) - The ID of a project milestone ++ `title` (required) - The title of an milestone ++ `description` (optional) - The description of the milestone ++ `due_date` (optional) - The due date of the milestone + +## Edit milestone + +Update an existing project milestone. + +``` +PUT /projects/:id/milestones/:milestone_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `milestone_id` (required) - The ID of a project milestone ++ `title` (optional) - The title of a milestone ++ `description` (optional) - The description of a milestone ++ `due_date` (optional) - The due date of the milestone ++ `closed` (optional) - The status of the milestone diff --git a/doc/api/projects.md b/doc/api/projects.md index ead31003..d680b5d8 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -204,108 +204,6 @@ Parameters: ] ``` -# Project Snippets - -## List snippets - -Not implemented. - -## Single snippet - -Get a project snippet. - -``` -GET /projects/:id/snippets/:snippet_id -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet - -```json -{ - "id": 1, - "title": "test", - "file_name": "add.rb", - "author": { - "id": 1, - "email": "john@example.com", - "name": "John Smith", - "blocked": false, - "created_at": "2012-05-23T08:00:58Z" - }, - "expires_at": null, - "updated_at": "2012-06-28T10:52:04Z", - "created_at": "2012-06-28T10:52:04Z" -} -``` - -## Snippet content - -Get a raw project snippet. - -``` -GET /projects/:id/snippets/:snippet_id/raw -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet - -## New snippet - -Create a new project snippet. - -``` -POST /projects/:id/snippets -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `title` (required) - The title of a snippet -+ `file_name` (required) - The name of a snippet file -+ `lifetime` (optional) - The expiration date of a snippet -+ `code` (required) - The content of a snippet - -Will return created snippet with status `201 Created` on success, or `404 Not found` on fail. - -## Edit snippet - -Update an existing project snippet. - -``` -PUT /projects/:id/snippets/:snippet_id -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet -+ `title` (optional) - The title of a snippet -+ `file_name` (optional) - The name of a snippet file -+ `lifetime` (optional) - The expiration date of a snippet -+ `code` (optional) - The content of a snippet - -Will return updated snippet with status `200 OK` on success, or `404 Not found` on fail. - -## Delete snippet - -Delete existing project snippet. - -``` -DELETE /projects/:id/snippets/:snippet_id -``` - -Parameters: - -+ `id` (required) - The ID or code name of a project -+ `snippet_id` (required) - The ID of a project's snippet - -Status code `200` will be returned on success. - ## Raw blob content Get the raw file contents for a file. diff --git a/doc/api/snippets.md b/doc/api/snippets.md new file mode 100644 index 00000000..0cd29ce5 --- /dev/null +++ b/doc/api/snippets.md @@ -0,0 +1,100 @@ +## List snippets + +Not implemented. + +## Single snippet + +Get a project snippet. + +``` +GET /projects/:id/snippets/:snippet_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet + +```json +{ + "id": 1, + "title": "test", + "file_name": "add.rb", + "author": { + "id": 1, + "email": "john@example.com", + "name": "John Smith", + "blocked": false, + "created_at": "2012-05-23T08:00:58Z" + }, + "expires_at": null, + "updated_at": "2012-06-28T10:52:04Z", + "created_at": "2012-06-28T10:52:04Z" +} +``` + +## Snippet content + +Get a raw project snippet. + +``` +GET /projects/:id/snippets/:snippet_id/raw +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet + +## New snippet + +Create a new project snippet. + +``` +POST /projects/:id/snippets +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `title` (required) - The title of a snippet ++ `file_name` (required) - The name of a snippet file ++ `lifetime` (optional) - The expiration date of a snippet ++ `code` (required) - The content of a snippet + +Will return created snippet with status `201 Created` on success, or `404 Not found` on fail. + +## Edit snippet + +Update an existing project snippet. + +``` +PUT /projects/:id/snippets/:snippet_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet ++ `title` (optional) - The title of a snippet ++ `file_name` (optional) - The name of a snippet file ++ `lifetime` (optional) - The expiration date of a snippet ++ `code` (optional) - The content of a snippet + +Will return updated snippet with status `200 OK` on success, or `404 Not found` on fail. + +## Delete snippet + +Delete existing project snippet. + +``` +DELETE /projects/:id/snippets/:snippet_id +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `snippet_id` (required) - The ID of a project's snippet + +Status code `200` will be returned on success. + diff --git a/doc/development.md b/doc/development.md new file mode 100644 index 00000000..55be2bc3 --- /dev/null +++ b/doc/development.md @@ -0,0 +1,45 @@ +## Development tips: + +### Start application in development mode + +#### 1. Via foreman + + bundle exec foreman -p 3000 + +#### 2. Via gitlab cli + + ./gitlab start + +#### 3. Manually + + bundle exec rails s + bundle exec rake environment resque:work QUEUE=* VVERBOSE=1 + + +### Run tests: + +#### 1. Packages + + # ubuntu + sudo apt-get install libqt4-dev libqtwebkit-dev + sudo apt-get install xvfb + + # Mac + brew install qt + brew install xvfb + +#### 2. DB & seeds + + bundle exec rake db:setup RAILS_ENV=test + bundle exec rake db:seed_fu RAILS_ENV=test + +### 3. Run Tests + + # All in one + bundle exec gitlab:test + + # Rspec + bundle exec rake spec + + # Cucumber + bundle exec rake cucumber diff --git a/doc/installation.md b/doc/installation.md index b6f1869b..b3fe92bf 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -119,7 +119,6 @@ Permissions: sudo chmod -R g+rwX /home/git/repositories/ sudo chown -R git:git /home/git/repositories/ - sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive #### CHECK: Logout & login again to apply git group to your user @@ -178,6 +177,11 @@ Permissions: sudo -u gitlab bundle exec rake gitlab:app:setup RAILS_ENV=production +#### Setup gitlab hooks + + sudo cp ./lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive + sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive + Checking status: sudo -u gitlab bundle exec rake gitlab:app:status RAILS_ENV=production @@ -196,6 +200,7 @@ Checking status: Resolving deltas: 100% (174/174), done. Can clone gitolite-admin?............YES UMASK for .gitolite.rc is 0007? ............YES + /home/git/share/gitolite/hooks/common/post-receive exists? ............YES If you got all YES - congrats! You can go to next step. @@ -239,42 +244,15 @@ You can login via web using admin generated with setup: sudo -u gitlab cp config/unicorn.rb.orig config/unicorn.rb sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D -Edit /etc/nginx/nginx.conf. In the *http* section add the following section of code or replace it completely with https://raw.github.com/dosire/gitlabhq/master/aws/nginx.conf +Add gitlab to nginx sites & change with your host specific settings - upstream gitlab { - server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket; - } + sudo cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-available/gitlab + sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab - server { - listen YOUR_SERVER_IP:80; # e.g., listen 192.168.1.1:80; - server_name YOUR_SERVER_FQDN; # e.g., server_name source.example.com; - root /home/gitlab/gitlab/public; - - # individual nginx logs for this gitlab vhost - access_log /var/log/nginx/gitlab_access.log; - error_log /var/log/nginx/gitlab_error.log; - - location / { - # serve static files from defined root folder;. - # @gitlab is a named location for the upstream fallback, see below - try_files $uri $uri/index.html $uri.html @gitlab; - } - - # if a file, which is not found in the root folder is requested, - # then the proxy pass the request to the upsteam (gitlab unicorn) - location @gitlab { - proxy_redirect off; - - # you need to change this to "https", if you set "ssl" directive to "on" - proxy_set_header X-FORWARDED_PROTO http; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - - proxy_pass http://gitlab; - } - } - -Change **YOUR_SERVER_IP** and **YOUR_SERVER_FQDN** to the IP address and fully-qualified domain name of the host serving GitLab. + # Change **YOUR_SERVER_IP** and **YOUR_SERVER_FQDN** + # to the IP address and fully-qualified domain name + # of the host serving GitLab. + sudo vim /etc/nginx/sites-enabled/gitlab Restart nginx: @@ -282,60 +260,7 @@ Restart nginx: Create init script in /etc/init.d/gitlab: - #! /bin/bash - ### BEGIN INIT INFO - # Provides: gitlab - # Required-Start: $local_fs $remote_fs $network $syslog redis-server - # Required-Stop: $local_fs $remote_fs $network $syslog - # Default-Start: 2 3 4 5 - # Default-Stop: 0 1 6 - # Short-Description: GitLab git repository management - # Description: GitLab git repository management - ### END INIT INFO - - DAEMON_OPTS="-c /home/gitlab/gitlab/config/unicorn.rb -E production -D" - NAME=unicorn - DESC="Gitlab service" - PID=/home/gitlab/gitlab/tmp/pids/unicorn.pid - RESQUE_PID=/home/gitlab/gitlab/tmp/pids/resque_worker.pid - - case "$1" in - start) - CD_TO_APP_DIR="cd /home/gitlab/gitlab" - START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" - START_RESQUE_PROCESS="./resque.sh" - - echo -n "Starting $DESC: " - if [ `whoami` = root ]; then - sudo -u gitlab sh -l -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" - else - $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS - fi - echo "$NAME." - ;; - stop) - echo -n "Stopping $DESC: " - kill -QUIT `cat $PID` - kill -QUIT `cat $RESQUE_PID` - echo "$NAME." - ;; - restart) - echo -n "Restarting $DESC: " - kill -USR2 `cat $PID` - echo "$NAME." - ;; - reload) - echo -n "Reloading $DESC configuration: " - kill -HUP `cat $PID` - echo "$NAME." - ;; - *) - echo "Usage: $NAME {start|stop|restart|reload}" >&2 - exit 1 - ;; - esac - - exit 0 + cp /home/gitlab/gitlab/lib/support/init-gitlab /etc/init.d/gitlab Adding permission: diff --git a/features/profile/ssh_keys.feature b/features/profile/ssh_keys.feature index c3a92f30..c81503ed 100644 --- a/features/profile/ssh_keys.feature +++ b/features/profile/ssh_keys.feature @@ -3,8 +3,8 @@ Feature: SSH Keys Given I signin as a user And I have ssh keys: | title | - | Work | - | Home | + | ssh-rsa Work | + | ssh-rsa Home | And I visit profile keys page Scenario: I should see SSH keys diff --git a/features/projects/issues/labels.feature b/features/projects/issues/labels.feature new file mode 100644 index 00000000..5a20bfd6 --- /dev/null +++ b/features/projects/issues/labels.feature @@ -0,0 +1,13 @@ +Feature: Labels + Background: + Given I signin as a user + And I own project "Shop" + And project "Shop" have issues tags: + | name | + | bug | + | feature | + Given I visit project "Shop" labels page + + Scenario: I should see active milestones + Then I should see label "bug" + And I should see label "feature" diff --git a/features/projects/network.feature b/features/projects/network.feature index 9655184c..61c05eb3 100644 --- a/features/projects/network.feature +++ b/features/projects/network.feature @@ -4,9 +4,7 @@ Feature: Project Network Graph Background: Given I signin as a user And I own project "Shop" - And I visit project "Shop" network page + And I visit project "Shop" network page Scenario: I should see project network Then page should have network graph - - diff --git a/features/step_definitions/dashboard_steps.rb b/features/step_definitions/dashboard_steps.rb index 90c3a69c..a4edd224 100644 --- a/features/step_definitions/dashboard_steps.rb +++ b/features/step_definitions/dashboard_steps.rb @@ -91,36 +91,24 @@ Then /^I should see my merge requests$/ do end Given /^I have assigned issues$/ do - project1 = Factory :project, - :path => "project1", - :code => "gitlabhq_1" - - project2 = Factory :project, - :path => "project2", - :code => "gitlabhq_2" - - project1.add_access(@user, :read, :write) - project2.add_access(@user, :read, :write) + project = Factory :project + project.add_access(@user, :read, :write) issue1 = Factory :issue, :author => @user, :assignee => @user, - :project => project1 + :project => project issue2 = Factory :issue, :author => @user, :assignee => @user, - :project => project2 + :project => project end Given /^I have authored merge requests$/ do - project1 = Factory :project, - :path => "project1", - :code => "gitlabhq_1" + project1 = Factory :project - project2 = Factory :project, - :path => "project2", - :code => "gitlabhq_2" + project2 = Factory :project project1.add_access(@user, :read, :write) project2.add_access(@user, :read, :write) diff --git a/features/step_definitions/profile/profile_keys_steps.rb b/features/step_definitions/profile/profile_keys_steps.rb index 5ab7e048..25926c53 100644 --- a/features/step_definitions/profile/profile_keys_steps.rb +++ b/features/step_definitions/profile/profile_keys_steps.rb @@ -16,7 +16,7 @@ end Given /^I submit new ssh key "(.*?)"$/ do |arg1| fill_in "key_title", :with => arg1 - fill_in "key_key", :with => "publickey234=" + fill_in "key_key", :with => "ssh-rsa publickey234=" click_button "Save" end diff --git a/features/step_definitions/project/project_issues_steps.rb b/features/step_definitions/project/project_issues_steps.rb index 00a1721f..27de03d5 100644 --- a/features/step_definitions/project/project_issues_steps.rb +++ b/features/step_definitions/project/project_issues_steps.rb @@ -33,6 +33,25 @@ Given /^I visit issue page "(.*?)"$/ do |arg1| end Given /^I submit new issue "(.*?)"$/ do |arg1| - fill_in "issue_title", :with => arg1 + fill_in "issue_title", with: arg1 click_button "Submit new issue" end + +Given /^project "(.*?)" have issues tags:$/ do |arg1, table| + project = Project.find_by_name(arg1) + table.hashes.each do |hash| + Factory :issue, + project: project, + label_list: [hash[:name]] + end +end + +Given /^I visit project "(.*?)" labels page$/ do |arg1| + visit project_labels_path(Project.find_by_name(arg1)) +end + +Then /^I should see label "(.*?)"$/ do |arg1| + within ".labels-table" do + page.should have_content arg1 + end +end diff --git a/features/step_definitions/project/projects_steps.rb b/features/step_definitions/project/projects_steps.rb index c9af346e..d981e1f3 100644 --- a/features/step_definitions/project/projects_steps.rb +++ b/features/step_definitions/project/projects_steps.rb @@ -1,4 +1,4 @@ -include LoginMacros +include LoginHelpers Given /^I signin as a user$/ do login_as :user @@ -57,6 +57,11 @@ end Given /^I visit project "(.*?)" network page$/ do |arg1| project = Project.find_by_name(arg1) + + # Stub out find_all to speed this up (10 commits vs. 650) + commits = Grit::Commit.find_all(project.repo, nil, {max_count: 10}) + Grit::Commit.stub(:find_all).and_return(commits) + visit graph_project_path(project) end @@ -67,8 +72,8 @@ end Given /^page should have network graph$/ do page.should have_content "Project Network Graph" within ".graph" do - page.should have_content "stable" - page.should have_content "notes_refacto..." + page.should have_content "master" + page.should have_content "scss_refactor..." end end diff --git a/features/support/env.rb b/features/support/env.rb index 496f23f9..53578152 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,13 +1,16 @@ -require 'simplecov' -SimpleCov.start 'rails' +unless ENV['CI'] + require 'simplecov' + SimpleCov.start 'rails' +end require 'cucumber/rails' require 'webmock/cucumber' + WebMock.allow_net_connect! -require Rails.root.join 'spec/monkeypatch' -require Rails.root.join 'spec/factories' -require Rails.root.join 'spec/support/login' +require Rails.root.join 'spec/support/gitolite_stub' +require Rails.root.join 'spec/support/stubbed_repository' +require Rails.root.join 'spec/support/login_helpers' require Rails.root.join 'spec/support/valid_commit' Capybara.default_selector = :css @@ -44,3 +47,13 @@ require 'headless' headless = Headless.new headless.start + +require 'cucumber/rspec/doubles' + +include GitoliteStub + +Before do + stub_gitolite! +end + +World(FactoryGirl::Syntax::Methods) diff --git a/gitlab b/gitlab new file mode 100755 index 00000000..acafb3f1 --- /dev/null +++ b/gitlab @@ -0,0 +1,75 @@ +#!/usr/bin/env ruby + +class GitlabCli + def initialize + @path = File.dirname(__FILE__) + @command = ARGV.shift + @mode = ARGV.shift + end + + def execute + case @command + when 'start' then start + when 'stop' then stop + else + puts "-- Usage gitlab start production or gitlab stop development" + end + end + + private + + def start + case @mode + when 'production'; + system(unicorn_start_cmd) + system(resque_start_cmd) + else + system(rails_start_cmd) + system(resque_dev_start_cmd) + end + end + + def stop + case @mode + when 'production'; + system(unicorn_stop_cmd) + else + system(rails_stop_cmd) + end + system(resque_stop_cmd) + end + + def rails_start_cmd + "bundle exec rails s -d" + end + + def rails_stop_cmd + pid = File.join(@path, "tmp/pids/server.pid") + "kill -QUIT `cat #{pid}`" + end + + def unicorn_start_cmd + unicorn_conf = File.join(@path, "config/unicorn.rb") + "bundle exec unicorn_rails -c #{unicorn_conf} -E production -D" + end + + def unicorn_stop_cmd + pid = File.join(@path, "/tmp/pids/unicorn.pid") + "kill -QUIT `cat #{pid}`" + end + + def resque_dev_start_cmd + "./resque_dev.sh > /dev/null 2>&1" + end + + def resque_start_cmd + "./resque.sh > /dev/null 2>&1" + end + + def resque_stop_cmd + pid = File.join(@path, "tmp/pids/resque_worker.pid") + "kill -QUIT `cat #{pid}`" + end +end + +GitlabCli.new.execute diff --git a/lib/api.rb b/lib/api.rb index 3ff3b383..be04701c 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -16,5 +16,6 @@ module Gitlab mount Users mount Projects mount Issues + mount Milestones end end diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 2abc20ad..836c2818 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -95,7 +95,7 @@ module Gitlab end end - # Delete a project issue + # Delete a project issue (deprecated) # # Parameters: # id (required) - The ID or code name of a project @@ -103,8 +103,7 @@ module Gitlab # Example Request: # DELETE /projects/:id/issues/:issue_id delete ":id/issues/:issue_id" do - @issue = user_project.issues.find(params[:issue_id]) - @issue.destroy + error!({'message' => 'method not allowed'}, 405) end end end diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb new file mode 100644 index 00000000..f537b8e5 --- /dev/null +++ b/lib/api/milestones.rb @@ -0,0 +1,80 @@ +module Gitlab + # Milestones API + class Milestones < Grape::API + before { authenticate! } + + resource :projects do + # Get a list of project milestones + # + # Parameters: + # id (required) - The ID or code name of a project + # Example Request: + # GET /projects/:id/milestones + get ":id/milestones" do + present user_project.milestones, with: Entities::Milestone + end + + # Get a single project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # milestone_id (required) - The ID of a project milestone + # Example Request: + # GET /projects/:id/milestones/:milestone_id + get ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + present @milestone, with: Entities::Milestone + end + + # Create a new project milestone + # + # Parameters: + # id (required) - The ID or code name of the project + # title (required) - The title of the milestone + # description (optional) - The description of the milestone + # due_date (optional) - The due date of the milestone + # Example Request: + # POST /projects/:id/milestones + post ":id/milestones" do + @milestone = user_project.milestones.new( + title: params[:title], + description: params[:description], + due_date: params[:due_date] + ) + + if @milestone.save + present @milestone, with: Entities::Milestone + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Update an existing project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # milestone_id (required) - The ID of a project milestone + # title (optional) - The title of a milestone + # description (optional) - The description of a milestone + # due_date (optional) - The due date of a milestone + # closed (optional) - The status of the milestone + # Example Request: + # PUT /projects/:id/milestones/:milestone_id + put ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + parameters = { + title: (params[:title] || @milestone.title), + description: (params[:description] || @milestone.description), + due_date: (params[:due_date] || @milestone.due_date), + closed: (params[:closed] || @milestone.closed) + } + + if @milestone.update_attributes(parameters) + present @milestone, with: Entities::Milestone + else + error!({'message' => '404 Not found'}, 404) + end + end + end + end +end diff --git a/lib/gitlab/gitolite.rb b/lib/gitlab/backend/gitolite.rb similarity index 72% rename from lib/gitlab/gitolite.rb rename to lib/gitlab/backend/gitolite.rb index e82f9e62..b69f4663 100644 --- a/lib/gitlab/gitolite.rb +++ b/lib/gitlab/backend/gitolite.rb @@ -2,54 +2,57 @@ require 'gitolite' require 'timeout' require 'fileutils' +# TODO: refactor & cleanup module Gitlab class Gitolite class AccessDenied < StandardError; end + class InvalidKey < StandardError; end - def self.update_project(path, project) - self.new.configure { |git| git.update_project(path, project) } + def set_key key_id, key_content, projects + configure do |c| + c.update_keys(key_id, key_content) + c.update_projects(projects) + end end - def self.destroy_project(project) - self.new.configure { |git| git.destroy_project(project) } + def remove_key key_id, projects + configure do |c| + c.delete_key(key_id) + c.update_projects(projects) + end end - def pull + def update_repository project + configure do |c| + c.update_project(project.path, project) + end + end + + alias_method :create_repository, :update_repository + + def remove_repository project + configure do |c| + c.destroy_project(project) + end + end + + def url_to_repo path + Gitlab.config.ssh_path + "#{path}.git" + end + + def initialize # create tmp dir @local_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}") - Dir.mkdir @local_dir - - `git clone #{GitHost.admin_uri} #{@local_dir}/gitolite` end - def push - Dir.chdir(File.join(@local_dir, "gitolite")) - `git add -A` - `git commit -am "Gitlab"` - `git push` - Dir.chdir(Rails.root) - - FileUtils.rm_rf(@local_dir) - end - - def configure - Timeout::timeout(30) do - File.open(File.join(Rails.root, 'tmp', "gitlabhq-gitolite.lock"), "w+") do |f| - begin - f.flock(File::LOCK_EX) - pull - yield(self) - push - ensure - f.flock(File::LOCK_UN) - end - end + def enable_automerge + configure do |git| + git.admin_all_repo end - rescue Exception => ex - Gitlab::Logger.error(ex.message) - raise Gitolite::AccessDenied.new("gitolite timeout") end + protected + def destroy_project(project) FileUtils.rm_rf(project.path_to_repo) @@ -106,13 +109,13 @@ module Gitlab name_writers = project.repository_writers name_masters = project.repository_masters - pr_br = project.protected_branches.map(&:name).join(" ") + pr_br = project.protected_branches.map(&:name).join("$ ") repo.clean_permissions # Deny access to protected branches for writers unless name_writers.blank? || pr_br.blank? - repo.add_permission("-", pr_br, name_writers) + repo.add_permission("-", pr_br.strip + "$ ", name_writers) end # Add read permissions @@ -153,5 +156,47 @@ module Gitlab conf.add_repo(repo, true) ga_repo.save end + + private + + def pull + # create tmp dir + @local_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}") + Dir.mkdir @local_dir + + `git clone #{Gitlab.config.gitolite_admin_uri} #{@local_dir}/gitolite` + end + + def push + Dir.chdir(File.join(@local_dir, "gitolite")) + `git add -A` + `git commit -am "Gitlab"` + `git push` + Dir.chdir(Rails.root) + + FileUtils.rm_rf(@local_dir) + end + + def configure + Timeout::timeout(30) do + File.open(File.join(Rails.root, 'tmp', "gitlabhq-gitolite.lock"), "w+") do |f| + begin + f.flock(File::LOCK_EX) + pull + yield(self) + push + ensure + f.flock(File::LOCK_UN) + end + end + end + rescue Exception => ex + if ex.message =~ /is not a valid SSH key string/ + raise Gitolite::InvalidKey.new("ssh key is not valid") + else + Gitlab::Logger.error(ex.message) + raise Gitolite::AccessDenied.new("gitolite timeout") + end + end end end diff --git a/config/initializers/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb similarity index 87% rename from config/initializers/grack_auth.rb rename to lib/gitlab/backend/grack_auth.rb index 5995b873..4f77c327 100644 --- a/config/initializers/grack_auth.rb +++ b/lib/gitlab/backend/grack_auth.rb @@ -42,13 +42,13 @@ module Grack def current_ref if @env["HTTP_CONTENT_ENCODING"] =~ /gzip/ - input = Zlib::GzipReader.new(@request.body).string + input = Zlib::GzipReader.new(@request.body).read else - input = @request.body.string + input = @request.body.read end - - oldrev, newrev, ref = input.split(' ') - /refs\/heads\/([\w-]+)/.match(ref).to_a.last + # Need to reset seek point + @request.body.rewind + /refs\/heads\/([\w-]+)/.match(input).to_a.first end end# Auth end# Grack diff --git a/lib/gitlab/git_host.rb b/lib/gitlab/git_host.rb deleted file mode 100644 index 76b2c7b1..00000000 --- a/lib/gitlab/git_host.rb +++ /dev/null @@ -1,17 +0,0 @@ -require File.join(Rails.root, "lib", "gitlab", "gitolite") - -module Gitlab - class GitHost - def self.system - Gitlab::Gitolite - end - - def self.admin_uri - Gitlab.config.git_host.admin_uri - end - - def self.url_to_repo(path) - Gitlab.config.ssh_path + "#{path}.git" - end - end -end diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index d3daed91..75fa835d 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -1,5 +1,14 @@ module Gitlab - # Custom parsing for Gitlab-flavored Markdown + # Custom parser for Gitlab-flavored Markdown + # + # It replaces references in the text with links to the appropriate items in Gitlab. + # + # Supported reference formats are: + # * @foo for team members + # * #123 for issues + # * !123 for merge requests + # * $123 for snippets + # * 123456 for commits # # Examples # @@ -67,25 +76,25 @@ module Gitlab def reference_user(identifier) if user = @project.users.where(name: identifier).first member = @project.users_projects.where(user_id: user).first - link_to("@#{user.name}", project_team_member_path(@project, member), html_options.merge(class: "gfm gfm-team_member #{html_options[:class]}")) if member + link_to("@#{identifier}", project_team_member_path(@project, member), html_options.merge(class: "gfm gfm-team_member #{html_options[:class]}")) if member end end def reference_issue(identifier) if issue = @project.issues.where(id: identifier).first - link_to("##{issue.id}", project_issue_path(@project, issue), html_options.merge(title: "Issue: #{issue.title}", class: "gfm gfm-issue #{html_options[:class]}")) + link_to("##{identifier}", project_issue_path(@project, issue), html_options.merge(title: "Issue: #{issue.title}", class: "gfm gfm-issue #{html_options[:class]}")) end end def reference_merge_request(identifier) if merge_request = @project.merge_requests.where(id: identifier).first - link_to("!#{merge_request.id}", project_merge_request_path(@project, merge_request), html_options.merge(title: "Merge Request: #{merge_request.title}", class: "gfm gfm-merge_request #{html_options[:class]}")) + link_to("!#{identifier}", project_merge_request_path(@project, merge_request), html_options.merge(title: "Merge Request: #{merge_request.title}", class: "gfm gfm-merge_request #{html_options[:class]}")) end end def reference_snippet(identifier) if snippet = @project.snippets.where(id: identifier).first - link_to("$#{snippet.id}", project_snippet_path(@project, snippet), html_options.merge(title: "Snippet: #{snippet.title}", class: "gfm gfm-snippet #{html_options[:class]}")) + link_to("$#{identifier}", project_snippet_path(@project, snippet), html_options.merge(title: "Snippet: #{snippet.title}", class: "gfm gfm-snippet #{html_options[:class]}")) end end diff --git a/lib/post-receive-hook b/lib/hooks/post-receive similarity index 100% rename from lib/post-receive-hook rename to lib/hooks/post-receive diff --git a/lib/support/init-gitlab b/lib/support/init-gitlab new file mode 100644 index 00000000..f146e80f --- /dev/null +++ b/lib/support/init-gitlab @@ -0,0 +1,54 @@ +#! /bin/bash +### BEGIN INIT INFO +# Provides: gitlab +# Required-Start: $local_fs $remote_fs $network $syslog redis-server +# Required-Stop: $local_fs $remote_fs $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: GitLab git repository management +# Description: GitLab git repository management +### END INIT INFO + +DAEMON_OPTS="-c /home/gitlab/gitlab/config/unicorn.rb -E production -D" +NAME=unicorn +DESC="Gitlab service" +PID=/home/gitlab/gitlab/tmp/pids/unicorn.pid +RESQUE_PID=/home/gitlab/gitlab/tmp/pids/resque_worker.pid + +case "$1" in + start) + CD_TO_APP_DIR="cd /home/gitlab/gitlab" + START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" + START_RESQUE_PROCESS="./resque.sh" + + echo -n "Starting $DESC: " + if [ `whoami` = root ]; then + sudo -u gitlab sh -l -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" + else + $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS + fi + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + kill -QUIT `cat $PID` + kill -QUIT `cat $RESQUE_PID` + echo "$NAME." + ;; + restart) + echo -n "Restarting $DESC: " + kill -USR2 `cat $PID` + echo "$NAME." + ;; + reload) + echo -n "Reloading $DESC configuration: " + kill -HUP `cat $PID` + echo "$NAME." + ;; + *) + echo "Usage: $NAME {start|stop|restart|reload}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/lib/support/nginx-gitlab b/lib/support/nginx-gitlab new file mode 100644 index 00000000..fa15d201 --- /dev/null +++ b/lib/support/nginx-gitlab @@ -0,0 +1,33 @@ +upstream gitlab { + server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket; +} + +server { + listen YOUR_SERVER_IP:80; # e.g., listen 192.168.1.1:80; + server_name YOUR_SERVER_FQDN; # e.g., server_name source.example.com; + root /home/gitlab/gitlab/public; + + # individual nginx logs for this gitlab vhost + access_log /var/log/nginx/gitlab_access.log; + error_log /var/log/nginx/gitlab_error.log; + + location / { + # serve static files from defined root folder;. + # @gitlab is a named location for the upstream fallback, see below + try_files $uri $uri/index.html $uri.html @gitlab; + } + + # if a file, which is not found in the root folder is requested, + # then the proxy pass the request to the upsteam (gitlab unicorn) + location @gitlab { + proxy_redirect off; + + # you need to change this to "https", if you set "ssl" directive to "on" + proxy_set_header X-FORWARDED_PROTO http; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + + proxy_pass http://gitlab; + } +} + diff --git a/lib/tasks/bulk_add_permission.rake b/lib/tasks/bulk_add_permission.rake new file mode 100644 index 00000000..55797825 --- /dev/null +++ b/lib/tasks/bulk_add_permission.rake @@ -0,0 +1,26 @@ +desc "Add all users to all projects, system administratos are added as masters" +task :add_users_to_project_teams => :environment do |t, args| + users = User.find_all_by_admin(false, :select => 'id').map(&:id) + admins = User.find_all_by_admin(true, :select => 'id').map(&:id) + + users.each do |user| + puts "#{user}" + end + + Project.all.each do |project| + puts "Importing #{users.length} users into #{project.path}" + UsersProject.bulk_import(project, users, UsersProject::DEVELOPER) + puts "Importing #{admins.length} admins into #{project.path}" + UsersProject.bulk_import(project, admins, UsersProject::MASTER) + end +end + +desc "Add user to as a developer to all projects" +task :add_user_to_project_teams, [:email] => :environment do |t, args| + user_email = args.email + user = User.find_by_email(user_email) + + project_ids = Project.all.map(&:id) + + UsersProject.user_bulk_import(user,project_ids,UsersProject::DEVELOPER) +end diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake index d9053c23..04d240f6 100644 --- a/lib/tasks/gitlab/backup.rake +++ b/lib/tasks/gitlab/backup.rake @@ -144,8 +144,7 @@ namespace :gitlab do if Kernel.system("cd #{File.dirname(project.second)} > /dev/null 2>&1 && git clone --bare #{backup_path_repo}/#{project.first}.bundle #{project.first}.git > /dev/null 2>&1") permission_commands = [ "sudo chmod -R g+rwX #{Gitlab.config.git_base_path}", - "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}", - "sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive" + "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}" ] permission_commands.each { |command| Kernel.system(command) } puts "[DONE]".green diff --git a/lib/tasks/gitlab/enable_automerge.rake b/lib/tasks/gitlab/enable_automerge.rake index 07f80586..0a1a0fa7 100644 --- a/lib/tasks/gitlab/enable_automerge.rake +++ b/lib/tasks/gitlab/enable_automerge.rake @@ -2,9 +2,7 @@ namespace :gitlab do namespace :app do desc "GITLAB | Enable auto merge" task :enable_automerge => :environment do - Gitlab::GitHost.system.new.configure do |git| - git.admin_all_repo - end + Gitlab::Gitolite.new.enable_automerge Project.find_each do |project| if project.repo_exists? && !project.satellite.exists? diff --git a/lib/tasks/gitlab/gitolite_rebuild.rake b/lib/tasks/gitlab/gitolite_rebuild.rake index 5ab17606..534aa315 100644 --- a/lib/tasks/gitlab/gitolite_rebuild.rake +++ b/lib/tasks/gitlab/gitolite_rebuild.rake @@ -16,7 +16,7 @@ namespace :gitlab do task :update_keys => :environment do puts "Starting Key" Key.find_each(:batch_size => 100) do |key| - key.update_repository + Gitlab::Gitolite.new.set_key(key.identifier, key.key, key.projects) print '.' end puts "Done with keys" diff --git a/lib/tasks/gitlab/setup.rake b/lib/tasks/gitlab/setup.rake index d60e73e9..49c86461 100644 --- a/lib/tasks/gitlab/setup.rake +++ b/lib/tasks/gitlab/setup.rake @@ -1,7 +1,11 @@ namespace :gitlab do namespace :app do desc "GITLAB | Setup production application" - task :setup => ['db:setup', 'db:seed_fu', 'gitlab:app:enable_automerge'] + task :setup => [ + 'db:setup', + 'db:seed_fu', + 'gitlab:app:enable_automerge' + ] end end diff --git a/lib/tasks/gitlab/status.rake b/lib/tasks/gitlab/status.rake index bc4e86ea..e5b5e122 100644 --- a/lib/tasks/gitlab/status.rake +++ b/lib/tasks/gitlab/status.rake @@ -56,6 +56,20 @@ namespace :gitlab do return end + gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common") + gitlab_hook_files = ['post-receive'] + gitlab_hook_files.each do |file_name| + dest = File.join(gitolite_hooks_path, file_name) + print "#{dest} exists? ............" + if File.exists?(dest) + puts "YES".green + else + puts "NO".red + return + end + end + + if Project.count > 0 puts "Validating projects repositories:".yellow Project.find_each(:batch_size => 100) do |project| @@ -67,13 +81,7 @@ namespace :gitlab do next end - - unless File.owned?(hook_file) - puts "post-receive file is not owner by gitlab".red - next - end - - puts "post-reveice file ok".green + puts "post-receive file ok".green end end diff --git a/lib/tasks/gitlab/update_hooks.rake b/lib/tasks/gitlab/update_hooks.rake deleted file mode 100644 index 44e1617e..00000000 --- a/lib/tasks/gitlab/update_hooks.rake +++ /dev/null @@ -1,19 +0,0 @@ -namespace :gitlab do - namespace :gitolite do - desc "GITLAB | Rewrite hooks for repos" - task :update_hooks => :environment do - puts "Starting Projects" - Project.find_each(:batch_size => 100) do |project| - begin - if project.commit - project.write_hooks - print ".".green - end - rescue Exception => e - print e.message.red - end - end - puts "\nDone with projects" - end - end -end diff --git a/lib/tasks/gitlab/write_hook.rake b/lib/tasks/gitlab/write_hook.rake new file mode 100644 index 00000000..9ec9c838 --- /dev/null +++ b/lib/tasks/gitlab/write_hook.rake @@ -0,0 +1,23 @@ +namespace :gitlab do + namespace :gitolite do + desc "GITLAB | Write GITLAB hook for gitolite" + task :write_hooks => :environment do + gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common") + gitlab_hooks_path = Rails.root.join("lib", "hooks") + + gitlab_hook_files = ['post-receive'] + + gitlab_hook_files.each do |file_name| + source = File.join(gitlab_hooks_path, file_name) + dest = File.join(gitolite_hooks_path, file_name) + + puts "sudo -u root cp #{source} #{dest}".yellow + `sudo -u root cp #{source} #{dest}` + + puts "sudo -u root chown git:git #{dest}".yellow + `sudo -u root chown git:git #{dest}` + end + end + end +end + diff --git a/resque_dev.sh b/resque_dev.sh index b09cfd9e..0f1d6edb 100755 --- a/resque_dev.sh +++ b/resque_dev.sh @@ -1 +1,2 @@ -bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1 +mkdir -p tmp/pids +bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid RAILS_ENV=development BACKGROUND=yes diff --git a/spec/factories.rb b/spec/factories.rb index ab2ca468..2e4acf39 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -1,92 +1,130 @@ -require File.join(Rails.root, 'spec', 'factory') - -Factory.add(:project, Project) do |obj| - obj.name = Faker::Internet.user_name - obj.path = 'gitlabhq' - obj.owner = Factory(:user) - obj.code = 'LGT' +# Backwards compatibility with the old method +def Factory(type, *args) + FactoryGirl.create(type, *args) end -Factory.add(:project_without_owner, Project) do |obj| - obj.name = Faker::Internet.user_name - obj.path = 'gitlabhq' - obj.code = 'LGT' +module Factory + def self.create(type, *args) + FactoryGirl.create(type, *args) + end + + def self.new(type, *args) + FactoryGirl.build(type, *args) + end end -Factory.add(:public_project, Project) do |obj| - obj.name = Faker::Internet.user_name - obj.path = 'gitlabhq' - obj.private_flag = false - obj.owner = Factory(:user) - obj.code = 'LGT' -end +FactoryGirl.define do + sequence :sentence, aliases: [:title, :content] do + Faker::Lorem.sentence + end -Factory.add(:user, User) do |obj| - obj.email = Faker::Internet.email - obj.password = "123456" - obj.name = Faker::Name.name - obj.password_confirmation = "123456" -end + sequence :name, aliases: [:file_name] do + Faker::Name.name + end -Factory.add(:admin, User) do |obj| - obj.email = Faker::Internet.email - obj.password = "123456" - obj.name = Faker::Name.name - obj.password_confirmation = "123456" - obj.admin = true -end + sequence(:url) { Faker::Internet.uri('http') } -Factory.add(:issue, Issue) do |obj| - obj.title = Faker::Lorem.sentence - obj.author = Factory :user - obj.assignee = Factory :user -end + factory :user, aliases: [:author, :assignee, :owner] do + email { Faker::Internet.email } + name + password "123456" + password_confirmation "123456" -Factory.add(:merge_request, MergeRequest) do |obj| - obj.title = Faker::Lorem.sentence - obj.author = Factory :user - obj.assignee = Factory :user - obj.source_branch = "master" - obj.target_branch = "stable" - obj.closed = false -end + trait :admin do + admin true + end -Factory.add(:snippet, Snippet) do |obj| - obj.title = Faker::Lorem.sentence - obj.file_name = Faker::Lorem.sentence - obj.content = Faker::Lorem.sentences -end + factory :admin, traits: [:admin] + end -Factory.add(:note, Note) do |obj| - obj.note = Faker::Lorem.sentence -end + factory :project do + sequence(:name) { |n| "project#{n}" } + path { name } + code { name } + owner + end -Factory.add(:key, Key) do |obj| - obj.title = "Example key" - obj.key = File.read(File.join(Rails.root, "db", "pkey.example")) -end + factory :users_project do + user + project + end -Factory.add(:project_hook, ProjectHook) do |obj| - obj.url = Faker::Internet.uri("http") -end + factory :issue do + title + author + project -Factory.add(:system_hook, SystemHook) do |obj| - obj.url = Faker::Internet.uri("http") -end + trait :closed do + closed true + end -Factory.add(:wiki, Wiki) do |obj| - obj.title = Faker::Lorem.sentence - obj.content = Faker::Lorem.sentence - obj.user = Factory(:user) - obj.project = Factory(:project) -end + factory :closed_issue, traits: [:closed] + end -Factory.add(:event, Event) do |obj| - obj.title = Faker::Lorem.sentence - obj.project = Factory(:project) -end + factory :merge_request do + title + author + project + source_branch "master" + target_branch "stable" + end -Factory.add(:milestone, Milestone) do |obj| - obj.title = Faker::Lorem.sentence - obj.due_date = Date.today + 1.month + factory :note do + project + note "Note" + end + + factory :event do + end + + factory :key do + title + key do + """ + ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0= + """ + end + + factory :deploy_key do + project + end + + factory :personal_key do + user + end + end + + factory :milestone do + title + project + end + + factory :system_hook do + url + end + + factory :project_hook do + url + end + + factory :wiki do + title + content + user + end + + factory :snippet do + project + author + title + content + file_name + end + + factory :protected_branch do + name + project + end end diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb new file mode 100644 index 00000000..5760aad4 --- /dev/null +++ b/spec/factories_spec.rb @@ -0,0 +1,91 @@ +require 'spec_helper' + +describe "Factories" do + describe 'User' do + it "builds a valid instance" do + build(:user).should be_valid + end + + it "builds a valid admin instance" do + build(:admin).should be_valid + end + end + + describe 'Project' do + it "builds a valid instance" do + build(:project).should be_valid + end + end + + describe 'Issue' do + it "builds a valid instance" do + build(:issue).should be_valid + end + + it "builds a valid closed instance" do + build(:closed_issue).should be_valid + end + end + + describe 'MergeRequest' do + it "builds a valid instance" do + build(:merge_request).should be_valid + end + end + + describe 'Note' do + it "builds a valid instance" do + build(:note).should be_valid + end + end + + describe 'Event' do + it "builds a valid instance" do + build(:event).should be_valid + end + end + + describe 'Key' do + it "builds a valid instance" do + build(:key).should be_valid + end + + it "builds a valid deploy key instance" do + build(:deploy_key).should be_valid + end + + it "builds a valid personal key instance" do + build(:personal_key).should be_valid + end + end + + describe 'Milestone' do + it "builds a valid instance" do + build(:milestone).should be_valid + end + end + + describe 'SystemHook' do + it "builds a valid instance" do + build(:system_hook).should be_valid + end + end + + describe 'ProjectHook' do + it "builds a valid instance" do + build(:project_hook).should be_valid + end + end + + describe 'Wiki' do + it "builds a valid instance" do + build(:wiki).should be_valid + end + end + + describe 'Snippet' do + it "builds a valid instance" do + build(:snippet).should be_valid + end + end +end diff --git a/spec/factory.rb b/spec/factory.rb deleted file mode 100644 index 1758b4d6..00000000 --- a/spec/factory.rb +++ /dev/null @@ -1,29 +0,0 @@ -class Factory - @factories = {} - - class << self - def add(name, klass, &block) - @factories[name] = [klass, block] - end - - def create(name, opts = {}) - new(name, opts).tap(&:save!) - end - - def new(name, opts = {}) - factory= @factories[name] - factory[0].new.tap do |obj| - factory[1].call(obj) - end.tap do |obj| - opts.each do |k, opt| - obj.send("#{k}=", opt) - end - end - end - end -end - -def Factory(name, opts={}) - Factory.create name, opts -end - diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb new file mode 100644 index 00000000..9a2df314 --- /dev/null +++ b/spec/helpers/application_helper_spec.rb @@ -0,0 +1,26 @@ +require 'spec_helper' + +describe ApplicationHelper do + describe "gravatar_icon" do + let(:user_email) { 'user@email.com' } + + it "should return a generic avatar path when Gravatar is disabled" do + Gitlab.config.stub(:disable_gravatar?).and_return(true) + gravatar_icon(user_email).should == 'no_avatar.png' + end + + it "should return a generic avatar path when email is blank" do + gravatar_icon('').should == 'no_avatar.png' + end + + it "should use SSL when appropriate" do + stub!(:request).and_return(double(:ssl? => true)) + gravatar_icon(user_email).should match('https://secure.gravatar.com') + end + + it "should accept a custom size" do + stub!(:request).and_return(double(:ssl? => false)) + gravatar_icon(user_email, 64).should match(/\?s=64/) + end + end +end diff --git a/spec/helpers/gitlab_flavored_markdown_spec.rb b/spec/helpers/gitlab_flavored_markdown_spec.rb index e147cb39..28bd46ec 100644 --- a/spec/helpers/gitlab_flavored_markdown_spec.rb +++ b/spec/helpers/gitlab_flavored_markdown_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" describe GitlabMarkdownHelper do before do - @project = Project.find_by_path("gitlabhq") || Factory(:project) + @project = Factory(:project) @commit = @project.repo.commits.first.parents.first @commit = CommitDecorator.decorate(Commit.new(@commit)) @other_project = Factory :project, path: "OtherPath", code: "OtherCode" @@ -157,7 +157,7 @@ describe GitlabMarkdownHelper do gfm("Let @#{user.name} fix the *mess* in #{@commit.id}").should == "Let #{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} fix the *mess* in #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "}" end - it "should not trip over other stuff", focus: true do + it "should not trip over other stuff" do gfm("_Please_ *stop* 'helping' and all the other b*$#%' you do.").should == "_Please_ *stop* 'helping' and all the other b*$#%' you do." end diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index 27af1e38..cf50b429 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -24,7 +24,7 @@ describe Notify do end it 'has the correct subject' do - should have_subject /Account was created for you/ + should have_subject /^gitlab \| Account was created for you$/ end it 'contains the new user\'s login name' do @@ -60,7 +60,7 @@ describe Notify do it_behaves_like 'an assignee email' it 'has the correct subject' do - should have_subject /new issue ##{issue.id}/ + should have_subject /new issue ##{issue.id} \| #{issue.title} \| #{project.name}/ end it 'contains a link to the new issue' do @@ -76,7 +76,7 @@ describe Notify do it_behaves_like 'a multiple recipients email' it 'has the correct subject' do - should have_subject /changed issue/ + should have_subject /changed issue ##{issue.id} \| #{issue.title}/ end it 'contains the name of the previous assignee' do @@ -91,6 +91,29 @@ describe Notify do should have_body_text /#{project_issue_path project, issue}/ end end + + describe 'status changed' do + let(:current_user) { Factory.create :user, email: "current@email.com" } + let(:status) { 'closed' } + subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) } + + it 'has the correct subject' do + should have_subject /changed issue ##{issue.id} \| #{issue.title}/i + end + + it 'contains the new status' do + should have_body_text /#{status}/i + end + + it 'contains the user name' do + should have_body_text /#{current_user.name}/i + end + + it 'contains a link to the issue' do + should have_body_text /#{project_issue_path project, issue}/ + end + end + end context 'for merge requests' do @@ -145,6 +168,26 @@ describe Notify do end end + describe 'project access changed' do + let(:project) { Factory.create(:project, + path: "Fuu", + code: "Fuu") } + let(:user) { Factory.create :user } + let(:users_project) { Factory.create(:users_project, + project: project, + user: user) } + subject { Notify.project_access_granted_email(users_project.id) } + it 'has the correct subject' do + should have_subject /access to project was granted/ + end + it 'contains name of project' do + should have_body_text /#{project.name}/ + end + it 'contains new user role' do + should have_body_text /#{users_project.project_access_human}/ + end + end + context 'items that are noteable, the email for a note' do let(:note_author) { Factory.create(:user, name: 'author_name') } let(:note) { Factory.create(:note, project: project, author: note_author) } diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 188f0997..aaffda31 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -1,24 +1,9 @@ -# == Schema Information -# -# Table name: events -# -# id :integer(4) not null, primary key -# target_type :string(255) -# target_id :integer(4) -# title :string(255) -# data :text -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# action :integer(4) -# author_id :integer(4) -# - require 'spec_helper' describe Event do describe "Associations" do it { should belong_to(:project) } + it { should belong_to(:target) } end describe "Respond to" do @@ -29,16 +14,6 @@ describe Event do it { should respond_to(:commits) } end - describe "Creation" do - before do - @event = Factory :event - end - - it "should create a valid event" do - @event.should be_valid - end - end - describe "Push event" do before do project = Factory :project diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index e9cbd725..69829a4d 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -2,28 +2,19 @@ require 'spec_helper' describe Issue do describe "Associations" do - it { should belong_to(:project) } - it { should belong_to(:author) } - it { should belong_to(:assignee) } it { should belong_to(:milestone) } end describe "Validation" do - it { should validate_presence_of(:title) } - it { should validate_presence_of(:author_id) } - it { should validate_presence_of(:project_id) } + it { should ensure_length_of(:description).is_within(0..2000) } end - describe "Scope" do - it { Issue.should respond_to :closed } - it { Issue.should respond_to :opened } + describe 'modules' do + it { should include_module(IssueCommonality) } + it { should include_module(Upvote) } end - subject { Factory.create(:issue, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)) } - it { should be_valid } + subject { Factory.create(:issue) } describe '#is_being_reassigned?' do it 'returns true if the issue assignee has changed' do @@ -41,11 +32,7 @@ describe Issue do subject.is_being_closed?.should be_true end it 'returns false if the closed attribute has changed and is now false' do - issue = Factory.create(:issue, - closed: true, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)) + issue = Factory.create(:closed_issue) issue.closed = false issue.is_being_closed?.should be_false end @@ -57,11 +44,7 @@ describe Issue do describe '#is_being_reopened?' do it 'returns true if the closed attribute has changed and is now false' do - issue = Factory.create(:issue, - closed: true, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)) + issue = Factory.create(:closed_issue) issue.closed = false issue.is_being_reopened?.should be_true end @@ -73,64 +56,4 @@ describe Issue do subject.is_being_reopened?.should be_false end end - - describe "plus 1" do - let(:project) { Factory(:project) } - subject { - Factory.create(:issue, - author: Factory(:user), - assignee: Factory(:user), - project: project) - } - - it "with no notes has a 0/0 score" do - subject.upvotes.should == 0 - end - - it "should recognize non-+1 notes" do - subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.should have(1).note - subject.notes.first.upvote?.should be_false - subject.upvotes.should == 0 - end - - it "should recognize a single +1 note" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.upvotes.should == 1 - end - - it "should recognize a multiple +1 notes" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo')) - subject.upvotes.should == 2 - end - end - - describe ".search" do - let!(:issue) { Factory.create(:issue, title: "Searchable issue", - project: Factory.create(:project)) } - - it "matches by title" do - Issue.search('able').all.should == [issue] - end - end end -# == Schema Information -# -# Table name: issues -# -# id :integer(4) not null, primary key -# title :string(255) -# assignee_id :integer(4) -# author_id :integer(4) -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# closed :boolean(1) default(FALSE), not null -# position :integer(4) default(0) -# critical :boolean(1) default(FALSE), not null -# branch_name :string(255) -# description :text -# milestone_id :integer(4) -# - diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb index 0f9b3177..85cd291d 100644 --- a/spec/models/key_spec.rb +++ b/spec/models/key_spec.rb @@ -2,12 +2,15 @@ require 'spec_helper' describe Key do describe "Associations" do - it { should belong_to(:user) or belong_to(:project) } + it { should belong_to(:user) } + it { should belong_to(:project) } end describe "Validation" do it { should validate_presence_of(:title) } it { should validate_presence_of(:key) } + it { should ensure_length_of(:title).is_within(0..255) } + it { should ensure_length_of(:key).is_within(0..5000) } end describe "Methods" do @@ -17,20 +20,15 @@ describe Key do context "validation of uniqueness" do context "as a deploy key" do - let(:project) { Factory.create(:project, path: 'alpha', code: 'alpha') } - let(:another_project) { Factory.create(:project, path: 'beta', code: 'beta') } - - before do - deploy_key = Factory.create(:key, project: project) - end + let!(:deploy_key) { create(:deploy_key) } it "does not accept the same key twice for a project" do - key = Factory.new(:key, project: project) + key = build(:key, project: deploy_key.project) key.should_not be_valid end it "does accept the same key for another project" do - key = Factory.new(:key, project: another_project) + key = build(:key, project_id: 0) key.should be_valid end end @@ -39,27 +37,13 @@ describe Key do let(:user) { Factory.create(:user) } it "accepts the key once" do - Factory.new(:key, user: user).should be_valid + build(:key, user: user).should be_valid end it "does not accepts the key twice" do - Factory.create(:key, user: user) - Factory.new(:key, user: user).should_not be_valid + create(:key, user: user) + build(:key, user: user).should_not be_valid end end end end -# == Schema Information -# -# Table name: keys -# -# id :integer(4) not null, primary key -# user_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# key :text -# title :string(255) -# identifier :string(255) -# project_id :integer(4) -# - diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index c7ad08a1..d1253b35 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -1,88 +1,13 @@ require 'spec_helper' describe MergeRequest do - describe "Associations" do - it { should belong_to(:project) } - it { should belong_to(:author) } - it { should belong_to(:assignee) } - end - describe "Validation" do it { should validate_presence_of(:target_branch) } it { should validate_presence_of(:source_branch) } - it { should validate_presence_of(:title) } - it { should validate_presence_of(:author_id) } - it { should validate_presence_of(:project_id) } end - describe "Scope" do - it { MergeRequest.should respond_to :closed } - it { MergeRequest.should respond_to :opened } - end - - it { Factory.create(:merge_request, - author: Factory(:user), - assignee: Factory(:user), - project: Factory.create(:project)).should be_valid } - - describe "plus 1" do - let(:project) { Factory(:project) } - subject { - Factory.create(:merge_request, - author: Factory(:user), - assignee: Factory(:user), - project: project) - } - - it "with no notes has a 0/0 score" do - subject.upvotes.should == 0 - end - - it "should recognize non-+1 notes" do - subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.should have(1).note - subject.notes.first.upvote?.should be_false - subject.upvotes.should == 0 - end - - it "should recognize a single +1 note" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.upvotes.should == 1 - end - - it "should recognize a multiple +1 notes" do - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) - subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo')) - subject.upvotes.should == 2 - end - end - - describe ".search" do - let!(:issue) { Factory.create(:issue, title: "Searchable issue", - project: Factory.create(:project)) } - - it "matches by title" do - Issue.search('able').all.should == [issue] - end + describe 'modules' do + it { should include_module(IssueCommonality) } + it { should include_module(Upvote) } end end -# == Schema Information -# -# Table name: merge_requests -# -# id :integer(4) not null, primary key -# target_branch :string(255) not null -# source_branch :string(255) not null -# project_id :integer(4) not null -# author_id :integer(4) -# assignee_id :integer(4) -# title :string(255) -# closed :boolean(1) default(FALSE), not null -# created_at :datetime not null -# updated_at :datetime not null -# st_commits :text(2147483647 -# st_diffs :text(2147483647 -# merged :boolean(1) default(FALSE), not null -# state :integer(4) default(1), not null -# - diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index 880d3f30..fa15fc8f 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -1,17 +1,3 @@ -# == Schema Information -# -# Table name: milestones -# -# id :integer(4) not null, primary key -# title :string(255) not null -# project_id :integer(4) not null -# description :text -# due_date :date -# closed :boolean(1) default(FALSE), not null -# created_at :datetime not null -# updated_at :datetime not null -# - require 'spec_helper' describe Milestone do @@ -25,30 +11,36 @@ describe Milestone do it { should validate_presence_of(:project_id) } end - let(:project) { Factory :project } - let(:milestone) { Factory :milestone, project: project } - let(:issue) { Factory :issue, project: project } + let(:milestone) { Factory :milestone } + let(:issue) { Factory :issue } - it { milestone.should be_valid } - - describe "Issues" do - before do + describe "#percent_complete" do + it "should not count open issues" do milestone.issues << issue + milestone.percent_complete.should == 0 end - it { milestone.percent_complete.should == 0 } + it "should count closed issues" do + issue.update_attributes(closed: true) + milestone.issues << issue + milestone.percent_complete.should == 100 + end - it do - issue.update_attributes closed: true + it "should recover from dividing by zero" do + milestone.issues.should_receive(:count).and_return(0) milestone.percent_complete.should == 100 end end - describe :expires_at do - before do - milestone.update_attributes due_date: Date.today + 1.day + describe "#expires_at" do + it "should be nil when due_date is unset" do + milestone.update_attributes(due_date: nil) + milestone.expires_at.should be_nil end - it { milestone.expires_at.should_not be_nil } + it "should not be nil when due_date is set" do + milestone.update_attributes(due_date: Date.tomorrow) + milestone.expires_at.should be_present + end end end diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index c97b23cb..ffaf442d 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -1,11 +1,10 @@ require 'spec_helper' describe Note do - let(:project) { Factory :project } - let!(:commit) { project.commit } - describe "Associations" do it { should belong_to(:project) } + it { should belong_to(:noteable) } + it { should belong_to(:author).class_name('User') } end describe "Validation" do @@ -13,8 +12,6 @@ describe Note do it { should validate_presence_of(:project) } end - it { Factory.create(:note, - project: project).should be_valid } describe "Scopes" do it "should have a today named scope that returns ..." do Note.today.where_values.should == ["created_at >= '#{Date.today}'"] @@ -25,26 +22,27 @@ describe Note do let(:project) { Factory(:project) } it "recognizes a neutral note" do - note = Factory(:note, project: project, note: "This is not a +1 note") + note = Factory(:note, note: "This is not a +1 note") note.should_not be_upvote end it "recognizes a +1 note" do - note = Factory(:note, project: project, note: "+1 for this") + note = Factory(:note, note: "+1 for this") note.should be_upvote end it "recognizes a -1 note as no vote" do - note = Factory(:note, project: project, note: "-1 for this") + note = Factory(:note, note: "-1 for this") note.should_not be_upvote end end - describe "Commit notes" do + let(:project) { create(:project) } + let(:commit) { project.commit } + describe "Commit notes" do before do @note = Factory :note, - project: project, noteable_id: commit.id, noteable_type: "Commit" end @@ -58,7 +56,6 @@ describe Note do describe "Pre-line commit notes" do before do @note = Factory :note, - project: project, noteable_id: commit.id, noteable_type: "Commit", line_code: "0_16_1" @@ -91,8 +88,8 @@ describe Note do describe :authorization do before do - @p1 = project - @p2 = Factory :project, code: "alien", path: "gitlabhq_1" + @p1 = create(:project) + @p2 = Factory :project @u1 = Factory :user @u2 = Factory :user @u3 = Factory :user @@ -135,19 +132,3 @@ describe Note do end end end -# == Schema Information -# -# Table name: notes -# -# id :integer(4) not null, primary key -# note :text -# noteable_id :string(255) -# noteable_type :string(255) -# author_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# project_id :integer(4) -# attachment :string(255) -# line_code :string(255) -# - diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 5bba4ff6..5add7ff8 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -2,23 +2,52 @@ require 'spec_helper' describe Project do describe "Associations" do + it { should belong_to(:owner).class_name('User') } it { should have_many(:users) } - it { should have_many(:protected_branches).dependent(:destroy) } it { should have_many(:events).dependent(:destroy) } - it { should have_many(:wikis).dependent(:destroy) } it { should have_many(:merge_requests).dependent(:destroy) } - it { should have_many(:users_projects).dependent(:destroy) } it { should have_many(:issues).dependent(:destroy) } + it { should have_many(:milestones).dependent(:destroy) } + it { should have_many(:users_projects).dependent(:destroy) } it { should have_many(:notes).dependent(:destroy) } it { should have_many(:snippets).dependent(:destroy) } - it { should have_many(:hooks).dependent(:destroy) } it { should have_many(:deploy_keys).dependent(:destroy) } + it { should have_many(:hooks).dependent(:destroy) } + it { should have_many(:wikis).dependent(:destroy) } + it { should have_many(:protected_branches).dependent(:destroy) } end describe "Validation" do + let!(:project) { create(:project) } + it { should validate_presence_of(:name) } + it { should validate_uniqueness_of(:name) } + it { should ensure_length_of(:name).is_within(0..255) } + it { should validate_presence_of(:path) } + it { should validate_uniqueness_of(:path) } + it { should ensure_length_of(:path).is_within(0..255) } + # TODO: Formats + + it { should ensure_length_of(:description).is_within(0..2000) } + it { should validate_presence_of(:code) } + it { should validate_uniqueness_of(:code) } + it { should ensure_length_of(:code).is_within(1..255) } + # TODO: Formats + + it { should validate_presence_of(:owner) } + + it "should not allow new projects beyond user limits" do + project.stub(:owner).and_return(double(can_create_project?: false, projects_limit: 1)) + project.should_not be_valid + project.errors[:base].first.should match(/Your own projects limit is 1/) + end + + it "should not allow 'gitolite-admin' as repo name" do + should allow_value("blah").for(:path) + should_not allow_value("gitolite-admin").for(:path) + end end describe "Respond to" do @@ -40,7 +69,6 @@ describe Project do it { should respond_to(:commits_with_refs) } it { should respond_to(:commits_since) } it { should respond_to(:commits_between) } - it { should respond_to(:write_hooks) } it { should respond_to(:satellite) } it { should respond_to(:update_repository) } it { should respond_to(:destroy_repository) } @@ -74,9 +102,11 @@ describe Project do it { should respond_to(:trigger_post_receive) } end - it "should not allow 'gitolite-admin' as repo name" do - should allow_value("blah").for(:path) - should_not allow_value("gitolite-admin").for(:path) + describe 'modules' do + it { should include_module(Repository) } + it { should include_module(PushObserver) } + it { should include_module(Authority) } + it { should include_module(Team) } end it "should return valid url to repo" do @@ -86,7 +116,7 @@ describe Project do it "should return path to repo" do project = Project.new(path: "somewhere") - project.path_to_repo.should == File.join(Rails.root, "tmp", "tests", "somewhere") + project.path_to_repo.should == File.join(Rails.root, "tmp", "repositories", "somewhere") end it "returns the full web URL for this repo" do @@ -111,7 +141,7 @@ describe Project do let(:last_event) { double } before do - project.stub(:events).and_return( [ double, double, last_event ] ) + project.stub_chain(:events, :order).and_return( [ double, double, last_event ] ) end it { project.last_activity.should == last_event } @@ -237,23 +267,3 @@ describe Project do end end end -# == Schema Information -# -# Table name: projects -# -# id :integer(4) not null, primary key -# name :string(255) -# path :string(255) -# description :text -# created_at :datetime not null -# updated_at :datetime not null -# private_flag :boolean(1) default(TRUE), not null -# code :string(255) -# owner_id :integer(4) -# default_branch :string(255) default("master"), not null -# issues_enabled :boolean(1) default(TRUE), not null -# wall_enabled :boolean(1) default(TRUE), not null -# merge_requests_enabled :boolean(1) default(TRUE), not null -# wiki_enabled :boolean(1) default(TRUE), not null -# - diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb index 1654e3b6..9180bc3b 100644 --- a/spec/models/protected_branch_spec.rb +++ b/spec/models/protected_branch_spec.rb @@ -1,19 +1,6 @@ -# == Schema Information -# -# Table name: protected_branches -# -# id :integer(4) not null, primary key -# project_id :integer(4) not null -# name :string(255) not null -# created_at :datetime not null -# updated_at :datetime not null -# - require 'spec_helper' describe ProtectedBranch do - let(:project) { Factory(:project) } - describe 'Associations' do it { should belong_to(:project) } end @@ -24,26 +11,26 @@ describe ProtectedBranch do end describe 'Callbacks' do - subject { ProtectedBranch.new(project: project, name: 'branch_name') } + let(:branch) { build(:protected_branch) } it 'call update_repository after save' do - subject.should_receive(:update_repository) - subject.save + branch.should_receive(:update_repository) + branch.save end it 'call update_repository after destroy' do - subject.should_receive(:update_repository) - subject.destroy + branch.save + branch.should_receive(:update_repository) + branch.destroy end end describe '#commit' do - subject { ProtectedBranch.new(project: project, name: 'cant_touch_this') } + let(:branch) { create(:protected_branch) } it 'commits itself to its project' do - project.should_receive(:commit).with('cant_touch_this') - - subject.commit + branch.project.should_receive(:commit).with(branch.name) + branch.commit end end end diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb index 9b4aaa13..ffb861c4 100644 --- a/spec/models/snippet_spec.rb +++ b/spec/models/snippet_spec.rb @@ -3,29 +3,21 @@ require 'spec_helper' describe Snippet do describe "Associations" do it { should belong_to(:project) } - it { should belong_to(:author) } + it { should belong_to(:author).class_name('User') } + it { should have_many(:notes).dependent(:destroy) } end describe "Validation" do - it { should validate_presence_of(:title) } it { should validate_presence_of(:author_id) } it { should validate_presence_of(:project_id) } + + it { should validate_presence_of(:title) } + it { should ensure_length_of(:title).is_within(0..255) } + it { should validate_presence_of(:file_name) } + it { should ensure_length_of(:title).is_within(0..255) } + it { should validate_presence_of(:content) } + it { should ensure_length_of(:content).is_within(0..10_000) } end end -# == Schema Information -# -# Table name: snippets -# -# id :integer(4) not null, primary key -# title :string(255) -# content :text -# author_id :integer(4) not null -# project_id :integer(4) not null -# created_at :datetime not null -# updated_at :datetime not null -# file_name :string(255) -# expires_at :datetime -# - diff --git a/spec/models/system_hook_spec.rb b/spec/models/system_hook_spec.rb index 56d76ed0..fe2a5836 100644 --- a/spec/models/system_hook_spec.rb +++ b/spec/models/system_hook_spec.rb @@ -10,13 +10,12 @@ describe SystemHook do end it "project_create hook" do - user = Factory :user with_resque do - project = Factory :project_without_owner, owner: user + project = Factory :project end WebMock.should have_requested(:post, @system_hook.url).with(body: /project_create/).once end - + it "project_destroy hook" do project = Factory :project with_resque do @@ -31,7 +30,7 @@ describe SystemHook do end WebMock.should have_requested(:post, @system_hook.url).with(body: /user_create/).once end - + it "user_destroy hook" do user = Factory :user with_resque do @@ -39,7 +38,7 @@ describe SystemHook do end WebMock.should have_requested(:post, @system_hook.url).with(body: /user_destroy/).once end - + it "project_create hook" do user = Factory :user project = Factory :project @@ -48,7 +47,7 @@ describe SystemHook do end WebMock.should have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once end - + it "project_destroy hook" do user = Factory :user project = Factory :project diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 265dcef1..ca34f07d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -2,12 +2,26 @@ require 'spec_helper' describe User do describe "Associations" do + it { should have_many(:users_projects).dependent(:destroy) } it { should have_many(:projects) } - it { should have_many(:users_projects) } - it { should have_many(:issues) } - it { should have_many(:assigned_issues) } - it { should have_many(:merge_requests) } - it { should have_many(:assigned_merge_requests) } + it { should have_many(:my_own_projects).class_name('Project') } + it { should have_many(:keys).dependent(:destroy) } + it { should have_many(:events).class_name('Event').dependent(:destroy) } + it { should have_many(:recent_events).class_name('Event') } + it { should have_many(:issues).dependent(:destroy) } + it { should have_many(:notes).dependent(:destroy) } + it { should have_many(:assigned_issues).dependent(:destroy) } + it { should have_many(:merge_requests).dependent(:destroy) } + it { should have_many(:assigned_merge_requests).dependent(:destroy) } + end + + describe 'validations' do + it { should validate_presence_of(:projects_limit) } + it { should validate_numericality_of(:projects_limit) } + it { should allow_value(0).for(:projects_limit) } + it { should_not allow_value(-1).for(:projects_limit) } + + it { should ensure_length_of(:bio).is_within(0..255) } end describe "Respond to" do @@ -49,49 +63,4 @@ describe User do user = Factory(:user) user.authentication_token.should_not == "" end - - describe "dependent" do - before do - @user = Factory :user - @note = Factory :note, - author: @user, - project: Factory(:project) - end - - it "should destroy all notes with user" do - Note.find_by_id(@note.id).should_not be_nil - @user.destroy - Note.find_by_id(@note.id).should be_nil - end - end end -# == Schema Information -# -# Table name: users -# -# id :integer(4) not null, primary key -# email :string(255) default(""), not null -# encrypted_password :string(128) default(""), not null -# reset_password_token :string(255) -# reset_password_sent_at :datetime -# remember_created_at :datetime -# sign_in_count :integer(4) default(0) -# current_sign_in_at :datetime -# last_sign_in_at :datetime -# current_sign_in_ip :string(255) -# last_sign_in_ip :string(255) -# created_at :datetime not null -# updated_at :datetime not null -# name :string(255) -# admin :boolean(1) default(FALSE), not null -# projects_limit :integer(4) default(10) -# skype :string(255) default(""), not null -# linkedin :string(255) default(""), not null -# twitter :string(255) default(""), not null -# authentication_token :string(255) -# dark_scheme :boolean(1) default(FALSE), not null -# theme_id :integer(4) default(1), not null -# bio :string(255) -# blocked :boolean(1) default(FALSE), not null -# - diff --git a/spec/models/users_project_spec.rb b/spec/models/users_project_spec.rb index 87fbfbf2..3197ba6e 100644 --- a/spec/models/users_project_spec.rb +++ b/spec/models/users_project_spec.rb @@ -7,7 +7,11 @@ describe UsersProject do end describe "Validation" do + let!(:users_project) { create(:users_project) } + it { should validate_presence_of(:user_id) } + it { should validate_uniqueness_of(:user_id).scoped_to(:project_id) } + it { should validate_presence_of(:project_id) } end @@ -16,15 +20,3 @@ describe UsersProject do it { should respond_to(:user_email) } end end -# == Schema Information -# -# Table name: users_projects -# -# id :integer(4) not null, primary key -# user_id :integer(4) not null -# project_id :integer(4) not null -# created_at :datetime not null -# updated_at :datetime not null -# project_access :integer(4) default(0), not null -# - diff --git a/spec/models/web_hook_spec.rb b/spec/models/web_hook_spec.rb index 88594761..3cba5b64 100644 --- a/spec/models/web_hook_spec.rb +++ b/spec/models/web_hook_spec.rb @@ -52,14 +52,3 @@ describe ProjectHook do end end end -# == Schema Information -# -# Table name: web_hooks -# -# id :integer(4) not null, primary key -# url :string(255) -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# - diff --git a/spec/models/wiki_spec.rb b/spec/models/wiki_spec.rb index 892d0e8f..de6ce426 100644 --- a/spec/models/wiki_spec.rb +++ b/spec/models/wiki_spec.rb @@ -4,27 +4,13 @@ describe Wiki do describe "Associations" do it { should belong_to(:project) } it { should belong_to(:user) } + it { should have_many(:notes).dependent(:destroy) } end describe "Validation" do it { should validate_presence_of(:title) } + it { should ensure_length_of(:title).is_within(1..250) } it { should validate_presence_of(:content) } it { should validate_presence_of(:user_id) } end - - it { Factory(:wiki).should be_valid } end -# == Schema Information -# -# Table name: wikis -# -# id :integer(4) not null, primary key -# title :string(255) -# content :text -# project_id :integer(4) -# created_at :datetime not null -# updated_at :datetime not null -# slug :string(255) -# user_id :integer(4) -# - diff --git a/spec/monkeypatch.rb b/spec/monkeypatch.rb deleted file mode 100644 index 855a31f0..00000000 --- a/spec/monkeypatch.rb +++ /dev/null @@ -1,51 +0,0 @@ -# Stubbing Project <-> git host path -# create project using Factory only -class Project - def update_repository - true - end - - def destroy_repository - true - end - - def path_to_repo - File.join(Rails.root, "tmp", "tests", path) - end - - def satellite - @satellite ||= FakeSatellite.new - end -end - -class Key - def update_repository - true - end - - def repository_delete_key - true - end -end - -class UsersProject - def update_repository - true - end -end - -class FakeSatellite - def exists? - true - end - - def create - true - end -end - -class ProtectedBranch - def update_repository - true - end -end diff --git a/spec/models/activity_observer_spec.rb b/spec/observers/activity_observer_spec.rb similarity index 100% rename from spec/models/activity_observer_spec.rb rename to spec/observers/activity_observer_spec.rb diff --git a/spec/models/issue_observer_spec.rb b/spec/observers/issue_observer_spec.rb similarity index 58% rename from spec/models/issue_observer_spec.rb rename to spec/observers/issue_observer_spec.rb index c6a405f1..b5943f2c 100644 --- a/spec/models/issue_observer_spec.rb +++ b/spec/observers/issue_observer_spec.rb @@ -3,7 +3,8 @@ require 'spec_helper' describe IssueObserver do let(:some_user) { double(:user, id: 1) } let(:assignee) { double(:user, id: 2) } - let(:issue) { double(:issue, id: 42, assignee: assignee) } + let(:author) { double(:user, id: 3) } + let(:issue) { double(:issue, id: 42, assignee: assignee, author: author) } before(:each) { subject.stub(:current_user).and_return(some_user) } @@ -67,36 +68,90 @@ describe IssueObserver do end end - context 'a status "closed" note' do - it 'is created if the issue is being closed' do + context 'a status "closed"' do + it 'note is created if the issue is being closed' do issue.should_receive(:is_being_closed?).and_return(true) Note.should_receive(:create_status_change_note).with(issue, some_user, 'closed') subject.after_update(issue) end - it 'is not created if the issue is not being closed' do + it 'note is not created if the issue is not being closed' do issue.should_receive(:is_being_closed?).and_return(false) Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'closed') subject.after_update(issue) end + + it 'notification is delivered if the issue being closed' do + issue.stub(:is_being_closed?).and_return(true) + Notify.should_receive(:issue_status_changed_email).twice + Note.should_receive(:create_status_change_note).with(issue, some_user, 'closed') + + subject.after_update(issue) + end + + it 'notification is not delivered if the issue not being closed' do + issue.stub(:is_being_closed?).and_return(false) + Notify.should_not_receive(:issue_status_changed_email) + Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'closed') + + subject.after_update(issue) + end + + it 'notification is delivered only to author if the issue being closed' do + issue_without_assignee = double(:issue, id: 42, author: author, assignee: nil) + issue_without_assignee.stub(:is_being_reassigned?).and_return(false) + issue_without_assignee.stub(:is_being_closed?).and_return(true) + issue_without_assignee.stub(:is_being_reopened?).and_return(false) + Notify.should_receive(:issue_status_changed_email).once + Note.should_receive(:create_status_change_note).with(issue_without_assignee, some_user, 'closed') + + subject.after_update(issue_without_assignee) + end end - context 'a status "reopened" note' do - it 'is created if the issue is being reopened' do + context 'a status "reopened"' do + it 'note is created if the issue is being reopened' do issue.should_receive(:is_being_reopened?).and_return(true) Note.should_receive(:create_status_change_note).with(issue, some_user, 'reopened') subject.after_update(issue) end - it 'is not created if the issue is not being reopened' do + it 'note is not created if the issue is not being reopened' do issue.should_receive(:is_being_reopened?).and_return(false) Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'reopened') subject.after_update(issue) end + + it 'notification is delivered if the issue being reopened' do + issue.stub(:is_being_reopened?).and_return(true) + Notify.should_receive(:issue_status_changed_email).twice + Note.should_receive(:create_status_change_note).with(issue, some_user, 'reopened') + + subject.after_update(issue) + end + + it 'notification is not delivered if the issue not being reopened' do + issue.stub(:is_being_reopened?).and_return(false) + Notify.should_not_receive(:issue_status_changed_email) + Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'reopened') + + subject.after_update(issue) + end + + it 'notification is delivered only to author if the issue being reopened' do + issue_without_assignee = double(:issue, id: 42, author: author, assignee: nil) + issue_without_assignee.stub(:is_being_reassigned?).and_return(false) + issue_without_assignee.stub(:is_being_closed?).and_return(false) + issue_without_assignee.stub(:is_being_reopened?).and_return(true) + Notify.should_receive(:issue_status_changed_email).once + Note.should_receive(:create_status_change_note).with(issue_without_assignee, some_user, 'reopened') + + subject.after_update(issue_without_assignee) + end end end diff --git a/spec/observers/key_observer_spec.rb b/spec/observers/key_observer_spec.rb new file mode 100644 index 00000000..7f2a76a3 --- /dev/null +++ b/spec/observers/key_observer_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe KeyObserver do + before do + @key = double('Key', + identifier: 'admin_654654', + key: '== a vaild ssh key', + projects: [], + is_deploy_key: false + ) + + @gitolite = double('Gitlab::Gitolite', + set_key: true, + remove_key: true + ) + + @observer = KeyObserver.instance + @observer.stub(:git_host => @gitolite) + end + + context :after_save do + it do + @gitolite.should_receive(:set_key).with(@key.identifier, @key.key, @key.projects) + @observer.after_save(@key) + end + end + + context :after_destroy do + it do + @gitolite.should_receive(:remove_key).with(@key.identifier, @key.projects) + @observer.after_destroy(@key) + end + end +end diff --git a/spec/models/user_observer_spec.rb b/spec/observers/user_observer_spec.rb similarity index 100% rename from spec/models/user_observer_spec.rb rename to spec/observers/user_observer_spec.rb diff --git a/spec/observers/users_project_observer_spec.rb b/spec/observers/users_project_observer_spec.rb new file mode 100644 index 00000000..3e392040 --- /dev/null +++ b/spec/observers/users_project_observer_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe UsersProjectObserver do + let(:user) { Factory.create :user } + let(:project) { Factory.create(:project, + code: "Fuu", + path: "Fuu" ) } + let(:users_project) { Factory.create(:users_project, + project: project, + user: user )} + subject { UsersProjectObserver.instance } + + describe "#after_create" do + it "should called when UsersProject created" do + subject.should_receive(:after_create) + UsersProject.observers.enable :users_project_observer do + Factory.create(:users_project, + project: project, + user: user) + end + end + it "should send email to user" do + Notify.should_receive(:project_access_granted_email).with(users_project.id).and_return(double(deliver: true)) + subject.after_create(users_project) + end + end + + describe "#after_update" do + it "should called when UsersProject updated" do + subject.should_receive(:after_update) + UsersProject.observers.enable :users_project_observer do + users_project.update_attribute(:project_access, 40) + end + end + it "should send email to user" do + Notify.should_receive(:project_access_granted_email).with(users_project.id).and_return(double(deliver: true)) + subject.after_update(users_project) + end + end +end diff --git a/spec/requests/admin/admin_projects_spec.rb b/spec/requests/admin/admin_projects_spec.rb index 0ce66f5f..2edfb592 100644 --- a/spec/requests/admin/admin_projects_spec.rb +++ b/spec/requests/admin/admin_projects_spec.rb @@ -87,7 +87,7 @@ describe "Admin::Projects" do visit new_admin_project_path fill_in 'project_name', with: 'NewProject' fill_in 'project_code', with: 'NPR' - fill_in 'project_path', with: 'gitlabhq_1' + fill_in 'project_path', with: 'newproject' expect { click_button "Create project" }.to change { Project.count }.by(1) @project = Project.last end diff --git a/spec/requests/admin/security_spec.rb b/spec/requests/admin/security_spec.rb index 0c369740..63068326 100644 --- a/spec/requests/admin/security_spec.rb +++ b/spec/requests/admin/security_spec.rb @@ -2,20 +2,26 @@ require 'spec_helper' describe "Admin::Projects" do describe "GET /admin/projects" do - it { admin_projects_path.should be_allowed_for :admin } - it { admin_projects_path.should be_denied_for :user } - it { admin_projects_path.should be_denied_for :visitor } + subject { admin_projects_path } + + it { should be_allowed_for :admin } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /admin/users" do - it { admin_users_path.should be_allowed_for :admin } - it { admin_users_path.should be_denied_for :user } - it { admin_users_path.should be_denied_for :visitor } + subject { admin_users_path } + + it { should be_allowed_for :admin } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /admin/hooks" do - it { admin_hooks_path.should be_allowed_for :admin } - it { admin_hooks_path.should be_denied_for :user } - it { admin_hooks_path.should be_denied_for :visitor } + subject { admin_hooks_path } + + it { should be_allowed_for :admin } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end end diff --git a/spec/api/issues_spec.rb b/spec/requests/api/issues_spec.rb similarity index 73% rename from spec/api/issues_spec.rb rename to spec/requests/api/issues_spec.rb index f6d8e379..293ea83a 100644 --- a/spec/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe Gitlab::API do + include ApiHelpers + let(:user) { Factory :user } let!(:project) { Factory :project, owner: user } let!(:issue) { Factory :issue, author: user, assignee: user, project: project } @@ -8,13 +10,13 @@ describe Gitlab::API do describe "GET /issues" do it "should return authentication error" do - get "#{api_prefix}/issues" + get api("/issues") response.status.should == 401 end describe "authenticated GET /issues" do it "should return an array of issues" do - get "#{api_prefix}/issues?private_token=#{user.private_token}" + get api("/issues", user) response.status.should == 200 json_response.should be_an Array json_response.first['title'].should == issue.title @@ -24,7 +26,7 @@ describe Gitlab::API do describe "GET /projects/:id/issues" do it "should return project issues" do - get "#{api_prefix}/projects/#{project.code}/issues?private_token=#{user.private_token}" + get api("/projects/#{project.code}/issues", user) response.status.should == 200 json_response.should be_an Array json_response.first['title'].should == issue.title @@ -33,7 +35,7 @@ describe Gitlab::API do describe "GET /projects/:id/issues/:issue_id" do it "should return a project issue by id" do - get "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" + get api("/projects/#{project.code}/issues/#{issue.id}", user) response.status.should == 200 json_response['title'].should == issue.title end @@ -41,7 +43,7 @@ describe Gitlab::API do describe "POST /projects/:id/issues" do it "should create a new project issue" do - post "#{api_prefix}/projects/#{project.code}/issues?private_token=#{user.private_token}", + post api("/projects/#{project.code}/issues", user), title: 'new issue', labels: 'label, label2' response.status.should == 201 json_response['title'].should == 'new issue' @@ -52,7 +54,7 @@ describe Gitlab::API do describe "PUT /projects/:id/issues/:issue_id" do it "should update a project issue" do - put "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}", + put api("/projects/#{project.code}/issues/#{issue.id}", user), title: 'updated title', labels: 'label2', closed: 1 response.status.should == 200 json_response['title'].should == 'updated title' @@ -63,9 +65,8 @@ describe Gitlab::API do describe "DELETE /projects/:id/issues/:issue_id" do it "should delete a project issue" do - expect { - delete "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" - }.to change { Issue.count }.by(-1) + delete api("/projects/#{project.code}/issues/#{issue.id}", user) + response.status.should == 405 end end end diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb new file mode 100644 index 00000000..cf5f65f0 --- /dev/null +++ b/spec/requests/api/milestones_spec.rb @@ -0,0 +1,47 @@ +require 'spec_helper' + +describe Gitlab::API do + include ApiHelpers + + let(:user) { Factory :user } + let!(:project) { Factory :project, owner: user } + let!(:milestone) { Factory :milestone, project: project } + + before { project.add_access(user, :read) } + + describe "GET /projects/:id/milestones" do + it "should return project milestones" do + get api("/projects/#{project.code}/milestones", user) + response.status.should == 200 + json_response.should be_an Array + json_response.first['title'].should == milestone.title + end + end + + describe "GET /projects/:id/milestones/:milestone_id" do + it "should return a project milestone by id" do + get api("/projects/#{project.code}/milestones/#{milestone.id}", user) + response.status.should == 200 + json_response['title'].should == milestone.title + end + end + + describe "POST /projects/:id/milestones" do + it "should create a new project milestone" do + post api("/projects/#{project.code}/milestones", user), + title: 'new milestone' + response.status.should == 201 + json_response['title'].should == 'new milestone' + json_response['description'].should be_nil + end + end + + describe "PUT /projects/:id/milestones/:milestone_id" do + it "should update a project milestone" do + put api("/projects/#{project.code}/milestones/#{milestone.id}", user), + title: 'updated title' + response.status.should == 200 + json_response['title'].should == 'updated title' + end + end +end diff --git a/spec/api/projects_spec.rb b/spec/requests/api/projects_spec.rb similarity index 67% rename from spec/api/projects_spec.rb rename to spec/requests/api/projects_spec.rb index ff45619e..0cbc12af 100644 --- a/spec/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe Gitlab::API do + include ApiHelpers + let(:user) { Factory :user } let!(:project) { Factory :project, owner: user } let!(:snippet) { Factory :snippet, author: user, project: project, title: 'example' } @@ -8,13 +10,13 @@ describe Gitlab::API do describe "GET /projects" do it "should return authentication error" do - get "#{api_prefix}/projects" + get api("/projects") response.status.should == 401 end describe "authenticated GET /projects" do it "should return an array of projects" do - get "#{api_prefix}/projects?private_token=#{user.private_token}" + get api("/projects", user) response.status.should == 200 json_response.should be_an Array json_response.first['name'].should == project.name @@ -25,20 +27,20 @@ describe Gitlab::API do describe "GET /projects/:id" do it "should return a project by id" do - get "#{api_prefix}/projects/#{project.id}?private_token=#{user.private_token}" + get api("/projects/#{project.id}", user) response.status.should == 200 json_response['name'].should == project.name json_response['owner']['email'].should == user.email end it "should return a project by code name" do - get "#{api_prefix}/projects/#{project.code}?private_token=#{user.private_token}" + get api("/projects/#{project.code}", user) response.status.should == 200 json_response['name'].should == project.name end it "should return a 404 error if not found" do - get "#{api_prefix}/projects/42?private_token=#{user.private_token}" + get api("/projects/42", user) response.status.should == 404 json_response['message'].should == '404 Not found' end @@ -46,7 +48,7 @@ describe Gitlab::API do describe "GET /projects/:id/repository/branches" do it "should return an array of project branches" do - get "#{api_prefix}/projects/#{project.code}/repository/branches?private_token=#{user.private_token}" + get api("/projects/#{project.code}/repository/branches", user) response.status.should == 200 json_response.should be_an Array json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name @@ -55,7 +57,7 @@ describe Gitlab::API do describe "GET /projects/:id/repository/branches/:branch" do it "should return the branch information for a single branch" do - get "#{api_prefix}/projects/#{project.code}/repository/branches/new_design?private_token=#{user.private_token}" + get api("/projects/#{project.code}/repository/branches/new_design", user) response.status.should == 200 json_response['name'].should == 'new_design' @@ -65,7 +67,7 @@ describe Gitlab::API do describe "GET /projects/:id/repository/tags" do it "should return an array of project tags" do - get "#{api_prefix}/projects/#{project.code}/repository/tags?private_token=#{user.private_token}" + get api("/projects/#{project.code}/repository/tags", user) response.status.should == 200 json_response.should be_an Array json_response.first['name'].should == project.repo.tags.sort_by(&:name).reverse.first.name @@ -74,7 +76,7 @@ describe Gitlab::API do describe "GET /projects/:id/snippets/:snippet_id" do it "should return a project snippet" do - get "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}" + get api("/projects/#{project.code}/snippets/#{snippet.id}", user) response.status.should == 200 json_response['title'].should == snippet.title end @@ -82,7 +84,7 @@ describe Gitlab::API do describe "POST /projects/:id/snippets" do it "should create a new project snippet" do - post "#{api_prefix}/projects/#{project.code}/snippets?private_token=#{user.private_token}", + post api("/projects/#{project.code}/snippets", user), title: 'api test', file_name: 'sample.rb', code: 'test' response.status.should == 201 json_response['title'].should == 'api test' @@ -91,7 +93,7 @@ describe Gitlab::API do describe "PUT /projects/:id/snippets" do it "should update an existing project snippet" do - put "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}", + put api("/projects/#{project.code}/snippets/#{snippet.id}", user), code: 'updated code' response.status.should == 200 json_response['title'].should == 'example' @@ -102,34 +104,31 @@ describe Gitlab::API do describe "DELETE /projects/:id/snippets/:snippet_id" do it "should delete existing project snippet" do expect { - delete "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}" + delete api("/projects/#{project.code}/snippets/#{snippet.id}", user) }.to change { Snippet.count }.by(-1) end end describe "GET /projects/:id/snippets/:snippet_id/raw" do it "should get a raw project snippet" do - get "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}/raw?private_token=#{user.private_token}" + get api("/projects/#{project.code}/snippets/#{snippet.id}/raw", user) response.status.should == 200 end end describe "GET /projects/:id/:sha/blob" do it "should get the raw file contents" do - get "#{api_prefix}/projects/#{project.code}/repository/commits/master/blob?filepath=README.md&private_token=#{user.private_token}" - + get api("/projects/#{project.code}/repository/commits/master/blob?filepath=README.md", user) response.status.should == 200 end it "should return 404 for invalid branch_name" do - get "#{api_prefix}/projects/#{project.code}/repository/commits/invalid_branch_name/blob?filepath=README.md&private_token=#{user.private_token}" - + get api("/projects/#{project.code}/repository/commits/invalid_branch_name/blob?filepath=README.md", user) response.status.should == 404 end it "should return 404 for invalid file" do - get "#{api_prefix}/projects/#{project.code}/repository/commits/master/blob?filepath=README.invalid&private_token=#{user.private_token}" - + get api("/projects/#{project.code}/repository/commits/master/blob?filepath=README.invalid", user) response.status.should == 404 end end diff --git a/spec/api/users_spec.rb b/spec/requests/api/users_spec.rb similarity index 76% rename from spec/api/users_spec.rb rename to spec/requests/api/users_spec.rb index 32b9379d..d791962a 100644 --- a/spec/api/users_spec.rb +++ b/spec/requests/api/users_spec.rb @@ -1,17 +1,19 @@ require 'spec_helper' describe Gitlab::API do + include ApiHelpers + let(:user) { Factory :user } describe "GET /users" do it "should return authentication error" do - get "#{api_prefix}/users" + get api("/users") response.status.should == 401 end describe "authenticated GET /users" do it "should return an array of users" do - get "#{api_prefix}/users?private_token=#{user.private_token}" + get api("/users", user) response.status.should == 200 json_response.should be_an Array json_response.first['email'].should == user.email @@ -21,7 +23,7 @@ describe Gitlab::API do describe "GET /users/:id" do it "should return a user by id" do - get "#{api_prefix}/users/#{user.id}?private_token=#{user.private_token}" + get api("/users/#{user.id}", user) response.status.should == 200 json_response['email'].should == user.email end @@ -29,7 +31,7 @@ describe Gitlab::API do describe "GET /user" do it "should return current user" do - get "#{api_prefix}/user?private_token=#{user.private_token}" + get api("/user", user) response.status.should == 200 json_response['email'].should == user.email end diff --git a/spec/requests/atom/dashboard_issues_spec.rb b/spec/requests/atom/dashboard_issues_spec.rb index 9b4ffc0e..79a9b8ef 100644 --- a/spec/requests/atom/dashboard_issues_spec.rb +++ b/spec/requests/atom/dashboard_issues_spec.rb @@ -6,13 +6,9 @@ describe "User Issues Dashboard" do login_as :user - @project1 = Factory :project, - path: "project1", - code: "TEST1" + @project1 = Factory :project - @project2 = Factory :project, - path: "project2", - code: "TEST2" + @project2 = Factory :project @project1.add_access(@user, :read, :write) @project2.add_access(@user, :read, :write) diff --git a/spec/requests/projects_deploy_keys_spec.rb b/spec/requests/projects_deploy_keys_spec.rb index 0fea7b46..894aa6d3 100644 --- a/spec/requests/projects_deploy_keys_spec.rb +++ b/spec/requests/projects_deploy_keys_spec.rb @@ -42,7 +42,7 @@ describe "Projects", "DeployKeys" do describe "fill in" do before do fill_in "key_title", with: "laptop" - fill_in "key_key", with: "publickey234=" + fill_in "key_key", with: "ssh-rsa publickey234=" end it { expect { click_button "Save" }.to change {Key.count}.by(1) } @@ -55,12 +55,12 @@ describe "Projects", "DeployKeys" do end end - describe "Show page" do + describe "Show page" do before do @key = Factory :key, project: project - visit project_deploy_key_path(project, @key) + visit project_deploy_key_path(project, @key) end - + it { page.should have_content @key.title } it { page.should have_content @key.key[0..10] } end diff --git a/spec/requests/security/profile_access_spec.rb b/spec/requests/security/profile_access_spec.rb index b8ed27f0..9f6fe6a2 100644 --- a/spec/requests/security/profile_access_spec.rb +++ b/spec/requests/security/profile_access_spec.rb @@ -11,24 +11,30 @@ describe "Users Security" do end describe "GET /keys" do - it { keys_path.should be_allowed_for @u1 } - it { keys_path.should be_allowed_for :admin } - it { keys_path.should be_allowed_for :user } - it { keys_path.should be_denied_for :visitor } + subject { keys_path } + + it { should be_allowed_for @u1 } + it { should be_allowed_for :admin } + it { should be_allowed_for :user } + it { should be_denied_for :visitor } end describe "GET /profile" do - it { profile_path.should be_allowed_for @u1 } - it { profile_path.should be_allowed_for :admin } - it { profile_path.should be_allowed_for :user } - it { profile_path.should be_denied_for :visitor } + subject { profile_path } + + it { should be_allowed_for @u1 } + it { should be_allowed_for :admin } + it { should be_allowed_for :user } + it { should be_denied_for :visitor } end describe "GET /profile/password" do - it { profile_password_path.should be_allowed_for @u1 } - it { profile_password_path.should be_allowed_for :admin } - it { profile_password_path.should be_allowed_for :user } - it { profile_password_path.should be_denied_for :visitor } + subject { profile_password_path } + + it { should be_allowed_for @u1 } + it { should be_allowed_for :admin } + it { should be_allowed_for :user } + it { should be_denied_for :visitor } end end end diff --git a/spec/requests/security/project_access_spec.rb b/spec/requests/security/project_access_spec.rb index d503cf85..0cdf43bf 100644 --- a/spec/requests/security/project_access_spec.rb +++ b/spec/requests/security/project_access_spec.rb @@ -26,64 +26,76 @@ describe "Application access" do end describe "GET /project_code" do - it { project_path(@project).should be_allowed_for @u1 } - it { project_path(@project).should be_allowed_for @u3 } - it { project_path(@project).should be_denied_for :admin } - it { project_path(@project).should be_denied_for @u2 } - it { project_path(@project).should be_denied_for :user } - it { project_path(@project).should be_denied_for :visitor } + subject { project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/master/tree" do - it { tree_project_ref_path(@project, @project.root_ref).should be_allowed_for @u1 } - it { tree_project_ref_path(@project, @project.root_ref).should be_allowed_for @u3 } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for :admin } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for @u2 } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for :user } - it { tree_project_ref_path(@project, @project.root_ref).should be_denied_for :visitor } + subject { tree_project_ref_path(@project, @project.root_ref) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/commits" do - it { project_commits_path(@project).should be_allowed_for @u1 } - it { project_commits_path(@project).should be_allowed_for @u3 } - it { project_commits_path(@project).should be_denied_for :admin } - it { project_commits_path(@project).should be_denied_for @u2 } - it { project_commits_path(@project).should be_denied_for :user } - it { project_commits_path(@project).should be_denied_for :visitor } + subject { project_commits_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/commit" do - it { project_commit_path(@project, @project.commit.id).should be_allowed_for @u1 } - it { project_commit_path(@project, @project.commit.id).should be_allowed_for @u3 } - it { project_commit_path(@project, @project.commit.id).should be_denied_for :admin } - it { project_commit_path(@project, @project.commit.id).should be_denied_for @u2 } - it { project_commit_path(@project, @project.commit.id).should be_denied_for :user } - it { project_commit_path(@project, @project.commit.id).should be_denied_for :visitor } + subject { project_commit_path(@project, @project.commit.id) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/team" do - it { team_project_path(@project).should be_allowed_for @u1 } - it { team_project_path(@project).should be_allowed_for @u3 } - it { team_project_path(@project).should be_denied_for :admin } - it { team_project_path(@project).should be_denied_for @u2 } - it { team_project_path(@project).should be_denied_for :user } - it { team_project_path(@project).should be_denied_for :visitor } + subject { team_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/wall" do - it { wall_project_path(@project).should be_allowed_for @u1 } - it { wall_project_path(@project).should be_allowed_for @u3 } - it { wall_project_path(@project).should be_denied_for :admin } - it { wall_project_path(@project).should be_denied_for @u2 } - it { wall_project_path(@project).should be_denied_for :user } - it { wall_project_path(@project).should be_denied_for :visitor } + subject { wall_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/blob" do before do - @commit = @project.commit - @path = @commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name - @blob_path = blob_project_ref_path(@project, @commit.id, path: @path) + commit = @project.commit + path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name + @blob_path = blob_project_ref_path(@project, commit.id, path: path) end it { @blob_path.should be_allowed_for @u1 } @@ -95,93 +107,113 @@ describe "Application access" do end describe "GET /project_code/edit" do - it { edit_project_path(@project).should be_allowed_for @u1 } - it { edit_project_path(@project).should be_denied_for @u3 } - it { edit_project_path(@project).should be_denied_for :admin } - it { edit_project_path(@project).should be_denied_for @u2 } - it { edit_project_path(@project).should be_denied_for :user } - it { edit_project_path(@project).should be_denied_for :visitor } + subject { edit_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_denied_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/deploy_keys" do - it { project_deploy_keys_path(@project).should be_allowed_for @u1 } - it { project_deploy_keys_path(@project).should be_denied_for @u3 } - it { project_deploy_keys_path(@project).should be_denied_for :admin } - it { project_deploy_keys_path(@project).should be_denied_for @u2 } - it { project_deploy_keys_path(@project).should be_denied_for :user } - it { project_deploy_keys_path(@project).should be_denied_for :visitor } + subject { project_deploy_keys_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_denied_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/issues" do - it { project_issues_path(@project).should be_allowed_for @u1 } - it { project_issues_path(@project).should be_allowed_for @u3 } - it { project_issues_path(@project).should be_denied_for :admin } - it { project_issues_path(@project).should be_denied_for @u2 } - it { project_issues_path(@project).should be_denied_for :user } - it { project_issues_path(@project).should be_denied_for :visitor } + subject { project_issues_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/snippets" do - it { project_snippets_path(@project).should be_allowed_for @u1 } - it { project_snippets_path(@project).should be_allowed_for @u3 } - it { project_snippets_path(@project).should be_denied_for :admin } - it { project_snippets_path(@project).should be_denied_for @u2 } - it { project_snippets_path(@project).should be_denied_for :user } - it { project_snippets_path(@project).should be_denied_for :visitor } + subject { project_snippets_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/merge_requests" do - it { project_merge_requests_path(@project).should be_allowed_for @u1 } - it { project_merge_requests_path(@project).should be_allowed_for @u3 } - it { project_merge_requests_path(@project).should be_denied_for :admin } - it { project_merge_requests_path(@project).should be_denied_for @u2 } - it { project_merge_requests_path(@project).should be_denied_for :user } - it { project_merge_requests_path(@project).should be_denied_for :visitor } + subject { project_merge_requests_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/repository" do - it { project_repository_path(@project).should be_allowed_for @u1 } - it { project_repository_path(@project).should be_allowed_for @u3 } - it { project_repository_path(@project).should be_denied_for :admin } - it { project_repository_path(@project).should be_denied_for @u2 } - it { project_repository_path(@project).should be_denied_for :user } - it { project_repository_path(@project).should be_denied_for :visitor } + subject { project_repository_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/repository/branches" do - it { branches_project_repository_path(@project).should be_allowed_for @u1 } - it { branches_project_repository_path(@project).should be_allowed_for @u3 } - it { branches_project_repository_path(@project).should be_denied_for :admin } - it { branches_project_repository_path(@project).should be_denied_for @u2 } - it { branches_project_repository_path(@project).should be_denied_for :user } - it { branches_project_repository_path(@project).should be_denied_for :visitor } + subject { branches_project_repository_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/repository/tags" do - it { tags_project_repository_path(@project).should be_allowed_for @u1 } - it { tags_project_repository_path(@project).should be_allowed_for @u3 } - it { tags_project_repository_path(@project).should be_denied_for :admin } - it { tags_project_repository_path(@project).should be_denied_for @u2 } - it { tags_project_repository_path(@project).should be_denied_for :user } - it { tags_project_repository_path(@project).should be_denied_for :visitor } + subject { tags_project_repository_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/hooks" do - it { project_hooks_path(@project).should be_allowed_for @u1 } - it { project_hooks_path(@project).should be_allowed_for @u3 } - it { project_hooks_path(@project).should be_denied_for :admin } - it { project_hooks_path(@project).should be_denied_for @u2 } - it { project_hooks_path(@project).should be_denied_for :user } - it { project_hooks_path(@project).should be_denied_for :visitor } + subject { project_hooks_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end describe "GET /project_code/files" do - it { files_project_path(@project).should be_allowed_for @u1 } - it { files_project_path(@project).should be_allowed_for @u3 } - it { files_project_path(@project).should be_denied_for :admin } - it { files_project_path(@project).should be_denied_for @u2 } - it { files_project_path(@project).should be_denied_for :user } - it { files_project_path(@project).should be_denied_for :visitor } + subject { files_project_path(@project) } + + it { should be_allowed_for @u1 } + it { should be_allowed_for @u3 } + it { should be_denied_for :admin } + it { should be_denied_for @u2 } + it { should be_denied_for :user } + it { should be_denied_for :visitor } end end end diff --git a/spec/roles/issue_commonality_spec.rb b/spec/roles/issue_commonality_spec.rb new file mode 100644 index 00000000..77b98b46 --- /dev/null +++ b/spec/roles/issue_commonality_spec.rb @@ -0,0 +1,69 @@ +require 'spec_helper' + +describe Issue, "IssueCommonality" do + let(:issue) { create(:issue) } + + describe "Associations" do + it { should belong_to(:project) } + it { should belong_to(:author) } + it { should belong_to(:assignee) } + it { should have_many(:notes).dependent(:destroy) } + end + + describe "Validation" do + it { should validate_presence_of(:project_id) } + it { should validate_presence_of(:author_id) } + it { should validate_presence_of(:title) } + it { should ensure_length_of(:title).is_at_least(0).is_at_most(255) } + end + + describe "Scope" do + it { described_class.should respond_to(:opened) } + it { described_class.should respond_to(:closed) } + it { described_class.should respond_to(:assigned) } + end + + it "has an :author_id_of_changes accessor" do + issue.should respond_to(:author_id_of_changes) + issue.should respond_to(:author_id_of_changes=) + end + + describe ".search" do + let!(:searchable_issue) { create(:issue, title: "Searchable issue") } + + it "matches by title" do + described_class.search('able').all.should == [searchable_issue] + end + end + + describe "#today?" do + it "returns true when created today" do + # Avoid timezone differences and just return exactly what we want + Date.stub(:today).and_return(issue.created_at.to_date) + issue.today?.should be_true + end + + it "returns false when not created today" do + Date.stub(:today).and_return(Date.yesterday) + issue.today?.should be_false + end + end + + describe "#new?" do + it "returns true when created today and record hasn't been updated" do + issue.stub(:today?).and_return(true) + issue.new?.should be_true + end + + it "returns false when not created today" do + issue.stub(:today?).and_return(false) + issue.new?.should be_false + end + + it "returns false when record has been updated" do + issue.stub(:today?).and_return(true) + issue.touch + issue.new?.should be_false + end + end +end diff --git a/spec/roles/upvote_spec.rb b/spec/roles/upvote_spec.rb new file mode 100644 index 00000000..24288ada --- /dev/null +++ b/spec/roles/upvote_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe Issue, "Upvote" do + let(:issue) { create(:issue) } + + it "with no notes has a 0/0 score" do + issue.upvotes.should == 0 + end + + it "should recognize non-+1 notes" do + issue.notes << create(:note, note: "No +1 here") + issue.should have(1).note + issue.notes.first.upvote?.should be_false + issue.upvotes.should == 0 + end + + it "should recognize a single +1 note" do + issue.notes << create(:note, note: "+1 This is awesome") + issue.upvotes.should == 1 + end + + it "should recognize multiple +1 notes" do + issue.notes << create(:note, note: "+1 This is awesome") + issue.notes << create(:note, note: "+1 I want this") + issue.upvotes.should == 2 + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 5c0bb618..d381b3f1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,7 @@ -require 'simplecov' -SimpleCov.start 'rails' +unless ENV['CI'] + require 'simplecov' + SimpleCov.start 'rails' +end # This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' @@ -7,10 +9,7 @@ require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'capybara/rails' require 'capybara/rspec' -require 'capybara/dsl' require 'webmock/rspec' -require 'factories' -require 'monkeypatch' require 'email_spec' require 'headless' @@ -21,10 +20,14 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} # Use capybara-webkit Capybara.javascript_driver = :webkit +WebMock.disable_net_connect!(allow_localhost: true) + RSpec.configure do |config| config.mock_with :rspec - config.include LoginMacros + config.include LoginHelpers, type: :request + config.include GitoliteStub + config.include FactoryGirl::Syntax::Methods # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false @@ -36,35 +39,11 @@ RSpec.configure do |config| headless.start end - config.before :each, type: :integration do - DeviseSessionMock.disable - end - config.before do - if example.metadata[:js] - DatabaseCleaner.strategy = :truncation - Capybara::Selenium::Driver::DEFAULT_OPTIONS[:resynchronize] = true - else - DatabaseCleaner.strategy = :transaction - end - - DatabaseCleaner.start - - WebMock.disable_net_connect!(allow_localhost: true) + stub_gitolite! # !!! Observers disabled by default in tests - # - # Use next code to enable observers - # before(:each) { ActiveRecord::Base.observers.enable(:all) } - # - ActiveRecord::Base.observers.disable :all + ActiveRecord::Base.observers.disable(:all) + # ActiveRecord::Base.observers.enable(:all) end - - config.after do - DatabaseCleaner.clean - end - - config.include RSpec::Rails::RequestExampleGroup, type: :request, example_group: { - file_path: /spec\/api/ - } end diff --git a/spec/support/api.rb b/spec/support/api.rb deleted file mode 100644 index d363d8b9..00000000 --- a/spec/support/api.rb +++ /dev/null @@ -1,7 +0,0 @@ -def api_prefix - "/api/#{Gitlab::API::VERSION}" -end - -def json_response - JSON.parse(response.body) -end diff --git a/spec/support/api_helpers.rb b/spec/support/api_helpers.rb new file mode 100644 index 00000000..7d901197 --- /dev/null +++ b/spec/support/api_helpers.rb @@ -0,0 +1,34 @@ +module ApiHelpers + # Public: Prepend a request path with the path to the API + # + # path - Path to append + # user - User object - If provided, automatically appends private_token query + # string for authenticated requests + # + # Examples + # + # >> api('/issues') + # => "/api/v2/issues" + # + # >> api('/issues', User.last) + # => "/api/v2/issues?private_token=..." + # + # >> api('/issues?foo=bar', User.last) + # => "/api/v2/issues?foo=bar&private_token=..." + # + # Returns the relative path to the requested API resource + def api(path, user = nil) + "/api/#{Gitlab::API::VERSION}#{path}" + + + # Normalize query string + (path.index('?') ? '' : '?') + + + # Append private_token if given a User object + (user.respond_to?(:private_token) ? + "&private_token=#{user.private_token}" : "") + end + + def json_response + JSON.parse(response.body) + end +end diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb new file mode 100644 index 00000000..f1e072aa --- /dev/null +++ b/spec/support/db_cleaner.rb @@ -0,0 +1,18 @@ +require 'database_cleaner' + +RSpec.configure do |config| + config.before do + if example.metadata[:js] + DatabaseCleaner.strategy = :truncation + Capybara::Selenium::Driver::DEFAULT_OPTIONS[:resynchronize] = true + else + DatabaseCleaner.strategy = :transaction + end + + DatabaseCleaner.start + end + + config.after do + DatabaseCleaner.clean + end +end diff --git a/spec/support/gitolite_stub.rb b/spec/support/gitolite_stub.rb new file mode 100644 index 00000000..2a907f99 --- /dev/null +++ b/spec/support/gitolite_stub.rb @@ -0,0 +1,35 @@ +module GitoliteStub + def stub_gitolite! + stub_gitlab_gitolite + stub_gitolite_admin + end + + def stub_gitolite_admin + gitolite_repo = mock( + clean_permissions: true, + add_permission: true + ) + + gitolite_config = mock( + add_repo: true, + get_repo: gitolite_repo, + has_repo?: true + ) + + gitolite_admin = double( + 'Gitolite::GitoliteAdmin', + config: gitolite_config, + save: true, + ) + + Gitolite::GitoliteAdmin.stub(new: gitolite_admin) + + end + + def stub_gitlab_gitolite + gitlab_gitolite = Gitlab::Gitolite.new + Gitlab::Gitolite.stub(new: gitlab_gitolite) + gitlab_gitolite.stub(configure: ->() { yield(self) }) + gitlab_gitolite.stub(update_keys: true) + end +end diff --git a/spec/support/js_patch.rb b/spec/support/js_patch.rb deleted file mode 100644 index 0d4ab264..00000000 --- a/spec/support/js_patch.rb +++ /dev/null @@ -1,6 +0,0 @@ -module JsPatch - def confirm_js_popup - page.evaluate_script("window.alert = function(msg) { return true; }") - page.evaluate_script("window.confirm = function(msg) { return true; }") - end -end diff --git a/spec/support/login.rb b/spec/support/login.rb deleted file mode 100644 index 78a907ba..00000000 --- a/spec/support/login.rb +++ /dev/null @@ -1,30 +0,0 @@ -module LoginMacros - def login_as role - @user = User.create(email: "user#{User.count}@mail.com", - name: "John Smith", - password: "123456", - password_confirmation: "123456", - skype: 'user_skype') - - if role == :admin - @user.admin = true - @user.save! - end - - visit new_user_session_path - fill_in "user_email", with: @user.email - fill_in "user_password", with: "123456" - click_button "Sign in" - end - - def login_with(user) - visit new_user_session_path - fill_in "user_email", with: user.email - fill_in "user_password", with: "123456" - click_button "Sign in" - end - - def logout - click_link "Logout" rescue nil - end -end diff --git a/spec/support/login_helpers.rb b/spec/support/login_helpers.rb new file mode 100644 index 00000000..769034e2 --- /dev/null +++ b/spec/support/login_helpers.rb @@ -0,0 +1,23 @@ +module LoginHelpers + # Internal: Create and log in as a user of the specified role + # + # role - User role (e.g., :admin, :user) + def login_as(role) + @user = Factory(role) + login_with(@user) + end + + # Internal: Login as the specified user + # + # user - User instance to login with + def login_with(user) + visit new_user_session_path + fill_in "user_email", with: user.email + fill_in "user_password", with: "123456" + click_button "Sign in" + end + + def logout + click_link "Logout" rescue nil + end +end diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb index e0672166..cb1dcba3 100644 --- a/spec/support/matchers.rb +++ b/spec/support/matchers.rb @@ -28,6 +28,16 @@ RSpec::Matchers.define :be_404_for do |user| end end +RSpec::Matchers.define :include_module do |expected| + match do + described_class.included_modules.include?(expected) + end + + failure_message_for_should do + "expected #{described_class} to include the #{expected} module" + end +end + module UrlAccess def url_allowed?(user, url) emulate_user(user) @@ -57,3 +67,17 @@ module UrlAccess login_with(user) if user end end + +# Extend shoulda-matchers +module Shoulda::Matchers::ActiveModel + class EnsureLengthOfMatcher + # Shortcut for is_at_least and is_at_most + def is_within(range) + if range.exclude_end? + is_at_least(range.first) && is_at_most(range.last - 1) + else + is_at_least(range.first) && is_at_most(range.last) + end + end + end +end diff --git a/spec/support/shared_examples.rb b/spec/support/shared_examples.rb deleted file mode 100644 index 9fd207d0..00000000 --- a/spec/support/shared_examples.rb +++ /dev/null @@ -1,16 +0,0 @@ -shared_examples_for :project_side_pane do - subject { page } - it { should have_content((@project || project).name) } - it { should have_content("Commits") } - it { should have_content("Files") } -end - -shared_examples_for :tree_view do - subject { page } - - it "should have Tree View of project" do - should have_content("app") - should have_content("History") - should have_content("Gemfile") - end -end diff --git a/spec/support/stubbed_repository.rb b/spec/support/stubbed_repository.rb new file mode 100644 index 00000000..90491e43 --- /dev/null +++ b/spec/support/stubbed_repository.rb @@ -0,0 +1,31 @@ +# Stubs out all Git repository access done by models so that specs can run +# against fake repositories without Grit complaining that they don't exist. +module StubbedRepository + def path_to_repo + if new_record? || path == 'newproject' + # There are a couple Project specs and features that expect the Project's + # path to be in the returned path, so let's patronize them. + File.join(Rails.root, 'tmp', 'repositories', path) + else + # For everything else, just give it the path to one of our real seeded + # repos. + File.join(Rails.root, 'tmp', 'repositories', 'gitlabhq') + end + end + + def satellite + FakeSatellite.new + end + + class FakeSatellite + def exists? + true + end + + def create + true + end + end +end + +Project.send(:include, StubbedRepository) From 8db2a59d0b6959a78ea7be4663dd9a858dff9f98 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sat, 1 Sep 2012 23:39:28 -0400 Subject: [PATCH 115/357] Add StaticModel role, and add it to Commit model Instead of doing this: link_to(commit.id, project_commit_path(project, id: commit.id)) Note.create(noteable_id: commit.id, noteable_type: "Commit", ...) It lets us do this: link_to(commit.id, project_commit_path(project, commit)) Note.create(noteable: commit, ...) --- app/models/commit.rb | 12 ++++-------- app/roles/static_model.rb | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 app/roles/static_model.rb diff --git a/app/models/commit.rb b/app/models/commit.rb index 5c6b4d88..15afedcb 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -1,6 +1,7 @@ class Commit include ActiveModel::Conversion include Gitlab::Encode + include StaticModel extend ActiveModel::Naming attr_accessor :commit @@ -22,8 +23,7 @@ class Commit :to_patch, to: :commit - - class << self + class << self def find_or_first(repo, commit_id = nil, root_ref) commit = if commit_id repo.commit(commit_id) @@ -85,7 +85,7 @@ class Commit first = project.commit(to.try(:strip)) last = project.commit(from.try(:strip)) - result = { + result = { commits: [], diffs: [], commit: nil @@ -105,10 +105,6 @@ class Commit end end - def persisted? - false - end - def initialize(raw_commit, head = nil) @commit = raw_commit @head = head @@ -155,7 +151,7 @@ class Commit prev_commit.try :id end - def parents_count + def parents_count parents && parents.count || 0 end end diff --git a/app/roles/static_model.rb b/app/roles/static_model.rb new file mode 100644 index 00000000..d26c8f47 --- /dev/null +++ b/app/roles/static_model.rb @@ -0,0 +1,35 @@ +# Provides an ActiveRecord-like interface to a model whose data is not persisted to a database. +module StaticModel + extend ActiveSupport::Concern + + module ClassMethods + # Used by ActiveRecord's polymorphic association to set object_id + def primary_key + 'id' + end + + # Used by ActiveRecord's polymorphic association to set object_type + def base_class + self + end + end + + # Used by AR for fetching attributes + # + # Pass it along if we respond to it. + def [](key) + send(key) if respond_to?(key) + end + + def to_param + id + end + + def persisted? + false + end + + def destroyed? + false + end +end From 40d619107f9027a33eccc01afa120f7b588e5cf9 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sat, 1 Sep 2012 23:56:44 -0400 Subject: [PATCH 116/357] Add link_title to CommitDecorator --- app/decorators/commit_decorator.rb | 9 +++++++++ lib/gitlab/markdown.rb | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/decorators/commit_decorator.rb b/app/decorators/commit_decorator.rb index cc8fa975..074176ae 100644 --- a/app/decorators/commit_decorator.rb +++ b/app/decorators/commit_decorator.rb @@ -1,6 +1,15 @@ class CommitDecorator < ApplicationDecorator decorates :commit + # Returns a string describing the commit for use in a link title + # + # Example + # + # "Commit: Alex Denisov - Project git clone panel" + def link_title + "Commit: #{author_name} - #{title}" + end + # Returns the commits title. # # Usually, the commit title is the first line of the commit message. diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index 75fa835d..9a07133d 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -100,7 +100,7 @@ module Gitlab def reference_commit(identifier) if commit = @project.commit(identifier) - link_to(identifier, project_commit_path(@project, id: commit.id), html_options.merge(title: "Commit: #{commit.author_name} - #{CommitDecorator.new(commit).title}", class: "gfm gfm-commit #{html_options[:class]}")) + link_to(identifier, project_commit_path(@project, id: commit.id), html_options.merge(title: CommitDecorator.new(commit).link_title, class: "gfm gfm-commit #{html_options[:class]}")) end end end From ef24576fc2239935d2d7b553e7d55674abf4eb4c Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 2 Sep 2012 02:13:13 -0400 Subject: [PATCH 117/357] Redesign gfm helper specs Should now be much clearer about what each spec is actually testing. For example, instead of testing stuff like link classes and titles in every single call, we only test those things once, in their own specs. --- spec/helpers/gitlab_markdown_helper_spec.rb | 344 ++++++++++++-------- 1 file changed, 200 insertions(+), 144 deletions(-) diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb index 28bd46ec..00164e0c 100644 --- a/spec/helpers/gitlab_markdown_helper_spec.rb +++ b/spec/helpers/gitlab_markdown_helper_spec.rb @@ -1,232 +1,288 @@ require "spec_helper" describe GitlabMarkdownHelper do + let!(:project) { create(:project) } + + let(:user) { create(:user, name: 'gfm') } + let(:commit) { CommitDecorator.decorate(project.commit) } + let(:issue) { create(:issue, project: project) } + let(:merge_request) { create(:merge_request, project: project) } + let(:snippet) { create(:snippet, project: project) } + let(:member) { project.users_projects.where(user_id: user).first } + before do - @project = Factory(:project) - @commit = @project.repo.commits.first.parents.first - @commit = CommitDecorator.decorate(Commit.new(@commit)) - @other_project = Factory :project, path: "OtherPath", code: "OtherCode" - @fake_user = Factory :user, name: "fred" + # Helper expects a @project instance variable + @project = project end describe "#gfm" do - it "should return text if @project is not set" do - @project = nil + it "should return unaltered text if project is nil" do + actual = "Testing references: ##{issue.id}" - gfm("foo").should == "foo" + gfm(actual).should_not == actual + + @project = nil + gfm(actual).should == actual + end + + it "should not alter non-references" do + actual = expected = "_Please_ *stop* 'helping' and all the other b*$#%' you do." + gfm(actual).should == expected + end + + it "should not touch HTML entities" do + actual = expected = "We'll accept good pull requests." + gfm(actual).should == expected + end + + it "should forward HTML options to links" do + gfm("Fixed in #{commit.id}", class: "foo").should have_selector("a.gfm.foo") end describe "referencing a commit" do + let(:expected) { project_commit_path(project, commit) } + it "should link using a full id" do - gfm("Reverts changes from #{@commit.id}").should == "Reverts changes from #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "}" + actual = "Reverts #{commit.id}" + gfm(actual).should match(expected) end it "should link using a short id" do - gfm("Backported from #{@commit.id[0, 6]}").should == "Backported from #{link_to @commit.id[0, 6], project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "}" + actual = "Backported from #{commit.short_id(6)}" + gfm(actual).should match(expected) end - it "should link with adjecent text" do - gfm("Reverted (see #{@commit.id})").should == "Reverted (see #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "})" + it "should link with adjacent text" do + actual = "Reverted (see #{commit.id})" + gfm(actual).should match(expected) + end + + it "should keep whitespace intact" do + actual = "Changes #{commit.id} dramatically" + expected = /Changes #{commit.id}<\/a> dramatically/ + gfm(actual).should match(expected) end it "should not link with an invalid id" do - gfm("What happened in 12345678?").should == "What happened in 12345678?" + actual = expected = "What happened in #{commit.id.reverse}" + gfm(actual).should == expected + end + + it "should include a title attribute" do + actual = "Reverts #{commit.id}" + gfm(actual).should match(/title="#{commit.link_title}"/) + end + + it "should include standard gfm classes" do + actual = "Reverts #{commit.id}" + gfm(actual).should match(/class="\s?gfm gfm-commit\s?"/) end end describe "referencing a team member" do - it "should link using a simple name" do - user = Factory :user, name: "barry" - @project.users << user - member = @project.users_projects.where(user_id: user).first + let(:actual) { "@#{user.name} you are right." } + let(:expected) { project_team_member_path(project, member) } - gfm("@#{user.name} you are right").should == "#{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} you are right" + before do + project.users << user + end + + it "should link using a simple name" do + gfm(actual).should match(expected) end it "should link using a name with dots" do - user = Factory :user, name: "alphA.Beta" - @project.users << user - member = @project.users_projects.where(user_id: user).first - - gfm("@#{user.name} you are right").should == "#{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} you are right" + user.update_attributes(name: "alphA.Beta") + gfm(actual).should match(expected) end it "should link using name with underscores" do - user = Factory :user, name: "ping_pong_king" - @project.users << user - member = @project.users_projects.where(user_id: user).first - - gfm("@#{user.name} you are right").should == "#{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} you are right" + user.update_attributes(name: "ping_pong_king") + gfm(actual).should match(expected) end - it "should link with adjecent text" do - user = Factory.create(:user, name: "ace") - @project.users << user - member = @project.users_projects.where(user_id: user).first - - gfm("Mail the Admin (@#{user.name})").should == "Mail the Admin (#{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "})" + it "should link with adjacent text" do + actual = "Mail the admin (@gfm)" + gfm(actual).should match(expected) end - it "should add styles" do - user = Factory :user, name: "barry" - @project.users << user - gfm("@#{user.name} you are right").should have_selector(".gfm.gfm-team_member") + it "should keep whitespace intact" do + actual = "Yes, @#{user.name} is right." + expected = /Yes, @#{user.name}<\/a> is right/ + gfm(actual).should match(expected) end - it "should not link using a bogus name" do - gfm("What hapened to @foo?").should == "What hapened to @foo?" + it "should not link with an invalid id" do + actual = expected = "@#{user.name.reverse} you are right." + gfm(actual).should == expected + end + + it "should include standard gfm classes" do + gfm(actual).should match(/class="\s?gfm gfm-team_member\s?"/) + end + end + + # Shared examples for referencing an object + # + # Expects the following attributes to be available in the example group: + # + # - object - The object itself + # - reference - The object reference string (e.g., #1234, $1234, !1234) + # + # Currently limited to Snippets, Issues and MergeRequests + shared_examples 'referenced object' do + let(:actual) { "Reference to #{reference}" } + let(:expected) { polymorphic_path([project, object]) } + + it "should link using a valid id" do + gfm(actual).should match(expected) + end + + it "should link with adjacent text" do + # Wrap the reference in parenthesis + gfm(actual.gsub(reference, "(#{reference})")).should match(expected) + + # Append some text to the end of the reference + gfm(actual.gsub(reference, "#{reference}, right?")).should match(expected) + end + + it "should keep whitespace intact" do + actual = "Referenced #{reference} already." + expected = /Referenced [^\s]+<\/a> already/ + gfm(actual).should match(expected) + end + + it "should not link with an invalid id" do + # Modify the reference string so it's still parsed, but is invalid + reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2)) + gfm(actual).should == actual + end + + it "should include a title attribute" do + title = "#{object.class.to_s.titlecase}: #{object.title}" + gfm(actual).should match(/title="#{title}"/) + end + + it "should include standard gfm classes" do + css = object.class.to_s.underscore + gfm(actual).should match(/class="\s?gfm gfm-#{css}\s?"/) end end describe "referencing an issue" do - before do - @issue = Factory :issue, assignee: @fake_user, author: @fake_user, project: @project - @invalid_issue = Factory :issue, assignee: @fake_user, author: @fake_user, project: @other_project - end + let(:object) { issue } + let(:reference) { "##{issue.id}" } - it "should link using a correct id" do - gfm("Fixes ##{@issue.id}").should == "Fixes #{link_to "##{@issue.id}", project_issue_path(@project, @issue), title: "Issue: #{@issue.title}", class: "gfm gfm-issue "}" - end - - it "should link with adjecent text" do - gfm("This has already been discussed (see ##{@issue.id})").should == "This has already been discussed (see #{link_to "##{@issue.id}", project_issue_path(@project, @issue), title: "Issue: #{@issue.title}", class: "gfm gfm-issue "})" - end - - it "should add styles" do - gfm("Fixes ##{@issue.id}").should have_selector(".gfm.gfm-issue") - end - - it "should not link using an invalid id" do - gfm("##{@invalid_issue.id} has been marked duplicate of this").should == "##{@invalid_issue.id} has been marked duplicate of this" - end + include_examples 'referenced object' end describe "referencing a merge request" do - before do - @merge_request = Factory :merge_request, assignee: @fake_user, author: @fake_user, project: @project - @invalid_merge_request = Factory :merge_request, assignee: @fake_user, author: @fake_user, project: @other_project - end + let(:object) { merge_request } + let(:reference) { "!#{merge_request.id}" } - it "should link using a correct id" do - gfm("Fixed in !#{@merge_request.id}").should == "Fixed in #{link_to "!#{@merge_request.id}", project_merge_request_path(@project, @merge_request), title: "Merge Request: #{@merge_request.title}", class: "gfm gfm-merge_request "}" - end - - it "should link with adjecent text" do - gfm("This has been fixed already (see !#{@merge_request.id})").should == "This has been fixed already (see #{link_to "!#{@merge_request.id}", project_merge_request_path(@project, @merge_request), title: "Merge Request: #{@merge_request.title}", class: "gfm gfm-merge_request "})" - end - - it "should add styles" do - gfm("Fixed in !#{@merge_request.id}").should have_selector(".gfm.gfm-merge_request") - end - - it "should not link using an invalid id" do - gfm("!#{@invalid_merge_request.id} violates our coding guidelines") - end + include_examples 'referenced object' end describe "referencing a snippet" do - before do - @snippet = Factory.create(:snippet, - title: "Render asset to string", - author: @fake_user, - project: @project) - end + let(:object) { snippet } + let(:reference) { "$#{snippet.id}" } - it "should link using a correct id" do - gfm("Check out $#{@snippet.id}").should == "Check out #{link_to "$#{@snippet.id}", project_snippet_path(@project, @snippet), title: "Snippet: #{@snippet.title}", class: "gfm gfm-snippet "}" - end - - it "should link with adjecent text" do - gfm("I have created a snippet for that ($#{@snippet.id})").should == "I have created a snippet for that (#{link_to "$#{@snippet.id}", project_snippet_path(@project, @snippet), title: "Snippet: #{@snippet.title}", class: "gfm gfm-snippet "})" - end - - it "should add styles" do - gfm("Check out $#{@snippet.id}").should have_selector(".gfm.gfm-snippet") - end - - it "should not link using an invalid id" do - gfm("Don't use $1234").should == "Don't use $1234" - end + include_examples 'referenced object' end - it "should link to multiple things" do - user = Factory :user, name: "barry" - @project.users << user - member = @project.users_projects.where(user_id: user).first + describe "referencing multiple objects" do + let(:actual) { "!#{merge_request.id} -> #{commit.id} -> ##{issue.id}" } - gfm("Let @#{user.name} fix the *mess* in #{@commit.id}").should == "Let #{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} fix the *mess* in #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "}" - end + it "should link to the merge request" do + expected = project_merge_request_path(project, merge_request) + gfm(actual).should match(expected) + end - it "should not trip over other stuff" do - gfm("_Please_ *stop* 'helping' and all the other b*$#%' you do.").should == "_Please_ *stop* 'helping' and all the other b*$#%' you do." - end + it "should link to the commit" do + expected = project_commit_path(project, commit) + gfm(actual).should match(expected) + end - it "should not touch HTML entities" do - gfm("We'll accept good pull requests.").should == "We'll accept good pull requests." - end - - it "should forward HTML options to links" do - gfm("fixed in #{@commit.id}", class: "foo").should have_selector("a.foo") + it "should link to the issue" do + expected = project_issue_path(project, issue) + gfm(actual).should match(expected) + end end end describe "#link_to_gfm" do - let(:issue1) { Factory :issue, assignee: @fake_user, author: @fake_user, project: @project } - let(:issue2) { Factory :issue, assignee: @fake_user, author: @fake_user, project: @project } + let(:commit_path) { project_commit_path(project, commit) } + let(:issues) { create_list(:issue, 2, project: project) } it "should handle references nested in links with all the text" do - link_to_gfm("This should finally fix ##{issue1.id} and ##{issue2.id} for real", project_commit_path(@project, id: @commit.id)).should == "#{link_to "This should finally fix ", project_commit_path(@project, id: @commit.id)}#{link_to "##{issue1.id}", project_issue_path(@project, issue1), title: "Issue: #{issue1.title}", class: "gfm gfm-issue "}#{link_to " and ", project_commit_path(@project, id: @commit.id)}#{link_to "##{issue2.id}", project_issue_path(@project, issue2), title: "Issue: #{issue2.title}", class: "gfm gfm-issue "}#{link_to " for real", project_commit_path(@project, id: @commit.id)}" + actual = link_to_gfm("This should finally fix ##{issues[0].id} and ##{issues[1].id} for real", commit_path) + + # Break the result into groups of links with their content, without + # closing tags + groups = actual.split("") + + # Leading commit link + groups[0].should match(/href="#{commit_path}"/) + groups[0].should match(/This should finally fix $/) + + # First issue link + groups[1].should match(/href="#{project_issue_path(project, issues[0])}"/) + groups[1].should match(/##{issues[0].id}$/) + + # Internal commit link + groups[2].should match(/href="#{commit_path}"/) + groups[2].should match(/ and /) + + # Second issue link + groups[3].should match(/href="#{project_issue_path(project, issues[1])}"/) + groups[3].should match(/##{issues[1].id}$/) + + # Trailing commit link + groups[4].should match(/href="#{commit_path}"/) + groups[4].should match(/ for real$/) end it "should forward HTML options" do - link_to_gfm("This should finally fix ##{issue1.id} for real", project_commit_path(@project, id: @commit.id), class: "foo").should have_selector(".foo") + actual = link_to_gfm("Fixed in #{commit.id}", commit_path, class: 'foo') + actual.should have_selector 'a.gfm.gfm-commit.foo' end end describe "#markdown" do - before do - @issue = Factory :issue, assignee: @fake_user, author: @fake_user, project: @project - @merge_request = Factory :merge_request, assignee: @fake_user, author: @fake_user, project: @project - @note = Factory.create(:note, - note: "Screenshot of the new feature", - project: @project, - noteable_id: @commit.id, - noteable_type: "Commit", - attachment: "screenshot123.jpg") - @snippet = Factory.create(:snippet, - title: "Render asset to string", - author: @fake_user, - project: @project) - - @other_user = Factory :user, name: "bill" - @project.users << @other_user - @member = @project.users_projects.where(user_id: @other_user).first - end - it "should handle references in paragraphs" do - markdown("\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. #{@commit.id} Nam pulvinar sapien eget odio adipiscing at faucibus orci vestibulum.\n").should == "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "} Nam pulvinar sapien eget odio adipiscing at faucibus orci vestibulum.

\n" + markdown("\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. #{commit.id} Nam pulvinar sapien eget odio adipiscing at faucibus orci vestibulum.\n").should == "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. #{link_to commit.id, project_commit_path(project, commit), title: commit.link_title, class: "gfm gfm-commit "} Nam pulvinar sapien eget odio adipiscing at faucibus orci vestibulum.

\n" end it "should handle references in headers" do - markdown("\n# Working around ##{@issue.id} for now\n## Apply !#{@merge_request.id}").should == "

Working around #{link_to "##{@issue.id}", project_issue_path(@project, @issue), title: "Issue: #{@issue.title}", class: "gfm gfm-issue "} for now

\n\n

Apply #{link_to "!#{@merge_request.id}", project_merge_request_path(@project, @merge_request), title: "Merge Request: #{@merge_request.title}", class: "gfm gfm-merge_request "}

\n" + actual = "\n# Working around ##{issue.id}\n## Apply !#{merge_request.id}" + + markdown(actual).should match(%r{Working around ##{issue.id}}) + markdown(actual).should match(%r{Apply !#{merge_request.id}}) end it "should handle references in lists" do - markdown("\n* dark: ##{@issue.id}\n* light by @#{@other_user.name}\n").should == "
    \n
  • dark: #{link_to "##{@issue.id}", project_issue_path(@project, @issue), title: "Issue: #{@issue.title}", class: "gfm gfm-issue "}
  • \n
  • light by #{link_to "@#{@other_user.name}", project_team_member_path(@project, @member), class: "gfm gfm-team_member "}
  • \n
\n" + project.users << user + + actual = "\n* dark: ##{issue.id}\n* light by @#{member.user_name}" + + markdown(actual).should match(%r{
  • dark: ##{issue.id}
  • }) + markdown(actual).should match(%r{
  • light by @#{member.user_name}
  • }) end it "should handle references in " do - markdown("Apply _!#{@merge_request.id}_ ASAP").should == "

    Apply #{link_to "!#{@merge_request.id}", project_merge_request_path(@project, @merge_request), title: "Merge Request: #{@merge_request.title}", class: "gfm gfm-merge_request "} ASAP

    \n" + actual = "Apply _!#{merge_request.id}_ ASAP" + + markdown(actual).should match(%r{Apply !#{merge_request.id}}) end it "should leave code blocks untouched" do - markdown("\n some code from $#{@snippet.id}\n here too\n").should == "
    some code from $#{@snippet.id}\nhere too\n
    \n
    \n" + markdown("\n some code from $#{snippet.id}\n here too\n").should == "
    some code from $#{snippet.id}\nhere too\n
    \n
    \n" - markdown("\n```\nsome code from $#{@snippet.id}\nhere too\n```\n").should == "
    some code from $#{@snippet.id}\nhere too\n
    \n
    \n" + markdown("\n```\nsome code from $#{snippet.id}\nhere too\n```\n").should == "
    some code from $#{snippet.id}\nhere too\n
    \n
    \n" end it "should leave inline code untouched" do - markdown("\nDon't use `$#{@snippet.id}` here.\n").should == "

    Don't use $#{@snippet.id} here.

    \n" + markdown("\nDon't use `$#{snippet.id}` here.\n").should == "

    Don't use $#{snippet.id} here.

    \n" end end end From cc137bba7905790347418f184c6b02d01af3e225 Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Sun, 2 Sep 2012 22:41:21 +0200 Subject: [PATCH 118/357] Update the references to the script and refer to it from the installation manual. Update the references to the script and refer to it from the installation manual. Indent the code block. --- doc/installation.md | 6 ++++++ lib/support/aws/debian_ubuntu_aws.sh | 7 ++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/doc/installation.md b/doc/installation.md index efed21f0..4cb873f0 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -51,6 +51,12 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq > curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh > > Now you can go to step 4" +> +> Or if you are installing on Amazon Web Services using Ubuntu 12.04 you can do all steps (1 to 6) at once with: +> +> curl https://raw.github.com/gitlabhq/gitlabhq/master/lib/support/aws/debian_ubuntu_aws.sh | sh +> +> for more detailed instructions read the HOWTO section of [the script](https://github.com/gitlabhq/gitlabhq/blob/master/lib/support/aws/debian_ubuntu_aws.sh) > - - - # 1. Install packages diff --git a/lib/support/aws/debian_ubuntu_aws.sh b/lib/support/aws/debian_ubuntu_aws.sh index 962ee008..c4103ec9 100644 --- a/lib/support/aws/debian_ubuntu_aws.sh +++ b/lib/support/aws/debian_ubuntu_aws.sh @@ -6,9 +6,6 @@ # This script only works on Amazon Web Services (AWS). # The operating system used is Ubuntu 12.04 64bit. -# TODO -# @dosire will send a pull request after this is merged in to change dosire/gitlabhq/non-interactive-aws-install links to gitlabhq/gitlabhq/master and reference this script from installation.md - # HOWTO # Signup for AWS, free tier are available at http://aws.amazon.com/free/ # Go to EC2 tab in the AWS console EC2 https://console.aws.amazon.com/ec2/home @@ -33,7 +30,7 @@ # Give the following command in your local terminal while suptituting the UPPERCASE items # 'ssh -i LOCATION_OF_AWS_KEY_PAIR_PRIVATE_KEY PUBLIC_DNS_OF_THE_NEW_SERVER' # Execute the curl command below and when its ready follow the printed 'Log in instuctions' -# curl https://raw.github.com/dosire/gitlabhq/non-interactive-aws-install/lib/support/aws/debian_ubuntu_aws.sh | sh +# curl https://raw.github.com/gitlabhq/gitlabhq/master/lib/support/aws/debian_ubuntu_aws.sh | sh # Prevent fingerprint prompt for localhost in step 1 to 3. echo "Host localhost @@ -41,7 +38,7 @@ echo "Host localhost UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config # Existing script for Step 1 to 3 -curl https://raw.github.com/dosire/gitlabhq/non-interactive-aws-install/doc/debian_ubuntu.sh | sh +curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh # Install MySQL sudo apt-get install -y makepasswd # Needed to create a unique password non-interactively. From c7cfe3d83bfbad2a074cacb5a4ed8a24244f8f26 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 3 Sep 2012 08:13:51 +0300 Subject: [PATCH 119/357] devise session templates to haml. Fix problem with missing message in commit --- app/decorators/commit_decorator.rb | 8 ++++ app/views/devise/sessions/_new_ldap.html.erb | 39 ------------------- app/views/devise/sessions/_new_ldap.html.haml | 29 ++++++++++++++ app/views/devise/sessions/new.html.erb | 27 ------------- app/views/devise/sessions/new.html.haml | 21 ++++++++++ 5 files changed, 58 insertions(+), 66 deletions(-) delete mode 100644 app/views/devise/sessions/_new_ldap.html.erb create mode 100644 app/views/devise/sessions/_new_ldap.html.haml delete mode 100644 app/views/devise/sessions/new.html.erb create mode 100644 app/views/devise/sessions/new.html.haml diff --git a/app/decorators/commit_decorator.rb b/app/decorators/commit_decorator.rb index 074176ae..f813ed25 100644 --- a/app/decorators/commit_decorator.rb +++ b/app/decorators/commit_decorator.rb @@ -16,6 +16,8 @@ class CommitDecorator < ApplicationDecorator # In case this first line is longer than 80 characters, it is cut off # after 70 characters and ellipses (`&hellp;`) are appended. def title + return no_commit_message unless safe_message + title_end = safe_message.index(/\n/) if (!title_end && safe_message.length > 80) || (title_end && title_end > 80) safe_message[0..69] << "…".html_safe @@ -35,4 +37,10 @@ class CommitDecorator < ApplicationDecorator safe_message.split(/\n/, 2)[1].try(:chomp) end end + + protected + + def no_commit_message + "--no commit message" + end end diff --git a/app/views/devise/sessions/_new_ldap.html.erb b/app/views/devise/sessions/_new_ldap.html.erb deleted file mode 100644 index 35dfaf71..00000000 --- a/app/views/devise/sessions/_new_ldap.html.erb +++ /dev/null @@ -1,39 +0,0 @@ -<%= form_tag(user_omniauth_callback_path(:ldap), :class => "login-box", :id => 'new_ldap_user' ) do %> - <%= image_tag "login-logo.png", :width => "304", :height => "66", :class => "login-logo", :alt => "Login Logo" %> - - <%= text_field_tag :username, nil, {:class => "text top", :placeholder => "LDAP Login"} %> - <%= password_field_tag :password, nil, {:class => "text bottom", :placeholder => "Password"} %> - -
    - <%= submit_tag "LDAP Sign in", :class => "primary btn" %> - - <%- if devise_mapping.omniauthable? %> - <%- (resource_class.omniauth_providers - [:ldap]).each do |provider| %> -
    - <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn primary" %>
    - <% end -%> - <% end -%> - -
    - Other Sign in - - -<% end %> - - -<%= form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :class => "login-box" }) do |f| %> - <%= f.text_field :email, :class => "text top", :placeholder => "Email" %> - <%= f.password_field :password, :class => "text bottom", :placeholder => "Password" %> - - <% if devise_mapping.rememberable? -%> -
    - <% end -%> -
    - <%= f.submit "Sign in", :class => "primary btn" %> -
    <%= render :partial => "devise/shared/links" %>
    - -<% end %> diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml new file mode 100644 index 00000000..85010df7 --- /dev/null +++ b/app/views/devise/sessions/_new_ldap.html.haml @@ -0,0 +1,29 @@ += form_tag(user_omniauth_callback_path(:ldap), :class => "login-box", :id => 'new_ldap_user' ) do + = image_tag "login-logo.png", :width => "304", :height => "66", :class => "login-logo", :alt => "Login Logo" + = text_field_tag :username, nil, {:class => "text top", :placeholder => "LDAP Login"} + = password_field_tag :password, nil, {:class => "text bottom", :placeholder => "Password"} + %br/ + = submit_tag "LDAP Sign in", :class => "primary btn" + - if devise_mapping.omniauthable? + - (resource_class.omniauth_providers - [:ldap]).each do |provider| + %hr/ + = link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn primary" + %br/ + %hr/ + %a#other_form_toggle{:href => "#", :onclick => "javascript:$('#new_user').toggle();"} Other Sign in + :javascript + $(function() { + $('#new_user').toggle(); + }); + = form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :class => "login-box" }) do |f| + = f.text_field :email, :class => "text top", :placeholder => "Email" + = f.password_field :password, :class => "text bottom", :placeholder => "Password" + - if devise_mapping.rememberable? + .clearfix.inputs-list + %label.checkbox.remember_me{:for => "user_remember_me"} + = f.check_box :remember_me + %span Remember me + %br/ + = f.submit "Sign in", :class => "primary btn" + .right + = render :partial => "devise/shared/links" diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb deleted file mode 100644 index a0383866..00000000 --- a/app/views/devise/sessions/new.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<% unless ldap_enable? -%> - - <%= form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :class => "login-box" }) do |f| %> - <%= image_tag "login-logo.png", :width => "304", :height => "66", :class => "login-logo", :alt => "Login Logo" %> - - <%= f.text_field :email, :class => "text top", :placeholder => "Email" %> - <%= f.password_field :password, :class => "text bottom", :placeholder => "Password" %> - - <% if devise_mapping.rememberable? -%> -
    - <% end -%> -
    - <%= f.submit "Sign in", :class => "primary btn" %> -
    <%= render :partial => "devise/shared/links" %>
    - - <%- if devise_mapping.omniauthable? %> - <%- resource_class.omniauth_providers.each do |provider| %> -
    - <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn primary" %>
    - <% end -%> - <% end -%> - - <% end %> - -<% else %> - <%= render :partial => 'devise/sessions/new_ldap' %> -<% end %> diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml new file mode 100644 index 00000000..6e86186c --- /dev/null +++ b/app/views/devise/sessions/new.html.haml @@ -0,0 +1,21 @@ +- if ldap_enable? + = render :partial => 'devise/sessions/new_ldap' +- else + = form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :class => "login-box" }) do |f| + = image_tag "login-logo.png", :width => "304", :height => "66", :class => "login-logo", :alt => "Login Logo" + = f.text_field :email, :class => "text top", :placeholder => "Email" + = f.password_field :password, :class => "text bottom", :placeholder => "Password" + - if devise_mapping.rememberable? + .clearfix.inputs-list + %label.checkbox.remember_me{:for => "user_remember_me"} + = f.check_box :remember_me + %span Remember me + %br/ + = f.submit "Sign in", :class => "primary btn wide" + .right + = render :partial => "devise/shared/links" + - if devise_mapping.omniauthable? + - resource_class.omniauth_providers.each do |provider| + %hr/ + = link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn primary" + %br/ From 6745812c7236e8d4f463e226feb2e61389c85563 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Mon, 3 Sep 2012 03:43:19 -0700 Subject: [PATCH 120/357] bump kaminari --- Gemfile.lock | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f226c931..7ec37f59 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -198,7 +198,7 @@ GEM httparty (0.8.3) multi_json (~> 1.0) multi_xml - i18n (0.6.0) + i18n (0.6.1) journey (1.0.4) jquery-rails (2.0.2) railties (>= 3.2.0, < 5.0) @@ -206,11 +206,10 @@ GEM jquery-ui-rails (0.5.0) jquery-rails railties (>= 3.1.0) - json (1.7.4) - kaminari (0.13.0) + json (1.7.5) + kaminari (0.14.0) actionpack (>= 3.0.0) activesupport (>= 3.0.0) - railties (>= 3.0.0) kgio (2.7.4) launchy (2.1.0) addressable (~> 2.2.6) @@ -348,7 +347,7 @@ GEM daemons (>= 1.0.9) eventmachine (>= 0.12.6) rack (>= 1.0.0) - thor (0.15.4) + thor (0.16.0) tilt (1.3.3) treetop (1.4.10) polyglot From 6817a6a2952bc6af74eb239982ed337f90897f98 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Mon, 3 Sep 2012 04:22:49 -0700 Subject: [PATCH 121/357] add kaminari config with default and max per_page values --- config/initializers/kaminari_config.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 config/initializers/kaminari_config.rb diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb new file mode 100644 index 00000000..3cbe9a05 --- /dev/null +++ b/config/initializers/kaminari_config.rb @@ -0,0 +1,10 @@ +Kaminari.configure do |config| + config.default_per_page = 20 + config.max_per_page = 100 + # config.window = 4 + # config.outer_window = 0 + # config.left = 0 + # config.right = 0 + # config.page_method_name = :page + # config.param_name = :page +end From 76e4d94d432b19d7dd58503c5eac46811630c04a Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Mon, 3 Sep 2012 04:46:29 -0700 Subject: [PATCH 122/357] add pagination to API --- doc/api/README.md | 7 +++++++ lib/api/helpers.rb | 4 ++++ lib/api/issues.rb | 4 ++-- lib/api/milestones.rb | 2 +- lib/api/projects.rb | 2 +- lib/api/users.rb | 2 +- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/doc/api/README.md b/doc/api/README.md index 53b4983e..3a6c7b76 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -23,6 +23,13 @@ GET http://example.com/api/v2/projects?private_token=QVy1PB7sTxfy4pqfZM1U The API uses JSON to serialize data. You don't need to specify `.json` at the end of API URL. +#### Pagination + +When listing resources you can pass the following parameters: + ++ `page` (default: `1`) - page number ++ `per_page` (default: `20`, max: `100`) - how many items to list per page + ## Contents + [Users](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/users.md) diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index c1ea0566..ce7b7b49 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -14,6 +14,10 @@ module Gitlab @project end + def paginate(object) + object.page(params[:page]).per(params[:per_page].to_i) + end + def authenticate! error!({'message' => '401 Unauthorized'}, 401) unless current_user end diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 836c2818..68cb7e05 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -9,7 +9,7 @@ module Gitlab # Example Request: # GET /issues get do - present current_user.issues, with: Entities::Issue + present paginate(current_user.issues), with: Entities::Issue end end @@ -21,7 +21,7 @@ module Gitlab # Example Request: # GET /projects/:id/issues get ":id/issues" do - present user_project.issues, with: Entities::Issue + present paginate(user_project.issues), with: Entities::Issue end # Get a single project issue diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb index f537b8e5..29f5efa4 100644 --- a/lib/api/milestones.rb +++ b/lib/api/milestones.rb @@ -11,7 +11,7 @@ module Gitlab # Example Request: # GET /projects/:id/milestones get ":id/milestones" do - present user_project.milestones, with: Entities::Milestone + present paginate(user_project.milestones), with: Entities::Milestone end # Get a single project milestone diff --git a/lib/api/projects.rb b/lib/api/projects.rb index f42849cd..3d4fde92 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -9,7 +9,7 @@ module Gitlab # Example Request: # GET /projects get do - @projects = current_user.projects + @projects = paginate current_user.projects present @projects, with: Entities::Project end diff --git a/lib/api/users.rb b/lib/api/users.rb index 81cb2a0e..98ced6f8 100644 --- a/lib/api/users.rb +++ b/lib/api/users.rb @@ -9,7 +9,7 @@ module Gitlab # Example Request: # GET /users get do - @users = User.all + @users = paginate User present @users, with: Entities::User end From e078a173d6fad0ec79ed252f5e268f060c37508d Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Mon, 3 Sep 2012 18:00:24 +0300 Subject: [PATCH 123/357] Create project via API: fixes added --- doc/api/projects.md | 6 +++++ lib/api/projects.rb | 22 ++++++++++++---- spec/requests/api/projects_spec.rb | 41 +++++++++++++++++++++++++++--- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/doc/api/projects.md b/doc/api/projects.md index b0c1e657..32775c32 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -102,6 +102,12 @@ Parameters: + `name` (required) - new project name + `code` (optional) - new project code, uses project name if not set + `path` (optional) - new project path, uses project name if not set ++ `description (optional) - short project description ++ `default_branch` (optional) - 'master' by default ++ `issues_enabled` (optional) - enabled by default ++ `wall_enabled` (optional) - enabled by default ++ `merge_requests_enabled` (optional) - enabled by default ++ `wiki_enabled` (optional) - enabled by default Will return created project with status `201 Created` on success, or `404 Not found` on fail. diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 3d4fde92..45c25127 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -29,14 +29,26 @@ module Gitlab # name (required) - name for new project # code (optional) - code for new project, uses project name if not set # path (optional) - path for new project, uses project name if not set + # description (optional) - short project description + # default_branch (optional) - 'master' by default + # issues_enabled (optional) - enabled by default + # wall_enabled (optional) - enabled by default + # merge_requests_enabled (optional) - enabled by default + # wiki_enabled (optional) - enabled by default # Example Request # POST /projects post do - project = {} - project[:name] = params[:name] - project[:code] = params[:code] || project[:name] - project[:path] = params[:path] || project[:name] - @project = Project.create_by_user(project, current_user) + @project = Project.create_by_user({ + name: params[:name], + code: (params[:code] || params[:name]), + path: (params[:path] || params[:name]), + description: (params[:description] || Project.columns_hash["description"].default), + default_branch: (params[:default_branch] || Project.columns_hash["default_branch"].default), + issues_enabled: (params[:issues_enabled] || Project.columns_hash["issues_enabled"].default), + wall_enabled: (params[:wall_enabled] || Project.columns_hash["wall_enabled"].default), + merge_requests_enabled: (params[:merge_requests_enabled] || Project.columns_hash["merge_requests_enabled"].default), + wiki_enabled: (params[:wiki_enabled] || Project.columns_hash["wiki_enabled"].default) + }, current_user) if @project.saved? present @project, with: Entities::Project else diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index cc6843cc..cdab2657 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -27,7 +27,7 @@ describe Gitlab::API do describe "POST /projects" do it "should create new project without code and path" do - lambda { + expect { name = "foo" post api("/projects", user), { name: name @@ -39,7 +39,41 @@ describe Gitlab::API do }.should change{Project.count}.by(1) end it "should create new project" do - lambda { + expect { + name = "foo" + path = "bar" + code = "bazz" + description = "fuu project" + default_branch = "default_branch" + issues_enabled = false + wall_enabled = false + merge_requests_enabled = false + wiki_enabled = false + post api("/projects", user), { + code: code, + path: path, + name: name, + description: description, + default_branch: default_branch, + issues_enabled: issues_enabled, + wall_enabled: wall_enabled, + merge_requests_enabled: merge_requests_enabled, + wiki_enabled: wiki_enabled + } + response.status.should == 201 + json_response["name"].should == name + json_response["path"].should == path + json_response["code"].should == code + json_response["description"].should == description + json_response["default_branch"].should == default_branch + json_response["issues_enabled"].should == issues_enabled + json_response["wall_enabled"].should == wall_enabled + json_response["merge_requests_enabled"].should == merge_requests_enabled + json_response["wiki_enabled"].should == wiki_enabled + }.should change{Project.count}.by(1) + end + it "should create new projects within all parameters" do + expect { name = "foo" path = "bar" code = "bazz" @@ -53,9 +87,10 @@ describe Gitlab::API do json_response["path"].should == path json_response["code"].should == code }.should change{Project.count}.by(1) + end it "should not create project without name" do - lambda { + expect { post api("/projects", user) response.status.should == 404 }.should_not change{Project.count} From 8ca0b75d05b457e4335a6734582ba703404cc9c6 Mon Sep 17 00:00:00 2001 From: randx Date: Mon, 3 Sep 2012 21:53:16 +0300 Subject: [PATCH 124/357] Tables refactored --- .../stylesheets/gitlab_bootstrap/tables.scss | 56 ++++++++++--------- app/assets/stylesheets/sections/tree.scss | 56 +++++++------------ app/views/admin/hooks/index.html.haml | 2 +- app/views/admin/projects/index.html.haml | 2 +- app/views/admin/projects/show.html.haml | 10 +++- app/views/admin/users/index.html.haml | 2 +- app/views/admin/users/show.html.haml | 14 +++-- app/views/hooks/index.html.haml | 11 ++-- app/views/keys/index.html.haml | 2 +- app/views/milestones/show.html.haml | 4 +- app/views/projects/_team.html.haml | 2 +- app/views/projects/files.html.haml | 7 ++- app/views/protected_branches/index.html.haml | 2 +- app/views/refs/_tree.html.haml | 2 +- app/views/repositories/branches.html.haml | 2 +- app/views/repositories/show.html.haml | 2 +- app/views/repositories/tags.html.haml | 2 +- app/views/search/show.html.haml | 6 +- app/views/snippets/index.html.haml | 2 +- app/views/team_members/show.html.haml | 4 +- app/views/wikis/history.html.haml | 2 +- app/views/wikis/pages.html.haml | 2 +- 22 files changed, 99 insertions(+), 95 deletions(-) diff --git a/app/assets/stylesheets/gitlab_bootstrap/tables.scss b/app/assets/stylesheets/gitlab_bootstrap/tables.scss index f78b1dee..29293867 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/tables.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/tables.scss @@ -1,41 +1,45 @@ table { + @extend .table; + @extend .table-striped; + @include solid_shade; + border:1px solid #bbb; width:100%; + th { - padding-top: 9px; font-weight: bold; vertical-align: middle; + border-bottom: 1px solid #bbb; + text-shadow: 0 1px 1px #fff; + @include bg-dark-gray-gradient; } + th, td { - padding: 10px 10px 9px; + padding: 8px; line-height: 18px; text-align: left; } - &.bordered-table { - border: 1px solid #DDD; - border-collapse: separate; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; + td { + border-color:#f1f1f1; + &:first-child { + border-left:1px solid #bbb; + } + + &:last-child { + border-right:1px solid #bbb; + } } - &.zebra-striped { - @extend .table-striped; + &.bordered { + @extend .table-bordered; + } + + &.lite { + border:none; + box-shadow:none; + tr, td { + border:none; + background:none !important; + } } } - -table.admin-table { - @extend .table-bordered; - @extend .zebra-striped; - @include solid_shade; - th { - border-color: #CCC; - border-bottom: 1px solid #bbb; - @include bg-gray-gradient; - } -} - -table.no-borders { - border:none; - tr, td { border:none } -} diff --git a/app/assets/stylesheets/sections/tree.scss b/app/assets/stylesheets/sections/tree.scss index 891f5e20..07568706 100644 --- a/app/assets/stylesheets/sections/tree.scss +++ b/app/assets/stylesheets/sections/tree.scss @@ -1,4 +1,4 @@ -#tree-holder { +#tree-holder { #tree-content-holder { float:left; width:100%; @@ -11,40 +11,44 @@ padding:12px; background: #F7F7F7; - pre { + pre { overflow: auto; } } } - .tree_progress { + .tree_progress { display:none; margin:20px; - &.loading { + &.loading { display:block; } } #tree-slider { @include border-radius(0); - .tree-item { - &:hover { - td { background: $hover; } + .tree-item { + &:hover { + td { + background: $hover; + border-top:1px solid #FEA; + border-bottom:1px solid #FEA; + } cursor:pointer; } } } - .tree-item { - .tree-item-file-name { + .tree-item { + .tree-item-file-name { vertical-align:middle; - a { - &:hover { + a { + &:hover { color:$blue_link; } } - img { + img { position: relative; top:-1px; } @@ -52,37 +56,19 @@ } - #tree-slider { - @include solid_shade; - width:100%; - - border-color:#ccc; - - td { - padding:8px; - border-color:#f1f1f1; + #tree-slider { + td { background:#fafafa; } - - tr:first-child td:first-child, - tr:first-child td:last-child { - border-radius:0; - } - - th { - border-color: #CCC; - border-bottom: 1px solid #bbb; - @include bg-gray-gradient; - } } - .tree-commit-link { + .tree-commit-link { color:#333; } - a.tree-commit-link { + a.tree-commit-link { color: #666; - &:hover { + &:hover { text-decoration: underline; } } diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml index 43288424..f17355fb 100644 --- a/app/views/admin/hooks/index.html.haml +++ b/app/views/admin/hooks/index.html.haml @@ -23,7 +23,7 @@ Hooks %small (#{@hooks.count}) %br - %table.admin-table + %table %tr %th URL %th Method diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index f7dd486d..bd38ae72 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -6,7 +6,7 @@ = text_field_tag :name, params[:name], class: "xlarge" = submit_tag "Search", class: "btn submit primary" -%table.admin-table +%table %thead %th Name %th Path diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 5ed56477..65d888f5 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -3,7 +3,11 @@ = link_to 'Edit', edit_admin_project_path(@admin_project), class: "btn right small" %br -%table.zebra-striped.table-bordered +%table.zebra-striped + %thead + %tr + %th Project + %th %tr %td %b @@ -40,7 +44,7 @@ %small (#{@admin_project.users_projects.count}) %br -%table.zebra-striped.table-bordered +%table.zebra-striped %thead %tr %th Name @@ -60,7 +64,7 @@ %h3 Add new team member %br = form_tag team_update_admin_project_path(@admin_project), class: "bulk_import", method: :put do - %table.zebra-striped.table-bordered + %table.zebra-striped %thead %tr %th Users diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index f21baabf..5ef94ef5 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -19,7 +19,7 @@ = link_to admin_users_path(filter: "wop") do Without projects -%table.admin-table +%table %thead %th Admin %th Name diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 4cca8ed7..4d2b9832 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -8,7 +8,11 @@ %br -%table.zebra-striped.table-bordered +%table.zebra-striped + %thead + %tr + %th Profile + %th %tr %td %b @@ -57,7 +61,7 @@ %h3 Add User to Projects %br = form_tag team_update_admin_user_path(@admin_user), class: "bulk_import", method: :put do - %table.table-bordered + %table %thead %tr %th Projects @@ -78,9 +82,9 @@ %h3 Projects %br - %table.zebra-striped.table-bordered - %tr - %thead + %table.zebra-striped + %thead + %tr %th Name %th Project Access %th diff --git a/app/views/hooks/index.html.haml b/app/views/hooks/index.html.haml index 3d2a381e..1b59c8e8 100644 --- a/app/views/hooks/index.html.haml +++ b/app/views/hooks/index.html.haml @@ -26,11 +26,12 @@ Hooks %small (#{@hooks.count}) %br - %table.admin-table - %tr - %th URL - %th Method - %th + %table + %thead + %tr + %th URL + %th Method + %th - @hooks.each do |hook| %tr %td diff --git a/app/views/keys/index.html.haml b/app/views/keys/index.html.haml index 9b5663ed..8f7e2bab 100644 --- a/app/views/keys/index.html.haml +++ b/app/views/keys/index.html.haml @@ -7,7 +7,7 @@ SSH key allows you to establish a secure connection between your computer and Gitlab -%table#keys-table.admin-table +%table#keys-table %thead %tr %th Name diff --git a/app/views/milestones/show.html.haml b/app/views/milestones/show.html.haml index b7da7b66..0d6cb2a0 100644 --- a/app/views/milestones/show.html.haml +++ b/app/views/milestones/show.html.haml @@ -42,7 +42,7 @@ .row .span6 - %table.admin-table + %table %thead %th Open Issues - @issues.each do |issue| @@ -56,7 +56,7 @@ = paginate @issues, theme: "gitlab" .span6 - %table.admin-table + %table %thead %th Participants - @users.each do |user| diff --git a/app/views/projects/_team.html.haml b/app/views/projects/_team.html.haml index 175aea27..0ddcf17f 100644 --- a/app/views/projects/_team.html.haml +++ b/app/views/projects/_team.html.haml @@ -1,4 +1,4 @@ -%table.admin-table +%table %thead %tr %th User diff --git a/app/views/projects/files.html.haml b/app/views/projects/files.html.haml index 68d51df0..ce8ba876 100644 --- a/app/views/projects/files.html.haml +++ b/app/views/projects/files.html.haml @@ -1,6 +1,11 @@ = render "project_head" - unless @notes.empty? - %table.zebra-striped.borders + %table + %thead + %tr + %th File name + %th + - @notes.each do |note| %tr %td diff --git a/app/views/protected_branches/index.html.haml b/app/views/protected_branches/index.html.haml index 2b93b0a8..33bb448a 100644 --- a/app/views/protected_branches/index.html.haml +++ b/app/views/protected_branches/index.html.haml @@ -24,7 +24,7 @@ = f.submit 'Protect', class: "primary btn" - unless @branches.empty? - %table.admin-table + %table %thead %tr %th Name diff --git a/app/views/refs/_tree.html.haml b/app/views/refs/_tree.html.haml index c231c407..a4765c10 100644 --- a/app/views/refs/_tree.html.haml +++ b/app/views/refs/_tree.html.haml @@ -13,7 +13,7 @@ = render partial: "refs/tree_file", locals: { name: tree.name, content: tree.data, file: tree } - else - contents = tree.contents - %table#tree-slider.bordered-table.table{class: "table_#{@hex_path}" } + %table#tree-slider{class: "table_#{@hex_path}" } %thead %th Name %th Last Update diff --git a/app/views/repositories/branches.html.haml b/app/views/repositories/branches.html.haml index 45004bdf..4c246c69 100644 --- a/app/views/repositories/branches.html.haml +++ b/app/views/repositories/branches.html.haml @@ -1,6 +1,6 @@ = render "repositories/branches_head" - unless @branches.empty? - %table.admin-table + %table %thead %tr %th Name diff --git a/app/views/repositories/show.html.haml b/app/views/repositories/show.html.haml index a09cdd62..fd0abac8 100644 --- a/app/views/repositories/show.html.haml +++ b/app/views/repositories/show.html.haml @@ -1,6 +1,6 @@ = render "branches_head" -%table.admin-table +%table %thead %tr %th Name diff --git a/app/views/repositories/tags.html.haml b/app/views/repositories/tags.html.haml index 7fc2c3bf..0e870c80 100644 --- a/app/views/repositories/tags.html.haml +++ b/app/views/repositories/tags.html.haml @@ -1,6 +1,6 @@ = render "commits/head" - unless @tags.empty? - %table.admin-table + %table %thead %tr %th Name diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml index d37ef670..b4a38b57 100644 --- a/app/views/search/show.html.haml +++ b/app/views/search/show.html.haml @@ -14,7 +14,7 @@ .search_results .row .span6 - %table.admin-table + %table %tr %th Projects %tbody @@ -31,7 +31,7 @@ %td %h4.nothing_here_message No Projects %br - %table.admin-table + %table %tr %th Merge Requests %tbody @@ -49,7 +49,7 @@ %td %h4.nothing_here_message No Merge Requests .span6 - %table.admin-table + %table %tr %th Issues %tbody diff --git a/app/views/snippets/index.html.haml b/app/views/snippets/index.html.haml index 7229b587..515daec6 100644 --- a/app/views/snippets/index.html.haml +++ b/app/views/snippets/index.html.haml @@ -8,7 +8,7 @@ %br To add new snippet - click on button. -%table.admin-table +%table %thead %tr %th Title diff --git a/app/views/team_members/show.html.haml b/app/views/team_members/show.html.haml index 6cb357cd..89662309 100644 --- a/app/views/team_members/show.html.haml +++ b/app/views/team_members/show.html.haml @@ -19,7 +19,7 @@ %br .row .span6 - %table.no-borders + %table.lite %tr %td Email %td= mail_to user.email @@ -39,7 +39,7 @@ %td Bio %td= user.bio .span6 - %table.no-borders + %table.lite %tr %td Member since %td= @team_member.created_at.stamp("Aug 21, 2011") diff --git a/app/views/wikis/history.html.haml b/app/views/wikis/history.html.haml index e31c5dc2..0a81817c 100644 --- a/app/views/wikis/history.html.haml +++ b/app/views/wikis/history.html.haml @@ -2,7 +2,7 @@ %span.cgray History for = @wikis.last.title %br -%table.admin-table +%table %thead %tr %th # diff --git a/app/views/wikis/pages.html.haml b/app/views/wikis/pages.html.haml index 2bfd0deb..7421d8f9 100644 --- a/app/views/wikis/pages.html.haml +++ b/app/views/wikis/pages.html.haml @@ -1,6 +1,6 @@ %h3.page_title All Pages %br -%table.admin-table +%table %thead %tr %th Title From f557686eb2d432f794addbc052331d5d8f0be400 Mon Sep 17 00:00:00 2001 From: randx Date: Mon, 3 Sep 2012 22:30:14 +0300 Subject: [PATCH 125/357] git clone panel available on files tab too --- app/assets/javascripts/projects.js | 9 +++++++++ app/assets/stylesheets/gitlab_bootstrap/blocks.scss | 2 +- app/assets/stylesheets/sections/projects.scss | 12 ++++++++---- app/views/projects/_clone_panel.html.haml | 4 ++-- app/views/projects/show.html.haml | 7 +------ app/views/refs/_head.html.haml | 9 +++++++++ app/views/refs/tree.js.haml | 2 +- 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/projects.js b/app/assets/javascripts/projects.js index be1b75b9..6bbfbacc 100644 --- a/app/assets/javascripts/projects.js +++ b/app/assets/javascripts/projects.js @@ -14,3 +14,12 @@ function Projects() { disableButtonIfEmtpyField("#project_name", ".project-submit") } + +function initGitCloneSwitcher() { + var link_sel = ".project_clone_holder button"; + $(link_sel).bind("click", function(e) { + $(link_sel).removeClass("active"); + $(this).addClass("active"); + $("#project_clone").val($(this).attr("data-clone")); + }) +} diff --git a/app/assets/stylesheets/gitlab_bootstrap/blocks.scss b/app/assets/stylesheets/gitlab_bootstrap/blocks.scss index 894cb304..70f7889f 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/blocks.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/blocks.scss @@ -1,6 +1,6 @@ /** * =================================== - * Contain 3 main UI block elements: + * Contain 3 main UI block elements: * .main_box - for show pages * .ui-box - for simple block & widgets * =================================== diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 721b569d..92d0fc43 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -75,17 +75,21 @@ padding: 4px 7px; border: 1px solid #CCC; margin-bottom:5px; - input[type=text] { +} + +.project_clone_holder { + input[type="text"] { border: 1px solid #BBB; + box-shadow: none; } } -.save-project-loader { - img { +.save-project-loader { + img { margin-top:50px; margin-bottom:50px; } - h3 { + h3 { @extend .page_title; } diff --git a/app/views/projects/_clone_panel.html.haml b/app/views/projects/_clone_panel.html.haml index 839a98a0..76059f32 100644 --- a/app/views/projects/_clone_panel.html.haml +++ b/app/views/projects/_clone_panel.html.haml @@ -3,8 +3,8 @@ .span7 .form-horizontal .input-prepend.project_clone_holder - = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo - = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo + %button{class: "btn small active", :"data-clone" => @project.ssh_url_to_repo} SSH + %button{class: "btn small", :"data-clone" => @project.http_url_to_repo} HTTP = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" .span4.right .right diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 77a0ef1a..de3e9cef 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -5,10 +5,5 @@ :javascript $(function(){ - var link_sel = ".project_clone_holder a"; - $(link_sel).bind("click", function() { - $(link_sel).removeClass("active"); - $(this).addClass("active"); - $("#project_clone").val($(this).attr("data-clone")); - }) + initGitCloneSwitcher(); }) diff --git a/app/views/refs/_head.html.haml b/app/views/refs/_head.html.haml index 8825493a..affd07cb 100644 --- a/app/views/refs/_head.html.haml +++ b/app/views/refs/_head.html.haml @@ -7,4 +7,13 @@ %li{class: "#{'active' if (controller.controller_name == "refs") }"} = link_to tree_project_ref_path(@project, @ref) do Source + %li.right + .input-prepend.project_clone_holder + %button{class: "btn small active", :"data-clone" => @project.ssh_url_to_repo} SSH + %button{class: "btn small", :"data-clone" => @project.http_url_to_repo} HTTP + = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" +:javascript + $(function(){ + initGitCloneSwitcher(); + }) diff --git a/app/views/refs/tree.js.haml b/app/views/refs/tree.js.haml index 2eccf8c1..92e90579 100644 --- a/app/views/refs/tree.js.haml +++ b/app/views/refs/tree.js.haml @@ -6,5 +6,5 @@ // Load last commit log for each file in tree $('#tree-slider').waitForImages(function() { - ajaxGet('#{@logs_path}'); + ajaxGet('#{@logs_path}'); }); From 5db2dbdcf110d4a5ff4180ae96ec9131ac9a1723 Mon Sep 17 00:00:00 2001 From: randx Date: Mon, 3 Sep 2012 22:57:34 +0300 Subject: [PATCH 126/357] fix browse file css --- app/assets/stylesheets/gitlab_bootstrap/files.scss | 2 +- app/assets/stylesheets/highlight/white.scss | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/gitlab_bootstrap/files.scss b/app/assets/stylesheets/gitlab_bootstrap/files.scss index 4ea5ed02..83903c53 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/files.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/files.scss @@ -9,7 +9,7 @@ .file_title { border-bottom: 1px solid #bbb; - @include bg-gray-gradient; + @include bg-dark-gray-gradient; margin: 0; font-weight: normal; font-weight: bold; diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss index a08f05bd..9b003b8a 100644 --- a/app/assets/stylesheets/highlight/white.scss +++ b/app/assets/stylesheets/highlight/white.scss @@ -1,12 +1,21 @@ -table.highlighttable -{ +table.highlighttable { margin:0px; padding:0px; font-size:12px; table-layout:fixed; background: #EEE; + box-shadow: none; + border: none; + td.linenos { + background:#eee; + border-left:none; + } + td.code { + border-right:none; + } } + td.code, td.linenos{ padding:0; From b44e9a08d5c0e012d645e75a321c6ea299b4bea1 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 3 Sep 2012 20:38:41 -0400 Subject: [PATCH 127/357] Add Milestone link to API help TOC [ci skip] --- app/views/help/api.html.haml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/help/api.html.haml b/app/views/help/api.html.haml index d7d7aed4..35176f8e 100644 --- a/app/views/help/api.html.haml +++ b/app/views/help/api.html.haml @@ -15,6 +15,8 @@ %a{href: "#users"} Users %li %a{href: "#issues"} Issues + %li + %a{href: "#milestones"} Milestones .file_holder#README .file_title From d29827433d77b9f9353fcae396ca321dd9016771 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 00:04:36 -0400 Subject: [PATCH 128/357] Update User#identifier to conform to Gitolite 2.x's user pattern Also modifies the specs a bit because I can't help myself. Closes #480 --- app/roles/account.rb | 11 +++++-- spec/factories.rb | 2 +- spec/models/user_spec.rb | 64 +++++++++++++++++++++++----------------- 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/app/roles/account.rb b/app/roles/account.rb index 63a9b5c5..b8c445a3 100644 --- a/app/roles/account.rb +++ b/app/roles/account.rb @@ -1,6 +1,13 @@ -module Account +module Account + # Returns a string for use as a Gitolite user identifier + # + # Note that Gitolite 2.x requires the following pattern for users: + # + # ^@?[0-9a-zA-Z][0-9a-zA-Z._\@+-]*$ def identifier - email.gsub /[^[:alnum:]]/, "_" + # Replace non-word chars with underscores, then make sure it starts with + # valid chars + email.gsub(/\W/, '_').gsub(/\A([\W\_])+/, '') end def is_admin? diff --git a/spec/factories.rb b/spec/factories.rb index 2e4acf39..a8b3bc57 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -28,7 +28,7 @@ FactoryGirl.define do email { Faker::Internet.email } name password "123456" - password_confirmation "123456" + password_confirmation { password } trait :admin do admin true diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index ca34f07d..08176754 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -31,36 +31,46 @@ describe User do it { should respond_to(:private_token) } end - it "should return valid identifier" do - user = User.new(email: "test@mail.com") - user.identifier.should == "test_mail_com" + describe '#identifier' do + it "should return valid identifier" do + user = build(:user, email: "test@mail.com") + user.identifier.should == "test_mail_com" + end + + it "should return identifier without + sign" do + user = build(:user, email: "test+foo@mail.com") + user.identifier.should == "test_foo_mail_com" + end + + it "should conform to Gitolite's required identifier pattern" do + user = build(:user, email: "_test@example.com") + user.identifier.should == 'test_example_com' + end end - it "should return identifier without + sign" do - user = User.new(email: "test+foo@mail.com") - user.identifier.should == "test_foo_mail_com" + describe '#generate_password' do + it "should execute callback when force_random_password specified" do + user = build(:user, force_random_password: true) + user.should_receive(:generate_password) + user.save + end + + it "should not generate password by default" do + user = create(:user, password: 'abcdefg') + user.password.should == 'abcdefg' + end + + it "should generate password when forcing random password" do + Devise.stub(:friendly_token).and_return('123456789') + user = create(:user, password: 'abcdefg', force_random_password: true) + user.password.should == '12345678' + end end - it "should execute callback when force_random_password specified" do - user = User.new(email: "test@mail.com", force_random_password: true) - user.should_receive(:generate_password) - user.save - end - - it "should not generate password by default" do - user = Factory(:user, password: 'abcdefg', password_confirmation: 'abcdefg') - user.password.should == 'abcdefg' - end - - it "should generate password when forcing random password" do - Devise.stub(:friendly_token).and_return('123456789') - user = User.create(email: "test1@mail.com", force_random_password: true) - user.password.should == user.password_confirmation - user.password.should == '12345678' - end - - it "should have authentication token" do - user = Factory(:user) - user.authentication_token.should_not == "" + describe 'authentication token' do + it "should have authentication token" do + user = Factory(:user) + user.authentication_token.should_not be_blank + end end end From b73d4419ea458a2824a35563bcd84d519b2a5516 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Tue, 4 Sep 2012 09:38:48 +0300 Subject: [PATCH 129/357] json_spec added. Create project via REST API fixed --- Gemfile | 1 + Gemfile.lock | 4 ++ spec/factories.rb | 3 ++ spec/requests/api/projects_spec.rb | 62 +++++++----------------------- spec/spec_helper.rb | 1 + 5 files changed, 22 insertions(+), 49 deletions(-) diff --git a/Gemfile b/Gemfile index b0724fad..33f9cf4c 100644 --- a/Gemfile +++ b/Gemfile @@ -117,6 +117,7 @@ group :test do gem 'email_spec' gem 'resque_spec' gem "webmock" + gem 'json_spec' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 7ec37f59..ae85a43a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -207,6 +207,9 @@ GEM jquery-rails railties (>= 3.1.0) json (1.7.5) + json_spec (1.0.3) + multi_json (~> 1.0) + rspec (~> 2.0) kaminari (0.14.0) actionpack (>= 3.0.0) activesupport (>= 3.0.0) @@ -406,6 +409,7 @@ DEPENDENCIES httparty jquery-rails (= 2.0.2) jquery-ui-rails (= 0.5.0) + json_spec kaminari launchy letter_opener diff --git a/spec/factories.rb b/spec/factories.rb index 2e4acf39..95c919fd 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -11,6 +11,9 @@ module Factory def self.new(type, *args) FactoryGirl.build(type, *args) end + def self.attributes(type, *args) + FactoryGirl.attributes_for(type, *args) + end end FactoryGirl.define do diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index cdab2657..43c44974 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -39,55 +39,19 @@ describe Gitlab::API do }.should change{Project.count}.by(1) end it "should create new project" do - expect { - name = "foo" - path = "bar" - code = "bazz" - description = "fuu project" - default_branch = "default_branch" - issues_enabled = false - wall_enabled = false - merge_requests_enabled = false - wiki_enabled = false - post api("/projects", user), { - code: code, - path: path, - name: name, - description: description, - default_branch: default_branch, - issues_enabled: issues_enabled, - wall_enabled: wall_enabled, - merge_requests_enabled: merge_requests_enabled, - wiki_enabled: wiki_enabled - } - response.status.should == 201 - json_response["name"].should == name - json_response["path"].should == path - json_response["code"].should == code - json_response["description"].should == description - json_response["default_branch"].should == default_branch - json_response["issues_enabled"].should == issues_enabled - json_response["wall_enabled"].should == wall_enabled - json_response["merge_requests_enabled"].should == merge_requests_enabled - json_response["wiki_enabled"].should == wiki_enabled - }.should change{Project.count}.by(1) - end - it "should create new projects within all parameters" do - expect { - name = "foo" - path = "bar" - code = "bazz" - post api("/projects", user), { - code: code, - path: path, - name: name - } - response.status.should == 201 - json_response["name"].should == name - json_response["path"].should == path - json_response["code"].should == code - }.should change{Project.count}.by(1) - + attributes = Factory.attributes(:project, + name: "foo", + path: "bar", + code: "bazz", + description: "foo project", + default_branch: "default_branch", + issues_enabled: false, + wall_enabled: false, + merge_requests_enabled: false, + wiki_enabled: false) + post api("/projects", user), attributes + response.status.should == 201 + response.body.should be_json_eql(attributes.to_json).excluding("owner", "private") end it "should not create project without name" do expect { diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d381b3f1..30a213ba 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -28,6 +28,7 @@ RSpec.configure do |config| config.include LoginHelpers, type: :request config.include GitoliteStub config.include FactoryGirl::Syntax::Methods + config.include JsonSpec::Helpers # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false From 6471d8c6521ef7a88f3aa893cc11c1da8077bdc0 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 03:18:26 -0400 Subject: [PATCH 130/357] Change @project instance variable to a local in views/help/markdown It was erroneously appending the project name to the page's title, even though the Help system isn't specific to one project. --- app/views/help/markdown.html.haml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/help/markdown.html.haml b/app/views/help/markdown.html.haml index 6a4bbb02..43d3d4b0 100644 --- a/app/views/help/markdown.html.haml +++ b/app/views/help/markdown.html.haml @@ -88,9 +88,9 @@ for commits -# this example will only be shown if the user has a project with at least one issue - - if @project = current_user.projects.first - - if issue = @project.issues.first - %p For example in your #{link_to @project.name, project_path(@project)} project something like + - if project = current_user.projects.first + - if issue = project.issues.first + %p For example in your #{link_to project.name, project_path(project)} project something like %pre= "This is related to ##{issue.id}. @#{current_user.name} is working on solving it." %p becomes = markdown "This is related to ##{issue.id}. @#{current_user.name} is working on solving it." From 4bd30245805bc7814fc24686a418a9c883259800 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Tue, 4 Sep 2012 10:29:26 +0300 Subject: [PATCH 131/357] json_spec removed --- Gemfile | 1 - Gemfile.lock | 4 -- spec/requests/api/projects_spec.rb | 59 ++++++++++++++++-------------- spec/spec_helper.rb | 1 - 4 files changed, 31 insertions(+), 34 deletions(-) diff --git a/Gemfile b/Gemfile index 33f9cf4c..b0724fad 100644 --- a/Gemfile +++ b/Gemfile @@ -117,7 +117,6 @@ group :test do gem 'email_spec' gem 'resque_spec' gem "webmock" - gem 'json_spec' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index ae85a43a..7ec37f59 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -207,9 +207,6 @@ GEM jquery-rails railties (>= 3.1.0) json (1.7.5) - json_spec (1.0.3) - multi_json (~> 1.0) - rspec (~> 2.0) kaminari (0.14.0) actionpack (>= 3.0.0) activesupport (>= 3.0.0) @@ -409,7 +406,6 @@ DEPENDENCIES httparty jquery-rails (= 2.0.2) jquery-ui-rails (= 0.5.0) - json_spec kaminari launchy letter_opener diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 43c44974..1373748f 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -27,37 +27,40 @@ describe Gitlab::API do describe "POST /projects" do it "should create new project without code and path" do - expect { - name = "foo" - post api("/projects", user), { - name: name - } - response.status.should == 201 - json_response["name"].should == name - json_response["code"].should == name - json_response["path"].should == name - }.should change{Project.count}.by(1) + expect { post api("/projects", user), name: 'foo' }.to change {Project.count}.by(1) end - it "should create new project" do - attributes = Factory.attributes(:project, - name: "foo", - path: "bar", - code: "bazz", - description: "foo project", - default_branch: "default_branch", - issues_enabled: false, - wall_enabled: false, - merge_requests_enabled: false, - wiki_enabled: false) - post api("/projects", user), attributes + + it "should not create new project without name" do + expect { post api("/projects", user) }.to_not change {Project.count} + end + + it "should respond with 201 on success" do + post api("/projects", user), name: 'foo' response.status.should == 201 - response.body.should be_json_eql(attributes.to_json).excluding("owner", "private") end - it "should not create project without name" do - expect { - post api("/projects", user) - response.status.should == 404 - }.should_not change{Project.count} + + it "should repsond with 404 on failure" do + post api("/projects", user) + response.status.should == 404 + end + + it "should assign attributes to project" do + project = Factory.attributes(:project, { + path: 'path', + code: 'code', + description: Faker::Lorem.sentence, + default_branch: 'stable', + issues_enabled: false, + wall_enabled: false, + merge_requests_enabled: false, + wiki_enabled: false + }) + + post api("/projects", user), project + + project.each_pair do |k,v| + json_response[k.to_s].should == v + end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 30a213ba..d381b3f1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -28,7 +28,6 @@ RSpec.configure do |config| config.include LoginHelpers, type: :request config.include GitoliteStub config.include FactoryGirl::Syntax::Methods - config.include JsonSpec::Helpers # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false From 457b0f604fc005cc695627c558a39c9e14f3c6a0 Mon Sep 17 00:00:00 2001 From: Tse-Ching Ho Date: Mon, 3 Sep 2012 21:04:10 +0800 Subject: [PATCH 132/357] use APP_ROOT in init-gitlab to specify root of project --- lib/support/init-gitlab | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/support/init-gitlab b/lib/support/init-gitlab index f146e80f..26ed11e1 100644 --- a/lib/support/init-gitlab +++ b/lib/support/init-gitlab @@ -9,23 +9,24 @@ # Description: GitLab git repository management ### END INIT INFO -DAEMON_OPTS="-c /home/gitlab/gitlab/config/unicorn.rb -E production -D" -NAME=unicorn +APP_ROOT="/home/gitlab/gitlab" +DAEMON_OPTS="-c $APP_ROOT/config/unicorn.rb -E production -D" +NAME="unicorn" DESC="Gitlab service" -PID=/home/gitlab/gitlab/tmp/pids/unicorn.pid -RESQUE_PID=/home/gitlab/gitlab/tmp/pids/resque_worker.pid +PID="$APP_ROOT/tmp/pids/unicorn.pid" +RESQUE_PID="$APP_ROOT/tmp/pids/resque_worker.pid" case "$1" in start) - CD_TO_APP_DIR="cd /home/gitlab/gitlab" + CD_TO_APP_DIR="cd $APP_ROOT" START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" START_RESQUE_PROCESS="./resque.sh" echo -n "Starting $DESC: " if [ `whoami` = root ]; then - sudo -u gitlab sh -l -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" + sudo -u gitlab sh -l -c "$CD_TO_APP_DIR && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" else - $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS + $CD_TO_APP_DIR && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS fi echo "$NAME." ;; From 4cb03183ac4d9c765111174f0d657997bfb35d45 Mon Sep 17 00:00:00 2001 From: Rob Taylor Date: Tue, 14 Aug 2012 17:54:25 +0100 Subject: [PATCH 133/357] Text changes to API documentation --- doc/api/README.md | 11 ++++------- doc/api/projects.md | 9 +++++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/doc/api/README.md b/doc/api/README.md index 3a6c7b76..dece3e23 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -1,10 +1,8 @@ # Gitlab API -All API requests require authentication. You need to pass `private_token` parameter to authenticate. +All API requests require authentication. You need to pass a `private_token` parameter to authenticate. You can find or reset your private token in your profile. -To get or reset your token visit your profile. - -If no or invalid `private_token` provided error message will be returned with status code 401: +If no, or an invalid, `private_token` is provided then an error message will be returned with status code 401: ```json { @@ -12,10 +10,9 @@ If no or invalid `private_token` provided error message will be returned with st } ``` -API requests should be prefixed with `api` and the API version. -API version is equal to Gitlab major version number and defined in `lib/api.rb`. +API requests should be prefixed with `api` and the API version. The API version is equal to the Gitlab major version number, which is defined in `lib/api.rb`. -Example of valid API request: +Example of a valid API request: ``` GET http://example.com/api/v2/projects?private_token=QVy1PB7sTxfy4pqfZM1U diff --git a/doc/api/projects.md b/doc/api/projects.md index b0c1e657..e029522b 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -1,6 +1,6 @@ ## List projects -Get a list of authenticated user's projects. +Get a list of projects owned by the authenticated user. ``` GET /projects @@ -55,7 +55,7 @@ GET /projects ## Single project -Get an authenticated user's project. +Get a specific project, identified by project ID, which is owned by the authentication user. ``` GET /projects/:id @@ -109,7 +109,7 @@ found` on fail. ## Project repository branches -Get a list of project repository branches sorted by name alphabetically. +Get a list of repository branches from a project, sorted by name alphabetically. ``` GET /projects/:id/repository/branches @@ -186,7 +186,7 @@ Parameters: ## Project repository tags -Get a list of project repository tags sorted by name in reverse alphabetical order. +Get a list of repository tags from a project, sorted by name in reverse alphabetical order. ``` GET /projects/:id/repository/tags @@ -237,3 +237,4 @@ Parameters: + `filepath` (required) - The path the file Will return the raw file contents. + From 12c57a7061d55798e77e79c3cfae293b4d773365 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 05:03:31 -0400 Subject: [PATCH 134/357] Change hardcoded base path to use Gitlab settings Closes #1072 --- lib/tasks/bulk_import.rake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake index 607250f1..5941eadb 100644 --- a/lib/tasks/bulk_import.rake +++ b/lib/tasks/bulk_import.rake @@ -1,8 +1,9 @@ IMPORT_DIRECTORY = 'import_projects' -REPOSITORY_DIRECTORY = '/home/git/repositories' desc "Imports existing Git repos into new projects from the import_projects folder" task :import_projects, [:email] => :environment do |t, args| + REPOSITORY_DIRECTORY = Gitlab.config.git_base_path + user_email = args.email repos_to_import = Dir.glob("#{IMPORT_DIRECTORY}/*") From 11ebbb68d8c0db7b23db8b0509f160fc1571e50a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 05:24:43 -0400 Subject: [PATCH 135/357] Add tmp/.gitkeep file to ensure tmp folder exists on clone The install guide lists it as a requirement, so we might as well have it by default. --- tmp/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tmp/.gitkeep diff --git a/tmp/.gitkeep b/tmp/.gitkeep new file mode 100644 index 00000000..e69de29b From fc7ac316a084788f91710912e110f1aa70fd5a65 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 05:26:25 -0400 Subject: [PATCH 136/357] Clean up doc/installation.md Closes #939 --- doc/installation.md | 66 ++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/doc/installation.md b/doc/installation.md index 4cb873f0..6ba14566 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -20,7 +20,7 @@ You might have some luck using these, but no guarantees: - MacOS X - FreeBSD -Gitlab does **not** run on Windows and we have no plans of making Gitlab compatible. +GitLab does **not** run on Windows and we have no plans of making GitLab compatible. ## This installation guide created for Debian/Ubuntu and properly tested. @@ -28,21 +28,21 @@ The installation consists of 6 steps: 1. Install packages / dependencies 2. Install ruby -3. Install gitolite -4. Install and configure Gitlab. +3. Install Gitolite +4. Install and configure GitLab. 5. Start the web front-end 6. Start a Resque worker (for background processing) ### IMPORTANT -Please make sure you have followed all the steps below before posting to the mailinglist with installation and configuration questions. +Please make sure you have followed all the steps below before posting to the mailing list with installation and configuration questions. -Only create a Github Issue if you want a specific part of this installation guide updated. +Only create a GitHub Issue if you want a specific part of this installation guide updated. Also read the [Read this before you submit an issue](https://github.com/gitlabhq/gitlabhq/wiki/Read-this-before-you-submit-an-issue) wiki page. > - - - -> First 3 steps can be easily skipped with simply install script: +> The first 3 steps of this guide can be easily skipped by executing an install script: > > # Install curl and sudo > apt-get install curl sudo @@ -50,9 +50,9 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq > # 3 steps in 1 command :) > curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh > -> Now you can go to step 4" +> Now you can go to [Step 4](#4-install-gitlab-and-configuration-check-status-configuration) > -> Or if you are installing on Amazon Web Services using Ubuntu 12.04 you can do all steps (1 to 6) at once with: +> Or if you are installing on Amazon Web Services using Ubuntu 12.04 you can do all steps (1 to 6) at once with: > > curl https://raw.github.com/gitlabhq/gitlabhq/master/lib/support/aws/debian_ubuntu_aws.sh | sh > @@ -61,7 +61,11 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq # 1. Install packages -*Keep in mind that `sudo` is not installed for debian by default. You should install it with as root:* **apt-get update && apt-get upgrade && apt-get install sudo** +*Keep in mind that `sudo` is not installed on Debian by default. You should install it as root:* + + apt-get update && apt-get upgrade && apt-get install sudo + +Now install the required packages: sudo apt-get update sudo apt-get upgrade @@ -71,7 +75,7 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq # If you want to use MySQL: sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev -# 2. Install ruby +# 2. Install Ruby wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz tar xzfv ruby-1.9.2-p290.tar.gz @@ -80,7 +84,7 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq make sudo make install -# 3. Install gitolite +# 3. Install Gitolite Create user for git: @@ -93,12 +97,12 @@ Create user for git: --home /home/git \ git -Create user for gitlab: +Create user for GitLab: # ubuntu/debian sudo adduser --disabled-login --gecos 'gitlab system' gitlab -Add your user to git group: +Add your user to the `git` group: sudo usermod -a -G git gitlab @@ -106,10 +110,10 @@ Generate key: sudo -H -u gitlab ssh-keygen -q -N '' -t rsa -f /home/gitlab/.ssh/id_rsa -Get gitolite source code: +Clone GitLab's fork of the Gitolite source code: cd /home/git - sudo -H -u git git clone git://github.com/gitlabhq/gitolite /home/git/gitolite + sudo -H -u git git clone https://github.com/gitlabhq/gitolite.git /home/git/gitolite Setup: @@ -135,23 +139,23 @@ Permissions: # if succeed you can remove it sudo rm -rf /tmp/gitolite-admin -**IMPORTANT! If you cant clone `gitolite-admin` repository - DONT PROCEED INSTALLATION** +**IMPORTANT! If you can't clone `gitolite-admin` repository - DO NOT PROCEED WITH INSTALLATION** +Check the [Trouble Shooting Guide](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Trouble-Shooting-Guide) +and ensure you have followed all of the above steps carefully. -# 4. Install gitlab and configuration. Check status configuration. +# 4. Clone GitLab source and install prerequisites sudo gem install charlock_holmes --version '0.6.8' sudo pip install pygments sudo gem install bundler cd /home/gitlab - sudo -H -u gitlab git clone -b stable git://github.com/gitlabhq/gitlabhq.git gitlab + sudo -H -u gitlab git clone -b stable https://github.com/gitlabhq/gitlabhq.git gitlab cd gitlab - sudo -u gitlab mkdir tmp - # Rename config files sudo -u gitlab cp config/gitlab.yml.example config/gitlab.yml -#### Select db you want to use +#### Select the database you want to use # SQLite sudo -u gitlab cp config/database.yml.sqlite config/database.yml @@ -179,15 +183,17 @@ Permissions: sudo -u gitlab -H bundle install --without development test --deployment -#### Setup DB +#### Setup database sudo -u gitlab bundle exec rake gitlab:app:setup RAILS_ENV=production -#### Setup gitlab hooks +#### Setup GitLab hooks sudo cp ./lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive +#### Check application status + Checking status: sudo -u gitlab bundle exec rake gitlab:app:status RAILS_ENV=production @@ -208,9 +214,9 @@ Checking status: UMASK for .gitolite.rc is 0007? ............YES /home/git/share/gitolite/hooks/common/post-receive exists? ............YES -If you got all YES - congrats! You can go to next step. +If you got all YES - congratulations! You can go to the next step. -# 5. Server up +# 5. Start the web server Application can be started with next command: @@ -225,12 +231,12 @@ You can login via web using admin generated with setup: admin@local.host 5iveL!fe -# 6. Run resque process (for processing queue). +# 6. Run Resque process (for processing job queue). # Manually sudo -u gitlab bundle exec rake environment resque:work QUEUE=* RAILS_ENV=production BACKGROUND=yes - # Gitlab start script + # GitLab start script sudo -u gitlab ./resque.sh # if you run this as root /home/gitlab/gitlab/tmp/pids/resque_worker.pid will be owned by root # causing the resque worker not to start via init script on next boot/service restart @@ -250,7 +256,7 @@ You can login via web using admin generated with setup: sudo -u gitlab cp config/unicorn.rb.orig config/unicorn.rb sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D -Add gitlab to nginx sites & change with your host specific settings +Add GitLab to nginx sites & change with your host specific settings sudo cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-available/gitlab sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab @@ -272,10 +278,10 @@ Adding permission: sudo chmod +x /etc/init.d/gitlab -Gitlab autostart: +GitLab autostart: sudo update-rc.d gitlab defaults -Now you can start/restart/stop gitlab like: +Now you can start/restart/stop GitLab like: sudo /etc/init.d/gitlab restart From c1ff89fa2adc4809ea093833464f41ea9af5bc6f Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 11:30:49 -0400 Subject: [PATCH 137/357] Rename projects.js to projects.js.coffee --- app/assets/javascripts/{projects.js => projects.js.coffee} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/assets/javascripts/{projects.js => projects.js.coffee} (100%) diff --git a/app/assets/javascripts/projects.js b/app/assets/javascripts/projects.js.coffee similarity index 100% rename from app/assets/javascripts/projects.js rename to app/assets/javascripts/projects.js.coffee From 7e76610d0a521af73459ffc2ba7b3956ab9da34c Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 11:36:14 -0400 Subject: [PATCH 138/357] Update the projects js file to coffeescript; refactor the clone panel switcher --- app/assets/javascripts/projects.js.coffee | 40 ++++++++++------------- app/views/projects/empty.html.haml | 13 -------- app/views/projects/show.html.haml | 5 --- app/views/refs/_head.html.haml | 5 --- 4 files changed, 18 insertions(+), 45 deletions(-) diff --git a/app/assets/javascripts/projects.js.coffee b/app/assets/javascripts/projects.js.coffee index 6bbfbacc..ca8f13f6 100644 --- a/app/assets/javascripts/projects.js.coffee +++ b/app/assets/javascripts/projects.js.coffee @@ -1,25 +1,21 @@ -function Projects() { - $("#project_name").live("change", function(){ - var slug = slugify($(this).val()); - $("#project_code").val(slug); - $("#project_path").val(slug); - }); +window.Projects = -> + $("#project_name").live "change", -> + slug = slugify($(this).val()) + $("#project_code").val(slug) + $("#project_path").val(slug) - $('.new_project, .edit_project').live('ajax:before', function() { - $('.project_new_holder, .project_edit_holder').hide(); - $('.save-project-loader').show(); - }); + $(".new_project, .edit_project").live "ajax:before", -> + $(".project_new_holder, .project_edit_holder").hide() + $(".save-project-loader").show() - $('form #project_default_branch').chosen(); + $("form #project_default_branch").chosen() + disableButtonIfEmtpyField "#project_name", ".project-submit" - disableButtonIfEmtpyField("#project_name", ".project-submit") -} - -function initGitCloneSwitcher() { - var link_sel = ".project_clone_holder button"; - $(link_sel).bind("click", function(e) { - $(link_sel).removeClass("active"); - $(this).addClass("active"); - $("#project_clone").val($(this).attr("data-clone")); - }) -} +# Git clone panel switcher +$ -> + scope = $('.project_clone_holder') + if scope.length > 0 + $('a, button', scope).click -> + $('a, button', scope).removeClass('active') + $(this).addClass('active') + $('#project_clone', scope).val($(this).data('clone')) diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index d408c0a6..6ec7015a 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -36,16 +36,3 @@ - if can? current_user, :admin_project, @project .prepend-top-20 = link_to 'Remove project', @project, confirm: 'Are you sure?', method: :delete, class: "btn danger right" - - - -:javascript - $(function(){ - var link_sel = ".project_clone_holder a"; - $(link_sel).bind("click", function() { - $(link_sel).removeClass("active"); - $(this).addClass("active"); - $("#project_clone").val($(this).attr("data-clone")); - }) - }) - diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index de3e9cef..21459da2 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -2,8 +2,3 @@ = render 'clone_panel' = render "events/event_last_push", event: @last_push .content_list= render @events - -:javascript - $(function(){ - initGitCloneSwitcher(); - }) diff --git a/app/views/refs/_head.html.haml b/app/views/refs/_head.html.haml index affd07cb..d51602de 100644 --- a/app/views/refs/_head.html.haml +++ b/app/views/refs/_head.html.haml @@ -12,8 +12,3 @@ %button{class: "btn small active", :"data-clone" => @project.ssh_url_to_repo} SSH %button{class: "btn small", :"data-clone" => @project.http_url_to_repo} HTTP = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" - -:javascript - $(function(){ - initGitCloneSwitcher(); - }) From a4633537737d1ea85c74b2089fa1c82e407c0cfa Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 11:37:38 -0400 Subject: [PATCH 139/357] Add "empty_repo?" method to Repository role Replaces two calls that this method simplifies --- app/controllers/application_controller.rb | 2 +- app/controllers/projects_controller.rb | 2 +- app/roles/repository.rb | 12 ++++++++---- spec/roles/repository_spec.rb | 22 ++++++++++++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 spec/roles/repository_spec.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9aab250d..d53b23bb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -135,7 +135,7 @@ class ApplicationController < ActionController::Base end def require_non_empty_project - redirect_to @project unless @project.repo_exists? && @project.has_commits? + redirect_to @project if @project.empty_repo? end def no_cache_headers diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index bd7f811e..170b8892 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -50,7 +50,7 @@ class ProjectsController < ApplicationController respond_to do |format| format.html do - if @project.repo_exists? && @project.has_commits? + unless @project.empty_repo? @last_push = current_user.recent_push(@project.id) render :show else diff --git a/app/roles/repository.rb b/app/roles/repository.rb index 5fa950db..5f6c3541 100644 --- a/app/roles/repository.rb +++ b/app/roles/repository.rb @@ -8,6 +8,10 @@ module Repository false end + def empty_repo? + !repo_exists? || !has_commits? + end + def commit(commit_id = nil) Commit.find_or_first(repo, commit_id, root_ref) end @@ -38,7 +42,7 @@ module Repository def has_post_receive_file? hook_file = File.join(path_to_repo, 'hooks', 'post-receive') - File.exists?(hook_file) + File.exists?(hook_file) end def tags @@ -67,7 +71,7 @@ module Repository def repo_exists? @repo_exists ||= (repo && !repo.branches.empty?) - rescue + rescue @repo_exists = false end @@ -94,7 +98,7 @@ module Repository !!commit end - def root_ref + def root_ref default_branch || "master" end @@ -104,7 +108,7 @@ module Repository # Archive Project to .tar.gz # - # Already packed repo archives stored at + # Already packed repo archives stored at # app_root/tmp/repositories/project_name/project_name-commit-id.tag.gz # def archive_repo ref diff --git a/spec/roles/repository_spec.rb b/spec/roles/repository_spec.rb new file mode 100644 index 00000000..62aecc13 --- /dev/null +++ b/spec/roles/repository_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe Project, "Repository" do + let(:project) { build(:project) } + + describe "#empty_repo?" do + it "should return true if the repo doesn't exist" do + project.stub(repo_exists?: false, has_commits?: true) + project.should be_empty_repo + end + + it "should return true if the repo has commits" do + project.stub(repo_exists?: true, has_commits?: false) + project.should be_empty_repo + end + + it "should return false if the repo exists and has commits" do + project.stub(repo_exists?: true, has_commits?: true) + project.should_not be_empty_repo + end + end +end From 82a399688316caa9d860d93204f5bfc9b7847a16 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 12:03:40 -0400 Subject: [PATCH 140/357] Remove projects/_show partial I have no earthly idea what this file was for, but I couldn't find it being rendered anywhere. --- app/views/projects/_show.html.haml | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 app/views/projects/_show.html.haml diff --git a/app/views/projects/_show.html.haml b/app/views/projects/_show.html.haml deleted file mode 100644 index e8a5b00d..00000000 --- a/app/views/projects/_show.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -%h5.title - = @project.name -%br -%div - %a.btn.info{href: tree_project_ref_path(@project, @project.root_ref)} Browse code -   - %a.btn{href: project_commits_path(@project)} Commits - %strong.right - = link_to project_path(@project) do - Switch to project → -%br -.alert-message.block-message.warning - .input - .input-prepend - %span.add-on git clone - = text_field_tag :project_clone, @project.url_to_repo, class: "xlarge one_click_select git_clone_url" - -= simple_format @project.description -- unless @events.blank? - %h4.middle_title Recent Activity - .content_list= render @events - - From 0bc4ecfedd1f8580ab861955b0c21605e5a3aadb Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 12:05:08 -0400 Subject: [PATCH 141/357] Change projects/empty to include the clone_panel partial instead of duplicating --- app/views/projects/_clone_panel.html.haml | 22 +++++++++++----------- app/views/projects/empty.html.haml | 10 ++-------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/app/views/projects/_clone_panel.html.haml b/app/views/projects/_clone_panel.html.haml index 76059f32..20891610 100644 --- a/app/views/projects/_clone_panel.html.haml +++ b/app/views/projects/_clone_panel.html.haml @@ -8,14 +8,14 @@ = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" .span4.right .right - - if can? current_user, :download_code, @project - = link_to archive_project_repository_path(@project), class: "btn small grouped" do - %i.icon-download-alt - Download - - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) - = link_to new_project_merge_request_path(@project), title: "New Merge Request", class: "btn small grouped" do - Merge Request - - if @project.issues_enabled && can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), title: "New Issue", class: "btn small grouped" do - Issue - + - unless @project.empty_repo? + - if can? current_user, :download_code, @project + = link_to archive_project_repository_path(@project), class: "btn small grouped" do + %i.icon-download-alt + Download + - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) + = link_to new_project_merge_request_path(@project), title: "New Merge Request", class: "btn small grouped" do + Merge Request + - if @project.issues_enabled && can?(current_user, :write_issue, @project) + = link_to new_project_issue_path(@project), title: "New Issue", class: "btn small grouped" do + Issue diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 6ec7015a..d9a151fc 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -1,12 +1,6 @@ = render 'shared/no_ssh' -.project_clone_panel - .row - .span7 - .form-horizontal - .input-prepend.project_clone_holder - = link_to "SSH", "#", class: "btn small active", :"data-clone" => @project.ssh_url_to_repo - = link_to "HTTP", "#", class: "btn small", :"data-clone" => @project.http_url_to_repo - = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" += render 'clone_panel' + %div.git-empty %h4 Git global setup: %pre.dark From 874a86f820466b2c9cd384483d862a3d5e2a3ae7 Mon Sep 17 00:00:00 2001 From: randx Date: Tue, 4 Sep 2012 19:44:17 +0300 Subject: [PATCH 142/357] update install to use recipes --- doc/installation.md | 16 ++++++------ lib/support/init-gitlab | 55 ---------------------------------------- lib/support/nginx-gitlab | 33 ------------------------ 3 files changed, 8 insertions(+), 96 deletions(-) delete mode 100644 lib/support/init-gitlab delete mode 100644 lib/support/nginx-gitlab diff --git a/doc/installation.md b/doc/installation.md index 6ba14566..462fbc57 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -48,15 +48,15 @@ Also read the [Read this before you submit an issue](https://github.com/gitlabhq > apt-get install curl sudo > > # 3 steps in 1 command :) -> curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh +> curl https://raw.github.com/gitlabhq/gitlab-recipes/master/install/debian_ubuntu.sh | sh > > Now you can go to [Step 4](#4-install-gitlab-and-configuration-check-status-configuration) > > Or if you are installing on Amazon Web Services using Ubuntu 12.04 you can do all steps (1 to 6) at once with: > -> curl https://raw.github.com/gitlabhq/gitlabhq/master/lib/support/aws/debian_ubuntu_aws.sh | sh +> curl https://raw.github.com/gitlabhq/gitlab-recipes/master/install/debian_ubuntu_aws.sh | sh > -> for more detailed instructions read the HOWTO section of [the script](https://github.com/gitlabhq/gitlabhq/blob/master/lib/support/aws/debian_ubuntu_aws.sh) +> for more detailed instructions read the HOWTO section of [the script](https://github.com/gitlabhq/gitlab-recipes/blob/master/install/debian_ubuntu_aws.sh) > - - - # 1. Install packages @@ -77,9 +77,9 @@ Now install the required packages: # 2. Install Ruby - wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz - tar xzfv ruby-1.9.2-p290.tar.gz - cd ruby-1.9.2-p290 + wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz + tar xfvz ruby-1.9.3-p194.tar.gz + cd ruby-1.9.3-p194 ./configure make sudo make install @@ -258,7 +258,7 @@ You can login via web using admin generated with setup: Add GitLab to nginx sites & change with your host specific settings - sudo cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-available/gitlab + sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/nginx/gitlab -P /etc/nginx/sites-available/ sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab # Change **YOUR_SERVER_IP** and **YOUR_SERVER_FQDN** @@ -272,7 +272,7 @@ Restart nginx: Create init script in /etc/init.d/gitlab: - cp /home/gitlab/gitlab/lib/support/init-gitlab /etc/init.d/gitlab + sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/init.d/gitlab -P /etc/init.d/ Adding permission: diff --git a/lib/support/init-gitlab b/lib/support/init-gitlab deleted file mode 100644 index 26ed11e1..00000000 --- a/lib/support/init-gitlab +++ /dev/null @@ -1,55 +0,0 @@ -#! /bin/bash -### BEGIN INIT INFO -# Provides: gitlab -# Required-Start: $local_fs $remote_fs $network $syslog redis-server -# Required-Stop: $local_fs $remote_fs $network $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: GitLab git repository management -# Description: GitLab git repository management -### END INIT INFO - -APP_ROOT="/home/gitlab/gitlab" -DAEMON_OPTS="-c $APP_ROOT/config/unicorn.rb -E production -D" -NAME="unicorn" -DESC="Gitlab service" -PID="$APP_ROOT/tmp/pids/unicorn.pid" -RESQUE_PID="$APP_ROOT/tmp/pids/resque_worker.pid" - -case "$1" in - start) - CD_TO_APP_DIR="cd $APP_ROOT" - START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" - START_RESQUE_PROCESS="./resque.sh" - - echo -n "Starting $DESC: " - if [ `whoami` = root ]; then - sudo -u gitlab sh -l -c "$CD_TO_APP_DIR && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" - else - $CD_TO_APP_DIR && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS - fi - echo "$NAME." - ;; - stop) - echo -n "Stopping $DESC: " - kill -QUIT `cat $PID` - kill -QUIT `cat $RESQUE_PID` - echo "$NAME." - ;; - restart) - echo -n "Restarting $DESC: " - kill -USR2 `cat $PID` - echo "$NAME." - ;; - reload) - echo -n "Reloading $DESC configuration: " - kill -HUP `cat $PID` - echo "$NAME." - ;; - *) - echo "Usage: $NAME {start|stop|restart|reload}" >&2 - exit 1 - ;; -esac - -exit 0 diff --git a/lib/support/nginx-gitlab b/lib/support/nginx-gitlab deleted file mode 100644 index fa15d201..00000000 --- a/lib/support/nginx-gitlab +++ /dev/null @@ -1,33 +0,0 @@ -upstream gitlab { - server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket; -} - -server { - listen YOUR_SERVER_IP:80; # e.g., listen 192.168.1.1:80; - server_name YOUR_SERVER_FQDN; # e.g., server_name source.example.com; - root /home/gitlab/gitlab/public; - - # individual nginx logs for this gitlab vhost - access_log /var/log/nginx/gitlab_access.log; - error_log /var/log/nginx/gitlab_error.log; - - location / { - # serve static files from defined root folder;. - # @gitlab is a named location for the upstream fallback, see below - try_files $uri $uri/index.html $uri.html @gitlab; - } - - # if a file, which is not found in the root folder is requested, - # then the proxy pass the request to the upsteam (gitlab unicorn) - location @gitlab { - proxy_redirect off; - - # you need to change this to "https", if you set "ssl" directive to "on" - proxy_set_header X-FORWARDED_PROTO http; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - - proxy_pass http://gitlab; - } -} - From d59d2a197e5ffb0231f97b0ef503e12e8d383709 Mon Sep 17 00:00:00 2001 From: randx Date: Tue, 4 Sep 2012 20:29:20 +0300 Subject: [PATCH 143/357] cleanup gitlab from setup scripts --- doc/debian_ubuntu.sh | 45 ---------- lib/support/aws/debian_ubuntu_aws.sh | 122 --------------------------- 2 files changed, 167 deletions(-) delete mode 100644 doc/debian_ubuntu.sh delete mode 100644 lib/support/aws/debian_ubuntu_aws.sh diff --git a/doc/debian_ubuntu.sh b/doc/debian_ubuntu.sh deleted file mode 100644 index 5ed1e2a2..00000000 --- a/doc/debian_ubuntu.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -sudo apt-get update -sudo apt-get upgrade - -sudo DEBIAN_FRONTEND='noninteractive' apt-get install -y postfix-policyd-spf-python # Install postfix without prompting. -sudo apt-get install -y git git-core wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline-gplv2-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server python-dev python-pip libyaml-dev - -wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz -tar xfvz ruby-1.9.3-p194.tar.gz -cd ruby-1.9.3-p194 -./configure -make -sudo make install - -sudo adduser \ - --system \ - --shell /bin/sh \ - --gecos 'git version control' \ - --group \ - --disabled-password \ - --home /home/git \ - git - -sudo adduser --disabled-login --gecos 'gitlab system' gitlab - -sudo usermod -a -G git gitlab - -sudo -H -u gitlab ssh-keygen -q -N '' -t rsa -f /home/gitlab/.ssh/id_rsa - -cd /home/git -sudo -H -u git git clone git://github.com/gitlabhq/gitolite /home/git/gitolite - -sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; /home/git/gitolite/src/gl-system-install" -sudo cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub -sudo chmod 777 /home/git/gitlab.pub - -sudo -u git -H sed -i 's/0077/0007/g' /home/git/share/gitolite/conf/example.gitolite.rc -sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gl-setup -q /home/git/gitlab.pub" - -sudo chmod -R g+rwX /home/git/repositories/ -sudo chown -R git:git /home/git/repositories/ - -sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin -sudo rm -rf /tmp/gitolite-admin diff --git a/lib/support/aws/debian_ubuntu_aws.sh b/lib/support/aws/debian_ubuntu_aws.sh deleted file mode 100644 index c4103ec9..00000000 --- a/lib/support/aws/debian_ubuntu_aws.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/sh - -# ABOUT -# This script performs a complete installation of Gitlab (master branch). -# Is can be run with one command without needing _any_ user input after that. -# This script only works on Amazon Web Services (AWS). -# The operating system used is Ubuntu 12.04 64bit. - -# HOWTO -# Signup for AWS, free tier are available at http://aws.amazon.com/free/ -# Go to EC2 tab in the AWS console EC2 https://console.aws.amazon.com/ec2/home -# Click the 'Launch Instance' button -# Select: 'Quick launch wizard' and continue -# Choose a key pair => Create New => Name it => Download it -# Choose a Launch Configuration => Select 'More Amazon Marketplace Images' -# Press 'Continue' -# Enter 'ubuntu/images/ubuntu-precise-12.04-amd64-server-20120424' and press 'Search' -# Select the only result (ami-3c994355) and press 'Continue' -# Press 'Edit details' if you want to modify something, for example make the type 'c1.medium' to make the install faster. -# Press the 'Launch' button -# Press 'Close' -# Click 'Security Groups' under the left hand menu 'NETWORK & SECURITY' -# Select the newly create seciruty group, probably named 'quicklaunch-1' -# Click on the Inbound tab -# In the 'Create a new rule' dropdown select 'HTTP' -# Press 'Add Rule' -# In the 'Create a new rule' dropdown select 'HTTPS' -# Press 'Add Rule' -# Press 'Apply Rule Changes' -# Give the following command in your local terminal while suptituting the UPPERCASE items -# 'ssh -i LOCATION_OF_AWS_KEY_PAIR_PRIVATE_KEY PUBLIC_DNS_OF_THE_NEW_SERVER' -# Execute the curl command below and when its ready follow the printed 'Log in instuctions' -# curl https://raw.github.com/gitlabhq/gitlabhq/master/lib/support/aws/debian_ubuntu_aws.sh | sh - -# Prevent fingerprint prompt for localhost in step 1 to 3. -echo "Host localhost - StrictHostKeyChecking no - UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config - -# Existing script for Step 1 to 3 -curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh - -# Install MySQL -sudo apt-get install -y makepasswd # Needed to create a unique password non-interactively. -userPassword=$(makepasswd --char=10) # Generate a random MySQL password -# Note that the lines below creates a cleartext copy of the random password in /var/cache/debconf/passwords.dat -# This file is normally only readable by root and the password will be deleted by the package management system after install. -echo mysql-server mysql-server/root_password password $userPassword | sudo debconf-set-selections -echo mysql-server mysql-server/root_password_again password $userPassword | sudo debconf-set-selections -sudo apt-get install -y mysql-server - -# Gitlab install -sudo gem install charlock_holmes --version '0.6.8' -sudo pip install pygments -sudo gem install bundler -sudo su -l gitlab -c "git clone git://github.com/gitlabhq/gitlabhq.git gitlab" # Using master everywhere. -sudo su -l gitlab -c "cd gitlab && mkdir tmp" -sudo su -l gitlab -c "cd gitlab/config && cp gitlab.yml.example gitlab.yml" -sudo su -l gitlab -c "cd gitlab/config && cp database.yml.example database.yml" -sudo sed -i 's/"secure password"/"'$userPassword'"/' /home/gitlab/gitlab/config/database.yml # Insert the mysql root password. -sudo su -l gitlab -c "cd gitlab && bundle install --without development test --deployment" -sudo su -l gitlab -c "cd gitlab && bundle exec rake gitlab:app:setup RAILS_ENV=production" - -# Setup gitlab hooks -sudo cp /home/gitlab/gitlab/lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive -sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive - -# Set the first occurrence of host in the Gitlab config to the publicly available domain name -sudo sed -i '0,/host/s/localhost/'`wget -qO- http://instance-data/latest/meta-data/public-hostname`'/' /home/gitlab/gitlab/config/gitlab.yml - -# Gitlab installation test (optional) -# sudo -u gitlab bundle exec rake gitlab:app:status RAILS_ENV=production -# sudo -u gitlab bundle exec rails s -e production -# sudo -u gitlab bundle exec rake environment resque:work QUEUE=* RAILS_ENV=production BACKGROUND=no - -# Install and configure Nginx -sudo apt-get install -y nginx -sudo cp /home/gitlab/gitlab/lib/support/nginx-gitlab /etc/nginx/sites-available/gitlab -sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab -sudo sed -i 's/YOUR_SERVER_IP/'`wget -qO- http://instance-data/latest/meta-data/local-ipv4`'/' /etc/nginx/sites-available/gitlab # Set private ip address (public won't work). -sudo sed -i 's/YOUR_SERVER_FQDN/'`wget -qO- http://instance-data/latest/meta-data/public-hostname`'/' /etc/nginx/sites-available/gitlab # Set public dns domain name. - -# Configure Unicorn -sudo -u gitlab cp /home/gitlab/gitlab/config/unicorn.rb.orig /home/gitlab/gitlab/config/unicorn.rb - -# Create a Gitlab service -sudo cp /home/gitlab/gitlab/lib/support/init-gitlab /etc/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab && sudo update-rc.d gitlab defaults - -## Gitlab service commands (unicorn and resque) -## restart doesn't restart resque, only start/stop effect it. -sudo -u gitlab service gitlab start -# sudo -u gitlab service gitlab restart -# sudo -u gitlab service gitlab stop - -# nginx Service commands -# sudo service nginx start -sudo service nginx restart -# sudo service nginx stop - -# Manual startup commands for troubleshooting when the service commands do not work -# sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D -# sudo su -l gitlab -c "cd gitlab && ./resque.sh" - -# Monitoring commands -# sudo tail -f /var/log/nginx/access.log; -# sudo tail -f /var/log/nginx/error.log; - -# Go to gitlab directory by default on next login. -echo 'cd /home/gitlab/gitlab' >> /home/ubuntu/.bashrc - -echo '' -echo '###########################################' -echo '# Log in instuctions #' -echo '###########################################' -echo '' -echo "Surf to this Gitlab installation in your browser:" -echo "http://`wget -qO- http://instance-data/latest/meta-data/public-hostname`/" -echo '' -echo 'and login with the following Email and Password:' -echo 'admin@local.host' -echo '5iveL!fe' \ No newline at end of file From 42032956bd4d51bd954762a6f1192f20d6375885 Mon Sep 17 00:00:00 2001 From: randx Date: Tue, 4 Sep 2012 20:50:00 +0300 Subject: [PATCH 144/357] Cleaner install section for nginx, unicorn --- doc/installation.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/installation.md b/doc/installation.md index 462fbc57..327fc192 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -246,18 +246,18 @@ You can login via web using admin generated with setup: # Nginx && Unicorn -### Install Nginx - - sudo apt-get install nginx - -## Unicorn +## 1. Unicorn cd /home/gitlab/gitlab sudo -u gitlab cp config/unicorn.rb.orig config/unicorn.rb sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D -Add GitLab to nginx sites & change with your host specific settings +## 2. Nginx + # Install first + sudo apt-get install nginx + + # Add GitLab to nginx sites & change with your host specific settings sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/nginx/gitlab -P /etc/nginx/sites-available/ sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab @@ -266,16 +266,15 @@ Add GitLab to nginx sites & change with your host specific settings # of the host serving GitLab. sudo vim /etc/nginx/sites-enabled/gitlab -Restart nginx: + # Restart nginx: /etc/init.d/nginx restart +## 3. Init script + Create init script in /etc/init.d/gitlab: sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/init.d/gitlab -P /etc/init.d/ - -Adding permission: - sudo chmod +x /etc/init.d/gitlab GitLab autostart: From 36738897bf06937056285b0eeabef13928d4d704 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 4 Sep 2012 23:57:39 -0400 Subject: [PATCH 145/357] Add specs for Project#discover_default_branch --- spec/roles/repository_spec.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/spec/roles/repository_spec.rb b/spec/roles/repository_spec.rb index 62aecc13..579425d7 100644 --- a/spec/roles/repository_spec.rb +++ b/spec/roles/repository_spec.rb @@ -19,4 +19,30 @@ describe Project, "Repository" do project.should_not be_empty_repo end end + + describe "#discover_default_branch" do + let(:master) { double(name: 'master') } + let(:stable) { double(name: 'stable') } + + it "returns 'master' when master exists" do + project.should_receive(:heads).and_return([stable, master]) + project.discover_default_branch.should == 'master' + end + + it "returns non-master when master exists but default branch is set to something else" do + project.default_branch = 'stable' + project.should_receive(:heads).and_return([stable, master]) + project.discover_default_branch.should == 'stable' + end + + it "returns a non-master branch when only one exists" do + project.should_receive(:heads).and_return([stable]) + project.discover_default_branch.should == 'stable' + end + + it "returns nil when no branch exists" do + project.should_receive(:heads).and_return([]) + project.discover_default_branch.should be_nil + end + end end From f06d98e907f71dc9b3a4a2da0db1c096b6c07024 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 01:00:07 -0400 Subject: [PATCH 146/357] Add SetDefaultBranchDefaultToNil migration default_branch now defaults to nil, not 'master'. It will be set after the first push by discover_default_branch. --- app/models/project.rb | 2 +- ...043334_set_default_branch_default_to_nil.rb | 12 ++++++++++++ db/schema.rb | 18 +++++++++--------- 3 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 db/migrate/20120905043334_set_default_branch_default_to_nil.rb diff --git a/app/models/project.rb b/app/models/project.rb index a7735a42..fc18ad55 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -187,7 +187,7 @@ end # private_flag :boolean(1) default(TRUE), not null # code :string(255) # owner_id :integer(4) -# default_branch :string(255) default("master"), not null +# default_branch :string(255) # issues_enabled :boolean(1) default(TRUE), not null # wall_enabled :boolean(1) default(TRUE), not null # merge_requests_enabled :boolean(1) default(TRUE), not null diff --git a/db/migrate/20120905043334_set_default_branch_default_to_nil.rb b/db/migrate/20120905043334_set_default_branch_default_to_nil.rb new file mode 100644 index 00000000..f5956fe8 --- /dev/null +++ b/db/migrate/20120905043334_set_default_branch_default_to_nil.rb @@ -0,0 +1,12 @@ +class SetDefaultBranchDefaultToNil < ActiveRecord::Migration + def up + # Set the default_branch to allow nil, and default it to nil + change_column_null(:projects, :default_branch, true) + change_column_default(:projects, :default_branch, nil) + end + + def down + change_column_null(:projects, :default_branch, false) + change_column_default(:projects, :default_branch, 'master') + end +end diff --git a/db/schema.rb b/db/schema.rb index 46461e44..00bb5523 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120729131232) do +ActiveRecord::Schema.define(:version => 20120905043334) do create_table "events", :force => true do |t| t.string "target_type" @@ -98,16 +98,16 @@ ActiveRecord::Schema.define(:version => 20120729131232) do t.string "name" t.string "path" t.text "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.boolean "private_flag", :default => true, :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.boolean "private_flag", :default => true, :null => false t.string "code" t.integer "owner_id" - t.string "default_branch", :default => "master", :null => false - t.boolean "issues_enabled", :default => true, :null => false - t.boolean "wall_enabled", :default => true, :null => false - t.boolean "merge_requests_enabled", :default => true, :null => false - t.boolean "wiki_enabled", :default => true, :null => false + t.string "default_branch" + t.boolean "issues_enabled", :default => true, :null => false + t.boolean "wall_enabled", :default => true, :null => false + t.boolean "merge_requests_enabled", :default => true, :null => false + t.boolean "wiki_enabled", :default => true, :null => false end create_table "protected_branches", :force => true do |t| From 443e23e61a10f34e9eccc3b6e91803a0996f5050 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 01:01:20 -0400 Subject: [PATCH 147/357] Add Repository#discover_default_branch and add it to PushObserver --- app/roles/push_observer.rb | 16 ++++++++++++---- app/roles/repository.rb | 24 +++++++++++++++++++++--- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/roles/push_observer.rb b/app/roles/push_observer.rb index 1067404d..947ed423 100644 --- a/app/roles/push_observer.rb +++ b/app/roles/push_observer.rb @@ -1,3 +1,6 @@ +# Includes methods for handling Git Push events +# +# Triggered by PostReceive job module PushObserver def observe_push(oldrev, newrev, ref, user) data = post_receive_data(oldrev, newrev, ref, user) @@ -84,11 +87,10 @@ module PushObserver data end - - # This method will be called after each post receive - # and only if user present in gitlab. - # All callbacks for post receive should be placed here + # This method will be called after each post receive and only if the provided + # user is present in GitLab. # + # All callbacks for post receive should be placed here. def trigger_post_receive(oldrev, newrev, ref, user) # Create push event self.observe_push(oldrev, newrev, ref, user) @@ -101,5 +103,11 @@ module PushObserver # Create satellite self.satellite.create unless self.satellite.exists? + + # Discover the default branch, but only if it hasn't already been set to + # something else + if default_branch.nil? + update_attributes(default_branch: discover_default_branch) + end end end diff --git a/app/roles/repository.rb b/app/roles/repository.rb index 5f6c3541..a77de4ad 100644 --- a/app/roles/repository.rb +++ b/app/roles/repository.rb @@ -94,6 +94,24 @@ module Repository end.sort_by(&:name) end + # Discovers the default branch based on the repository's available branches + # + # - If no branches are present, returns nil + # - If one branch is present, returns its name + # - If two or more branches are present, returns the one that has a name + # matching root_ref (default_branch or 'master' if default_branch is nil) + def discover_default_branch + branches = heads.collect(&:name) + + if branches.length == 0 + nil + elsif branches.length == 1 + branches.first + else + branches.select { |v| v == root_ref }.first + end + end + def has_commits? !!commit end @@ -102,7 +120,7 @@ module Repository default_branch || "master" end - def root_ref? branch + def root_ref?(branch) root_ref == branch end @@ -111,7 +129,7 @@ module Repository # Already packed repo archives stored at # app_root/tmp/repositories/project_name/project_name-commit-id.tag.gz # - def archive_repo ref + def archive_repo(ref) ref = ref || self.root_ref commit = self.commit(ref) return nil unless commit @@ -138,6 +156,6 @@ module Repository end def http_url_to_repo - http_url = [Gitlab.config.url, "/", path, ".git"].join() + http_url = [Gitlab.config.url, "/", path, ".git"].join('') end end From 861a51488a44eac143ac4f44802fdf05fbd8f4c1 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 01:02:30 -0400 Subject: [PATCH 148/357] Add specs for a couple more Repository methods used by discover_default_branch --- spec/roles/repository_spec.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/spec/roles/repository_spec.rb b/spec/roles/repository_spec.rb index 579425d7..0fda57a3 100644 --- a/spec/roles/repository_spec.rb +++ b/spec/roles/repository_spec.rb @@ -45,4 +45,28 @@ describe Project, "Repository" do project.discover_default_branch.should be_nil end end + + describe "#root_ref" do + it "returns default_branch when set" do + project.default_branch = 'stable' + project.root_ref.should == 'stable' + end + + it "returns 'master' when default_branch is nil" do + project.default_branch = nil + project.root_ref.should == 'master' + end + end + + describe "#root_ref?" do + it "returns true when branch is root_ref" do + project.default_branch = 'stable' + project.root_ref?('stable').should be_true + end + + it "returns false when branch is not root_ref" do + project.default_branch = nil + project.root_ref?('stable').should be_false + end + end end From a9f275bc201e666b9f26768aa228aca8250d5a94 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 01:12:44 -0400 Subject: [PATCH 149/357] Fix load_refs in ApplicationController after default_branch change As a last resort it was calling a method that didn't exist. Woops! --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d53b23bb..dae2e906 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -124,7 +124,7 @@ class ApplicationController < ActionController::Base if params[:ref].blank? @branch = params[:branch].blank? ? nil : params[:branch] @tag = params[:tag].blank? ? nil : params[:tag] - @ref = @branch || @tag || @project.try(:default_branch) || Repository.default_ref + @ref = @branch || @tag || @project.try(:default_branch) || 'master' else @ref = params[:ref] end From 5e1c63d3f0f0729a1d9d9e19c64b2fef65cc30fb Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 01:13:41 -0400 Subject: [PATCH 150/357] Move load_refs out of ApplicationController and into CommitsController That was the only place it was used. --- app/controllers/application_controller.rb | 10 ---------- app/controllers/commits_controller.rb | 14 +++++++++++++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index dae2e906..7e53b8fe 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -120,16 +120,6 @@ class ApplicationController < ActionController::Base end end - def load_refs - if params[:ref].blank? - @branch = params[:branch].blank? ? nil : params[:branch] - @tag = params[:tag].blank? ? nil : params[:tag] - @ref = @branch || @tag || @project.try(:default_branch) || 'master' - else - @ref = params[:ref] - end - end - def render_404 render file: File.join(Rails.root, "public", "404"), layout: false, status: "404" end diff --git a/app/controllers/commits_controller.rb b/app/controllers/commits_controller.rb index 717912d9..5e10a1b6 100644 --- a/app/controllers/commits_controller.rb +++ b/app/controllers/commits_controller.rb @@ -59,7 +59,7 @@ class CommitsController < ApplicationController def patch @commit = project.commit(params[:id]) - + send_data( @commit.to_patch, type: "text/plain", @@ -67,4 +67,16 @@ class CommitsController < ApplicationController filename: (@commit.id.to_s + ".patch") ) end + + protected + + def load_refs + if params[:ref].blank? + @branch = params[:branch].blank? ? nil : params[:branch] + @tag = params[:tag].blank? ? nil : params[:tag] + @ref = @branch || @tag || @project.try(:default_branch) || 'master' + else + @ref = params[:ref] + end + end end From 982a4095c193a9256b76ffcc40526e726eac14d1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 5 Sep 2012 08:56:59 +0300 Subject: [PATCH 151/357] Use tw style for some buttons. Improved deploy key UI --- .../stylesheets/gitlab_bootstrap/buttons.scss | 26 +++++-------------- app/assets/stylesheets/main.scss | 7 +++++ app/views/deploy_keys/_form.html.haml | 13 +++++++--- app/views/deploy_keys/index.html.haml | 14 +++++++--- app/views/deploy_keys/new.html.haml | 2 +- app/views/deploy_keys/show.html.haml | 13 +++++++--- app/views/keys/show.html.haml | 2 +- app/views/team_members/show.html.haml | 2 +- 8 files changed, 46 insertions(+), 33 deletions(-) diff --git a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss index c838f3b2..380fc3e3 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/buttons.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/buttons.scss @@ -1,8 +1,5 @@ .btn { - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #f7f7f7), to(#d5d5d5)); - background-image: -webkit-linear-gradient(#f7f7f7 7.6%, #d5d5d5); - background-image: -moz-linear-gradient(#f7f7f7 7.6%, #d5d5d5); - background-image: -o-linear-gradient(#f7f7f7 7.6%, #d5d5d5); + @include bg-gradient(#f7f7f7, #d5d5d5); border-color:#aaa; &:hover { @include bg-gray-gradient; @@ -12,10 +9,8 @@ &.primary { background:#2a79A3; + @include bg-gradient(#47A7b7, #2585b5); border-color: #2A79A3; - background-image: -webkit-linear-gradient(#47A7b7 7.6%, #2585b5); - background-image: -moz-linear-gradient(#47A7b7 7.6%, #2585b5); - background-image: -o-linear-gradient(#47A7b7 7.6%, #2585b5); color:#fff; text-shadow: 0 1px 1px #268; &:hover { @@ -30,16 +25,11 @@ } &.success { - border-color: #4A4; - background-image: -webkit-linear-gradient(#82D482 7.6%, #22B442); - background-image: -moz-linear-gradient(#82D482 7.6%, #22B442); - background-image: -o-linear-gradient(#82D482 7.6%, #22B442); - color: #fff; - text-shadow: 0 1px 1px #141; + @extend .btn-success; &:hover { - background: #6C6; - color: #fff; + @extend .btn-success; + background: #51a351; } &.disabled { @@ -62,10 +52,8 @@ padding-right:30px; } - &.danger, - &.btn-danger { - color:#fff; - background: #DA4E49; + &.danger { + @extend .btn-danger; border-color: #BD362F; &:hover { diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index be27d754..abd1ddf9 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -56,6 +56,13 @@ $hover: #fdf5d9; border-radius: $radius; } +@mixin bg-gradient($from, $to) { + background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to)); + background-image: -webkit-linear-gradient($from, $to); + background-image: -moz-linear-gradient($from, $to); + background-image: -o-linear-gradient($from, $to); +} + @mixin bg-gray-gradient { background:#eee; background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); diff --git a/app/views/deploy_keys/_form.html.haml b/app/views/deploy_keys/_form.html.haml index 461f1f5d..6beba562 100644 --- a/app/views/deploy_keys/_form.html.haml +++ b/app/views/deploy_keys/_form.html.haml @@ -11,8 +11,13 @@ .input= f.text_field :title .clearfix = f.label :key - .input= f.text_area :key, class: "xlarge" - .actions - = f.submit 'Save', class: "primary btn" - = link_to "Cancel", project_deploy_keys_path(@project), class: "btn" + .input + = f.text_area :key, class: [:xxlarge, :thin_area] + %p.hint + Paste a machine public key here. Read more about how generate it + = link_to "here", help_ssh_path + + .actions + = f.submit 'Save', class: "save-btn btn" + = link_to "Cancel", project_deploy_keys_path(@project), class: "btn cancel-btn" diff --git a/app/views/deploy_keys/index.html.haml b/app/views/deploy_keys/index.html.haml index 0ee9d03b..b9c654a1 100644 --- a/app/views/deploy_keys/index.html.haml +++ b/app/views/deploy_keys/index.html.haml @@ -1,11 +1,17 @@ = render "repositories/head" -- if can? current_user, :admin_project, @project - .alert-message.block-message - Deploy keys allow read-only access to repository. + +%p.slead + Deploy keys allow read-only access to repository. It matches perfectly for CI, staging or production servers. + + - if can? current_user, :admin_project, @project = link_to new_project_deploy_key_path(@project), class: "btn small", title: "New Deploy Key" do Add Deploy Key - - if @keys.any? %table + %thead + %tr + %th Keys + %th + %th - @keys.each do |key| = render(partial: 'show', locals: {key: key}) diff --git a/app/views/deploy_keys/new.html.haml b/app/views/deploy_keys/new.html.haml index a2f1010b..e973cb7d 100644 --- a/app/views/deploy_keys/new.html.haml +++ b/app/views/deploy_keys/new.html.haml @@ -1,6 +1,6 @@ = render "repositories/head" -%h3 New Deploy key +%h3.page_title New Deploy key %hr = render 'form' diff --git a/app/views/deploy_keys/show.html.haml b/app/views/deploy_keys/show.html.haml index b1e0dc5c..c94cf10d 100644 --- a/app/views/deploy_keys/show.html.haml +++ b/app/views/deploy_keys/show.html.haml @@ -1,7 +1,14 @@ = render "repositories/head" -%h3= @key.title +%h3.page_title + Deploy key: + = @key.title + %small + created at + = @key.created_at.stamp("Aug 21, 2011") +.back_link + = link_to project_deploy_keys_path(@project) do + ← To keys list %hr %pre= @key.key -.actions +.right = link_to 'Remove', project_deploy_key_path(@key.project, @key), confirm: 'Are you sure?', method: :delete, class: "danger btn delete-key" - .clear diff --git a/app/views/keys/show.html.haml b/app/views/keys/show.html.haml index ffd52b96..a8cba6c8 100644 --- a/app/views/keys/show.html.haml +++ b/app/views/keys/show.html.haml @@ -10,5 +10,5 @@ %hr %pre= @key.key -.actions +.right = link_to 'Remove', @key, confirm: 'Are you sure?', method: :delete, class: "btn danger delete-key" diff --git a/app/views/team_members/show.html.haml b/app/views/team_members/show.html.haml index 89662309..3b5c78a8 100644 --- a/app/views/team_members/show.html.haml +++ b/app/views/team_members/show.html.haml @@ -3,7 +3,7 @@ .team_member_show - if can? current_user, :admin_project, @project - = link_to 'Remove from team', project_team_member_path(project_id: @project, id: @team_member.id), confirm: 'Are you sure?', method: :delete, class: "right btn btn-danger" + = link_to 'Remove from team', project_team_member_path(project_id: @project, id: @team_member.id), confirm: 'Are you sure?', method: :delete, class: "right btn danger" .profile_avatar_holder = image_tag gravatar_icon(user.email, 60), class: "borders" %h3 From 761c17f282c51baa6bc8e3ec169bc09dfaa43b83 Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Wed, 5 Sep 2012 09:20:02 +0300 Subject: [PATCH 152/357] Unused routes removed --- config/routes.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 51e65721..ed5eac0d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -50,10 +50,6 @@ Gitlab::Application.routes.draw do end end resources :team_members, :only => [:edit, :update, :destroy] - get 'mailer/preview_note' - get 'mailer/preview_user_new' - get 'mailer/preview_issue_new' - resources :hooks, :only => [:index, :create, :destroy] do get :test end From 9b9dd3f9bf62e8b116213012b766abcaef3e641e Mon Sep 17 00:00:00 2001 From: Alex Denisov <1101.debian@gmail.com> Date: Wed, 5 Sep 2012 11:44:47 +0300 Subject: [PATCH 153/357] Unnecessary code removed --- lib/api/projects.rb | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 45c25127..d45d1d82 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -38,17 +38,15 @@ module Gitlab # Example Request # POST /projects post do - @project = Project.create_by_user({ - name: params[:name], - code: (params[:code] || params[:name]), - path: (params[:path] || params[:name]), - description: (params[:description] || Project.columns_hash["description"].default), - default_branch: (params[:default_branch] || Project.columns_hash["default_branch"].default), - issues_enabled: (params[:issues_enabled] || Project.columns_hash["issues_enabled"].default), - wall_enabled: (params[:wall_enabled] || Project.columns_hash["wall_enabled"].default), - merge_requests_enabled: (params[:merge_requests_enabled] || Project.columns_hash["merge_requests_enabled"].default), - wiki_enabled: (params[:wiki_enabled] || Project.columns_hash["wiki_enabled"].default) - }, current_user) + params[:code] ||= params[:name] + params[:path] ||= params[:name] + project_attrs = {} + params.each_pair do |k ,v| + if Project.attribute_names.include? k + project_attrs[k] = v + end + end + @project = Project.create_by_user(project_attrs, current_user) if @project.saved? present @project, with: Entities::Project else From 2680371785bfac1d0b76e5c4e53aa1074f743f84 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Wed, 5 Sep 2012 03:05:57 -0700 Subject: [PATCH 154/357] bump shoulda-matchers --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7ec37f59..f350b3fc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -323,7 +323,7 @@ GEM multi_json (~> 1.0) rubyzip settingslogic (2.0.8) - shoulda-matchers (1.1.0) + shoulda-matchers (1.3.0) activesupport (>= 3.0.0) simplecov (0.6.4) multi_json (~> 1.0) From 0b559cdece743269a7087c8206ab2cc587ec15f2 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Wed, 5 Sep 2012 03:14:24 -0700 Subject: [PATCH 155/357] add validations for boolean attributes --- app/models/project.rb | 2 ++ app/roles/issue_commonality.rb | 2 +- spec/models/issue_spec.rb | 1 + spec/models/milestone_spec.rb | 1 + spec/models/project_spec.rb | 8 ++++++-- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index fc18ad55..4de836c7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -104,6 +104,8 @@ class Project < ActiveRecord::Base length: { within: 1..255 } validates :owner, presence: true + validates :issues_enabled, :wall_enabled, :merge_requests_enabled, + :wiki_enabled, inclusion: { in: [true, false] } validate :check_limit validate :repo_name diff --git a/app/roles/issue_commonality.rb b/app/roles/issue_commonality.rb index a8fd679d..ac972a70 100644 --- a/app/roles/issue_commonality.rb +++ b/app/roles/issue_commonality.rb @@ -16,7 +16,7 @@ module IssueCommonality validates :title, presence: true, length: { within: 0..255 } - + validates :closed, inclusion: { in: [true, false] } scope :opened, where(closed: false) scope :closed, where(closed: true) diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 69829a4d..ca6307e7 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -7,6 +7,7 @@ describe Issue do describe "Validation" do it { should ensure_length_of(:description).is_within(0..2000) } + it { should ensure_inclusion_of(:closed).in_array([true, false]) } end describe 'modules' do diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index fa15fc8f..f0f0f883 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -9,6 +9,7 @@ describe Milestone do describe "Validation" do it { should validate_presence_of(:title) } it { should validate_presence_of(:project_id) } + it { should ensure_inclusion_of(:closed).in_array([true, false]) } end let(:milestone) { Factory :milestone } diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 5add7ff8..756f69de 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -37,6 +37,10 @@ describe Project do # TODO: Formats it { should validate_presence_of(:owner) } + it { should ensure_inclusion_of(:issues_enabled).in_array([true, false]) } + it { should ensure_inclusion_of(:wall_enabled).in_array([true, false]) } + it { should ensure_inclusion_of(:merge_requests_enabled).in_array([true, false]) } + it { should ensure_inclusion_of(:wiki_enabled).in_array([true, false]) } it "should not allow new projects beyond user limits" do project.stub(:owner).and_return(double(can_create_project?: false, projects_limit: 1)) @@ -239,7 +243,7 @@ describe Project do end end - describe :update_merge_requests do + describe :update_merge_requests do let(:project) { Factory :project } before do @@ -259,7 +263,7 @@ describe Project do @merge_request.closed.should be_true end - it "should update merge request commits with new one if pushed to source branch" do + it "should update merge request commits with new one if pushed to source branch" do @merge_request.last_commit.should == nil project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/master", @key.user) @merge_request.reload From 21bfd1e7fc91ce9a1aa34582381c1dec716607f8 Mon Sep 17 00:00:00 2001 From: randx Date: Wed, 5 Sep 2012 23:00:10 +0300 Subject: [PATCH 156/357] minor css improvements --- .../stylesheets/gitlab_bootstrap/files.scss | 2 +- app/assets/stylesheets/sections/header.scss | 4 ++-- app/assets/stylesheets/sections/nav.scss | 24 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/assets/stylesheets/gitlab_bootstrap/files.scss b/app/assets/stylesheets/gitlab_bootstrap/files.scss index 83903c53..d39fdb27 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/files.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/files.scss @@ -3,7 +3,7 @@ * */ .file_holder { - border:1px solid #CCC; + border:1px solid #BBB; margin-bottom:1em; @include solid_shade; diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index d0fb662e..8328a5ab 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -22,7 +22,7 @@ header { * */ .app_logo { - width:230px; + width:200px; float:left; position:relative; top:-5px; @@ -31,7 +31,7 @@ header { h1 { padding-top: 5px; - width:102px; + width:90px; background: url('logo_dark.png') no-repeat 0px -3px; float:left; margin-left:5px; diff --git a/app/assets/stylesheets/sections/nav.scss b/app/assets/stylesheets/sections/nav.scss index 097e8197..6f6a0e8e 100644 --- a/app/assets/stylesheets/sections/nav.scss +++ b/app/assets/stylesheets/sections/nav.scss @@ -2,7 +2,7 @@ * Main Menu of Application * */ -ul.main_menu { +ul.main_menu { border-radius: 4px; margin: auto; margin:30px 0; @@ -12,7 +12,7 @@ ul.main_menu { position:relative; overflow:hidden; @include shade; - .count { + .count { position: relative; top: -1px; display: inline-block; @@ -29,12 +29,12 @@ ul.main_menu { border-radius: 8px; -moz-border-radius: 8px; } - .label { + .label { background:$hover; text-shadow:none; color:$style_color; } - li { + li { list-style-type: none; margin: 0; display: table-cell; @@ -43,7 +43,7 @@ ul.main_menu { border-left: 1px solid #EEE; border-bottom:2px solid #CFCFCF; - &:first-child{ + &:first-child{ -webkit-border-top-left-radius: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-topleft: 4px; @@ -53,31 +53,31 @@ ul.main_menu { border-left: 0; } - &.current { + &.current { background-color:#D5D5D5; - border-bottom: 2px solid $style_color; + border-bottom: 1px solid #AAA; border-right: 1px solid #BBB; border-left: 1px solid #BBB; border-radius: 0 0 1px 1px; - &:first-child{ + &:first-child{ border-bottom:none; border-left:none; } } - &.home { - a { + &.home { + a { background: url(home_icon.PNG) no-repeat center center; text-indent:-9999px; min-width:20px; - img { + img { position:relative; top:4px; } } } } - a { + a { display: block; text-align: center; font-weight:bold; From 8f7360f3901ae27a457f252b1a9a091a857434ee Mon Sep 17 00:00:00 2001 From: miks Date: Wed, 5 Sep 2012 23:01:03 +0300 Subject: [PATCH 157/357] API on adding users to project implemented --- doc/api/projects.md | 15 +++++++++++++++ lib/api/projects.rb | 12 ++++++++++++ spec/requests/api/projects_spec.rb | 12 ++++++++++++ 3 files changed, 39 insertions(+) diff --git a/doc/api/projects.md b/doc/api/projects.md index e029522b..85b88d40 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -106,6 +106,21 @@ Parameters: Will return created project with status `201 Created` on success, or `404 Not found` on fail. +## Add project users + +Add users to exiting project + +``` +PUT /projects/:id/add_users +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `user_ids` (required) - new project name ++ `project_access` (required) - new project name + +Will return updated project with status `200 OK` on success, or `404 Not found` on fail. ## Project repository branches diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 3d4fde92..46e688e4 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -44,6 +44,18 @@ module Gitlab end end + # Add users to project with specified access level + # + # Parameters: + # id (required) - The ID or code name of a project + # user_ids (required) - The ID list of users to add + # project_access (required) - Project access level + # Example Request: + # PUT /projects/:id/add_users + put ":id/add_users" do + user_project.add_users_ids_to_team(params[:user_ids], params[:project_access]) + end + # Get a project repository branches # # Parameters: diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index cc6843cc..f8434654 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -62,6 +62,18 @@ describe Gitlab::API do end end + describe "PUT /projects/:id/add_users" do + @user2 = Factory :user + @user3 = Factory :user + + it "should add users to existing project" do + expect { + put api("/projects/#{project.code}/add_users", user), + user_ids: [@user2.id, @user3.id], project_access: UsersProject::DEVELOPER + }.to change {Project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) + end + end + describe "GET /projects/:id" do it "should return a project by id" do get api("/projects/#{project.id}", user) From d480a478c1cb1246e1dad80cc438c5556a3eb33f Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 5 Sep 2012 16:04:41 -0400 Subject: [PATCH 158/357] Add emoji image files --- app/assets/images/emoji/+1.png | Bin 0 -> 5135 bytes app/assets/images/emoji/-1.png | Bin 0 -> 5070 bytes app/assets/images/emoji/100.png | Bin 0 -> 3302 bytes app/assets/images/emoji/109.png | Bin 0 -> 3698 bytes app/assets/images/emoji/1234.png | Bin 0 -> 4751 bytes app/assets/images/emoji/8ball.png | Bin 0 -> 4141 bytes app/assets/images/emoji/a.png | Bin 0 -> 3154 bytes app/assets/images/emoji/ab.png | Bin 0 -> 3859 bytes app/assets/images/emoji/abc.png | Bin 0 -> 4247 bytes app/assets/images/emoji/abcd.png | Bin 0 -> 4471 bytes app/assets/images/emoji/accept.png | Bin 0 -> 4729 bytes app/assets/images/emoji/aerial_tramway.png | Bin 0 -> 3489 bytes app/assets/images/emoji/airplane.png | Bin 0 -> 4740 bytes app/assets/images/emoji/alarm_clock.png | Bin 0 -> 7062 bytes app/assets/images/emoji/alien.png | Bin 0 -> 5457 bytes app/assets/images/emoji/ambulance.png | Bin 0 -> 3708 bytes app/assets/images/emoji/anchor.png | Bin 0 -> 4479 bytes app/assets/images/emoji/angel.png | Bin 0 -> 6672 bytes app/assets/images/emoji/anger.png | Bin 0 -> 3079 bytes app/assets/images/emoji/angry.png | Bin 0 -> 5037 bytes app/assets/images/emoji/ant.png | Bin 0 -> 2851 bytes app/assets/images/emoji/apple.png | Bin 0 -> 5630 bytes app/assets/images/emoji/aquarius.png | Bin 0 -> 5096 bytes app/assets/images/emoji/aries.png | Bin 0 -> 4345 bytes app/assets/images/emoji/arrow_backward.png | Bin 0 -> 3180 bytes app/assets/images/emoji/arrow_double_down.png | Bin 0 -> 3179 bytes app/assets/images/emoji/arrow_double_up.png | Bin 0 -> 3613 bytes app/assets/images/emoji/arrow_down.png | Bin 0 -> 3006 bytes app/assets/images/emoji/arrow_down_small.png | Bin 0 -> 2934 bytes app/assets/images/emoji/arrow_forward.png | Bin 0 -> 3201 bytes app/assets/images/emoji/arrow_heading_down.png | Bin 0 -> 3521 bytes app/assets/images/emoji/arrow_heading_up.png | Bin 0 -> 3520 bytes app/assets/images/emoji/arrow_left.png | Bin 0 -> 3041 bytes app/assets/images/emoji/arrow_lower_left.png | Bin 0 -> 3342 bytes app/assets/images/emoji/arrow_lower_right.png | Bin 0 -> 3334 bytes app/assets/images/emoji/arrow_right.png | Bin 0 -> 3022 bytes app/assets/images/emoji/arrow_right_hook.png | Bin 0 -> 3712 bytes app/assets/images/emoji/arrow_up.png | Bin 0 -> 3073 bytes app/assets/images/emoji/arrow_up_down.png | Bin 0 -> 3544 bytes app/assets/images/emoji/arrow_up_small.png | Bin 0 -> 3198 bytes app/assets/images/emoji/arrow_upper_left.png | Bin 0 -> 3228 bytes app/assets/images/emoji/arrow_upper_right.png | Bin 0 -> 3235 bytes app/assets/images/emoji/arrows_clockwise.png | Bin 0 -> 1399 bytes .../images/emoji/arrows_counterclockwise.png | Bin 0 -> 4823 bytes app/assets/images/emoji/art.png | Bin 0 -> 6744 bytes app/assets/images/emoji/articulated_lorry.png | Bin 0 -> 2938 bytes app/assets/images/emoji/astonished.png | Bin 0 -> 6043 bytes app/assets/images/emoji/atm.png | Bin 0 -> 4072 bytes app/assets/images/emoji/b.png | Bin 0 -> 3025 bytes app/assets/images/emoji/baby.png | Bin 0 -> 5921 bytes app/assets/images/emoji/baby_bottle.png | Bin 0 -> 4461 bytes app/assets/images/emoji/baby_chick.png | Bin 0 -> 3961 bytes app/assets/images/emoji/baby_symbol.png | Bin 0 -> 2967 bytes app/assets/images/emoji/baggage_claim.png | Bin 0 -> 3502 bytes app/assets/images/emoji/balloon.png | Bin 0 -> 2300 bytes .../images/emoji/ballot_box_with_check.png | Bin 0 -> 1829 bytes app/assets/images/emoji/bamboo.png | Bin 0 -> 4672 bytes app/assets/images/emoji/banana.png | Bin 0 -> 3915 bytes app/assets/images/emoji/bangbang.png | Bin 0 -> 1387 bytes app/assets/images/emoji/bank.png | Bin 0 -> 5583 bytes app/assets/images/emoji/bar_chart.png | Bin 0 -> 2460 bytes app/assets/images/emoji/barber.png | Bin 0 -> 4252 bytes app/assets/images/emoji/baseball.png | Bin 0 -> 6032 bytes app/assets/images/emoji/basketball.png | Bin 0 -> 6386 bytes app/assets/images/emoji/bath.png | Bin 0 -> 3210 bytes app/assets/images/emoji/bathtub.png | Bin 0 -> 2784 bytes app/assets/images/emoji/battery.png | Bin 0 -> 3812 bytes app/assets/images/emoji/bear.png | Bin 0 -> 5561 bytes app/assets/images/emoji/beer.png | Bin 0 -> 6097 bytes app/assets/images/emoji/beers.png | Bin 0 -> 6591 bytes app/assets/images/emoji/beetle.png | Bin 0 -> 5255 bytes app/assets/images/emoji/beginner.png | Bin 0 -> 2761 bytes app/assets/images/emoji/bell.png | Bin 0 -> 4859 bytes app/assets/images/emoji/bento.png | Bin 0 -> 5732 bytes app/assets/images/emoji/bicyclist.png | Bin 0 -> 6484 bytes app/assets/images/emoji/bike.png | Bin 0 -> 4722 bytes app/assets/images/emoji/bikini.png | Bin 0 -> 3890 bytes app/assets/images/emoji/bird.png | Bin 0 -> 4878 bytes app/assets/images/emoji/birthday.png | Bin 0 -> 5404 bytes app/assets/images/emoji/black_circle.png | Bin 0 -> 2369 bytes app/assets/images/emoji/black_joker.png | Bin 0 -> 3877 bytes app/assets/images/emoji/black_nib.png | Bin 0 -> 2352 bytes app/assets/images/emoji/black_square.png | Bin 0 -> 1332 bytes app/assets/images/emoji/blossom.png | Bin 0 -> 4232 bytes app/assets/images/emoji/blowfish.png | Bin 0 -> 3751 bytes app/assets/images/emoji/blue_book.png | Bin 0 -> 5092 bytes app/assets/images/emoji/blue_car.png | Bin 0 -> 4081 bytes app/assets/images/emoji/blue_heart.png | Bin 0 -> 4094 bytes app/assets/images/emoji/blush.png | Bin 0 -> 5188 bytes app/assets/images/emoji/boar.png | Bin 0 -> 4840 bytes app/assets/images/emoji/boat.png | Bin 0 -> 3833 bytes app/assets/images/emoji/bomb.png | Bin 0 -> 5208 bytes app/assets/images/emoji/book.png | Bin 0 -> 6050 bytes app/assets/images/emoji/bookmark.png | Bin 0 -> 4696 bytes app/assets/images/emoji/bookmark_tabs.png | Bin 0 -> 3162 bytes app/assets/images/emoji/books.png | Bin 0 -> 6539 bytes app/assets/images/emoji/boot.png | Bin 0 -> 3327 bytes app/assets/images/emoji/bouquet.png | Bin 0 -> 6915 bytes app/assets/images/emoji/bow.png | Bin 0 -> 5143 bytes app/assets/images/emoji/bowling.png | Bin 0 -> 4184 bytes app/assets/images/emoji/bowtie.png | Bin 0 -> 6478 bytes app/assets/images/emoji/boy.png | Bin 0 -> 5946 bytes app/assets/images/emoji/bread.png | Bin 0 -> 6214 bytes app/assets/images/emoji/bride_with_veil.png | Bin 0 -> 8515 bytes app/assets/images/emoji/bridge_at_night.png | Bin 0 -> 5137 bytes app/assets/images/emoji/briefcase.png | Bin 0 -> 2698 bytes app/assets/images/emoji/broken_heart.png | Bin 0 -> 4118 bytes app/assets/images/emoji/bug.png | Bin 0 -> 5945 bytes app/assets/images/emoji/bulb.png | Bin 0 -> 4490 bytes app/assets/images/emoji/bullettrain_front.png | Bin 0 -> 4992 bytes app/assets/images/emoji/bullettrain_side.png | Bin 0 -> 3842 bytes app/assets/images/emoji/bus.png | Bin 0 -> 4065 bytes app/assets/images/emoji/busstop.png | Bin 0 -> 1676 bytes app/assets/images/emoji/bust_in_silhouette.png | Bin 0 -> 2007 bytes app/assets/images/emoji/busts_in_silhouette.png | Bin 0 -> 3021 bytes app/assets/images/emoji/cactus.png | Bin 0 -> 4509 bytes app/assets/images/emoji/cake.png | Bin 0 -> 6129 bytes app/assets/images/emoji/calendar.png | Bin 0 -> 2920 bytes app/assets/images/emoji/calling.png | Bin 0 -> 4037 bytes app/assets/images/emoji/camel.png | Bin 0 -> 4485 bytes app/assets/images/emoji/camera.png | Bin 0 -> 4661 bytes app/assets/images/emoji/cancer.png | Bin 0 -> 5384 bytes app/assets/images/emoji/candy.png | Bin 0 -> 4502 bytes app/assets/images/emoji/capital_abcd.png | Bin 0 -> 5136 bytes app/assets/images/emoji/capricorn.png | Bin 0 -> 4670 bytes app/assets/images/emoji/car.png | Bin 0 -> 4278 bytes app/assets/images/emoji/card_index.png | Bin 0 -> 3749 bytes app/assets/images/emoji/carousel_horse.png | Bin 0 -> 5893 bytes app/assets/images/emoji/cat.png | Bin 0 -> 5987 bytes app/assets/images/emoji/cat2.png | Bin 0 -> 5723 bytes app/assets/images/emoji/cd.png | Bin 0 -> 6718 bytes app/assets/images/emoji/chart.png | Bin 0 -> 4331 bytes .../images/emoji/chart_with_downwards_trend.png | Bin 0 -> 2910 bytes .../images/emoji/chart_with_upwards_trend.png | Bin 0 -> 2939 bytes app/assets/images/emoji/checkered_flag.png | Bin 0 -> 1675 bytes app/assets/images/emoji/cherries.png | Bin 0 -> 5604 bytes app/assets/images/emoji/cherry_blossom.png | Bin 0 -> 7174 bytes app/assets/images/emoji/chestnut.png | Bin 0 -> 5875 bytes app/assets/images/emoji/chicken.png | Bin 0 -> 3988 bytes app/assets/images/emoji/children_crossing.png | Bin 0 -> 3460 bytes app/assets/images/emoji/chocolate_bar.png | Bin 0 -> 5249 bytes app/assets/images/emoji/christmas_tree.png | Bin 0 -> 4721 bytes app/assets/images/emoji/church.png | Bin 0 -> 4653 bytes app/assets/images/emoji/cinema.png | Bin 0 -> 3573 bytes app/assets/images/emoji/circus_tent.png | Bin 0 -> 4683 bytes app/assets/images/emoji/city_sunrise.png | Bin 0 -> 4312 bytes app/assets/images/emoji/city_sunset.png | Bin 0 -> 3841 bytes app/assets/images/emoji/cl.png | Bin 0 -> 3493 bytes app/assets/images/emoji/clap.png | Bin 0 -> 7110 bytes app/assets/images/emoji/clapper.png | Bin 0 -> 4192 bytes app/assets/images/emoji/clipboard.png | Bin 0 -> 4663 bytes app/assets/images/emoji/clock1.png | Bin 0 -> 2590 bytes app/assets/images/emoji/clock10.png | Bin 0 -> 2590 bytes app/assets/images/emoji/clock1030.png | Bin 0 -> 2864 bytes app/assets/images/emoji/clock11.png | Bin 0 -> 2587 bytes app/assets/images/emoji/clock1130.png | Bin 0 -> 2854 bytes app/assets/images/emoji/clock12.png | Bin 0 -> 2504 bytes app/assets/images/emoji/clock1230.png | Bin 0 -> 2797 bytes app/assets/images/emoji/clock130.png | Bin 0 -> 2842 bytes app/assets/images/emoji/clock2.png | Bin 0 -> 2595 bytes app/assets/images/emoji/clock230.png | Bin 0 -> 2853 bytes app/assets/images/emoji/clock3.png | Bin 0 -> 2492 bytes app/assets/images/emoji/clock330.png | Bin 0 -> 2739 bytes app/assets/images/emoji/clock4.png | Bin 0 -> 2619 bytes app/assets/images/emoji/clock430.png | Bin 0 -> 2847 bytes app/assets/images/emoji/clock5.png | Bin 0 -> 2624 bytes app/assets/images/emoji/clock530.png | Bin 0 -> 2832 bytes app/assets/images/emoji/clock6.png | Bin 0 -> 2577 bytes app/assets/images/emoji/clock630.png | Bin 0 -> 2730 bytes app/assets/images/emoji/clock7.png | Bin 0 -> 2615 bytes app/assets/images/emoji/clock730.png | Bin 0 -> 2820 bytes app/assets/images/emoji/clock8.png | Bin 0 -> 2603 bytes app/assets/images/emoji/clock830.png | Bin 0 -> 2847 bytes app/assets/images/emoji/clock9.png | Bin 0 -> 2486 bytes app/assets/images/emoji/clock930.png | Bin 0 -> 2746 bytes app/assets/images/emoji/closed_book.png | Bin 0 -> 4847 bytes app/assets/images/emoji/closed_lock_with_key.png | Bin 0 -> 5701 bytes app/assets/images/emoji/closed_umbrella.png | Bin 0 -> 3868 bytes app/assets/images/emoji/cloud.png | Bin 0 -> 3860 bytes app/assets/images/emoji/clubs.png | Bin 0 -> 1685 bytes app/assets/images/emoji/cn.png | Bin 0 -> 3634 bytes app/assets/images/emoji/cocktail.png | Bin 0 -> 2949 bytes app/assets/images/emoji/coffee.png | Bin 0 -> 4306 bytes app/assets/images/emoji/cold_sweat.png | Bin 0 -> 5972 bytes app/assets/images/emoji/collision.png | Bin 0 -> 3781 bytes app/assets/images/emoji/computer.png | Bin 0 -> 1705 bytes app/assets/images/emoji/confetti_ball.png | Bin 0 -> 5521 bytes app/assets/images/emoji/confounded.png | Bin 0 -> 5857 bytes app/assets/images/emoji/congratulations.png | Bin 0 -> 4883 bytes app/assets/images/emoji/construction.png | Bin 0 -> 3700 bytes app/assets/images/emoji/construction_worker.png | Bin 0 -> 6193 bytes app/assets/images/emoji/convenience_store.png | Bin 0 -> 4073 bytes app/assets/images/emoji/cookie.png | Bin 0 -> 8149 bytes app/assets/images/emoji/cool.png | Bin 0 -> 4182 bytes app/assets/images/emoji/cop.png | Bin 0 -> 7141 bytes app/assets/images/emoji/copyright.png | Bin 0 -> 1579 bytes app/assets/images/emoji/corn.png | Bin 0 -> 6694 bytes app/assets/images/emoji/couple.png | Bin 0 -> 7615 bytes app/assets/images/emoji/couple_with_heart.png | Bin 0 -> 7370 bytes app/assets/images/emoji/couplekiss.png | Bin 0 -> 7219 bytes app/assets/images/emoji/cow.png | Bin 0 -> 5745 bytes app/assets/images/emoji/cow2.png | Bin 0 -> 5303 bytes app/assets/images/emoji/credit_card.png | Bin 0 -> 2648 bytes app/assets/images/emoji/crocodile.png | Bin 0 -> 6125 bytes app/assets/images/emoji/crossed_flags.png | Bin 0 -> 4015 bytes app/assets/images/emoji/crown.png | Bin 0 -> 5655 bytes app/assets/images/emoji/cry.png | Bin 0 -> 5699 bytes app/assets/images/emoji/crying_cat_face.png | Bin 0 -> 6682 bytes app/assets/images/emoji/crystal_ball.png | Bin 0 -> 6236 bytes app/assets/images/emoji/cupid.png | Bin 0 -> 5413 bytes app/assets/images/emoji/curly_loop.png | Bin 0 -> 1264 bytes app/assets/images/emoji/currency_exchange.png | Bin 0 -> 1959 bytes app/assets/images/emoji/curry.png | Bin 0 -> 5336 bytes app/assets/images/emoji/custard.png | Bin 0 -> 5810 bytes app/assets/images/emoji/customs.png | Bin 0 -> 3899 bytes app/assets/images/emoji/cyclone.png | Bin 0 -> 4890 bytes app/assets/images/emoji/dancer.png | Bin 0 -> 3737 bytes app/assets/images/emoji/dancers.png | Bin 0 -> 7918 bytes app/assets/images/emoji/dango.png | Bin 0 -> 4449 bytes app/assets/images/emoji/dart.png | Bin 0 -> 5462 bytes app/assets/images/emoji/dash.png | Bin 0 -> 5448 bytes app/assets/images/emoji/date.png | Bin 0 -> 2977 bytes app/assets/images/emoji/de.png | Bin 0 -> 2640 bytes app/assets/images/emoji/deciduous_tree.png | Bin 0 -> 7374 bytes app/assets/images/emoji/department_store.png | Bin 0 -> 5159 bytes .../emoji/diamond_shape_with_a_dot_inside.png | Bin 0 -> 5698 bytes app/assets/images/emoji/diamonds.png | Bin 0 -> 2785 bytes app/assets/images/emoji/disappointed.png | Bin 0 -> 4764 bytes app/assets/images/emoji/dizzy.png | Bin 0 -> 3044 bytes app/assets/images/emoji/dizzy_face.png | Bin 0 -> 6278 bytes app/assets/images/emoji/do_not_litter.png | Bin 0 -> 5277 bytes app/assets/images/emoji/dog.png | Bin 0 -> 5945 bytes app/assets/images/emoji/dog2.png | Bin 0 -> 5931 bytes app/assets/images/emoji/dollar.png | Bin 0 -> 4622 bytes app/assets/images/emoji/dolls.png | Bin 0 -> 7138 bytes app/assets/images/emoji/dolphin.png | Bin 0 -> 4343 bytes app/assets/images/emoji/door.png | Bin 0 -> 3310 bytes app/assets/images/emoji/doughnut.png | Bin 0 -> 5209 bytes app/assets/images/emoji/dragon.png | Bin 0 -> 7828 bytes app/assets/images/emoji/dragon_face.png | Bin 0 -> 6737 bytes app/assets/images/emoji/dress.png | Bin 0 -> 3631 bytes app/assets/images/emoji/dromedary_camel.png | Bin 0 -> 5139 bytes app/assets/images/emoji/droplet.png | Bin 0 -> 3278 bytes app/assets/images/emoji/dvd.png | Bin 0 -> 6993 bytes app/assets/images/emoji/e-mail.png | Bin 0 -> 2128 bytes app/assets/images/emoji/ear.png | Bin 0 -> 4335 bytes app/assets/images/emoji/ear_of_rice.png | Bin 0 -> 4758 bytes app/assets/images/emoji/earth_africa.png | Bin 0 -> 7164 bytes app/assets/images/emoji/earth_americas.png | Bin 0 -> 7039 bytes app/assets/images/emoji/earth_asia.png | Bin 0 -> 7303 bytes app/assets/images/emoji/egg.png | Bin 0 -> 5211 bytes app/assets/images/emoji/eggplant.png | Bin 0 -> 4672 bytes app/assets/images/emoji/eight.png | Bin 0 -> 3844 bytes .../images/emoji/eight_pointed_black_star.png | Bin 0 -> 3289 bytes .../images/emoji/eight_spoked_asterisk.png | Bin 0 -> 4012 bytes app/assets/images/emoji/electric_plug.png | Bin 0 -> 2819 bytes app/assets/images/emoji/elephant.png | Bin 0 -> 5086 bytes app/assets/images/emoji/email.png | Bin 0 -> 2697 bytes app/assets/images/emoji/end.png | Bin 0 -> 1475 bytes app/assets/images/emoji/envelope.png | Bin 0 -> 1655 bytes app/assets/images/emoji/es.png | Bin 0 -> 4302 bytes app/assets/images/emoji/euro.png | Bin 0 -> 3942 bytes app/assets/images/emoji/european_castle.png | Bin 0 -> 5427 bytes app/assets/images/emoji/european_post_office.png | Bin 0 -> 4816 bytes app/assets/images/emoji/evergreen_tree.png | Bin 0 -> 4924 bytes app/assets/images/emoji/exclamation.png | Bin 0 -> 1175 bytes app/assets/images/emoji/eyeglasses.png | Bin 0 -> 4929 bytes app/assets/images/emoji/eyes.png | Bin 0 -> 4398 bytes app/assets/images/emoji/facepunch.png | Bin 0 -> 4873 bytes app/assets/images/emoji/factory.png | Bin 0 -> 5558 bytes app/assets/images/emoji/fallen_leaf.png | Bin 0 -> 4890 bytes app/assets/images/emoji/family.png | Bin 0 -> 7211 bytes app/assets/images/emoji/fast_forward.png | Bin 0 -> 3105 bytes app/assets/images/emoji/fax.png | Bin 0 -> 4650 bytes app/assets/images/emoji/fearful.png | Bin 0 -> 5600 bytes app/assets/images/emoji/feelsgood.png | Bin 0 -> 1150 bytes app/assets/images/emoji/feet.png | Bin 0 -> 1529 bytes app/assets/images/emoji/ferris_wheel.png | Bin 0 -> 6213 bytes app/assets/images/emoji/file_folder.png | Bin 0 -> 4013 bytes app/assets/images/emoji/finnadie.png | Bin 0 -> 1186 bytes app/assets/images/emoji/fire.png | Bin 0 -> 3886 bytes app/assets/images/emoji/fire_engine.png | Bin 0 -> 4862 bytes app/assets/images/emoji/fireworks.png | Bin 0 -> 6269 bytes app/assets/images/emoji/first_quarter_moon.png | Bin 0 -> 5967 bytes .../emoji/first_quarter_moon_with_face.png | Bin 0 -> 4280 bytes app/assets/images/emoji/fish.png | Bin 0 -> 4721 bytes app/assets/images/emoji/fish_cake.png | Bin 0 -> 5818 bytes .../images/emoji/fishing_pole_and_fish.png | Bin 0 -> 4470 bytes app/assets/images/emoji/fist.png | Bin 0 -> 5880 bytes app/assets/images/emoji/five.png | Bin 0 -> 3593 bytes app/assets/images/emoji/flags.png | Bin 0 -> 6124 bytes app/assets/images/emoji/flashlight.png | Bin 0 -> 5024 bytes app/assets/images/emoji/floppy_disk.png | Bin 0 -> 3215 bytes app/assets/images/emoji/flower_playing_cards.png | Bin 0 -> 3434 bytes app/assets/images/emoji/flushed.png | Bin 0 -> 5845 bytes app/assets/images/emoji/foggy.png | Bin 0 -> 4623 bytes app/assets/images/emoji/football.png | Bin 0 -> 6712 bytes app/assets/images/emoji/fork_and_knife.png | Bin 0 -> 3608 bytes app/assets/images/emoji/fountain.png | Bin 0 -> 5087 bytes app/assets/images/emoji/four.png | Bin 0 -> 3176 bytes app/assets/images/emoji/four_leaf_clover.png | Bin 0 -> 5995 bytes app/assets/images/emoji/fr.png | Bin 0 -> 3398 bytes app/assets/images/emoji/free.png | Bin 0 -> 3605 bytes app/assets/images/emoji/fried_shrimp.png | Bin 0 -> 7550 bytes app/assets/images/emoji/fries.png | Bin 0 -> 6405 bytes app/assets/images/emoji/frog.png | Bin 0 -> 4823 bytes app/assets/images/emoji/fuelpump.png | Bin 0 -> 4296 bytes app/assets/images/emoji/full_moon.png | Bin 0 -> 6458 bytes app/assets/images/emoji/full_moon_with_face.png | Bin 0 -> 7224 bytes app/assets/images/emoji/game_die.png | Bin 0 -> 2957 bytes app/assets/images/emoji/gb.png | Bin 0 -> 5894 bytes app/assets/images/emoji/gem.png | Bin 0 -> 4855 bytes app/assets/images/emoji/gemini.png | Bin 0 -> 4296 bytes app/assets/images/emoji/ghost.png | Bin 0 -> 4513 bytes app/assets/images/emoji/gift.png | Bin 0 -> 6712 bytes app/assets/images/emoji/gift_heart.png | Bin 0 -> 6013 bytes app/assets/images/emoji/girl.png | Bin 0 -> 6314 bytes app/assets/images/emoji/globe_with_meridians.png | Bin 0 -> 5837 bytes app/assets/images/emoji/goat.png | Bin 0 -> 4889 bytes app/assets/images/emoji/goberserk.png | Bin 0 -> 1334 bytes app/assets/images/emoji/godmode.png | Bin 0 -> 1042 bytes app/assets/images/emoji/golf.png | Bin 0 -> 3548 bytes app/assets/images/emoji/grapes.png | Bin 0 -> 5423 bytes app/assets/images/emoji/green_apple.png | Bin 0 -> 6205 bytes app/assets/images/emoji/green_book.png | Bin 0 -> 5090 bytes app/assets/images/emoji/green_heart.png | Bin 0 -> 4432 bytes app/assets/images/emoji/grey_exclamation.png | Bin 0 -> 1142 bytes app/assets/images/emoji/grey_question.png | Bin 0 -> 1057 bytes app/assets/images/emoji/grin.png | Bin 0 -> 5721 bytes app/assets/images/emoji/guardsman.png | Bin 0 -> 3587 bytes app/assets/images/emoji/guitar.png | Bin 0 -> 4382 bytes app/assets/images/emoji/gun.png | Bin 0 -> 3161 bytes app/assets/images/emoji/haircut.png | Bin 0 -> 7100 bytes app/assets/images/emoji/hamburger.png | Bin 0 -> 5706 bytes app/assets/images/emoji/hammer.png | Bin 0 -> 3670 bytes app/assets/images/emoji/hamster.png | Bin 0 -> 7221 bytes app/assets/images/emoji/hand.png | Bin 0 -> 4161 bytes app/assets/images/emoji/handbag.png | Bin 0 -> 5449 bytes app/assets/images/emoji/hankey.png | Bin 0 -> 4754 bytes app/assets/images/emoji/hash.png | Bin 0 -> 3742 bytes app/assets/images/emoji/hatched_chick.png | Bin 0 -> 5646 bytes app/assets/images/emoji/hatching_chick.png | Bin 0 -> 5928 bytes app/assets/images/emoji/headphones.png | Bin 0 -> 1910 bytes app/assets/images/emoji/hear_no_evil.png | Bin 0 -> 6550 bytes app/assets/images/emoji/heart.png | Bin 0 -> 3302 bytes app/assets/images/emoji/heart_decoration.png | Bin 0 -> 3507 bytes app/assets/images/emoji/heart_eyes.png | Bin 0 -> 5758 bytes app/assets/images/emoji/heart_eyes_cat.png | Bin 0 -> 6176 bytes app/assets/images/emoji/heartbeat.png | Bin 0 -> 4052 bytes app/assets/images/emoji/heartpulse.png | Bin 0 -> 6269 bytes app/assets/images/emoji/hearts.png | Bin 0 -> 2925 bytes app/assets/images/emoji/heavy_check_mark.png | Bin 0 -> 1103 bytes app/assets/images/emoji/heavy_division_sign.png | Bin 0 -> 340 bytes app/assets/images/emoji/heavy_dollar_sign.png | Bin 0 -> 1416 bytes .../images/emoji/heavy_exclamation_mark.png | Bin 0 -> 1315 bytes app/assets/images/emoji/heavy_minus_sign.png | Bin 0 -> 197 bytes .../images/emoji/heavy_multiplication_x.png | Bin 0 -> 591 bytes app/assets/images/emoji/heavy_plus_sign.png | Bin 0 -> 315 bytes app/assets/images/emoji/helicopter.png | Bin 0 -> 4100 bytes app/assets/images/emoji/herb.png | Bin 0 -> 5889 bytes app/assets/images/emoji/hibiscus.png | Bin 0 -> 8322 bytes app/assets/images/emoji/high_brightness.png | Bin 0 -> 4060 bytes app/assets/images/emoji/high_heel.png | Bin 0 -> 4557 bytes app/assets/images/emoji/hocho.png | Bin 0 -> 2506 bytes app/assets/images/emoji/honey_pot.png | Bin 0 -> 5830 bytes app/assets/images/emoji/honeybee.png | Bin 0 -> 5851 bytes app/assets/images/emoji/horse.png | Bin 0 -> 4582 bytes app/assets/images/emoji/horse_racing.png | Bin 0 -> 5905 bytes app/assets/images/emoji/hospital.png | Bin 0 -> 4887 bytes app/assets/images/emoji/hotel.png | Bin 0 -> 5123 bytes app/assets/images/emoji/hotsprings.png | Bin 0 -> 3538 bytes app/assets/images/emoji/hourglass.png | Bin 0 -> 4492 bytes app/assets/images/emoji/house.png | Bin 0 -> 3510 bytes app/assets/images/emoji/hurtrealbad.png | Bin 0 -> 1456 bytes app/assets/images/emoji/ice_cream.png | Bin 0 -> 5469 bytes app/assets/images/emoji/icecream.png | Bin 0 -> 4603 bytes app/assets/images/emoji/id.png | Bin 0 -> 3905 bytes app/assets/images/emoji/ideograph_advantage.png | Bin 0 -> 3095 bytes app/assets/images/emoji/imp.png | Bin 0 -> 6631 bytes app/assets/images/emoji/inbox_tray.png | Bin 0 -> 3700 bytes app/assets/images/emoji/incoming_envelope.png | Bin 0 -> 2206 bytes .../images/emoji/information_desk_person.png | Bin 0 -> 6605 bytes app/assets/images/emoji/information_source.png | Bin 0 -> 3670 bytes app/assets/images/emoji/innocent.png | Bin 0 -> 7000 bytes app/assets/images/emoji/interrobang.png | Bin 0 -> 2875 bytes app/assets/images/emoji/iphone.png | Bin 0 -> 3499 bytes app/assets/images/emoji/it.png | Bin 0 -> 3495 bytes app/assets/images/emoji/izakaya_lantern.png | Bin 0 -> 4064 bytes app/assets/images/emoji/jack_o_lantern.png | Bin 0 -> 5633 bytes app/assets/images/emoji/japan.png | Bin 0 -> 4085 bytes app/assets/images/emoji/japanese_castle.png | Bin 0 -> 4939 bytes app/assets/images/emoji/japanese_goblin.png | Bin 0 -> 5159 bytes app/assets/images/emoji/japanese_ogre.png | Bin 0 -> 7147 bytes app/assets/images/emoji/jeans.png | Bin 0 -> 3470 bytes app/assets/images/emoji/joy.png | Bin 0 -> 6339 bytes app/assets/images/emoji/joy_cat.png | Bin 0 -> 7190 bytes app/assets/images/emoji/jp.png | Bin 0 -> 2827 bytes app/assets/images/emoji/key.png | Bin 0 -> 3452 bytes app/assets/images/emoji/keycap_ten.png | Bin 0 -> 4095 bytes app/assets/images/emoji/kimono.png | Bin 0 -> 4938 bytes app/assets/images/emoji/kiss.png | Bin 0 -> 6276 bytes app/assets/images/emoji/kissing_cat.png | Bin 0 -> 6801 bytes app/assets/images/emoji/kissing_face.png | Bin 0 -> 5563 bytes app/assets/images/emoji/kissing_heart.png | Bin 0 -> 5767 bytes app/assets/images/emoji/koala.png | Bin 0 -> 5687 bytes app/assets/images/emoji/koko.png | Bin 0 -> 2854 bytes app/assets/images/emoji/kr.png | Bin 0 -> 5105 bytes app/assets/images/emoji/large_blue_circle.png | Bin 0 -> 4637 bytes app/assets/images/emoji/large_blue_diamond.png | Bin 0 -> 3790 bytes app/assets/images/emoji/large_orange_diamond.png | Bin 0 -> 3899 bytes app/assets/images/emoji/last_quarter_moon.png | Bin 0 -> 6176 bytes .../images/emoji/last_quarter_moon_with_face.png | Bin 0 -> 4328 bytes app/assets/images/emoji/laughing.png | Bin 0 -> 6347 bytes app/assets/images/emoji/leaves.png | Bin 0 -> 5571 bytes app/assets/images/emoji/ledger.png | Bin 0 -> 5921 bytes app/assets/images/emoji/left_luggage.png | Bin 0 -> 4025 bytes app/assets/images/emoji/left_right_arrow.png | Bin 0 -> 3413 bytes .../images/emoji/leftwards_arrow_with_hook.png | Bin 0 -> 3775 bytes app/assets/images/emoji/lemon.png | Bin 0 -> 6055 bytes app/assets/images/emoji/leo.png | Bin 0 -> 4913 bytes app/assets/images/emoji/leopard.png | Bin 0 -> 5384 bytes app/assets/images/emoji/libra.png | Bin 0 -> 4229 bytes app/assets/images/emoji/light_rail.png | Bin 0 -> 3792 bytes app/assets/images/emoji/link.png | Bin 0 -> 2652 bytes app/assets/images/emoji/lips.png | Bin 0 -> 3738 bytes app/assets/images/emoji/lipstick.png | Bin 0 -> 3384 bytes app/assets/images/emoji/lock.png | Bin 0 -> 3676 bytes app/assets/images/emoji/lock_with_ink_pen.png | Bin 0 -> 4967 bytes app/assets/images/emoji/lollipop.png | Bin 0 -> 5771 bytes app/assets/images/emoji/loop.png | Bin 0 -> 3417 bytes app/assets/images/emoji/loudspeaker.png | Bin 0 -> 6001 bytes app/assets/images/emoji/love_hotel.png | Bin 0 -> 5941 bytes app/assets/images/emoji/love_letter.png | Bin 0 -> 2467 bytes app/assets/images/emoji/low_brightness.png | Bin 0 -> 2498 bytes app/assets/images/emoji/m.png | Bin 0 -> 4737 bytes app/assets/images/emoji/mag.png | Bin 0 -> 3040 bytes app/assets/images/emoji/mag_right.png | Bin 0 -> 3629 bytes app/assets/images/emoji/mahjong.png | Bin 0 -> 3309 bytes app/assets/images/emoji/mailbox.png | Bin 0 -> 4196 bytes app/assets/images/emoji/mailbox_closed.png | Bin 0 -> 4360 bytes app/assets/images/emoji/mailbox_with_mail.png | Bin 0 -> 4581 bytes app/assets/images/emoji/mailbox_with_no_mail.png | Bin 0 -> 3101 bytes app/assets/images/emoji/man.png | Bin 0 -> 6023 bytes app/assets/images/emoji/man_with_gua_pi_mao.png | Bin 0 -> 5324 bytes app/assets/images/emoji/man_with_turban.png | Bin 0 -> 6528 bytes app/assets/images/emoji/mans_shoe.png | Bin 0 -> 4749 bytes app/assets/images/emoji/maple_leaf.png | Bin 0 -> 4450 bytes app/assets/images/emoji/mask.png | Bin 0 -> 5235 bytes app/assets/images/emoji/massage.png | Bin 0 -> 6036 bytes app/assets/images/emoji/meat_on_bone.png | Bin 0 -> 5534 bytes app/assets/images/emoji/mega.png | Bin 0 -> 4680 bytes app/assets/images/emoji/melon.png | Bin 0 -> 8233 bytes app/assets/images/emoji/memo.png | Bin 0 -> 4945 bytes app/assets/images/emoji/mens.png | Bin 0 -> 3368 bytes app/assets/images/emoji/metal.png | Bin 0 -> 3098 bytes app/assets/images/emoji/metro.png | Bin 0 -> 3402 bytes app/assets/images/emoji/microphone.png | Bin 0 -> 3680 bytes app/assets/images/emoji/microscope.png | Bin 0 -> 4141 bytes app/assets/images/emoji/milky_way.png | Bin 0 -> 5878 bytes app/assets/images/emoji/minibus.png | Bin 0 -> 3113 bytes app/assets/images/emoji/minidisc.png | Bin 0 -> 5594 bytes app/assets/images/emoji/mobile_phone_off.png | Bin 0 -> 3521 bytes app/assets/images/emoji/money_with_wings.png | Bin 0 -> 7586 bytes app/assets/images/emoji/moneybag.png | Bin 0 -> 5500 bytes app/assets/images/emoji/monkey.png | Bin 0 -> 4973 bytes app/assets/images/emoji/monkey_face.png | Bin 0 -> 5348 bytes app/assets/images/emoji/monorail.png | Bin 0 -> 4311 bytes app/assets/images/emoji/moon.png | Bin 0 -> 3541 bytes app/assets/images/emoji/mortar_board.png | Bin 0 -> 4165 bytes app/assets/images/emoji/mount_fuji.png | Bin 0 -> 5004 bytes app/assets/images/emoji/mountain_bicyclist.png | Bin 0 -> 9511 bytes app/assets/images/emoji/mountain_cableway.png | Bin 0 -> 4405 bytes app/assets/images/emoji/mountain_railway.png | Bin 0 -> 7448 bytes app/assets/images/emoji/mouse.png | Bin 0 -> 6625 bytes app/assets/images/emoji/mouse2.png | Bin 0 -> 4087 bytes app/assets/images/emoji/movie_camera.png | Bin 0 -> 4081 bytes app/assets/images/emoji/moyai.png | Bin 0 -> 2166 bytes app/assets/images/emoji/muscle.png | Bin 0 -> 4672 bytes app/assets/images/emoji/mushroom.png | Bin 0 -> 4887 bytes app/assets/images/emoji/musical_keyboard.png | Bin 0 -> 1944 bytes app/assets/images/emoji/musical_note.png | Bin 0 -> 3188 bytes app/assets/images/emoji/musical_score.png | Bin 0 -> 1576 bytes app/assets/images/emoji/mute.png | Bin 0 -> 6635 bytes app/assets/images/emoji/nail_care.png | Bin 0 -> 5814 bytes app/assets/images/emoji/name_badge.png | Bin 0 -> 3985 bytes app/assets/images/emoji/neckbeard.png | Bin 0 -> 6421 bytes app/assets/images/emoji/necktie.png | Bin 0 -> 6116 bytes .../images/emoji/negative_squared_cross_mark.png | Bin 0 -> 3853 bytes app/assets/images/emoji/neutral_face.png | Bin 0 -> 4843 bytes app/assets/images/emoji/new.png | Bin 0 -> 3927 bytes app/assets/images/emoji/new_moon.png | Bin 0 -> 5371 bytes app/assets/images/emoji/new_moon_with_face.png | Bin 0 -> 6750 bytes app/assets/images/emoji/newspaper.png | Bin 0 -> 5198 bytes app/assets/images/emoji/ng.png | Bin 0 -> 4201 bytes app/assets/images/emoji/nine.png | Bin 0 -> 3776 bytes app/assets/images/emoji/no_bell.png | Bin 0 -> 5944 bytes app/assets/images/emoji/no_bicycles.png | Bin 0 -> 5661 bytes app/assets/images/emoji/no_entry.png | Bin 0 -> 3514 bytes app/assets/images/emoji/no_entry_sign.png | Bin 0 -> 3288 bytes app/assets/images/emoji/no_good.png | Bin 0 -> 7034 bytes app/assets/images/emoji/no_mobile_phones.png | Bin 0 -> 5083 bytes app/assets/images/emoji/no_mouth.png | Bin 0 -> 4732 bytes app/assets/images/emoji/no_pedestrians.png | Bin 0 -> 5487 bytes app/assets/images/emoji/no_smoking.png | Bin 0 -> 4212 bytes app/assets/images/emoji/non-potable_water.png | Bin 0 -> 5202 bytes app/assets/images/emoji/nose.png | Bin 0 -> 3703 bytes app/assets/images/emoji/notebook.png | Bin 0 -> 6036 bytes .../emoji/notebook_with_decorative_cover.png | Bin 0 -> 5329 bytes app/assets/images/emoji/notes.png | Bin 0 -> 1536 bytes app/assets/images/emoji/nut_and_bolt.png | Bin 0 -> 2169 bytes app/assets/images/emoji/o.png | Bin 0 -> 2542 bytes app/assets/images/emoji/o2.png | Bin 0 -> 3498 bytes app/assets/images/emoji/ocean.png | Bin 0 -> 5777 bytes app/assets/images/emoji/octocat.png | Bin 0 -> 3933 bytes app/assets/images/emoji/octopus.png | Bin 0 -> 5779 bytes app/assets/images/emoji/oden.png | Bin 0 -> 5543 bytes app/assets/images/emoji/office.png | Bin 0 -> 5162 bytes app/assets/images/emoji/ok.png | Bin 0 -> 4158 bytes app/assets/images/emoji/ok_hand.png | Bin 0 -> 4598 bytes app/assets/images/emoji/ok_woman.png | Bin 0 -> 7527 bytes app/assets/images/emoji/older_man.png | Bin 0 -> 6733 bytes app/assets/images/emoji/older_woman.png | Bin 0 -> 5977 bytes app/assets/images/emoji/on.png | Bin 0 -> 1806 bytes app/assets/images/emoji/oncoming_automobile.png | Bin 0 -> 7469 bytes app/assets/images/emoji/oncoming_bus.png | Bin 0 -> 5305 bytes app/assets/images/emoji/oncoming_police_car.png | Bin 0 -> 5683 bytes app/assets/images/emoji/oncoming_taxi.png | Bin 0 -> 6287 bytes app/assets/images/emoji/one.png | Bin 0 -> 2825 bytes app/assets/images/emoji/open_file_folder.png | Bin 0 -> 4292 bytes app/assets/images/emoji/open_hands.png | Bin 0 -> 4951 bytes app/assets/images/emoji/ophiuchus.png | Bin 0 -> 4434 bytes app/assets/images/emoji/orange_book.png | Bin 0 -> 5085 bytes app/assets/images/emoji/outbox_tray.png | Bin 0 -> 3683 bytes app/assets/images/emoji/ox.png | Bin 0 -> 6079 bytes app/assets/images/emoji/page_facing_up.png | Bin 0 -> 2183 bytes app/assets/images/emoji/page_with_curl.png | Bin 0 -> 3729 bytes app/assets/images/emoji/pager.png | Bin 0 -> 4022 bytes app/assets/images/emoji/palm_tree.png | Bin 0 -> 3664 bytes app/assets/images/emoji/panda_face.png | Bin 0 -> 4814 bytes app/assets/images/emoji/paperclip.png | Bin 0 -> 2558 bytes app/assets/images/emoji/parking.png | Bin 0 -> 3083 bytes .../images/emoji/part_alternation_mark.png | Bin 0 -> 2685 bytes app/assets/images/emoji/partly_sunny.png | Bin 0 -> 5181 bytes app/assets/images/emoji/passport_control.png | Bin 0 -> 4018 bytes app/assets/images/emoji/paw_prints.png | Bin 0 -> 2471 bytes app/assets/images/emoji/peach.png | Bin 0 -> 5920 bytes app/assets/images/emoji/pear.png | Bin 0 -> 6936 bytes app/assets/images/emoji/pencil.png | Bin 0 -> 4945 bytes app/assets/images/emoji/pencil2.png | Bin 0 -> 4450 bytes app/assets/images/emoji/penguin.png | Bin 0 -> 4746 bytes app/assets/images/emoji/pensive.png | Bin 0 -> 5062 bytes app/assets/images/emoji/performing_arts.png | Bin 0 -> 6287 bytes app/assets/images/emoji/persevere.png | Bin 0 -> 5519 bytes app/assets/images/emoji/person_frowning.png | Bin 0 -> 4826 bytes .../images/emoji/person_with_blond_hair.png | Bin 0 -> 6622 bytes .../images/emoji/person_with_pouting_face.png | Bin 0 -> 5428 bytes app/assets/images/emoji/phone.png | Bin 0 -> 5495 bytes app/assets/images/emoji/pig.png | Bin 0 -> 5996 bytes app/assets/images/emoji/pig2.png | Bin 0 -> 4797 bytes app/assets/images/emoji/pig_nose.png | Bin 0 -> 4761 bytes app/assets/images/emoji/pill.png | Bin 0 -> 5022 bytes app/assets/images/emoji/pineapple.png | Bin 0 -> 5634 bytes app/assets/images/emoji/pisces.png | Bin 0 -> 4458 bytes app/assets/images/emoji/pizza.png | Bin 0 -> 5273 bytes app/assets/images/emoji/plus1.png | Bin 0 -> 5075 bytes app/assets/images/emoji/point_down.png | Bin 0 -> 3225 bytes app/assets/images/emoji/point_left.png | Bin 0 -> 3085 bytes app/assets/images/emoji/point_right.png | Bin 0 -> 3079 bytes app/assets/images/emoji/point_up.png | Bin 0 -> 3431 bytes app/assets/images/emoji/point_up_2.png | Bin 0 -> 3181 bytes app/assets/images/emoji/police_car.png | Bin 0 -> 3349 bytes app/assets/images/emoji/poodle.png | Bin 0 -> 6852 bytes app/assets/images/emoji/poop.png | Bin 0 -> 4754 bytes app/assets/images/emoji/post_office.png | Bin 0 -> 5136 bytes app/assets/images/emoji/postal_horn.png | Bin 0 -> 4819 bytes app/assets/images/emoji/postbox.png | Bin 0 -> 3388 bytes app/assets/images/emoji/potable_water.png | Bin 0 -> 3934 bytes app/assets/images/emoji/pouch.png | Bin 0 -> 4691 bytes app/assets/images/emoji/poultry_leg.png | Bin 0 -> 4200 bytes app/assets/images/emoji/pound.png | Bin 0 -> 4235 bytes app/assets/images/emoji/pouting_cat.png | Bin 0 -> 4918 bytes app/assets/images/emoji/pray.png | Bin 0 -> 6203 bytes app/assets/images/emoji/princess.png | Bin 0 -> 7920 bytes app/assets/images/emoji/punch.png | Bin 0 -> 4833 bytes app/assets/images/emoji/purple_heart.png | Bin 0 -> 4295 bytes app/assets/images/emoji/purse.png | Bin 0 -> 5033 bytes app/assets/images/emoji/pushpin.png | Bin 0 -> 3793 bytes .../images/emoji/put_litter_in_its_place.png | Bin 0 -> 4091 bytes app/assets/images/emoji/question.png | Bin 0 -> 1711 bytes app/assets/images/emoji/rabbit.png | Bin 0 -> 5677 bytes app/assets/images/emoji/rabbit2.png | Bin 0 -> 4517 bytes app/assets/images/emoji/racehorse.png | Bin 0 -> 4735 bytes app/assets/images/emoji/radio.png | Bin 0 -> 6150 bytes app/assets/images/emoji/radio_button.png | Bin 0 -> 2198 bytes app/assets/images/emoji/rage.png | Bin 0 -> 5410 bytes app/assets/images/emoji/rage1.png | Bin 0 -> 1086 bytes app/assets/images/emoji/rage2.png | Bin 0 -> 1098 bytes app/assets/images/emoji/rage3.png | Bin 0 -> 1119 bytes app/assets/images/emoji/rage4.png | Bin 0 -> 1270 bytes app/assets/images/emoji/railway_car.png | Bin 0 -> 3648 bytes app/assets/images/emoji/rainbow.png | Bin 0 -> 5314 bytes app/assets/images/emoji/raised_hand.png | Bin 0 -> 6177 bytes app/assets/images/emoji/raised_hands.png | Bin 0 -> 5375 bytes app/assets/images/emoji/ram.png | Bin 0 -> 6531 bytes app/assets/images/emoji/ramen.png | Bin 0 -> 6574 bytes app/assets/images/emoji/rat.png | Bin 0 -> 5441 bytes app/assets/images/emoji/recycle.png | Bin 0 -> 3704 bytes app/assets/images/emoji/red_car.png | Bin 0 -> 4278 bytes app/assets/images/emoji/red_circle.png | Bin 0 -> 3946 bytes app/assets/images/emoji/registered.png | Bin 0 -> 1613 bytes app/assets/images/emoji/relaxed.png | Bin 0 -> 5455 bytes app/assets/images/emoji/relieved.png | Bin 0 -> 5648 bytes app/assets/images/emoji/repeat.png | Bin 0 -> 4009 bytes app/assets/images/emoji/repeat_one.png | Bin 0 -> 4287 bytes app/assets/images/emoji/restroom.png | Bin 0 -> 4142 bytes app/assets/images/emoji/revolving_hearts.png | Bin 0 -> 5472 bytes app/assets/images/emoji/rewind.png | Bin 0 -> 3056 bytes app/assets/images/emoji/ribbon.png | Bin 0 -> 5581 bytes app/assets/images/emoji/rice.png | Bin 0 -> 4645 bytes app/assets/images/emoji/rice_ball.png | Bin 0 -> 5408 bytes app/assets/images/emoji/rice_cracker.png | Bin 0 -> 7787 bytes app/assets/images/emoji/rice_scene.png | Bin 0 -> 6261 bytes app/assets/images/emoji/ring.png | Bin 0 -> 5232 bytes app/assets/images/emoji/rocket.png | Bin 0 -> 5388 bytes app/assets/images/emoji/roller_coaster.png | Bin 0 -> 5148 bytes app/assets/images/emoji/rooster.png | Bin 0 -> 6168 bytes app/assets/images/emoji/rose.png | Bin 0 -> 4202 bytes app/assets/images/emoji/rotating_light.png | Bin 0 -> 6620 bytes app/assets/images/emoji/round_pushpin.png | Bin 0 -> 1936 bytes app/assets/images/emoji/rowboat.png | Bin 0 -> 5433 bytes app/assets/images/emoji/ru.png | Bin 0 -> 3920 bytes app/assets/images/emoji/rugby_football.png | Bin 0 -> 7781 bytes app/assets/images/emoji/runner.png | Bin 0 -> 3137 bytes app/assets/images/emoji/running.png | Bin 0 -> 3214 bytes .../images/emoji/running_shirt_with_sash.png | Bin 0 -> 5701 bytes app/assets/images/emoji/sa.png | Bin 0 -> 3556 bytes app/assets/images/emoji/sagittarius.png | Bin 0 -> 4505 bytes app/assets/images/emoji/sailboat.png | Bin 0 -> 3833 bytes app/assets/images/emoji/sake.png | Bin 0 -> 5073 bytes app/assets/images/emoji/sandal.png | Bin 0 -> 3974 bytes app/assets/images/emoji/santa.png | Bin 0 -> 6271 bytes app/assets/images/emoji/satellite.png | Bin 0 -> 4867 bytes app/assets/images/emoji/satisfied.png | Bin 0 -> 5364 bytes app/assets/images/emoji/saxophone.png | Bin 0 -> 4252 bytes app/assets/images/emoji/school.png | Bin 0 -> 5446 bytes app/assets/images/emoji/school_satchel.png | Bin 0 -> 5741 bytes app/assets/images/emoji/scissors.png | Bin 0 -> 3839 bytes app/assets/images/emoji/scorpius.png | Bin 0 -> 4566 bytes app/assets/images/emoji/scream.png | Bin 0 -> 6482 bytes app/assets/images/emoji/scream_cat.png | Bin 0 -> 6844 bytes app/assets/images/emoji/scroll.png | Bin 0 -> 6749 bytes app/assets/images/emoji/seat.png | Bin 0 -> 6059 bytes app/assets/images/emoji/secret.png | Bin 0 -> 5364 bytes app/assets/images/emoji/see_no_evil.png | Bin 0 -> 6828 bytes app/assets/images/emoji/seedling.png | Bin 0 -> 2260 bytes app/assets/images/emoji/seven.png | Bin 0 -> 3055 bytes app/assets/images/emoji/shaved_ice.png | Bin 0 -> 5908 bytes app/assets/images/emoji/sheep.png | Bin 0 -> 4732 bytes app/assets/images/emoji/shell.png | Bin 0 -> 5115 bytes app/assets/images/emoji/ship.png | Bin 0 -> 4233 bytes app/assets/images/emoji/shipit.png | Bin 0 -> 9351 bytes app/assets/images/emoji/shirt.png | Bin 0 -> 4676 bytes app/assets/images/emoji/shit.png | Bin 0 -> 4754 bytes app/assets/images/emoji/shoe.png | Bin 0 -> 4799 bytes app/assets/images/emoji/shower.png | Bin 0 -> 7583 bytes app/assets/images/emoji/signal_strength.png | Bin 0 -> 3231 bytes app/assets/images/emoji/six.png | Bin 0 -> 3791 bytes app/assets/images/emoji/six_pointed_star.png | Bin 0 -> 4859 bytes app/assets/images/emoji/ski.png | Bin 0 -> 4167 bytes app/assets/images/emoji/skull.png | Bin 0 -> 2428 bytes app/assets/images/emoji/sleepy.png | Bin 0 -> 5837 bytes app/assets/images/emoji/slot_machine.png | Bin 0 -> 4605 bytes app/assets/images/emoji/small_blue_diamond.png | Bin 0 -> 1898 bytes app/assets/images/emoji/small_orange_diamond.png | Bin 0 -> 1944 bytes app/assets/images/emoji/small_red_triangle.png | Bin 0 -> 2054 bytes .../images/emoji/small_red_triangle_down.png | Bin 0 -> 2157 bytes app/assets/images/emoji/smile.png | Bin 0 -> 5890 bytes app/assets/images/emoji/smile_cat.png | Bin 0 -> 6117 bytes app/assets/images/emoji/smiley.png | Bin 0 -> 5794 bytes app/assets/images/emoji/smiley_cat.png | Bin 0 -> 6083 bytes app/assets/images/emoji/smiling_imp.png | Bin 0 -> 7189 bytes app/assets/images/emoji/smirk.png | Bin 0 -> 5307 bytes app/assets/images/emoji/smirk_cat.png | Bin 0 -> 6062 bytes app/assets/images/emoji/smoking.png | Bin 0 -> 2875 bytes app/assets/images/emoji/snail.png | Bin 0 -> 6657 bytes app/assets/images/emoji/snake.png | Bin 0 -> 4069 bytes app/assets/images/emoji/snowboarder.png | Bin 0 -> 5356 bytes app/assets/images/emoji/snowflake.png | Bin 0 -> 5637 bytes app/assets/images/emoji/snowman.png | Bin 0 -> 4658 bytes app/assets/images/emoji/sob.png | Bin 0 -> 5709 bytes app/assets/images/emoji/soccer.png | Bin 0 -> 4878 bytes app/assets/images/emoji/soon.png | Bin 0 -> 1911 bytes app/assets/images/emoji/sos.png | Bin 0 -> 4262 bytes app/assets/images/emoji/sound.png | Bin 0 -> 5024 bytes app/assets/images/emoji/space_invader.png | Bin 0 -> 4353 bytes app/assets/images/emoji/spades.png | Bin 0 -> 1719 bytes app/assets/images/emoji/spaghetti.png | Bin 0 -> 6955 bytes app/assets/images/emoji/sparkler.png | Bin 0 -> 5696 bytes app/assets/images/emoji/sparkles.png | Bin 0 -> 2212 bytes app/assets/images/emoji/speak_no_evil.png | Bin 0 -> 5977 bytes app/assets/images/emoji/speaker.png | Bin 0 -> 5173 bytes app/assets/images/emoji/speech_balloon.png | Bin 0 -> 2130 bytes app/assets/images/emoji/speedboat.png | Bin 0 -> 3512 bytes app/assets/images/emoji/squirrel.png | Bin 0 -> 9351 bytes app/assets/images/emoji/star.png | Bin 0 -> 3628 bytes app/assets/images/emoji/star2.png | Bin 0 -> 4068 bytes app/assets/images/emoji/stars.png | Bin 0 -> 4366 bytes app/assets/images/emoji/station.png | Bin 0 -> 4836 bytes app/assets/images/emoji/statue_of_liberty.png | Bin 0 -> 6075 bytes app/assets/images/emoji/steam_locomotive.png | Bin 0 -> 5159 bytes app/assets/images/emoji/stew.png | Bin 0 -> 5365 bytes app/assets/images/emoji/straight_ruler.png | Bin 0 -> 3832 bytes app/assets/images/emoji/strawberry.png | Bin 0 -> 5477 bytes app/assets/images/emoji/sun_with_face.png | Bin 0 -> 7958 bytes app/assets/images/emoji/sunflower.png | Bin 0 -> 6567 bytes app/assets/images/emoji/sunglasses.png | Bin 0 -> 5749 bytes app/assets/images/emoji/sunny.png | Bin 0 -> 3802 bytes app/assets/images/emoji/sunrise.png | Bin 0 -> 3914 bytes .../images/emoji/sunrise_over_mountains.png | Bin 0 -> 6594 bytes app/assets/images/emoji/surfer.png | Bin 0 -> 6259 bytes app/assets/images/emoji/sushi.png | Bin 0 -> 5257 bytes app/assets/images/emoji/suspect.png | Bin 0 -> 1016 bytes app/assets/images/emoji/suspension_railway.png | Bin 0 -> 3937 bytes app/assets/images/emoji/sweat.png | Bin 0 -> 5576 bytes app/assets/images/emoji/sweat_drops.png | Bin 0 -> 4782 bytes app/assets/images/emoji/sweat_smile.png | Bin 0 -> 6519 bytes app/assets/images/emoji/sweet_potato.png | Bin 0 -> 5684 bytes app/assets/images/emoji/swimmer.png | Bin 0 -> 4378 bytes app/assets/images/emoji/symbols.png | Bin 0 -> 5434 bytes app/assets/images/emoji/syringe.png | Bin 0 -> 3040 bytes app/assets/images/emoji/tada.png | Bin 0 -> 5945 bytes app/assets/images/emoji/tanabata_tree.png | Bin 0 -> 4409 bytes app/assets/images/emoji/tangerine.png | Bin 0 -> 6645 bytes app/assets/images/emoji/taurus.png | Bin 0 -> 4733 bytes app/assets/images/emoji/taxi.png | Bin 0 -> 3744 bytes app/assets/images/emoji/tea.png | Bin 0 -> 5954 bytes app/assets/images/emoji/telephone.png | Bin 0 -> 5495 bytes app/assets/images/emoji/telephone_receiver.png | Bin 0 -> 2001 bytes app/assets/images/emoji/telescope.png | Bin 0 -> 3322 bytes app/assets/images/emoji/tennis.png | Bin 0 -> 5976 bytes app/assets/images/emoji/tent.png | Bin 0 -> 4482 bytes app/assets/images/emoji/thought_balloon.png | Bin 0 -> 2582 bytes app/assets/images/emoji/three.png | Bin 0 -> 3758 bytes app/assets/images/emoji/thumbsdown.png | Bin 0 -> 5070 bytes app/assets/images/emoji/thumbsup.png | Bin 0 -> 5075 bytes app/assets/images/emoji/ticket.png | Bin 0 -> 3091 bytes app/assets/images/emoji/tiger.png | Bin 0 -> 6051 bytes app/assets/images/emoji/tiger2.png | Bin 0 -> 5744 bytes app/assets/images/emoji/tired_face.png | Bin 0 -> 6178 bytes app/assets/images/emoji/tm.png | Bin 0 -> 842 bytes app/assets/images/emoji/toilet.png | Bin 0 -> 1733 bytes app/assets/images/emoji/tokyo_tower.png | Bin 0 -> 4802 bytes app/assets/images/emoji/tomato.png | Bin 0 -> 5748 bytes app/assets/images/emoji/tongue.png | Bin 0 -> 5785 bytes app/assets/images/emoji/tongue2.png | Bin 0 -> 3662 bytes app/assets/images/emoji/top.png | Bin 0 -> 3785 bytes app/assets/images/emoji/tophat.png | Bin 0 -> 3009 bytes app/assets/images/emoji/tractor.png | Bin 0 -> 5671 bytes app/assets/images/emoji/traffic_light.png | Bin 0 -> 3545 bytes app/assets/images/emoji/train.png | Bin 0 -> 3905 bytes app/assets/images/emoji/train2.png | Bin 0 -> 4817 bytes app/assets/images/emoji/tram.png | Bin 0 -> 4869 bytes .../images/emoji/triangular_flag_on_post.png | Bin 0 -> 1399 bytes app/assets/images/emoji/triangular_ruler.png | Bin 0 -> 2706 bytes app/assets/images/emoji/trident.png | Bin 0 -> 4833 bytes app/assets/images/emoji/triumph.png | Bin 0 -> 6164 bytes app/assets/images/emoji/trolleybus.png | Bin 0 -> 4431 bytes app/assets/images/emoji/trollface.png | Bin 0 -> 4905 bytes app/assets/images/emoji/trophy.png | Bin 0 -> 5520 bytes app/assets/images/emoji/tropical_drink.png | Bin 0 -> 4189 bytes app/assets/images/emoji/tropical_fish.png | Bin 0 -> 5846 bytes app/assets/images/emoji/truck.png | Bin 0 -> 3721 bytes app/assets/images/emoji/trumpet.png | Bin 0 -> 4373 bytes app/assets/images/emoji/tshirt.png | Bin 0 -> 4676 bytes app/assets/images/emoji/tulip.png | Bin 0 -> 6065 bytes app/assets/images/emoji/turtle.png | Bin 0 -> 5336 bytes app/assets/images/emoji/tv.png | Bin 0 -> 5242 bytes .../images/emoji/twisted_rightwards_arrows.png | Bin 0 -> 4313 bytes app/assets/images/emoji/two.png | Bin 0 -> 3518 bytes app/assets/images/emoji/two_hearts.png | Bin 0 -> 3565 bytes .../images/emoji/two_men_holding_hands.png | Bin 0 -> 6994 bytes .../images/emoji/two_women_holding_hands.png | Bin 0 -> 7633 bytes app/assets/images/emoji/u5272.png | Bin 0 -> 4533 bytes app/assets/images/emoji/u5408.png | Bin 0 -> 3890 bytes app/assets/images/emoji/u55b6.png | Bin 0 -> 3411 bytes app/assets/images/emoji/u6307.png | Bin 0 -> 4103 bytes app/assets/images/emoji/u6708.png | Bin 0 -> 3011 bytes app/assets/images/emoji/u6709.png | Bin 0 -> 3198 bytes app/assets/images/emoji/u6e80.png | Bin 0 -> 4419 bytes app/assets/images/emoji/u7121.png | Bin 0 -> 3942 bytes app/assets/images/emoji/u7533.png | Bin 0 -> 3048 bytes app/assets/images/emoji/u7981.png | Bin 0 -> 5175 bytes app/assets/images/emoji/u7a7a.png | Bin 0 -> 4180 bytes app/assets/images/emoji/uk.png | Bin 0 -> 5894 bytes app/assets/images/emoji/umbrella.png | Bin 0 -> 4745 bytes app/assets/images/emoji/unamused.png | Bin 0 -> 5315 bytes app/assets/images/emoji/underage.png | Bin 0 -> 5722 bytes app/assets/images/emoji/unlock.png | Bin 0 -> 3551 bytes app/assets/images/emoji/up.png | Bin 0 -> 3721 bytes app/assets/images/emoji/us.png | Bin 0 -> 6285 bytes app/assets/images/emoji/v.png | Bin 0 -> 4669 bytes .../images/emoji/vertical_traffic_light.png | Bin 0 -> 3422 bytes app/assets/images/emoji/vhs.png | Bin 0 -> 3145 bytes app/assets/images/emoji/vibration_mode.png | Bin 0 -> 3906 bytes app/assets/images/emoji/video_camera.png | Bin 0 -> 5090 bytes app/assets/images/emoji/video_game.png | Bin 0 -> 4957 bytes app/assets/images/emoji/violin.png | Bin 0 -> 5020 bytes app/assets/images/emoji/virgo.png | Bin 0 -> 4869 bytes app/assets/images/emoji/volcano.png | Bin 0 -> 6167 bytes app/assets/images/emoji/vs.png | Bin 0 -> 3424 bytes app/assets/images/emoji/walking.png | Bin 0 -> 2468 bytes app/assets/images/emoji/waning_crescent_moon.png | Bin 0 -> 5885 bytes app/assets/images/emoji/waning_gibbous_moon.png | Bin 0 -> 6510 bytes app/assets/images/emoji/warning.png | Bin 0 -> 3177 bytes app/assets/images/emoji/watch.png | Bin 0 -> 5189 bytes app/assets/images/emoji/water_buffalo.png | Bin 0 -> 4774 bytes app/assets/images/emoji/watermelon.png | Bin 0 -> 5501 bytes app/assets/images/emoji/wave.png | Bin 0 -> 5048 bytes app/assets/images/emoji/wavy_dash.png | Bin 0 -> 872 bytes app/assets/images/emoji/waxing_crescent_moon.png | Bin 0 -> 6198 bytes app/assets/images/emoji/waxing_gibbous_moon.png | Bin 0 -> 6455 bytes app/assets/images/emoji/wc.png | Bin 0 -> 4088 bytes app/assets/images/emoji/weary.png | Bin 0 -> 6279 bytes app/assets/images/emoji/wedding.png | Bin 0 -> 5847 bytes app/assets/images/emoji/whale.png | Bin 0 -> 4940 bytes app/assets/images/emoji/whale2.png | Bin 0 -> 6032 bytes app/assets/images/emoji/wheelchair.png | Bin 0 -> 4224 bytes app/assets/images/emoji/white_circle.png | Bin 0 -> 2506 bytes app/assets/images/emoji/white_flower.png | Bin 0 -> 4391 bytes app/assets/images/emoji/white_square.png | Bin 0 -> 1411 bytes app/assets/images/emoji/wind_chime.png | Bin 0 -> 3487 bytes app/assets/images/emoji/wine_glass.png | Bin 0 -> 3151 bytes app/assets/images/emoji/wink.png | Bin 0 -> 5253 bytes app/assets/images/emoji/wink2.png | Bin 0 -> 6007 bytes app/assets/images/emoji/wolf.png | Bin 0 -> 4845 bytes app/assets/images/emoji/woman.png | Bin 0 -> 6895 bytes app/assets/images/emoji/womans_clothes.png | Bin 0 -> 4075 bytes app/assets/images/emoji/womans_hat.png | Bin 0 -> 8101 bytes app/assets/images/emoji/womens.png | Bin 0 -> 3893 bytes app/assets/images/emoji/wrench.png | Bin 0 -> 2775 bytes app/assets/images/emoji/x.png | Bin 0 -> 2044 bytes app/assets/images/emoji/yellow_heart.png | Bin 0 -> 4414 bytes app/assets/images/emoji/yen.png | Bin 0 -> 4989 bytes app/assets/images/emoji/yum.png | Bin 0 -> 5886 bytes app/assets/images/emoji/zap.png | Bin 0 -> 2233 bytes app/assets/images/emoji/zero.png | Bin 0 -> 3590 bytes app/assets/images/emoji/zzz.png | Bin 0 -> 2027 bytes 847 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 app/assets/images/emoji/+1.png create mode 100755 app/assets/images/emoji/-1.png create mode 100755 app/assets/images/emoji/100.png create mode 100755 app/assets/images/emoji/109.png create mode 100755 app/assets/images/emoji/1234.png create mode 100755 app/assets/images/emoji/8ball.png create mode 100755 app/assets/images/emoji/a.png create mode 100755 app/assets/images/emoji/ab.png create mode 100755 app/assets/images/emoji/abc.png create mode 100755 app/assets/images/emoji/abcd.png create mode 100755 app/assets/images/emoji/accept.png create mode 100755 app/assets/images/emoji/aerial_tramway.png create mode 100755 app/assets/images/emoji/airplane.png create mode 100755 app/assets/images/emoji/alarm_clock.png create mode 100755 app/assets/images/emoji/alien.png create mode 100755 app/assets/images/emoji/ambulance.png create mode 100755 app/assets/images/emoji/anchor.png create mode 100755 app/assets/images/emoji/angel.png create mode 100755 app/assets/images/emoji/anger.png create mode 100755 app/assets/images/emoji/angry.png create mode 100755 app/assets/images/emoji/ant.png create mode 100755 app/assets/images/emoji/apple.png create mode 100755 app/assets/images/emoji/aquarius.png create mode 100755 app/assets/images/emoji/aries.png create mode 100755 app/assets/images/emoji/arrow_backward.png create mode 100755 app/assets/images/emoji/arrow_double_down.png create mode 100755 app/assets/images/emoji/arrow_double_up.png create mode 100755 app/assets/images/emoji/arrow_down.png create mode 100755 app/assets/images/emoji/arrow_down_small.png create mode 100755 app/assets/images/emoji/arrow_forward.png create mode 100755 app/assets/images/emoji/arrow_heading_down.png create mode 100755 app/assets/images/emoji/arrow_heading_up.png create mode 100755 app/assets/images/emoji/arrow_left.png create mode 100755 app/assets/images/emoji/arrow_lower_left.png create mode 100755 app/assets/images/emoji/arrow_lower_right.png create mode 100755 app/assets/images/emoji/arrow_right.png create mode 100755 app/assets/images/emoji/arrow_right_hook.png create mode 100755 app/assets/images/emoji/arrow_up.png create mode 100755 app/assets/images/emoji/arrow_up_down.png create mode 100755 app/assets/images/emoji/arrow_up_small.png create mode 100755 app/assets/images/emoji/arrow_upper_left.png create mode 100755 app/assets/images/emoji/arrow_upper_right.png create mode 100755 app/assets/images/emoji/arrows_clockwise.png create mode 100755 app/assets/images/emoji/arrows_counterclockwise.png create mode 100755 app/assets/images/emoji/art.png create mode 100755 app/assets/images/emoji/articulated_lorry.png create mode 100755 app/assets/images/emoji/astonished.png create mode 100755 app/assets/images/emoji/atm.png create mode 100755 app/assets/images/emoji/b.png create mode 100755 app/assets/images/emoji/baby.png create mode 100755 app/assets/images/emoji/baby_bottle.png create mode 100755 app/assets/images/emoji/baby_chick.png create mode 100755 app/assets/images/emoji/baby_symbol.png create mode 100755 app/assets/images/emoji/baggage_claim.png create mode 100755 app/assets/images/emoji/balloon.png create mode 100755 app/assets/images/emoji/ballot_box_with_check.png create mode 100755 app/assets/images/emoji/bamboo.png create mode 100755 app/assets/images/emoji/banana.png create mode 100755 app/assets/images/emoji/bangbang.png create mode 100755 app/assets/images/emoji/bank.png create mode 100755 app/assets/images/emoji/bar_chart.png create mode 100755 app/assets/images/emoji/barber.png create mode 100755 app/assets/images/emoji/baseball.png create mode 100755 app/assets/images/emoji/basketball.png create mode 100755 app/assets/images/emoji/bath.png create mode 100755 app/assets/images/emoji/bathtub.png create mode 100755 app/assets/images/emoji/battery.png create mode 100755 app/assets/images/emoji/bear.png create mode 100755 app/assets/images/emoji/beer.png create mode 100755 app/assets/images/emoji/beers.png create mode 100755 app/assets/images/emoji/beetle.png create mode 100755 app/assets/images/emoji/beginner.png create mode 100755 app/assets/images/emoji/bell.png create mode 100755 app/assets/images/emoji/bento.png create mode 100755 app/assets/images/emoji/bicyclist.png create mode 100755 app/assets/images/emoji/bike.png create mode 100755 app/assets/images/emoji/bikini.png create mode 100755 app/assets/images/emoji/bird.png create mode 100755 app/assets/images/emoji/birthday.png create mode 100755 app/assets/images/emoji/black_circle.png create mode 100755 app/assets/images/emoji/black_joker.png create mode 100755 app/assets/images/emoji/black_nib.png create mode 100755 app/assets/images/emoji/black_square.png create mode 100755 app/assets/images/emoji/blossom.png create mode 100755 app/assets/images/emoji/blowfish.png create mode 100755 app/assets/images/emoji/blue_book.png create mode 100755 app/assets/images/emoji/blue_car.png create mode 100755 app/assets/images/emoji/blue_heart.png create mode 100755 app/assets/images/emoji/blush.png create mode 100755 app/assets/images/emoji/boar.png create mode 100755 app/assets/images/emoji/boat.png create mode 100755 app/assets/images/emoji/bomb.png create mode 100755 app/assets/images/emoji/book.png create mode 100755 app/assets/images/emoji/bookmark.png create mode 100755 app/assets/images/emoji/bookmark_tabs.png create mode 100755 app/assets/images/emoji/books.png create mode 100755 app/assets/images/emoji/boot.png create mode 100755 app/assets/images/emoji/bouquet.png create mode 100755 app/assets/images/emoji/bow.png create mode 100755 app/assets/images/emoji/bowling.png create mode 100755 app/assets/images/emoji/bowtie.png create mode 100755 app/assets/images/emoji/boy.png create mode 100755 app/assets/images/emoji/bread.png create mode 100755 app/assets/images/emoji/bride_with_veil.png create mode 100755 app/assets/images/emoji/bridge_at_night.png create mode 100755 app/assets/images/emoji/briefcase.png create mode 100755 app/assets/images/emoji/broken_heart.png create mode 100755 app/assets/images/emoji/bug.png create mode 100755 app/assets/images/emoji/bulb.png create mode 100755 app/assets/images/emoji/bullettrain_front.png create mode 100755 app/assets/images/emoji/bullettrain_side.png create mode 100755 app/assets/images/emoji/bus.png create mode 100755 app/assets/images/emoji/busstop.png create mode 100755 app/assets/images/emoji/bust_in_silhouette.png create mode 100755 app/assets/images/emoji/busts_in_silhouette.png create mode 100755 app/assets/images/emoji/cactus.png create mode 100755 app/assets/images/emoji/cake.png create mode 100755 app/assets/images/emoji/calendar.png create mode 100755 app/assets/images/emoji/calling.png create mode 100755 app/assets/images/emoji/camel.png create mode 100755 app/assets/images/emoji/camera.png create mode 100755 app/assets/images/emoji/cancer.png create mode 100755 app/assets/images/emoji/candy.png create mode 100755 app/assets/images/emoji/capital_abcd.png create mode 100755 app/assets/images/emoji/capricorn.png create mode 100755 app/assets/images/emoji/car.png create mode 100755 app/assets/images/emoji/card_index.png create mode 100755 app/assets/images/emoji/carousel_horse.png create mode 100755 app/assets/images/emoji/cat.png create mode 100755 app/assets/images/emoji/cat2.png create mode 100755 app/assets/images/emoji/cd.png create mode 100755 app/assets/images/emoji/chart.png create mode 100755 app/assets/images/emoji/chart_with_downwards_trend.png create mode 100755 app/assets/images/emoji/chart_with_upwards_trend.png create mode 100755 app/assets/images/emoji/checkered_flag.png create mode 100755 app/assets/images/emoji/cherries.png create mode 100755 app/assets/images/emoji/cherry_blossom.png create mode 100755 app/assets/images/emoji/chestnut.png create mode 100755 app/assets/images/emoji/chicken.png create mode 100755 app/assets/images/emoji/children_crossing.png create mode 100755 app/assets/images/emoji/chocolate_bar.png create mode 100755 app/assets/images/emoji/christmas_tree.png create mode 100755 app/assets/images/emoji/church.png create mode 100755 app/assets/images/emoji/cinema.png create mode 100755 app/assets/images/emoji/circus_tent.png create mode 100755 app/assets/images/emoji/city_sunrise.png create mode 100755 app/assets/images/emoji/city_sunset.png create mode 100755 app/assets/images/emoji/cl.png create mode 100755 app/assets/images/emoji/clap.png create mode 100755 app/assets/images/emoji/clapper.png create mode 100755 app/assets/images/emoji/clipboard.png create mode 100755 app/assets/images/emoji/clock1.png create mode 100755 app/assets/images/emoji/clock10.png create mode 100755 app/assets/images/emoji/clock1030.png create mode 100755 app/assets/images/emoji/clock11.png create mode 100755 app/assets/images/emoji/clock1130.png create mode 100755 app/assets/images/emoji/clock12.png create mode 100755 app/assets/images/emoji/clock1230.png create mode 100755 app/assets/images/emoji/clock130.png create mode 100755 app/assets/images/emoji/clock2.png create mode 100755 app/assets/images/emoji/clock230.png create mode 100755 app/assets/images/emoji/clock3.png create mode 100755 app/assets/images/emoji/clock330.png create mode 100755 app/assets/images/emoji/clock4.png create mode 100755 app/assets/images/emoji/clock430.png create mode 100755 app/assets/images/emoji/clock5.png create mode 100755 app/assets/images/emoji/clock530.png create mode 100755 app/assets/images/emoji/clock6.png create mode 100755 app/assets/images/emoji/clock630.png create mode 100755 app/assets/images/emoji/clock7.png create mode 100755 app/assets/images/emoji/clock730.png create mode 100755 app/assets/images/emoji/clock8.png create mode 100755 app/assets/images/emoji/clock830.png create mode 100755 app/assets/images/emoji/clock9.png create mode 100755 app/assets/images/emoji/clock930.png create mode 100755 app/assets/images/emoji/closed_book.png create mode 100755 app/assets/images/emoji/closed_lock_with_key.png create mode 100755 app/assets/images/emoji/closed_umbrella.png create mode 100755 app/assets/images/emoji/cloud.png create mode 100755 app/assets/images/emoji/clubs.png create mode 100755 app/assets/images/emoji/cn.png create mode 100755 app/assets/images/emoji/cocktail.png create mode 100755 app/assets/images/emoji/coffee.png create mode 100755 app/assets/images/emoji/cold_sweat.png create mode 100755 app/assets/images/emoji/collision.png create mode 100755 app/assets/images/emoji/computer.png create mode 100755 app/assets/images/emoji/confetti_ball.png create mode 100755 app/assets/images/emoji/confounded.png create mode 100755 app/assets/images/emoji/congratulations.png create mode 100755 app/assets/images/emoji/construction.png create mode 100755 app/assets/images/emoji/construction_worker.png create mode 100755 app/assets/images/emoji/convenience_store.png create mode 100755 app/assets/images/emoji/cookie.png create mode 100755 app/assets/images/emoji/cool.png create mode 100755 app/assets/images/emoji/cop.png create mode 100755 app/assets/images/emoji/copyright.png create mode 100755 app/assets/images/emoji/corn.png create mode 100755 app/assets/images/emoji/couple.png create mode 100755 app/assets/images/emoji/couple_with_heart.png create mode 100755 app/assets/images/emoji/couplekiss.png create mode 100755 app/assets/images/emoji/cow.png create mode 100755 app/assets/images/emoji/cow2.png create mode 100755 app/assets/images/emoji/credit_card.png create mode 100755 app/assets/images/emoji/crocodile.png create mode 100755 app/assets/images/emoji/crossed_flags.png create mode 100755 app/assets/images/emoji/crown.png create mode 100755 app/assets/images/emoji/cry.png create mode 100755 app/assets/images/emoji/crying_cat_face.png create mode 100755 app/assets/images/emoji/crystal_ball.png create mode 100755 app/assets/images/emoji/cupid.png create mode 100755 app/assets/images/emoji/curly_loop.png create mode 100755 app/assets/images/emoji/currency_exchange.png create mode 100755 app/assets/images/emoji/curry.png create mode 100755 app/assets/images/emoji/custard.png create mode 100755 app/assets/images/emoji/customs.png create mode 100755 app/assets/images/emoji/cyclone.png create mode 100755 app/assets/images/emoji/dancer.png create mode 100755 app/assets/images/emoji/dancers.png create mode 100755 app/assets/images/emoji/dango.png create mode 100755 app/assets/images/emoji/dart.png create mode 100755 app/assets/images/emoji/dash.png create mode 100755 app/assets/images/emoji/date.png create mode 100755 app/assets/images/emoji/de.png create mode 100755 app/assets/images/emoji/deciduous_tree.png create mode 100755 app/assets/images/emoji/department_store.png create mode 100755 app/assets/images/emoji/diamond_shape_with_a_dot_inside.png create mode 100755 app/assets/images/emoji/diamonds.png create mode 100755 app/assets/images/emoji/disappointed.png create mode 100755 app/assets/images/emoji/dizzy.png create mode 100755 app/assets/images/emoji/dizzy_face.png create mode 100755 app/assets/images/emoji/do_not_litter.png create mode 100755 app/assets/images/emoji/dog.png create mode 100755 app/assets/images/emoji/dog2.png create mode 100755 app/assets/images/emoji/dollar.png create mode 100755 app/assets/images/emoji/dolls.png create mode 100755 app/assets/images/emoji/dolphin.png create mode 100755 app/assets/images/emoji/door.png create mode 100755 app/assets/images/emoji/doughnut.png create mode 100755 app/assets/images/emoji/dragon.png create mode 100755 app/assets/images/emoji/dragon_face.png create mode 100755 app/assets/images/emoji/dress.png create mode 100755 app/assets/images/emoji/dromedary_camel.png create mode 100755 app/assets/images/emoji/droplet.png create mode 100755 app/assets/images/emoji/dvd.png create mode 100755 app/assets/images/emoji/e-mail.png create mode 100755 app/assets/images/emoji/ear.png create mode 100755 app/assets/images/emoji/ear_of_rice.png create mode 100755 app/assets/images/emoji/earth_africa.png create mode 100755 app/assets/images/emoji/earth_americas.png create mode 100755 app/assets/images/emoji/earth_asia.png create mode 100755 app/assets/images/emoji/egg.png create mode 100755 app/assets/images/emoji/eggplant.png create mode 100755 app/assets/images/emoji/eight.png create mode 100755 app/assets/images/emoji/eight_pointed_black_star.png create mode 100755 app/assets/images/emoji/eight_spoked_asterisk.png create mode 100755 app/assets/images/emoji/electric_plug.png create mode 100755 app/assets/images/emoji/elephant.png create mode 100755 app/assets/images/emoji/email.png create mode 100755 app/assets/images/emoji/end.png create mode 100755 app/assets/images/emoji/envelope.png create mode 100755 app/assets/images/emoji/es.png create mode 100755 app/assets/images/emoji/euro.png create mode 100755 app/assets/images/emoji/european_castle.png create mode 100755 app/assets/images/emoji/european_post_office.png create mode 100755 app/assets/images/emoji/evergreen_tree.png create mode 100755 app/assets/images/emoji/exclamation.png create mode 100755 app/assets/images/emoji/eyeglasses.png create mode 100755 app/assets/images/emoji/eyes.png create mode 100755 app/assets/images/emoji/facepunch.png create mode 100755 app/assets/images/emoji/factory.png create mode 100755 app/assets/images/emoji/fallen_leaf.png create mode 100755 app/assets/images/emoji/family.png create mode 100755 app/assets/images/emoji/fast_forward.png create mode 100755 app/assets/images/emoji/fax.png create mode 100755 app/assets/images/emoji/fearful.png create mode 100755 app/assets/images/emoji/feelsgood.png create mode 100755 app/assets/images/emoji/feet.png create mode 100755 app/assets/images/emoji/ferris_wheel.png create mode 100755 app/assets/images/emoji/file_folder.png create mode 100755 app/assets/images/emoji/finnadie.png create mode 100755 app/assets/images/emoji/fire.png create mode 100755 app/assets/images/emoji/fire_engine.png create mode 100755 app/assets/images/emoji/fireworks.png create mode 100755 app/assets/images/emoji/first_quarter_moon.png create mode 100755 app/assets/images/emoji/first_quarter_moon_with_face.png create mode 100755 app/assets/images/emoji/fish.png create mode 100755 app/assets/images/emoji/fish_cake.png create mode 100755 app/assets/images/emoji/fishing_pole_and_fish.png create mode 100755 app/assets/images/emoji/fist.png create mode 100755 app/assets/images/emoji/five.png create mode 100755 app/assets/images/emoji/flags.png create mode 100755 app/assets/images/emoji/flashlight.png create mode 100755 app/assets/images/emoji/floppy_disk.png create mode 100755 app/assets/images/emoji/flower_playing_cards.png create mode 100755 app/assets/images/emoji/flushed.png create mode 100755 app/assets/images/emoji/foggy.png create mode 100755 app/assets/images/emoji/football.png create mode 100755 app/assets/images/emoji/fork_and_knife.png create mode 100755 app/assets/images/emoji/fountain.png create mode 100755 app/assets/images/emoji/four.png create mode 100755 app/assets/images/emoji/four_leaf_clover.png create mode 100755 app/assets/images/emoji/fr.png create mode 100755 app/assets/images/emoji/free.png create mode 100755 app/assets/images/emoji/fried_shrimp.png create mode 100755 app/assets/images/emoji/fries.png create mode 100755 app/assets/images/emoji/frog.png create mode 100755 app/assets/images/emoji/fuelpump.png create mode 100755 app/assets/images/emoji/full_moon.png create mode 100755 app/assets/images/emoji/full_moon_with_face.png create mode 100755 app/assets/images/emoji/game_die.png create mode 100755 app/assets/images/emoji/gb.png create mode 100755 app/assets/images/emoji/gem.png create mode 100755 app/assets/images/emoji/gemini.png create mode 100755 app/assets/images/emoji/ghost.png create mode 100755 app/assets/images/emoji/gift.png create mode 100755 app/assets/images/emoji/gift_heart.png create mode 100755 app/assets/images/emoji/girl.png create mode 100755 app/assets/images/emoji/globe_with_meridians.png create mode 100755 app/assets/images/emoji/goat.png create mode 100755 app/assets/images/emoji/goberserk.png create mode 100755 app/assets/images/emoji/godmode.png create mode 100755 app/assets/images/emoji/golf.png create mode 100755 app/assets/images/emoji/grapes.png create mode 100755 app/assets/images/emoji/green_apple.png create mode 100755 app/assets/images/emoji/green_book.png create mode 100755 app/assets/images/emoji/green_heart.png create mode 100755 app/assets/images/emoji/grey_exclamation.png create mode 100755 app/assets/images/emoji/grey_question.png create mode 100755 app/assets/images/emoji/grin.png create mode 100755 app/assets/images/emoji/guardsman.png create mode 100755 app/assets/images/emoji/guitar.png create mode 100755 app/assets/images/emoji/gun.png create mode 100755 app/assets/images/emoji/haircut.png create mode 100755 app/assets/images/emoji/hamburger.png create mode 100755 app/assets/images/emoji/hammer.png create mode 100755 app/assets/images/emoji/hamster.png create mode 100755 app/assets/images/emoji/hand.png create mode 100755 app/assets/images/emoji/handbag.png create mode 100755 app/assets/images/emoji/hankey.png create mode 100755 app/assets/images/emoji/hash.png create mode 100755 app/assets/images/emoji/hatched_chick.png create mode 100755 app/assets/images/emoji/hatching_chick.png create mode 100755 app/assets/images/emoji/headphones.png create mode 100755 app/assets/images/emoji/hear_no_evil.png create mode 100755 app/assets/images/emoji/heart.png create mode 100755 app/assets/images/emoji/heart_decoration.png create mode 100755 app/assets/images/emoji/heart_eyes.png create mode 100755 app/assets/images/emoji/heart_eyes_cat.png create mode 100755 app/assets/images/emoji/heartbeat.png create mode 100755 app/assets/images/emoji/heartpulse.png create mode 100755 app/assets/images/emoji/hearts.png create mode 100755 app/assets/images/emoji/heavy_check_mark.png create mode 100755 app/assets/images/emoji/heavy_division_sign.png create mode 100755 app/assets/images/emoji/heavy_dollar_sign.png create mode 100755 app/assets/images/emoji/heavy_exclamation_mark.png create mode 100755 app/assets/images/emoji/heavy_minus_sign.png create mode 100755 app/assets/images/emoji/heavy_multiplication_x.png create mode 100755 app/assets/images/emoji/heavy_plus_sign.png create mode 100755 app/assets/images/emoji/helicopter.png create mode 100755 app/assets/images/emoji/herb.png create mode 100755 app/assets/images/emoji/hibiscus.png create mode 100755 app/assets/images/emoji/high_brightness.png create mode 100755 app/assets/images/emoji/high_heel.png create mode 100755 app/assets/images/emoji/hocho.png create mode 100755 app/assets/images/emoji/honey_pot.png create mode 100755 app/assets/images/emoji/honeybee.png create mode 100755 app/assets/images/emoji/horse.png create mode 100755 app/assets/images/emoji/horse_racing.png create mode 100755 app/assets/images/emoji/hospital.png create mode 100755 app/assets/images/emoji/hotel.png create mode 100755 app/assets/images/emoji/hotsprings.png create mode 100755 app/assets/images/emoji/hourglass.png create mode 100755 app/assets/images/emoji/house.png create mode 100755 app/assets/images/emoji/hurtrealbad.png create mode 100755 app/assets/images/emoji/ice_cream.png create mode 100755 app/assets/images/emoji/icecream.png create mode 100755 app/assets/images/emoji/id.png create mode 100755 app/assets/images/emoji/ideograph_advantage.png create mode 100755 app/assets/images/emoji/imp.png create mode 100755 app/assets/images/emoji/inbox_tray.png create mode 100755 app/assets/images/emoji/incoming_envelope.png create mode 100755 app/assets/images/emoji/information_desk_person.png create mode 100755 app/assets/images/emoji/information_source.png create mode 100755 app/assets/images/emoji/innocent.png create mode 100755 app/assets/images/emoji/interrobang.png create mode 100755 app/assets/images/emoji/iphone.png create mode 100755 app/assets/images/emoji/it.png create mode 100755 app/assets/images/emoji/izakaya_lantern.png create mode 100755 app/assets/images/emoji/jack_o_lantern.png create mode 100755 app/assets/images/emoji/japan.png create mode 100755 app/assets/images/emoji/japanese_castle.png create mode 100755 app/assets/images/emoji/japanese_goblin.png create mode 100755 app/assets/images/emoji/japanese_ogre.png create mode 100755 app/assets/images/emoji/jeans.png create mode 100755 app/assets/images/emoji/joy.png create mode 100755 app/assets/images/emoji/joy_cat.png create mode 100755 app/assets/images/emoji/jp.png create mode 100755 app/assets/images/emoji/key.png create mode 100755 app/assets/images/emoji/keycap_ten.png create mode 100755 app/assets/images/emoji/kimono.png create mode 100755 app/assets/images/emoji/kiss.png create mode 100755 app/assets/images/emoji/kissing_cat.png create mode 100755 app/assets/images/emoji/kissing_face.png create mode 100755 app/assets/images/emoji/kissing_heart.png create mode 100755 app/assets/images/emoji/koala.png create mode 100755 app/assets/images/emoji/koko.png create mode 100755 app/assets/images/emoji/kr.png create mode 100755 app/assets/images/emoji/large_blue_circle.png create mode 100755 app/assets/images/emoji/large_blue_diamond.png create mode 100755 app/assets/images/emoji/large_orange_diamond.png create mode 100755 app/assets/images/emoji/last_quarter_moon.png create mode 100755 app/assets/images/emoji/last_quarter_moon_with_face.png create mode 100755 app/assets/images/emoji/laughing.png create mode 100755 app/assets/images/emoji/leaves.png create mode 100755 app/assets/images/emoji/ledger.png create mode 100755 app/assets/images/emoji/left_luggage.png create mode 100755 app/assets/images/emoji/left_right_arrow.png create mode 100755 app/assets/images/emoji/leftwards_arrow_with_hook.png create mode 100755 app/assets/images/emoji/lemon.png create mode 100755 app/assets/images/emoji/leo.png create mode 100755 app/assets/images/emoji/leopard.png create mode 100755 app/assets/images/emoji/libra.png create mode 100755 app/assets/images/emoji/light_rail.png create mode 100755 app/assets/images/emoji/link.png create mode 100755 app/assets/images/emoji/lips.png create mode 100755 app/assets/images/emoji/lipstick.png create mode 100755 app/assets/images/emoji/lock.png create mode 100755 app/assets/images/emoji/lock_with_ink_pen.png create mode 100755 app/assets/images/emoji/lollipop.png create mode 100755 app/assets/images/emoji/loop.png create mode 100755 app/assets/images/emoji/loudspeaker.png create mode 100755 app/assets/images/emoji/love_hotel.png create mode 100755 app/assets/images/emoji/love_letter.png create mode 100755 app/assets/images/emoji/low_brightness.png create mode 100755 app/assets/images/emoji/m.png create mode 100755 app/assets/images/emoji/mag.png create mode 100755 app/assets/images/emoji/mag_right.png create mode 100755 app/assets/images/emoji/mahjong.png create mode 100755 app/assets/images/emoji/mailbox.png create mode 100755 app/assets/images/emoji/mailbox_closed.png create mode 100755 app/assets/images/emoji/mailbox_with_mail.png create mode 100755 app/assets/images/emoji/mailbox_with_no_mail.png create mode 100755 app/assets/images/emoji/man.png create mode 100755 app/assets/images/emoji/man_with_gua_pi_mao.png create mode 100755 app/assets/images/emoji/man_with_turban.png create mode 100755 app/assets/images/emoji/mans_shoe.png create mode 100755 app/assets/images/emoji/maple_leaf.png create mode 100755 app/assets/images/emoji/mask.png create mode 100755 app/assets/images/emoji/massage.png create mode 100755 app/assets/images/emoji/meat_on_bone.png create mode 100755 app/assets/images/emoji/mega.png create mode 100755 app/assets/images/emoji/melon.png create mode 100755 app/assets/images/emoji/memo.png create mode 100755 app/assets/images/emoji/mens.png create mode 100755 app/assets/images/emoji/metal.png create mode 100755 app/assets/images/emoji/metro.png create mode 100755 app/assets/images/emoji/microphone.png create mode 100755 app/assets/images/emoji/microscope.png create mode 100755 app/assets/images/emoji/milky_way.png create mode 100755 app/assets/images/emoji/minibus.png create mode 100755 app/assets/images/emoji/minidisc.png create mode 100755 app/assets/images/emoji/mobile_phone_off.png create mode 100755 app/assets/images/emoji/money_with_wings.png create mode 100755 app/assets/images/emoji/moneybag.png create mode 100755 app/assets/images/emoji/monkey.png create mode 100755 app/assets/images/emoji/monkey_face.png create mode 100755 app/assets/images/emoji/monorail.png create mode 100755 app/assets/images/emoji/moon.png create mode 100755 app/assets/images/emoji/mortar_board.png create mode 100755 app/assets/images/emoji/mount_fuji.png create mode 100755 app/assets/images/emoji/mountain_bicyclist.png create mode 100755 app/assets/images/emoji/mountain_cableway.png create mode 100755 app/assets/images/emoji/mountain_railway.png create mode 100755 app/assets/images/emoji/mouse.png create mode 100755 app/assets/images/emoji/mouse2.png create mode 100755 app/assets/images/emoji/movie_camera.png create mode 100755 app/assets/images/emoji/moyai.png create mode 100755 app/assets/images/emoji/muscle.png create mode 100755 app/assets/images/emoji/mushroom.png create mode 100755 app/assets/images/emoji/musical_keyboard.png create mode 100755 app/assets/images/emoji/musical_note.png create mode 100755 app/assets/images/emoji/musical_score.png create mode 100755 app/assets/images/emoji/mute.png create mode 100755 app/assets/images/emoji/nail_care.png create mode 100755 app/assets/images/emoji/name_badge.png create mode 100755 app/assets/images/emoji/neckbeard.png create mode 100755 app/assets/images/emoji/necktie.png create mode 100755 app/assets/images/emoji/negative_squared_cross_mark.png create mode 100755 app/assets/images/emoji/neutral_face.png create mode 100755 app/assets/images/emoji/new.png create mode 100755 app/assets/images/emoji/new_moon.png create mode 100755 app/assets/images/emoji/new_moon_with_face.png create mode 100755 app/assets/images/emoji/newspaper.png create mode 100755 app/assets/images/emoji/ng.png create mode 100755 app/assets/images/emoji/nine.png create mode 100755 app/assets/images/emoji/no_bell.png create mode 100755 app/assets/images/emoji/no_bicycles.png create mode 100755 app/assets/images/emoji/no_entry.png create mode 100755 app/assets/images/emoji/no_entry_sign.png create mode 100755 app/assets/images/emoji/no_good.png create mode 100755 app/assets/images/emoji/no_mobile_phones.png create mode 100755 app/assets/images/emoji/no_mouth.png create mode 100755 app/assets/images/emoji/no_pedestrians.png create mode 100755 app/assets/images/emoji/no_smoking.png create mode 100755 app/assets/images/emoji/non-potable_water.png create mode 100755 app/assets/images/emoji/nose.png create mode 100755 app/assets/images/emoji/notebook.png create mode 100755 app/assets/images/emoji/notebook_with_decorative_cover.png create mode 100755 app/assets/images/emoji/notes.png create mode 100755 app/assets/images/emoji/nut_and_bolt.png create mode 100755 app/assets/images/emoji/o.png create mode 100755 app/assets/images/emoji/o2.png create mode 100755 app/assets/images/emoji/ocean.png create mode 100755 app/assets/images/emoji/octocat.png create mode 100755 app/assets/images/emoji/octopus.png create mode 100755 app/assets/images/emoji/oden.png create mode 100755 app/assets/images/emoji/office.png create mode 100755 app/assets/images/emoji/ok.png create mode 100755 app/assets/images/emoji/ok_hand.png create mode 100755 app/assets/images/emoji/ok_woman.png create mode 100755 app/assets/images/emoji/older_man.png create mode 100755 app/assets/images/emoji/older_woman.png create mode 100755 app/assets/images/emoji/on.png create mode 100755 app/assets/images/emoji/oncoming_automobile.png create mode 100755 app/assets/images/emoji/oncoming_bus.png create mode 100755 app/assets/images/emoji/oncoming_police_car.png create mode 100755 app/assets/images/emoji/oncoming_taxi.png create mode 100755 app/assets/images/emoji/one.png create mode 100755 app/assets/images/emoji/open_file_folder.png create mode 100755 app/assets/images/emoji/open_hands.png create mode 100755 app/assets/images/emoji/ophiuchus.png create mode 100755 app/assets/images/emoji/orange_book.png create mode 100755 app/assets/images/emoji/outbox_tray.png create mode 100755 app/assets/images/emoji/ox.png create mode 100755 app/assets/images/emoji/page_facing_up.png create mode 100755 app/assets/images/emoji/page_with_curl.png create mode 100755 app/assets/images/emoji/pager.png create mode 100755 app/assets/images/emoji/palm_tree.png create mode 100755 app/assets/images/emoji/panda_face.png create mode 100755 app/assets/images/emoji/paperclip.png create mode 100755 app/assets/images/emoji/parking.png create mode 100755 app/assets/images/emoji/part_alternation_mark.png create mode 100755 app/assets/images/emoji/partly_sunny.png create mode 100755 app/assets/images/emoji/passport_control.png create mode 100755 app/assets/images/emoji/paw_prints.png create mode 100755 app/assets/images/emoji/peach.png create mode 100755 app/assets/images/emoji/pear.png create mode 100755 app/assets/images/emoji/pencil.png create mode 100755 app/assets/images/emoji/pencil2.png create mode 100755 app/assets/images/emoji/penguin.png create mode 100755 app/assets/images/emoji/pensive.png create mode 100755 app/assets/images/emoji/performing_arts.png create mode 100755 app/assets/images/emoji/persevere.png create mode 100755 app/assets/images/emoji/person_frowning.png create mode 100755 app/assets/images/emoji/person_with_blond_hair.png create mode 100755 app/assets/images/emoji/person_with_pouting_face.png create mode 100755 app/assets/images/emoji/phone.png create mode 100755 app/assets/images/emoji/pig.png create mode 100755 app/assets/images/emoji/pig2.png create mode 100755 app/assets/images/emoji/pig_nose.png create mode 100755 app/assets/images/emoji/pill.png create mode 100755 app/assets/images/emoji/pineapple.png create mode 100755 app/assets/images/emoji/pisces.png create mode 100755 app/assets/images/emoji/pizza.png create mode 100755 app/assets/images/emoji/plus1.png create mode 100755 app/assets/images/emoji/point_down.png create mode 100755 app/assets/images/emoji/point_left.png create mode 100755 app/assets/images/emoji/point_right.png create mode 100755 app/assets/images/emoji/point_up.png create mode 100755 app/assets/images/emoji/point_up_2.png create mode 100755 app/assets/images/emoji/police_car.png create mode 100755 app/assets/images/emoji/poodle.png create mode 100755 app/assets/images/emoji/poop.png create mode 100755 app/assets/images/emoji/post_office.png create mode 100755 app/assets/images/emoji/postal_horn.png create mode 100755 app/assets/images/emoji/postbox.png create mode 100755 app/assets/images/emoji/potable_water.png create mode 100755 app/assets/images/emoji/pouch.png create mode 100755 app/assets/images/emoji/poultry_leg.png create mode 100755 app/assets/images/emoji/pound.png create mode 100755 app/assets/images/emoji/pouting_cat.png create mode 100755 app/assets/images/emoji/pray.png create mode 100755 app/assets/images/emoji/princess.png create mode 100755 app/assets/images/emoji/punch.png create mode 100755 app/assets/images/emoji/purple_heart.png create mode 100755 app/assets/images/emoji/purse.png create mode 100755 app/assets/images/emoji/pushpin.png create mode 100755 app/assets/images/emoji/put_litter_in_its_place.png create mode 100755 app/assets/images/emoji/question.png create mode 100755 app/assets/images/emoji/rabbit.png create mode 100755 app/assets/images/emoji/rabbit2.png create mode 100755 app/assets/images/emoji/racehorse.png create mode 100755 app/assets/images/emoji/radio.png create mode 100755 app/assets/images/emoji/radio_button.png create mode 100755 app/assets/images/emoji/rage.png create mode 100755 app/assets/images/emoji/rage1.png create mode 100755 app/assets/images/emoji/rage2.png create mode 100755 app/assets/images/emoji/rage3.png create mode 100755 app/assets/images/emoji/rage4.png create mode 100755 app/assets/images/emoji/railway_car.png create mode 100755 app/assets/images/emoji/rainbow.png create mode 100755 app/assets/images/emoji/raised_hand.png create mode 100755 app/assets/images/emoji/raised_hands.png create mode 100755 app/assets/images/emoji/ram.png create mode 100755 app/assets/images/emoji/ramen.png create mode 100755 app/assets/images/emoji/rat.png create mode 100755 app/assets/images/emoji/recycle.png create mode 100755 app/assets/images/emoji/red_car.png create mode 100755 app/assets/images/emoji/red_circle.png create mode 100755 app/assets/images/emoji/registered.png create mode 100755 app/assets/images/emoji/relaxed.png create mode 100755 app/assets/images/emoji/relieved.png create mode 100755 app/assets/images/emoji/repeat.png create mode 100755 app/assets/images/emoji/repeat_one.png create mode 100755 app/assets/images/emoji/restroom.png create mode 100755 app/assets/images/emoji/revolving_hearts.png create mode 100755 app/assets/images/emoji/rewind.png create mode 100755 app/assets/images/emoji/ribbon.png create mode 100755 app/assets/images/emoji/rice.png create mode 100755 app/assets/images/emoji/rice_ball.png create mode 100755 app/assets/images/emoji/rice_cracker.png create mode 100755 app/assets/images/emoji/rice_scene.png create mode 100755 app/assets/images/emoji/ring.png create mode 100755 app/assets/images/emoji/rocket.png create mode 100755 app/assets/images/emoji/roller_coaster.png create mode 100755 app/assets/images/emoji/rooster.png create mode 100755 app/assets/images/emoji/rose.png create mode 100755 app/assets/images/emoji/rotating_light.png create mode 100755 app/assets/images/emoji/round_pushpin.png create mode 100755 app/assets/images/emoji/rowboat.png create mode 100755 app/assets/images/emoji/ru.png create mode 100755 app/assets/images/emoji/rugby_football.png create mode 100755 app/assets/images/emoji/runner.png create mode 100755 app/assets/images/emoji/running.png create mode 100755 app/assets/images/emoji/running_shirt_with_sash.png create mode 100755 app/assets/images/emoji/sa.png create mode 100755 app/assets/images/emoji/sagittarius.png create mode 100755 app/assets/images/emoji/sailboat.png create mode 100755 app/assets/images/emoji/sake.png create mode 100755 app/assets/images/emoji/sandal.png create mode 100755 app/assets/images/emoji/santa.png create mode 100755 app/assets/images/emoji/satellite.png create mode 100755 app/assets/images/emoji/satisfied.png create mode 100755 app/assets/images/emoji/saxophone.png create mode 100755 app/assets/images/emoji/school.png create mode 100755 app/assets/images/emoji/school_satchel.png create mode 100755 app/assets/images/emoji/scissors.png create mode 100755 app/assets/images/emoji/scorpius.png create mode 100755 app/assets/images/emoji/scream.png create mode 100755 app/assets/images/emoji/scream_cat.png create mode 100755 app/assets/images/emoji/scroll.png create mode 100755 app/assets/images/emoji/seat.png create mode 100755 app/assets/images/emoji/secret.png create mode 100755 app/assets/images/emoji/see_no_evil.png create mode 100755 app/assets/images/emoji/seedling.png create mode 100755 app/assets/images/emoji/seven.png create mode 100755 app/assets/images/emoji/shaved_ice.png create mode 100755 app/assets/images/emoji/sheep.png create mode 100755 app/assets/images/emoji/shell.png create mode 100755 app/assets/images/emoji/ship.png create mode 100755 app/assets/images/emoji/shipit.png create mode 100755 app/assets/images/emoji/shirt.png create mode 100755 app/assets/images/emoji/shit.png create mode 100755 app/assets/images/emoji/shoe.png create mode 100755 app/assets/images/emoji/shower.png create mode 100755 app/assets/images/emoji/signal_strength.png create mode 100755 app/assets/images/emoji/six.png create mode 100755 app/assets/images/emoji/six_pointed_star.png create mode 100755 app/assets/images/emoji/ski.png create mode 100755 app/assets/images/emoji/skull.png create mode 100755 app/assets/images/emoji/sleepy.png create mode 100755 app/assets/images/emoji/slot_machine.png create mode 100755 app/assets/images/emoji/small_blue_diamond.png create mode 100755 app/assets/images/emoji/small_orange_diamond.png create mode 100755 app/assets/images/emoji/small_red_triangle.png create mode 100755 app/assets/images/emoji/small_red_triangle_down.png create mode 100755 app/assets/images/emoji/smile.png create mode 100755 app/assets/images/emoji/smile_cat.png create mode 100755 app/assets/images/emoji/smiley.png create mode 100755 app/assets/images/emoji/smiley_cat.png create mode 100755 app/assets/images/emoji/smiling_imp.png create mode 100755 app/assets/images/emoji/smirk.png create mode 100755 app/assets/images/emoji/smirk_cat.png create mode 100755 app/assets/images/emoji/smoking.png create mode 100755 app/assets/images/emoji/snail.png create mode 100755 app/assets/images/emoji/snake.png create mode 100755 app/assets/images/emoji/snowboarder.png create mode 100755 app/assets/images/emoji/snowflake.png create mode 100755 app/assets/images/emoji/snowman.png create mode 100755 app/assets/images/emoji/sob.png create mode 100755 app/assets/images/emoji/soccer.png create mode 100755 app/assets/images/emoji/soon.png create mode 100755 app/assets/images/emoji/sos.png create mode 100755 app/assets/images/emoji/sound.png create mode 100755 app/assets/images/emoji/space_invader.png create mode 100755 app/assets/images/emoji/spades.png create mode 100755 app/assets/images/emoji/spaghetti.png create mode 100755 app/assets/images/emoji/sparkler.png create mode 100755 app/assets/images/emoji/sparkles.png create mode 100755 app/assets/images/emoji/speak_no_evil.png create mode 100755 app/assets/images/emoji/speaker.png create mode 100755 app/assets/images/emoji/speech_balloon.png create mode 100755 app/assets/images/emoji/speedboat.png create mode 100755 app/assets/images/emoji/squirrel.png create mode 100755 app/assets/images/emoji/star.png create mode 100755 app/assets/images/emoji/star2.png create mode 100755 app/assets/images/emoji/stars.png create mode 100755 app/assets/images/emoji/station.png create mode 100755 app/assets/images/emoji/statue_of_liberty.png create mode 100755 app/assets/images/emoji/steam_locomotive.png create mode 100755 app/assets/images/emoji/stew.png create mode 100755 app/assets/images/emoji/straight_ruler.png create mode 100755 app/assets/images/emoji/strawberry.png create mode 100755 app/assets/images/emoji/sun_with_face.png create mode 100755 app/assets/images/emoji/sunflower.png create mode 100755 app/assets/images/emoji/sunglasses.png create mode 100755 app/assets/images/emoji/sunny.png create mode 100755 app/assets/images/emoji/sunrise.png create mode 100755 app/assets/images/emoji/sunrise_over_mountains.png create mode 100755 app/assets/images/emoji/surfer.png create mode 100755 app/assets/images/emoji/sushi.png create mode 100755 app/assets/images/emoji/suspect.png create mode 100755 app/assets/images/emoji/suspension_railway.png create mode 100755 app/assets/images/emoji/sweat.png create mode 100755 app/assets/images/emoji/sweat_drops.png create mode 100755 app/assets/images/emoji/sweat_smile.png create mode 100755 app/assets/images/emoji/sweet_potato.png create mode 100755 app/assets/images/emoji/swimmer.png create mode 100755 app/assets/images/emoji/symbols.png create mode 100755 app/assets/images/emoji/syringe.png create mode 100755 app/assets/images/emoji/tada.png create mode 100755 app/assets/images/emoji/tanabata_tree.png create mode 100755 app/assets/images/emoji/tangerine.png create mode 100755 app/assets/images/emoji/taurus.png create mode 100755 app/assets/images/emoji/taxi.png create mode 100755 app/assets/images/emoji/tea.png create mode 100755 app/assets/images/emoji/telephone.png create mode 100755 app/assets/images/emoji/telephone_receiver.png create mode 100755 app/assets/images/emoji/telescope.png create mode 100755 app/assets/images/emoji/tennis.png create mode 100755 app/assets/images/emoji/tent.png create mode 100755 app/assets/images/emoji/thought_balloon.png create mode 100755 app/assets/images/emoji/three.png create mode 100755 app/assets/images/emoji/thumbsdown.png create mode 100755 app/assets/images/emoji/thumbsup.png create mode 100755 app/assets/images/emoji/ticket.png create mode 100755 app/assets/images/emoji/tiger.png create mode 100755 app/assets/images/emoji/tiger2.png create mode 100755 app/assets/images/emoji/tired_face.png create mode 100755 app/assets/images/emoji/tm.png create mode 100755 app/assets/images/emoji/toilet.png create mode 100755 app/assets/images/emoji/tokyo_tower.png create mode 100755 app/assets/images/emoji/tomato.png create mode 100755 app/assets/images/emoji/tongue.png create mode 100755 app/assets/images/emoji/tongue2.png create mode 100755 app/assets/images/emoji/top.png create mode 100755 app/assets/images/emoji/tophat.png create mode 100755 app/assets/images/emoji/tractor.png create mode 100755 app/assets/images/emoji/traffic_light.png create mode 100755 app/assets/images/emoji/train.png create mode 100755 app/assets/images/emoji/train2.png create mode 100755 app/assets/images/emoji/tram.png create mode 100755 app/assets/images/emoji/triangular_flag_on_post.png create mode 100755 app/assets/images/emoji/triangular_ruler.png create mode 100755 app/assets/images/emoji/trident.png create mode 100755 app/assets/images/emoji/triumph.png create mode 100755 app/assets/images/emoji/trolleybus.png create mode 100755 app/assets/images/emoji/trollface.png create mode 100755 app/assets/images/emoji/trophy.png create mode 100755 app/assets/images/emoji/tropical_drink.png create mode 100755 app/assets/images/emoji/tropical_fish.png create mode 100755 app/assets/images/emoji/truck.png create mode 100755 app/assets/images/emoji/trumpet.png create mode 100755 app/assets/images/emoji/tshirt.png create mode 100755 app/assets/images/emoji/tulip.png create mode 100755 app/assets/images/emoji/turtle.png create mode 100755 app/assets/images/emoji/tv.png create mode 100755 app/assets/images/emoji/twisted_rightwards_arrows.png create mode 100755 app/assets/images/emoji/two.png create mode 100755 app/assets/images/emoji/two_hearts.png create mode 100755 app/assets/images/emoji/two_men_holding_hands.png create mode 100755 app/assets/images/emoji/two_women_holding_hands.png create mode 100755 app/assets/images/emoji/u5272.png create mode 100755 app/assets/images/emoji/u5408.png create mode 100755 app/assets/images/emoji/u55b6.png create mode 100755 app/assets/images/emoji/u6307.png create mode 100755 app/assets/images/emoji/u6708.png create mode 100755 app/assets/images/emoji/u6709.png create mode 100755 app/assets/images/emoji/u6e80.png create mode 100755 app/assets/images/emoji/u7121.png create mode 100755 app/assets/images/emoji/u7533.png create mode 100755 app/assets/images/emoji/u7981.png create mode 100755 app/assets/images/emoji/u7a7a.png create mode 100755 app/assets/images/emoji/uk.png create mode 100755 app/assets/images/emoji/umbrella.png create mode 100755 app/assets/images/emoji/unamused.png create mode 100755 app/assets/images/emoji/underage.png create mode 100755 app/assets/images/emoji/unlock.png create mode 100755 app/assets/images/emoji/up.png create mode 100755 app/assets/images/emoji/us.png create mode 100755 app/assets/images/emoji/v.png create mode 100755 app/assets/images/emoji/vertical_traffic_light.png create mode 100755 app/assets/images/emoji/vhs.png create mode 100755 app/assets/images/emoji/vibration_mode.png create mode 100755 app/assets/images/emoji/video_camera.png create mode 100755 app/assets/images/emoji/video_game.png create mode 100755 app/assets/images/emoji/violin.png create mode 100755 app/assets/images/emoji/virgo.png create mode 100755 app/assets/images/emoji/volcano.png create mode 100755 app/assets/images/emoji/vs.png create mode 100755 app/assets/images/emoji/walking.png create mode 100755 app/assets/images/emoji/waning_crescent_moon.png create mode 100755 app/assets/images/emoji/waning_gibbous_moon.png create mode 100755 app/assets/images/emoji/warning.png create mode 100755 app/assets/images/emoji/watch.png create mode 100755 app/assets/images/emoji/water_buffalo.png create mode 100755 app/assets/images/emoji/watermelon.png create mode 100755 app/assets/images/emoji/wave.png create mode 100755 app/assets/images/emoji/wavy_dash.png create mode 100755 app/assets/images/emoji/waxing_crescent_moon.png create mode 100755 app/assets/images/emoji/waxing_gibbous_moon.png create mode 100755 app/assets/images/emoji/wc.png create mode 100755 app/assets/images/emoji/weary.png create mode 100755 app/assets/images/emoji/wedding.png create mode 100755 app/assets/images/emoji/whale.png create mode 100755 app/assets/images/emoji/whale2.png create mode 100755 app/assets/images/emoji/wheelchair.png create mode 100755 app/assets/images/emoji/white_circle.png create mode 100755 app/assets/images/emoji/white_flower.png create mode 100755 app/assets/images/emoji/white_square.png create mode 100755 app/assets/images/emoji/wind_chime.png create mode 100755 app/assets/images/emoji/wine_glass.png create mode 100755 app/assets/images/emoji/wink.png create mode 100755 app/assets/images/emoji/wink2.png create mode 100755 app/assets/images/emoji/wolf.png create mode 100755 app/assets/images/emoji/woman.png create mode 100755 app/assets/images/emoji/womans_clothes.png create mode 100755 app/assets/images/emoji/womans_hat.png create mode 100755 app/assets/images/emoji/womens.png create mode 100755 app/assets/images/emoji/wrench.png create mode 100755 app/assets/images/emoji/x.png create mode 100755 app/assets/images/emoji/yellow_heart.png create mode 100755 app/assets/images/emoji/yen.png create mode 100755 app/assets/images/emoji/yum.png create mode 100755 app/assets/images/emoji/zap.png create mode 100755 app/assets/images/emoji/zero.png create mode 100755 app/assets/images/emoji/zzz.png diff --git a/app/assets/images/emoji/+1.png b/app/assets/images/emoji/+1.png new file mode 100755 index 0000000000000000000000000000000000000000..3a43ecae29590cb314aeeea6e1b0fc4b065df671 GIT binary patch literal 5135 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 B_>lkr literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/-1.png b/app/assets/images/emoji/-1.png new file mode 100755 index 0000000000000000000000000000000000000000..41c6b825d6a6abf736a1b882c951c1eb942afabf GIT binary patch literal 5070 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/100.png b/app/assets/images/emoji/100.png new file mode 100755 index 0000000000000000000000000000000000000000..bce9ab14f59d1c8dc298279ed1931292f613fdcd GIT binary patch literal 3302 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE)_S@)hEy=VJy^YFUTGr3 zgXiDt-tXLEoBQ%F*OjmZB92yq0&_MSZ0Ry;UohLM{G?d#?2JuEQ@U^dn{iUC{G`#D zGt>SWZa#TsN5+RkB90%Jv_y1TgBC2c-5Y-{^ZeJ{``*9buK!$l+nlhfsujVL?f9S1 zDL$vaxmM@qX`#y^f9AY>_($z^@wRh|>J@dD8y+~rcrW7dS6@AkE4zN)s@k`wThiF0 z@tDx0%P0QIs2uXslTJPCsK>oVzjD`u_aB!`-!S>~w~ZT*u4P@X`{L5Z1Y!Pj>3>T7}Do8Ic&J+PJY9;5+ z>6!XdwX|pbDVyAXZN}^pmshNrQwkc)#rN#@Tfgl<#<9D}H8zhQ$eeQ3u|L4dx>?wG z%h$=h8`eBntouudNw;R-A@k}L@h!G3e@k3db}8BBE8Ow^Bvhn-xJ=78?D|iKsr)80 zXL48t9h;ZecV(veFlY6_OSB72zrS|MtzSEh3KKm~ytpbhGyLH;!MK?xCNkNd z+QI(Ye#K+iGxHAqGIUxnHTapz@` z2?67GoHm;#&Jvz-#wTV1#|fdA3of6YyYTKB>1XEcJNKSURoyvxs$~C^oLT30DaS-z zSo-+pk^28u$9*n6+2bKTtMith-kJ~h#P)hLUYw-w_HBmBB=u)6PNZ%AR(`Wi{c)UA zURT)!^|;~|e(^guk}_QuoRM%_nzF9X?PNVmS?_1-iKU#4X%AMi@mn4&3$ggGP^`=p zE1B4%s+;GfHl$C%!ET?YwsY?jl{ED{6g(%qU}4{tlt1O zcvVpHFej_{D-EXIRT-A8fqFf6E-YbBeGuUH^}dIn@^>SVmZAtJcCW@jaF^FRc2IBJV6ZB`)e+ zYDR%>oVc%tMaZYAb2dFF?X`&Ahi9>^@A<;Q(k66xY2Se#7XD$GGgHiO zCO#9>xpa}oMry@$KYe50zbiH_OYwC|SaHa_Al~ifqogwz#4PR{y(g{VBXm+}eZNiz zhluDdqh~KPn3*R&{N3SK7I`i@ibeLU*z8#*K8|U#n6zibgj^8yd7=N)srO>jg`~hm z-q8;nT9y40d)6Ggt=wJOlh(uDw9R4jp?`K#^NThqUfWvXY^2EAclAbL!!*qkKEac( ztFO}#^pTKBE@oz3n4qY2i-}!}XI6@OY;8>F(@!4jw;j0GQ_Epx^yP`)+JlECJ+)dT z+5e2^j=u@(%uK1ruTIQLak71UK~5^)-DQcoV2O#5lv?IQ_j`ex3=|bUB^*;eQ5vFD zJMjU_-zT?s+7%=_u1j9)xX^ zOF%d}yXNorOv|nB9FB6f%?SO_9;)Z}#7b_(2FvF)Q>={6L?2jPUbv;(E$Ntqv{X(; z;k>@XjqBGZ=GdMTd3x@^XBHi~M{OsJavLum_-0;srJMD5?5rK%BwtCUD)fH3rS@L? z#l>kG?F+x>mFX`X$E$>Tjuua(8KxlKO&kcgL4wq)LE93aGGZXOZ( zqch#O?g5LWW+9JufaVUH$IhjB2PzimR91J}$(}thy-2Q3f9+x$+at`9(n`fb#?p7< z7PvTk5?0-oR`ap$+ZqK+=AD|iI@v0pygFi&+Zgt!(fvo8@R=nZHF;C)^&%TDJn2%K zZmoAY@cfM{PmKS*xg;j}{&93@TI0$P28ybVW#@eKb1$U=ghn#;<~A4 zX>yG0%+xvS}}4TeVH$IU-{J#X}8dBpjPYipK1d3fYb(>{-Ux6OwV%-z`}YSb@ku33D< zpzZ%8TVu}fOST>#Ik1pR`CPyu#%Wh0gVS?8mnOV(oc49HTw2PEY@;wWsZP5${cmhfBqX>lDs9pA z|NNFUC(`HY=?Sx&#O|t2U*sMAv#k+!=O)RnIaT5N z=u%TDYqz(H3X6T{DGh;=B_5rIGTJXScW7*SHMymKqEB!hm(tWDOf6jeuG{W;oaOvB zfq&Dcqq;j*KG>!9nOjBOQ_|ODVxmauqP~v@HXhJu>JwS9aQ|#|<7Xmo)_>$+nv{9U z*U_;&MORC5_HN07O*>WJ%RJ7Hdcx7CeZj>zfSZSfFU+DL&n75w$-#Aj+rlL|OvHp` zr*BaeViKA(UDKRZQk88(LeG2oqys9ABAQ%YvZ_f7W?huOG3levla-8e(FX*Sn7mYu zxa3S?^Vt4t<)qCj=B%PwjlZ>18V~N)n46>V>8#|Qt)5#CO;-KOyN&JJ7X!Hr)+p=D zJ5EJSEm~D8_LY)P$IivpK_ z6N~a&Jbz!$x+cLdp)d9|9IQPPb8^PEt2Yk6ncAal#oeT7(UZ8#JyP<<_IYiYULoH$ zEjoHhOq%I%=RL9MA(1m*xRrZOyXY`)#kUROo4KY9e8w2DL!d)iiki2^d>8H>aud`$w} z=JCsLn;5SW?Mv`)J;-)mbW7T%2Zh^AGBUh>aQLPN=5?)lvSZW9W0PLbin*E+_)^8y zjrr@5f&_yN=Fbxr*cX~yxN-1q^A#mKr^Dwx4P0-}n7ZS$#CFj$Wic+?r9CNM(%+oF zA^FpB>hX5V4NYMVP6ykR?R58oHo0Wa?lq@A9KP~@?vFji k=PW_}1t>B7%zsAJoxN)wRQbv?FfcH9y85}Sb4q9e0EfFN00000 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/109.png b/app/assets/images/emoji/109.png new file mode 100755 index 0000000000000000000000000000000000000000..74b9d5d38cdce2f1dee8cc7c1ff2fa8619851aed GIT binary patch literal 3698 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/1234.png b/app/assets/images/emoji/1234.png new file mode 100755 index 0000000000000000000000000000000000000000..c47c2e1f9f0d0e86bc78e3a9ee96e643b83a57f1 GIT binary patch literal 4751 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 L>gTe~DWM4f@{sdu literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/8ball.png b/app/assets/images/emoji/8ball.png new file mode 100755 index 0000000000000000000000000000000000000000..c2c710d45019ca3110a50771ef41d19da878e708 GIT binary patch literal 4141 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 RW?*1o@O1TaS?83{1OVw+>>U6A literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ab.png b/app/assets/images/emoji/ab.png new file mode 100755 index 0000000000000000000000000000000000000000..2a522204767b0aafef8129675cb7042f3d01b975 GIT binary patch literal 3859 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 DhyXf< literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/abc.png b/app/assets/images/emoji/abc.png new file mode 100755 index 0000000000000000000000000000000000000000..505d40a15572fcaf3b9455d5db41986513360ba4 GIT binary patch literal 4247 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 UE8^-H7#J8lUHx3vIVCg!0AJ@%)c^nh literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/accept.png b/app/assets/images/emoji/accept.png new file mode 100755 index 0000000000000000000000000000000000000000..2d200903188ccc0c59156798e3a939c2dc88ab7e GIT binary patch literal 4729 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/aerial_tramway.png b/app/assets/images/emoji/aerial_tramway.png new file mode 100755 index 0000000000000000000000000000000000000000..38f6dfe2334f4f48136eec16f5fbf4a507af5306 GIT binary patch literal 3489 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/airplane.png b/app/assets/images/emoji/airplane.png new file mode 100755 index 0000000000000000000000000000000000000000..8407cb6757565f0561b470f63a0d2a101fcb50f4 GIT binary patch literal 4740 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 MUHx3vIVCg!0NXhxk^lez literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/alarm_clock.png b/app/assets/images/emoji/alarm_clock.png new file mode 100755 index 0000000000000000000000000000000000000000..86ca8c8ed450d0b249c5820f15d43b0504dd413d GIT binary patch literal 7062 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/alien.png b/app/assets/images/emoji/alien.png new file mode 100755 index 0000000000000000000000000000000000000000..416de47be465f67782f65262c32c4c10a353b7f2 GIT binary patch literal 5457 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ambulance.png b/app/assets/images/emoji/ambulance.png new file mode 100755 index 0000000000000000000000000000000000000000..b740f45dba20daf0e9e917feed179467640e232d GIT binary patch literal 3708 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/angel.png b/app/assets/images/emoji/angel.png new file mode 100755 index 0000000000000000000000000000000000000000..da52c310c64fd4b2b745df3c44b58aa1c9cdbf6c GIT binary patch literal 6672 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/anger.png b/app/assets/images/emoji/anger.png new file mode 100755 index 0000000000000000000000000000000000000000..6fb4dca1854fdc7585ba22a7a953f35b42d1b935 GIT binary patch literal 3079 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/apple.png b/app/assets/images/emoji/apple.png new file mode 100755 index 0000000000000000000000000000000000000000..08aa17b95137ef962f1957a447485dfef8a69339 GIT binary patch literal 5630 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 Rn1O+T!PC{xWt~$(697KPz@`8I literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/aries.png b/app/assets/images/emoji/aries.png new file mode 100755 index 0000000000000000000000000000000000000000..899902237c974fb00d51b113e405e3747987c32a GIT binary patch literal 4345 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEE$7e$jJ3JOxw64}xcx6Nyvd2jml_fKoS?|t`jUK~5y2JO1_ ze3$pweV_B*`un`%>DT%G*zcFw&v#%wbHLZ7wQK$v%kSM?_j>-F%Rg@P*Js~*FITgm zGW@pl+4;hipR7(kztzzg(b0LMV`43?IFJ4?jg}&@7=4}7JOZvUt_0DbLRRwRX#S8z) zvlo6^nyvlC^ZpSBog*$eM?BUX@p<#aLGMY(8VfO&2a|jIbLT&g`*gvkoI5M1G-6ks z;`2<_OoI5YWG@SS+o5W+-?1=gm{(=~_10TU*Bdog)mCnz~p zfxN!v_yUUw+?EriEvNA`IDftut=$!OwtuJZ)`+s_HgkTRT;Ot@^K9nC>r0NxEEj*9 z&-b|d{y({YuMU)dEI%H9Z1eg(9na%$^iE7JJoE9_f}0I#&KccinZJLE#~qg6`|0~B zSR&G_J?M32d7Tl&vf0j`?}r;P$er1F_4SIz=0b7ab^p6FUjMMVH>ZN{`@Ss>^J?XP*WY2>e|d3L>)UlM8O_@=CU1LR zyOOoKxqeyAC38aoZbLz7!%eb=!q%2&#Py!I*2J`{x5IcRtAflJq4; z;z?qG$LY7aUdvwi;p*oPyHhhZ zEv>9Pv~7!H^cK(CUp5}NKB?6oB|(}VYMpbUSH^pJLrQ<}F+tbKh2rv;uf`kauKKBb zY4(wcje36`i2EPxp0$X(+f}H;_W8b^`Re|Qo_|mcU2)@I(Gk_7>z@DhJ|&iWscd66 zIKu}nWiotTaN>i~@k^H%Jlr6k>7mY}&HlFOnSk0`SCm@IPoRGAX8vXp{% zt@Pk(%k!}7oWVB9QP#7)?`(WT^i{pref>Je^WV&9FK%ZpurfV;j;AH}#x%2x)w8lc zi|2(&OrE^!(3%`h_M(l`9G0Ek_{6E>X7XR(r94aCHXXWl&_SjHjB{EA1>2D=B(PA^;b@3=hDDLRrXs->_sP^hE*CbXx3$(txu*#qDVyg7ErM-Lfgyg@t&i@h{ z&}?=^(Q2N+nQit*7k=S%tmE3iQ}AL&X6HPQTN_$0PVw4bmKXQ9bDqSv+Lf}l?8geL zzBAm~cQyDy!rwmW3-x6(vn1wk3XfZH+U)fdnn#xrc(7&7l%o2<8?T%QB~^0kWd z)+sD!=m-G*vw_tSgtI&woHogYHs^wOXY)GxF<0@dUa~8 z*lg}fRSg!~j`W4>RXDWX>UQ=mPpM%Ye`@0V+O4bR92AfZr zcY5{1L;o%wGP$u+Lfl$!Xbhts5~>vc0HQBZ}Pi8ftD3DPKjr4sIV6~nlWhDGiltZRb6Z)v`}PwN7(zS zITEkC5?&k$Id^s4w}c{tX;&BSsF}pZ?#3lk`{m=(7q6w5uPZKfW7z-twUqeX)YilC zIhV@HT)NIr`0;J+tXublr45C$-P&bNxL#iNW9nSCVpR*7b~*p(*Gv&?xA)zidNux! zgL2jHV-J0zTPKKKSG2S$vRZTCX`KB1Lg8Zqj#^XBy?Vwet|Rkr(dNwGzLmL|-Da8A zi@oRHef0ZS`>bWlJdz$)9gaIIWNqp5JhY1CM9fLc!y%uS@+?e|65cD=xoB$oy`6qB zInu{F<-e}{e}8AHsNILs1D+!Ffd%Bgc3ET+Y?-)NmM zUnWeCm0f9-c+f_XJx1sEeedOy5pR#%@$q!n(%Y$)6C*lK>fh*?m?`%QI8< zCH=M6Wnk-BQ}nHDhL^V9PLrGRlbzcvE+zdqaNY0Wa(|hFvknN^e0w8%!PM4zj%6tC z+*u);UEY;`|8`ZP+-2gPCDGN)(evm3%(){PYW36Dm&^I>u21m!YS6!^`6p-(18_EdRH zPtSb*#E@khHlCZX=7~yb%91VrZy#+^{Qglrd_lGf!}NofV}d#DKi{0|zfSAIa^73J zRLtDZwYoG(h}-*kJ_?fXn5BNiFNM1-?VkRgz)Z!I1tr0^H>8C|wy)VCQ>6EP!sG}! zf8(jb7pL6nE&N{bDgGB1$KCHYq-q-UO7>Yd9Za6=^<(Dwcel4KbNK({o!yZo<;uy0 zGtULxboM{T;Wz2|%GqgYM|JM@c15>l8muika!b%p__x_vpWF>v`)(;@g!x;s_5_Dz zz3SO_u=PR&k9hyH<&K+|Giu9c9{O40kS6JTlJ)1FPY=~hc1wRMxoKu16b!1JZ$94O zIa~4(U+IkG(pa`^PChlQb4*j$zquB*`5N0d%~?XvG~1O98ZB8~XBKgx?sTy9#ook< zrw1kq%Kc*Rvfo4`{@Pg6|Y=Y z)W|)3Cb_I_;a%2Qx-73(PkyBr98sZCUu@z&yLoGLw84`8yj(ps z@o`Y=wUU&oyL=UD&rMVMcX>@@?|RSNwT8v`{R6EzH`94$SuW3!beP$k+8(O#_@c_W zy|ytHTy^=(RVgpZl^finq{kP1? z%303vCaR#y|6$ID6Nk5-+-0vKbVPZ!xk$}=vOd(-9)|>*%Y4 zS1g_Q46G&YRq^lQ7uD;oExKOs6n^OZW&Ld*&wce_HM8b@er4XA%$>7#M`(%6<5(%< z@OAx$WnUfAGG>+e7W`a0dGWk$hjc#)``=%c^6Tnnd*xNVtJ79(iT=9mMA6z?*K;KO zrt-V=%+XK&< zRIqMO^RuqnbVPgqGmFjdldcwjo>|Mh%GWXfe8P_D-pxk49b>-DzLS(Wai{H8y_*+( z6)YsydekK;tSY&=>;}i~Aj5z%phF+wAFHg&b(t-^pl|TEeuFTclfBEMWS;kL76ZMaJ&zm26a_P#+0g(^iYR_d$ zzxOKK%BwtVz0dv6f0xYDkz}~*!*XevUe>O?q_?MK zc7cqxWWx?g%c(|B&37!yaP`@JXRc%5$1A%8U(7mUZ?l8_zSz%e%=W>D&et4!zruL7 zoi5+9M=p7s#<${(7#^0q2sp!`oO$AWvP#mjne$vVmX(&NU#iYw*}I=(!TT2-LUqqJ zpZUJ|%8-GCKa`wzoLIB z?d$Tb*90Stboc9t`#o{%Q)L!#*0Gr-^~W(n-q}PqzxZs(In7h+=LuL_LVE(y97k^{ zzkkcQq>7*I@?)W`Gfv4q)>_BE?p{v52Dq!_lDBI9X_kic@Q%3J!+Q@`(-7;@ueW6TN7!|P)hP88I5yq9~^H|NLSgB9WTGm0b@mT-JLlVNZ< zy!2>=YpourW7|3N#!1H=HqL%e%=U_R>+X6Q&eJi+zvjk8IjcRZ&C7nxUFc$eY*JCh zR4y;OqZ1}9I&^4}_rgD^060UlHC%1{qMa(Q@G}h7ViwmMQ)-ulaDcT&-@) zUfVzS&TYQ9IR1TC-H$5&FK;%^dogqJ-Hm;(wGchXoMO+LF<)k~G=w*KGgrS@vG&l; z8xt2Fcl!T#uk+;fbsyh$%D=l||MC3(zt@&dU%y%a+OuAEkI_AcuXEM5!>Vph`(+RQ zSbsodg7s|P8#lfdbzPljQ}FRZwtMjvJ++N2_)W literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_backward.png b/app/assets/images/emoji/arrow_backward.png new file mode 100755 index 0000000000000000000000000000000000000000..088621834f79d886414b5bce8038f51848600d2f GIT binary patch literal 3180 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 RVPIfj@O1TaS?83{1OTN-@~r>> literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_double_down.png b/app/assets/images/emoji/arrow_double_down.png new file mode 100755 index 0000000000000000000000000000000000000000..2ecbebcda13081ebc7167ad60c915c76af94d3a8 GIT binary patch literal 3179 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 Y?!5KZZo|cE3=9kmp00i_>zopr0K7u|EC2ui literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_down.png b/app/assets/images/emoji/arrow_down.png new file mode 100755 index 0000000000000000000000000000000000000000..e6702f02baeebbf7d31c6da3a59e52002a574935 GIT binary patch literal 3006 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_forward.png b/app/assets/images/emoji/arrow_forward.png new file mode 100755 index 0000000000000000000000000000000000000000..fbfe711b64debda17e7a38e48ef0e3d0f05f85c3 GIT binary patch literal 3201 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEJUm?-Ln`9l&d$z}372fU zZ#;eO-ip1iz2E#0G8Z@JH1tfKGi6D@t!1iOnSl$10t7q)R;=Q<82@21m*PJ~0gsql zm!^d^XlVp2U6`3s9C-DZZ}G~>7JhS%_zBWze zHM9MHrzg#QZhQZyp8MvO;y(XPnmFj;i*Q`9nylR#C>RoaEB0@?o zb4^7h8O~{1Jg&@&tep~-YnHmZ@9ocGX>qe$rY(2=|6QL~^P}CqbBfA!cP}rKyBv;z zrUI_491MO2+HMvP{v?a^+}d#FPx8%9&geB?7esv4=YL=K(9|bspJ%~WX8#cP(yup< zG`030IjtqocU<8GBjftlRy@wF%d!Gayx}-t(XM;Ick-c4It{lr=nC)D&Ww@V+jHf@ z(p<@IyPNx7`!fgkHEf-|@Aec8-T&2}Vuj4Zh(8l2{^Ra#dMfSyZO;|K zh=!}*ZT4vd2LAiiv`f|d^eXKIt&3Nz@<=K^ZM5Z1TX z%^iybjwmUHOh0Jw@$$l9#T8L2IK@BgO4zmi?_BX}b|-ScOfD#g}_Fojlh zE?l_HrtPbC)`m?BW$JIlcrhh!l6?+ zT9YHTt>Egl z_cm?s?m1fMq^bR0aG34E)J2{JcXz3OJ+bK0_iU;Be9hJCoRlUWxu$QfoE#)$Y5iuE zFNejmWr7S-b_eb(%T!&|)@7fU@2q9ocCpd%OZi;OId5g}SG>5e`C6%RL)eF}7hNj7 zx0vuPYA*;6w#_;9G4Z=V$jlcU63^BZe&=B3dNRv=&5CI}*8FJ?3@memXI`mdSbJU6 zA-MPVqE3r11rjGKM7*;nW!Rg)Nvk+#IR6=&Q$upn+wIrYR8K$M!`bdD%aN<4)v&Jp z`l~iY={c>bg+1w?B+f@|IAkAUOoi0a8Pb6Yl1YNoJvVqBTf`)=s7*AqanUM;uBMW6Y!-iB4$@AN)$${OZ+U@5MS!n>c8;I#q9pwHg@;-WNVtO zUwQccz1PR?Jr)m~Zn9z3GLc=&JQUMfZYh4Q=_`ZH zgPZ$`Z!*2i-}3cQ>)yE;ucZ&S-98l{$zR>{`K73X;w08Xs?sa^8G0%OctW}kG@Ciz zD?TXxe}aY3>{(eKuV2&Kvui!~$q7xRi@J^+w#w1`w?&olB$J2P$rtggJERS^xiUXz zU~0Iu@_2#Dl1H7@;SVOBH+e8KcJ7U`CpOcjxn8&vpf-7hZ>r#ch?Al~2frg^# zta`UoEEfcPE2@m{5-=<=IM#gj;SS5_eFly9?f+Hosn25Af3r~Jzr~H_ua6>hR_ZV^ zFS`?^&EYFVaTV4j{{$6;7Zx0{(CL0yq}6;W!y~SxO6!+g zvn%UbX&Hf^1bI2DK5L)I~X`O%5{Hwz5eL#dFP(zTAsVT?ew9&UJv9M zKV+#j7Vx?5NDZ!hE5n!B(ZUt}Ku&vydc&DJGwQfsYHiDlY+hfxPH_M2I+5FU7R|p- zNkmNxQFx=`bBG)W$t(iryPiPe&g4IcQU+Q#?KbN$|=Kwu7hqf!pGqY8}?Q zf7%rd3Ld7MvTS&$=36$`n!jYx*B_P7&zxpip7})WzgcTG@e9EM92EoJJzP`@*T_Zo4VE0Pb6~{$RAj-{7SE> zQ=OTKS>s%#E8k_UyL+ZT2=SeHEcSbT3)fnMult2v9zN8Z?${7-e(i9 z>=Ax-=YE5Uv%!}*f!2PXlQxe-6<|@ z{=tQuOAI)@%zl(KnJaFR>F3p-C~IBJc>BI}-?`7s0ivvd&fn+F{`{V6cVdu*@xiD> zz7wCW7H6{LzkTnJ{o7KKu_#D6&vUlv<2?rssY|v=JU{Z^?!bSxZ%<`^KW+8&XvkhA zl`?1ENtp+he^@r?p0lViKT|I=ZMU7eFB?Pq*)=tRj5@~VCvv!_+%#(8WOX<(rFBN| zv7LvNW~$7dxjQDNA?8_2?#$>Fsm-mD9iJc0xc+RL1J9LB3O6R07t6Y`8mOy%o4NB# zf9`3f#XMYrjH&au4=6u&W%a^v(`d=sfkF!<(n)82#_j1Qv@3bI3JNrp;$wg#eN);lKV=| z89Y*rwp6cAn4-6+Q{~V^1CiM27ad||K3A}Mvd-B1Kzi{Bjvp7jZTHs3x^LrJR>z>s z_jrl@ETxt!j2)rZ%&%S3js9G+Y1hMj5t))s7d4*jJ~GQ{yB16FWZA8nbGW9RPnjSm zfAogK`Fq@VkJs7Vxn3&h5VawWp+SKugF%e(0%O8W+46k95Ys;kR01p81@#)!EG91C zRA&fG+k4LNSnKT#zT9bfOu{Q4E?#+X-t*o4`+keXY-aev6=pqwVIButLzHGy_Nhn9 ztY;tIcdF$ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_heading_down.png b/app/assets/images/emoji/arrow_heading_down.png new file mode 100755 index 0000000000000000000000000000000000000000..56dd3b9d3c82b414776df4825c2cffe22a191695 GIT binary patch literal 3521 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_heading_up.png b/app/assets/images/emoji/arrow_heading_up.png new file mode 100755 index 0000000000000000000000000000000000000000..c8f670a1ef0d6507b478c10aef33805db936a958 GIT binary patch literal 3520 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 Q3=9kmp00i_>zopr0909{PXGV_ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_left.png b/app/assets/images/emoji/arrow_left.png new file mode 100755 index 0000000000000000000000000000000000000000..d64ac619c9d23bfd68d8cbd3bde58419f57d9719 GIT binary patch literal 3041 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 E02)hFL;wH) literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_right.png b/app/assets/images/emoji/arrow_right.png new file mode 100755 index 0000000000000000000000000000000000000000..6d483b5144f38155564201bb77b7de0921c23de7 GIT binary patch literal 3022 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 B)r0^5 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_right_hook.png b/app/assets/images/emoji/arrow_right_hook.png new file mode 100755 index 0000000000000000000000000000000000000000..8b4ea6e1720e19534d9bdcddb67d4a3a7a4c72a0 GIT binary patch literal 3712 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 K&t;ucLK6VQaPd6= literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_up.png b/app/assets/images/emoji/arrow_up.png new file mode 100755 index 0000000000000000000000000000000000000000..b5b0688d3c60baa9174e99c9d427c32afe6b43c2 GIT binary patch literal 3073 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEiX4Q zom0YpFAfR`U6gxinWE#AhAb{MmgY){{Tt5y+WP+bnYTaRomqFizxG^%V`|v(-QUjH zKL360PW8E+>Bqu;+1sz_m;G>qF;ae-XfJ#C+FRfL&Nq2u@$2|j>v+q(dDmAzzgGWy zYq7MtXM(gu1M7?iUWvx5A?$0iYBIm?%K!Jl=ja;C=P{qf|1DdUcX6MkDYyB#m6b`o ztC!{ZK5c59th9lb=Kzz>0k)n4TxZ&3H{_gNc*@ke?@y&$=-2jjw||f+NE_tI}h9%MCzJG-eD!`Fr0&-%8XgnFRZG1pdw940d@iSO53bJbv4~1opAi^k~0hf}7mOm}G9yXrt*y8g`-R}$5~7X(yY^7(Y(`mM)H zt*)E=Iu=~K^g*%qd6t^=Wx@;iWxSSU%sId-6Kr)LX`|&DGwsM+vu`t|{*m$BxPxU~ zA7|6llH+fc*_o|2tkg>spD+8Sphi7>w&%A7+XFH>V!a@*zB1u>EjGKR|Cq?PMYB4t zxV8EQ&sTRjtk}wzAL-M|x~(O$#%@pP#y@<|AH-~a)5N?(rP%v1L!zSXIrj$)qOU_u zbvO#<1+?US|NZj9Hr0@KI#S`aQ>TkvJpD)Z+`*j^$!)m>4AWiaO^^w;bnq+hu5nKZ zi)d8p;oLpp&_;>acT!7grC(TCcjh5H70L%xGJ{eg2l4)Oir^6 zHm;ad%+t^)V6HXm7Tb#p-%_`vyel~zds{X1@=Jr)O@1%LERVB<7EN5!;xV7q#YXsp zAcy8v+eTYC4zu6fbH-timqZUk&T!t&+;gWgA- z>56PG;vOj<`JKgcWc|!0pPJ7XkMMS?nr?oP@Hpx6@9*s9`pcGX-MoZXa;=NlLH`VK zp%{~YNih;Kn^{D1wKcb772J@2qNTNL{roFQTRE~GIxTNm{O#lO@Vnb*OB^p>zi5&W zdu(d7S+_?w=Zr>KnFFpxle`@~?U_C92S?v%zPQ5c?_ox+P2!IoUG+Lu9J{jiKVQ82 zAIIE^L|MyE9Y1c$olx6^Z;DOP#RBsqr=0g3?K$c}y@a-K`)=jAV$`dM4<#@{`n zIj_IIHwiEf?>fMsbATo10LPjosZTyWt=whhASiO*SuN{lMXW@)SZ7hZoxrrVJ2pq- z?(Lhit>A56g76jQa}g77UzFkRndu>(b0F+-S7phQn@>yn(-}8ZND6OI)r;B_ETO)x z+<)qp*@~uzpSjI<+9ZAUxmZE-!$Vv3e*KJ|e?j{FoJHpMY+cpwS-a-%`!D(TRrC3m z*Xu2O)$jeC;#YTZ)@Eh{w&aD(yA}xVN@U)auzBUu?l*UK1cn;wOEpi^VlU~tn^V@+4GQ8Wzvc7Ki-=-emGgv5oqQ1@`~y` z=QC{CM%%AUUEr5>q`I?m!hi3MJ?eD@<;0}DmEYVy z1{z&q{8%WwWWt{#4E2dZY>TE?sAY6y)Y^E587g=yn)Y)f%&YZgYMzy7JY~n1s`m$c zPJT7GxJ{zeIXGnni>I%b{H*6a-6xXSID&JIThEnR?jyT!+M53_Q)=nwdvpS zYxbCWC&5AdiVslOBVw&qM)dlQpmfQ_~WXQL8Qn8r9$vh$Pi5l(l_S$pOjHhh5*ePz< zUnJ%8%qU1;$u4t^9hE9)V#|eH@2!bdc-J0a#eQUw(btvFd^i4iIl1wVVPPs~o}sCf z=gWo+iz~~IExHrio7wAj^oMYCSXrg#LfiB`63M2IPj30)D_y{}y|5ozB_$5gx1VzFdsrQ= z#8~E}bH>ooFjc={x%u0gU}f=%{!6)xzbSP+Ve)&x*0=IZ;4`3mKam-kt6|&A;PU52SISc}{;W^MQf`cQ2Q1 z|9$PK{Fm~(?>>CnUHPlR(v|I}n84; zomrn=-`RAF=j$S!g7SMW_Io2Efo%d7?0|Nttr>mdKI;Vst0FV*S8~^|S literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_up_down.png b/app/assets/images/emoji/arrow_up_down.png new file mode 100755 index 0000000000000000000000000000000000000000..b718c21458293f890b495deef5d48acf989d6c29 GIT binary patch literal 3544 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_up_small.png b/app/assets/images/emoji/arrow_up_small.png new file mode 100755 index 0000000000000000000000000000000000000000..1217331977284472dd35685ae89c4102b5db4e0d GIT binary patch literal 3198 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 Veh^xl097~)on2iJ@>TTs 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 BDtrI{ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrow_upper_right.png b/app/assets/images/emoji/arrow_upper_right.png new file mode 100755 index 0000000000000000000000000000000000000000..e23790ba18d5c2cf1efad64293af7c131b2ff7c1 GIT binary patch literal 3235 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 II;Vst08z>wiU0rr literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrows_clockwise.png b/app/assets/images/emoji/arrows_clockwise.png new file mode 100755 index 0000000000000000000000000000000000000000..5f84d7e72b79e1ada173447a15f44444dcc1b5e8 GIT binary patch literal 1399 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rVHcAhSdAr*0NXXa;24V5@h z|9nsVyL-7?H%;RX)>^0gti@r6lgKYksma`)fjJ_c0y#gf76`D`7K+q%G&U))ZcG%I z+}5PRvoJ!0^OnnunN3DQ?#Y*5zuWtM{%4mxIrr?HcYfcS%<=c$`sZ`Lf46&HIgj~y z=%HVWBGYqTEvat)+Vzg1;l-R;`wMz^tw`qHW&Ne0D!M$&fssk#OzBL6<9hSry&Hc# zZC~@}!f;M@Rb@w96`3wE3Cc(uj+ql9ahM2kf0p{1-p+6}t)CB0a* z-%aqwq|`k(vz&r^4=tS8VBNA`^!p#n>kf^1*X{D`{w7N$JZ`Ao(JC_Q>V+j6B2{Lb ze7~=3b0X7ix3~K;%x+j3b6+StVfkZzQ`6PQ4Toj_y!<&m|EZMHg~}6lKX~dN`?IhA zx0PcFkVhnf|^r_gJ14oxo?E{r*G7A;--= zU8-Eh^|_NZ8XeNxHm|$xBwxg*r=`9^<&1r)5#$V@2Ky~dzF3AQSk95mxpJzUVkNWHz8pwL8sPDF9yA9*h7M;Y$TV77~-yVF_e)^eAdFLJm1?yK9ee-1lZ%#;x zxv1LLqTFPbo!<3a>A=F3t8X&9_AESb*E`Yf z$g!_2+A7D+m-gMH-)Y%s#F!<#Vp)yjL&lIg zd$mmMX^LIMWvF3XIWU|BuTYOJ{9#!zAGPWKT5<} z{a@JMpm{s+;Pbj4OAIdT;NV#5(d0H|fiRb8z(U=VzZ=#R%X?@zBo{NVtkBKQNa5pP z;7n5y7hrnl-muPw|N2&*$?A%n{K}Ot^j9uwNzIV^b@+sWshnHb(L@oo-i9^K%3c?` zVoPSW9P(2WxOU^Z%o-uaRzEEVKLL@`8U-sCy%nAs%E5L0at4oKQ|s?bkM|$f=BU|X z5V`t5Qplqf7b0TkEN;3Te`9alvBSp%rcRyrV9P7nE~Uyp4-+;$vsN;lbnE@Xj*Bc$ zj{m7!74X)_GLxUXHK5ChG68Gh`!=I zCi||ptwZL_rr@;K`A6NEomwP>r{8M7=f75eYUVbk6P#^K)69JzUDv-Pyno+4jvXZ7C8`iWiQ( zUy|H`9rJ+DWf-T^-_G*p Mr>mdKI;Vst0O>@2%>V!Z literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/arrows_counterclockwise.png b/app/assets/images/emoji/arrows_counterclockwise.png new file mode 100755 index 0000000000000000000000000000000000000000..1933ae18b90f830fbff6954eb926f1adacf9bcbf GIT binary patch literal 4823 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/art.png b/app/assets/images/emoji/art.png new file mode 100755 index 0000000000000000000000000000000000000000..d45212b0340418f08b4c2dc74bbcc9a837af917f GIT binary patch literal 6744 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/articulated_lorry.png b/app/assets/images/emoji/articulated_lorry.png new file mode 100755 index 0000000000000000000000000000000000000000..81ec1f917411f42a24c21a66e249e0c2a89a8972 GIT binary patch literal 2938 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 KT-G@yGywqXmSXAv literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/astonished.png b/app/assets/images/emoji/astonished.png new file mode 100755 index 0000000000000000000000000000000000000000..858a83484a8d7dcacf867dff9f7513f4b4a668af GIT binary patch literal 6043 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 Y-THQ2q;p{e0|Nttr>mdKI;Vst0IpG^?*IS* literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/atm.png b/app/assets/images/emoji/atm.png new file mode 100755 index 0000000000000000000000000000000000000000..c2846e792183b0957c0821eb27ae38c4dedf4c66 GIT binary patch literal 4072 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE#`>B!AVe(X@$a;wFCfr5~D=)yp4*AR^$(NzK(CXGU-o|Dy# zTorRWCMh&GIvBLLsp?8>P^?R6jgxGHS(OKO}y1pX!1$KCG~KipDN z`DO0!UFxxnTc_9WKASmj+riA4x6{mhomD4Q_)Xzn=Du^6>8VSRe8rQ+cmp#heQ4KX zS!(#HInwoc!GXSHx%INAHtkpM4vlV)j_&VK&;Pc|`aFN^K7&u!uHW*vW;6}AGrGQZ z{?3bYYx7nc*ILEtoLsX^qJHrj|BfrW!}T}!5Eld5i$eSY_*U00v3kCREd zoyfiYDAUsDt;)0uQkT~qTeW@hTJGt$jMFEr=>Ggi{MAd}!@u}z7HvDQ)pGU8-xI!?me*Y3Tg{Yr zcS2H02G9Q=g`3*Hz4e%TqiE*6e>=<*S+88%s=NKwtm&tAS=pR^dd}4}h56w5^5>pA zn4+_o&PMj;I))rLUsio*?-`2^&1dDpUW62^KD$MieVfk=hR*7(qW(%rfy>l$_2xhS za3`*R1#3{olxJ()nS&h8G^O9RU1xtk@o(O2M*FV9$rH1+)ELY+MjT5@xEXWd%>~m% zmWHc5Tv!^@yb>cX%ne)EY@(OXe^ca6i)?(zMozEWb9Lu%L|iKQ!_O|#$Lf{2OsTK6 zkR!Gy_(htGwi<)x;s_z{HpK<@s|A>t&Q5U=kzI1YLepF7_$f{SiA2T}rryOSQH^P@ z7O|!<_a4~MXz|t2W5zYlyKsz^MZ#QQ`3eSUMcE}!AD!m7RVZ+33Tv>? z+KWMty*szmJZ{^d9e&_OwY^IDlb9{H4_y5D`NM3XC!g(t%LO@Nu0M16uc6K-dss^)U@t5&h5{OXp}m=Cu5=%Y2CwV>pk#O42LzY=ZgSXE)`F4`nnfcrq#wTm5`Hl9} zoBxnf2@RN#k@j%8eyWP8*Y$5}AEY{-ntXlsvx1MOj;bi}d99pWd~=U%+b+gVN6n67 zGq;ymKA&?r#z!LK)W*|qO*wq+UN2;B)mqPBXIIj6T<)LJ^w?Wo_kuYTURnKlYU_XL zvb~FU@|=731lPru8uI^rly|AMT5;99TYV+HMb8hPH>^)n*5ChA!){+8qvH|5Ki8M> z|9qx@@4+GeGbW#fIQV2O&iU`F7N4#&EA<(Zf@+3;!E^IEPqn$q(@#q;@4PnA*V2P= zvM{8{fz4mT5i$ZIpuPyqnU%v zmd3VaR$}Wl{_nch+WoVA{y+1bd)if7EBjn^_kCF!EjY<&Qt5w3tI3L{lg#{t71g5{ zf;cWEOSZKcduVbpr8;H$`u{iR)|+wKC1&%h$t?5S?{S~0@;M@-)|}n^`bNswltw2qi5%3>E1sr8nRYPdb@RAhKdR&To7?CSW`VAN3EYFWWk{eU%vNl z__fKbYXaYT@x+&xSWT`Tk&rt(X+`IU-R1lrP9*Dpc<|l4;QaQwgWu~vWqaMM-q5|i z=JRr!4|{oQ9;e;`=* z<8pY#pOxW}-#6d?@MQhH1ylO1c13>A*Z;V9dHmCj>h*`u&%fW|-{8=zed-&(wdNsJ z@pGveI=%`b%FfC$L6aJ6*>`CyeILQ^XqO(-6*u|!)fuX)^W-lS?wP)BUSoict9S4u zf8BZhf^ik4((Q^M=U}DzDnc=cLgo@ zdeUL`R^`Sk9&G{LfCE9S{K{ey4@YM9L z2lzRf7&K&`2YdZ)RQ~df|MI1n+EcIn|@zjG(-3n z%YswKzkcKU_|Hz+J=j}$v-G5r`jR<6H@}+D$9v$}+Ul1t<>plUYrA}x)$6RQ;Sx3R z9}Q_|UriNB{LS8;P}1R>|9;sNZLzb74+6xMZ<@S}Ial&E=AL_{-Qz%(Q**9yaPhyL z{QdNCUcMzaHr498?%1)FvFh9AiaKuBL#dnC6FHA58t^47`lYv^`_s|qlNj2L&oEry zS-EztNaE*jwgSB^Pp>Ci6$$3;d>AD0Vo`cQ%e{Xhduy9}zI-z_vpHk&N$v~Zg}e41 z{`sd&&OiL{c;l5Hg+?DLzpjlHNxa&{-B`Eo&tzAT#M6DXF1f394!X7nZO^*BK#$uw zzRNURciEKd_2mp%lME )HKz^d)1@3H6?XHUi=UTz_Eo?s z*vt0{FYEW<7SYqU8P2W>RexSw@!c^iY2qurtJ57SnFBI7+ID{Yby~y8Y;xM|W5*L8 zq)Pnd)wla>;+iqbu9=lP{on@<55^3?t%BZ~JzE5X`&W1Fc+vNG&I?JFgo91RjcL!$ z&E-7M=k#4(_Q2NEr*3Sb(;Q4$(oQ>C#r&S>AIx%kQ>CWQ0d0Nz^Xubo9GDxwr!(l9 zNLlm0gZGcGKkM6+&{JMk$8liI%*#9eetYV&*pT6#+5GcKk&{-1{7=jHW7aWYg4EML zti~(y=eY^WTz`6OcHUy4`MW=QU9}YoF4c%{KRJ)jJmv7=*tN2}$jwZdH*3DG zE}xsz@O}%k-_zgIe`Tx+ZIBZ`YIer=A-8|q>Gcs@>%8qIvny)pGk$3av^$noJflHr zO+;al<-X0?_79XUTzzM|bFzZdgKXZO!n?CVr)+xHIlb~j_3O%%yT*T#CBFZ=e7<7; zUjf&SYbud-Cu<~R4F7RxEm+ycP_XFDt?P-iQaRJUzj$N8w(azjmHW6KEH8fGwqx0a zo83JxfL@!{^wv({1n(11edRTtZat*v!yzDCJ9kzLtHzeffSNFdn>ywH zjy~5&z5T9V;r;A)F*5vt*K59qpV~Ba`X!6^F@Jp6E*!~vJmu1zI}F=e^(q%|KhDxn z4V=%iP%-KAwQsglK7HH$Tj5bd%dTTqUWM670nbWK&F5TI_*AKhVcFGU8}*8+$I=yb z4o9{|{(q#lqPySv#*KBZRVKpUntA7#FF#uH-(^qRO>S|64Zj&I%$RS=oZq+U=AVvJ zlP1lrwq9Uow~tGyweaU73;yd{Z(hF1{88gZB2(F$#KWiaA5}LBR@K+H?`%`O@#&yr z+P*K#W-eD%z1h^Pdfc*c)}8yDRv#t!ZT|>+q&sE{FiB+<3V*!Bme$g-%ckId@`UdO z9-O|OcPd0gWNb=$&fouL8o(!!mKbSjd83H(q^T zX_xou`j(~x&Xvk6Gxx7hGL6|JC;ye@q!A)E^&P zS=F#brbU?ZFl%D?jeV$Gm zK}f*I*F>ZBlTAsL#Qyc&Zywq%U&Fv}&DGak@FqzziK;VKTeucWErA&HEt)< zrN6VA@0_rmHr-i6ehKTLB(KHHTRsIYgfu4=?*BZud*Vy+t*d`cGn4F9Uc&6;^HXg_ zab-wVPr{1rdmls?GN!P(|2?See}lJpzj}7o*)ok5hD85^aS8_S_q|`ZNwVpoB3B;k z@l%`)KFj{zjE_EfbNh*iM_h^45kU<{MOL>wx~cjhV5Z5z0Iv1xAD?ZKo?scuw5jz( z-JX|>r+w`-bE^5A5?qrLEESeJ37Kdp`%gIA@~Qd9UH3k*IU2u0eH!=#op^qzm$_}q zyBizz;`khe8LKDvo`|?IhqooO=h2$CKcZMO&by~>VmZuQaaVTk&c5sKx#spUGg~cr zW$(+Wn8sXKeQZz5 zWb2!S*X2I>=h(CLw62SlSfze|?HLoF!_|S0f!qxS28a}DGG(GILfBgTe~DWM4f;=;1( literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/b.png b/app/assets/images/emoji/b.png new file mode 100755 index 0000000000000000000000000000000000000000..8742b3d2e3ebc335f654f4279519d5413badb699 GIT binary patch literal 3025 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE!v5 zj-RRiKIiw^@;^r;n%^6V?7RJAK7$}ji@EB`g+-J^{5ba)a^XZa78bwWmoZe z*P^FhM{eDIc;&itXjqgWpQ28su^HR;{qm2k%ayj4YO~F&=4+0xX|!V4Dzb=e#{=%A z(-fstwEF+jeut-BebA zM`_1zUeViBv5+InV_zqKM*Y7^3twN4{F_Z*R1QkY=^%T7 z<{^y@Y4+v}^;)x7u6KrPu{d{av5Q~MMX9eL?|VZY-MxRhTFH zIUCzdHowQQe5>gEc_l)>c1*nM^-wu^TY2@pQ@zJhxT_pwA_DzCZB^>X?p^lvbz+bv z&%JtkrK?vNST{CZOjG9Js9HMVjllJo^5=7>9o8^kf35HW!<-xLeGGB>It@X~uQGX5 z$Z74oeKmb<>y^d*haRqzKE82gxnDzy=yjVth03e+ck@i$qjv0g;9`*^ueEww4ogq) z3o|IG%(8fAv7=|Tj`7}AD>>)A;ESv9Ie$4qagYA~mft_0Pdj~KcD~X=5h11H;=WCR z35vXe7o?;N&go>`wPUF)jFq^~yli2!MPKc@3tKKaT$?*dVo&>1fy|sOa~4(hxw01Y zbar#FG(1w;Gf&PzQ>ch}qWMgnWB0207aw*GnAiRx;6l=Zh&a|O3POpSw@O@8^=^o` zGVSh$)Jw@%gDU+dJ&)MLqxIxLZ=cd6A18L7s&9#JcwfEW#eF}zT-V1;y6*avO|`Aw z50BgZlUS^i>Rewd<*fgQ+4OY3u`!2pZXThvne!thwEdK8FxUMG;1d@*HF5hu*Z}+|Ioj)2xL>-== z^@}JmUt7B3Ouh~8T+hb|i~s%k9C&pj_wK$wj3MdbA=%sxNsbCp(Rxp&JPuzcY9^d^ zvR&9Ao8K+jO&~kx(4qZ*B=4rLcTK8ORw!He)bQZp{}!jJ7|se^m*c$1bWq~=Ps!kh z6>)o|F3SIBiG0S9{_l^&L(L}%I~ktZ9`KPfcjh|qDZEJQO>+6Phdzp(N1nuPI_te< zEpO=ax#^qh0tK(lY5nIe*OryRp~6ta^ka_~=L6prDoKyycjsB~Z(v%W(H39Hnt4v_ z+@8wT*r|7K-D{US)Wk05@M%sl*Yt0y-U}7Y9y&=+X`ayhbkcdoxJ>>JzRztP+D|d& zdGb%l;90S9V;G0iW#+#x5;fOGZDxC9!D^qEoP|uVbhte_wryX)iz0|=HH$CiB5$6;Z+x08CgGgtO?mehEnZ$0p#v9KHpKX>5C}L`)}-h9Kp|!Kt^<|~%R+*aIJwrd z9@%*Q&h3khM^36Mdwt|?h<(Vt?PStXP805mCk}ekCL5}`a9lWM$$4y1VD(~!-u7#| zQuuCMzu73a?X=*n6rVSKZ(lBd{9^fhy%^VdH9{-j-hNnJ(r4mVk=i|+MTkw^rL`==7B}+@@~o}S4Z&NZxTB4N;+`s3f_~~!bF^2 zEuFq$wtLZ}H6IVJ4Uk_y#dqGj4+b$@YhM=LDtsV0`EjTpL-7L3K3ThCFQ>^lJ8rD8 z{K66ZBBt+%q?YRB2Y-V793v!zetbB!`omZG`3|zjqde7Wzv~ysojl0CYrp)v3lq+2 zK6&t2Q@!E8;*XC?NujBB4G(=Qtyqq_a!j5gWAWie(PP;!!O9CC@b2HmwD)iAizg>b zq+Qd*Io?*!vSl|>Ik%8q?!Q{SOx$PcJZEsXC2QP$Ia6mpdSJ*UZ>C7v^fV zh`KQw7scH;vvNY4zg)eHe0(8mRL{n{OO9`qklL#vKF{lE$6@z*d*T_LS{*t!S9lxi zv$;$N<;rBp>x?|$z4VQf=uw>;?h_iEla6k9^Xc@&hqiWm-&t+BAZ)Ib>+_^l#SZw4ObG z&9pr4u-NMI2{EmEul4QKC6dCob8oO2p%?PAG`ZdbnF8&UE3Y)8?n**(ibR|}l{ zE~}w_K*d>r@rw_KfKx;um)=R)Gu} zM-7e$&0q~koIOv#QsIMzO)8_;m(@Idq;WZ{O0bOdT!jnT$0KoMV?i(kGp_!DW%%&j(Br$vbzZ79TLNIdDO1<`F)z zOS{V#&(_;te3~kjp)2Z>=t+Cu8*sijotFn;o_V>rpKzCSfqlRp9*aeRymUJ z%0TJc{d8@E(*hMTVkhNp7-^j;YsqijtTb~GQxD_byv87lbi9L%;K^pN~q7swbCwcqTK#ePrb6<>re%CznO{dkMuEdfh0(FFDn=aRHc zgSH*FfYK%Rtx4}Q_R4wLF4~$md-)X6g-ZHO zXa4o%pZuQP8++`{JvY54TaLeSoKlC5wN^i(vw9aA@_ z#_hA=ea=05&VGLPhv&sP*XEx_FT8_ow`}_x|L4r-y1h~spE;JU%VX*DmukM@;&I~5 z1PAHQzAL>iev|qfxBOat1?La-q7zYmiE*=q1wXlTfBhqK#p^*!)zYvlT{5EP%OV*C zOC^e%zn%5%{=y^mIdJ~9+uNAlGhMK&ESdbgqJXhRP>EqyX6TIB5(~dhSZux4+}%}$ zbHO~Z<98ga=6?uEyeGq}sdDJ=~ZXHM^28UFR&?*D)H z?f&~e{%Vkj>yKo+C(}g^Br@>{7tCll%p#-qz<{xxGa`11koK=7#$kM~rpp*FiLE;` zq3+^G?ybSoo~p9ze_Xgvq~UyAtdGm4%|2lpoWh-~Kn<=XtncX?Gm9@ggWIdQz(OgP4OL3h@x5~iAUYhSA`Ey>M16kzIo zJ>jKRiEFET+l}B^2j6|XJ0Vp5<{DN{u8S`-8&`eFf9rbV!S_A&t@k7T&+qr$`cHww zBKK)V;N~sdxxUrzc8PtdI?S5E?vswFd}wof(8&-QxFC~@$N6~7&cpI1 zt8TllT($T`&!TtV46eV)%d5V3eQ#g+@ml{kbE+b*HC%RcKWp3<{cEAmt*U~|dpi@a zCe-DunQ{EnLOUJRNGBt!m;;L*+VSYWILtJuF=^VKd52bsF5dCL|9qp6p(W!nH`ygY zxi4n*U*%@snB`cPlWAAW{MxSj*n^F6VJvgDRh6s_y>Lzcm3Mt+s-gX+Jsu6>Pc~L) z^t-Z@C^9cQ|BKsFgqv05SCPh(O)pMAnQ(r|#4S2&@#%DgM_ zK#1wY&t1!$7KM9GQas7^O@5+^;?tB1UvF*5Ij~7YVi(VW_S7hkTYMqD%5$yuUQfKd zbM5NRw_P>H6AMy)+&I^NN8I(Fx7&gF9+S#`87gn*eL6{8X5#sT9s0d7=NzqkADohC^D&&j^x_A;*by8Rklj<3`f|93dx-p&Urn3~Tk-JkE) z=43tBW76~-qag8l;U>(RRyi&zzRvwXCCK1Xq{5d*4>lDs(c)m?AJ<~HAMl&DA*F=F zk>Sj_k_B0wJUqM$FRxPW=Ge7t@`-?*-5FdWl1>aU0&<%-xG&qQz38#4>Vwc^=lNRC zg2d$=6Yb9&UGpGdU)sb)GJZFgeVBCW0WbFi(L>7}H|t!vm0I&_mH(q7TeAy~Y+CA~ z5|BS-L-BXDHx7{h(JFO)h2 zvQ~7){Z%+}DD`x~n~%pIep;P>{88(H3kn+&0+xqmJnT^Aa}5x)6~D24eRsS3P4s5RE9&VZaD>f)( zN^aLXW&O!XX~Bfk3iEvrE1p+h%fh4NkoI92qi3?A>$%BWCxnXbEn~0$y6^krRsD1M zS(JWH^sp$Y<~pnP;mbFvx{ZlU_P_dNHO{`=@#*n=x3UfL>*O6KnO<7XxXY8JxGQqe ziL{`;7fQ92?9NX*CeBe-*ZKVZ<~3(I#?F?quMTFWHd9pBKcBSd)^XPJLdG_}<_tn+ zVPPR`e$S2OYR}d{r=a7)QFw0B<@r`e_K&>xs1h;MN^2;*-HGunak&nM4zjc z-t?EXWL4^kCCX1SxKvwma*w#V8ypH~sdF&Xy4ceVXj)tJJozB^u?zJDY<@3-E)+MiQTJlp)jY}FmPR=&s=fk}63&dqJL zZp!134(e2~o$RDI`#^zOYtE@%9l3TXf(vHddir-}%QbhF6j`pHDNM^!C#?u5o$GAJ zwtixROUvGE`?DDg8JpfW>CImf4fgd1S!DLB?5;AHTz5C&l-ohi z1D@&$GueEYR%lZ$2ee!MdcPnhZH3d0Lf68st zm-@wW8$BfIhrTripU;7Fnz^W5)IIthszR-IbUp7LLj^XJ?7#{-KU)H@m0PWWKi zt;78(wb%2)g4rqJH=hNRd=q4RIc4eQxB4sC*1VZMY1_j2(H;W3xAiVbHL5T?9Q^pt zJo5~>UYqw%UohDH*;d)v^8DAE1DdZpId9JQ`>e$5^hjy-3Mn6<=WJ}rUA1J=kqxd7I$3%nrcY&lsJrq|G&@ho&0v-Noh|7;s`Ev^ zZL~3#I?}CUc#^4LjvsqTm!YWS#8WIss=0TqJm{6-F==gOQPe4;X+~|&W0^}rBcH42 zaxn{U%jG<;?UmDUhC#4e`P&y8k$>WBh7AsCe-e58UEGc+otytzV0-JwT1SWHpM~1? zOL}xwsH`*1VfOF#6q%co63x5etly<6C85#m57PG=GbShBJjxnut)KfcscZG@C3h|? z=$zUT-Skwou^yXO8{-7e3DnaqK#x zGT}r`U&Gg9H`oe0|_4x5q#z)b_~)m7tU}!Vd34&kE^YzQB7yTCMeDRhWQF z$6l!k6-QRwe!b{)?!pO;E~Qi&;4EtOgHBEMYHKI?0>8A zsk!Cl+wb-}-rj2#D!7%Y9Tp^a_o+&7-`xzsidc=1N>A-BzD9NBs)gEOns*h1K7aMw ze!95OWzO=?YfpQrOz^TYh?U+pw;@-xqQ8N&ChTYDk{L(lJzsP;bFxWigIQFsRn%EA zmjlODIMZ(|aew?sef5SNY#tL=aCW`mTGeq)#k$`*)GF``)6={|WshpV=T<$kRG+jxB$_U@5!6EXy~yj8(&$z1_tR z-Zt;vuvykyOxI;$y@1`srx6W_Qs?^`Iu7jCd-c}p)>*c+^yM3qzgvW8^Iv^={Id1& zhruB_a&j$qbPulfPrm42|LLXs@=>Y_j?47n91Fl?;?@J6bv(iT$wK_4dZ&==t}2 z&ih>2ES~gm*7gUh???BaoW*lpVu_)gU~=!=zt=00Cgt4tBrwyJ)6A=)YG#n3HMt;J#U=H71cgH5J8e$2Aokaafu z!$$u7++h)izs~;|UGwdh_QiSk+V)qzZ?$-L#JJ!dyM6ykKcUCfWd}dUFoqpsWKwA; z{bX8rKE%57v)zZvk8hSPX)f95cj>RBT=VfohUX6)4X>ZFoyI}{c2`~q$4 z18%(WaB0bXePRjk;{_}kQjC2PuN$|iweYHb;811R%XjFD(w=WkryoXW#uKT!1^8Rm!P7A2DTiPbsId2P%(7$)wubV}%tLlSZgWqxY zJ??K7FS#byiaD-No(IauXl^ zUSim1=5#{J27YDkUl*ot+?aHf>w{tR zTc>`jf*f|CE9qAm^5*$nT38+RD30Ne&g+EOHIqv}OW26@YaYAz?Q^xkg53e7!jmqD zDsa@!b3U?d^1HI_-mY6)wGyp07;U$I-+A(-lvJJ@X!0fC>G_r#3)l^ zmCC1*`XA0rB9Ts7Qx7`r_Wk~E!u*Hnk?gON=B}B2{K3WwAF1Eg8X@()HTw?CHjr6Z zIPn|vj&=QfoWcRwTMR8@MQ`xUVzQ6i|8l-x-0l?L^Z9Wpfy^0wjpf#3{=_RK6ZJ(FN{i+9 zba>S!OcYo?BX_2RoW`M9x4UJ(*NT2yBxg3}xy-q^=#;4#f=HCyT z^X0@3bB?&Ke!Ix8tlX(ZNr_HmhI zMr)^a>rH$(dDDSUf~+nKCK{XCVzzOpXDqn?Zjq5uOVo00GZ!&2V~>*UPWf96=lD8p zF22CS>z`LE<>z$RL62Eu#`>TGB`dqCE+4*ldfI~i4&SY>GS1~RsNO7a6JH# z8GGhleSP7f4Ce8-OU5BDqj>P>VE0V>9R0w&D}e%-^_B2)3<5TZ#4=Qo9Et){rmEB6mQ<_kN>MJ zuHTHw+tQcDv`bd%0N;Y_Lf-yIrrIL$j!RZ8GCMGx@rd-yq~wnGDt0^1ywpk%w6x#z ze!7Ta_|n%Tdk5Y3J#|r0;Y^ zIk9<F3d~&y?XY1eG~j))l~OIS0Cuxf7|fEvUb~?b#u8wr#|-d)wuPZ z@vaWzqwlst^N**`Q>p3|sPJ*%f4i+)YpLw*I|{cY4|CrVepAwvKRv6r|J=3Nola|e zLnduM#GD}~kZE+NgXdYO{N5(lDJ4RUHeIf%&dKL_114JkpR+kYFZ@D==|Oj`i4J0sW!aqa?4XOQ8iJ6QK@tK0j`M-N~Z%@3XUxJDdRYYNhhbC#c-{e zk2H7Nnu<#9j=#)y+GgBGD7~1oB~b0d znj>fCeL=~CXofLxDBjKYaI+DY%VdE%bba)dIz z@e#W4bC$TUvYGD^X6d>K&)-jHQ2w{cWZydGT=}zJ?Q)$A{(bW5V$4zn`&15mb-K7L z`mElot76MenfipiGWlMZZk*}XQknIBT+i=Iq& z6nYpeDVCzypmu!T&UfkRYl)#iIt_6zO)|MHW1 zng6-FI||>6l==81Wu-|?eI+CHm21{pEvq=$ybF!jmHl_hzEM>6x5zWB`>>V&!RGgs zwtexNB(y@l2yl3=6gy{;#}mK*mHx-A`f)uz#||7hBlGeFmu%j8=Iyr^Ojy6@p2p&s znTOAu;o0_n_95kz!}CsF>dm?A{m=WN@bs^-hEvMz_7*Kzp!4SZBK!9W6MZ^tEiPYM z@M4Y<7iT-C!&K&(Q#u(OR$g(~c}wIvcdN*X!(FQ7ThA@1W$4)N@bqh~zRU5i54P>f zxE4L*X_I;M!VU9zzfXNN|Hg*gcfanRe$P_*VDILspZ}HD6ur9sSontDy%}?6ExfR1 zLD0&Dq4|rPciwut^{Cd`i#e0hy;=70g-$gHIg`+EfPJ2SV92p6F|2d>?%#I3{`QFI zzKbfcqEph-4GmAm%|EjKyWgXQA5XrlEuLy_{Nw&>epUG!aX+WO-1+Ndf1m%|&j;3V z=G-%Gjjdj8XlU5}^5v!s|Eop3U!$1cig|ONO_QA(#k;vUjNag$et|=Ey_uX4z z8YsG;bInSjWol`j&w1wEGVY9jH|xmyW9si`&RRWx%fpwazQ>2zPm9}a@_AXwp?!;H z`0h*6nCqaJdf0Qu2Hj?t_GO*(w|B~>M^04emXvp?=60>-eo$>!71xlryxq*xHtuqA z{My!)Ud773AJ!$SgI>)}BoA_b1#q;w&r0yDb=a#&m{N;@Dmp6Z{)oiXEwetM#$@7o@(RvN@jQU$l3je9qTH w4_3y%Tk&4y_8;-P+YZ-T|8cJck1PLYXJ4k!y5@l{Xb_yi)78&qol`;+0LP|2djJ3c literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/baby_bottle.png b/app/assets/images/emoji/baby_bottle.png new file mode 100755 index 0000000000000000000000000000000000000000..1b2cfe5e30142e5d17119050a1ea452a33130e7a GIT binary patch literal 4461 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 P3=9mOu6{1-oD!M literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/baby_chick.png b/app/assets/images/emoji/baby_chick.png new file mode 100755 index 0000000000000000000000000000000000000000..9be8d2930062b1e0c798fa553fb8818aa6615465 GIT binary patch literal 3961 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/baggage_claim.png b/app/assets/images/emoji/baggage_claim.png new file mode 100755 index 0000000000000000000000000000000000000000..59ae044a45e8849549f93a241794c0d3daf5540d GIT binary patch literal 3502 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ballot_box_with_check.png b/app/assets/images/emoji/ballot_box_with_check.png new file mode 100755 index 0000000000000000000000000000000000000000..f07a466c77847298d320668d6d2911377cc51139 GIT binary patch literal 1829 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rUcZ#-QbLn`9l-n`u(oBH?o z$LpKFC8oW%+GIc-FP%Ai>Rb`u++*Ce@9iIaj+_7W zuibgCvW|b7RsP*(?JA1gy5?_kVQ$eT)m>+LKUyUC*XaHEcGR}$#LULxaB;J?tzxsq zAFYu6sBS%f*1`j;j=qgPROR~l?BuPl<8IonJus{I5VK!#Ovn3U>)+N`)pKn8_4r}< zaqW2pPM>~M&Oa|+a7|L~`tyoQ(`*XPsTZ->-MIR#ps41tpjIn;xNf$n!};xpX7<@n zn))<4nsv_4e<_PAmnM4nYOBOYm6mlo6gs~!==bsZGk=j_Ab0Db>zkSU-s#0;$z@8E zt>vv-le8k#vFPK=zmkpTiVt@s?DOD_dS1MUzw%B{`zEfYCEIK2+z!n8+1<|;`^1XZ zxoz#2Eyg?@n=JS>m`<*AoU#0e;_{u`%2Gn^Uw$m@ty>(<=tti-+8*bZk@Me!@iz|Rh0@7!5@@s*_H-5JX(-N) zqNCfYPH?dZoDiN-{YPuNq?u0FO*7rE9c!zmw(Mb>lq@2#?T~C1pQj_sgs5kh_b;q; z_f%?7n3#KDqrtkQ*{t8Px^AZFeA~62>sN@#!mW&-R2LP7u>8DoCAV;u`Bm4*T|K++ zBx)~v#Jtv+L1nGtBIPjcihE5ltyfm`+P&m8^^Mfh+V>_@eU+BC%O}>R3sw>5O2qd) zxGK|nC2@Mh^W4c&o2Go-d5wG8YAx*)_syleoVwAq+vKH0bG9C2yt~EhiOuXi$sVyx z3_{&^UmE`1wZ&7QVdmPzsx5zR`&cPNcxEc((@2p9gKTGG!?bOYD-65h|g;XqgeU8SzaC7fF zroM=?dhWZ~d4?;Mlx7_GI_-9L(6o^C6xQ*x-0^IyS;g%cvly0b+4C~E?e1~~!$(2$ zzqSPm2C`gOc3G`@kAJ&ar`V@<0gpH43({gTeqO4)tJ?O*sig7iJ)=c>3=NCo?tkAS zYPHqd#qtS%;_TSGjggmIbWGb>r(3=-oy}vhNG(OF$`@fkJjH`UY>1R5k1lC6W=12*+>7aIIPBQ5+%a7LPIKh;^OP~ zb7n{FZDKgHr%|E7WjE`h^pf3&s%LGwa&?Q-c1QE~ z;5Mh-8QsodFG9q8+!gXUIK5W=a=?3b_|Os($;aBd%7$z_r2++7Q=eO&qMUysA*_q;2c!Z^IFTz#!ec3n}t=v4n5m~+dT71}{r7uT2OY-8aq-FomApMuK)*6$^8HL0XzO_6q}x_so;hsK6&E9Ih?xwK9N9gWPb6Ic@bDLHHX?#63u8=lR1 zwEi^rs#Ui{Ro99t3p!3XXJO}M+IOsfw#>{wUrt*Wu|yOHKD>CTsmn}Mm9?`e;~k4{ zp!3}$7vpP}{5v|=f3o(0SH+Xry_Zj!GIh%GDvoDvbE>}Wnl-EKm)z@l_Z{~!Sk!yo zkXfg(MN~voMW|SPYF1W8)|JQ2lkfk$Y`09b;p*y1+J}#x+;ryi`JK%_@_za3`F=Fk zV6MZq&d--NA7af|&GpPFWboFyt=akR{ E0B(bHCIA2c literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bamboo.png b/app/assets/images/emoji/bamboo.png new file mode 100755 index 0000000000000000000000000000000000000000..fc858d0fc2c2431826a012572b7c565585fe4ade GIT binary patch literal 4672 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/banana.png b/app/assets/images/emoji/banana.png new file mode 100755 index 0000000000000000000000000000000000000000..a0563afb9584524209bf7616ddfa7ecf751feb96 GIT binary patch literal 3915 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 J);T3K0RTVyJ68Yz literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bangbang.png b/app/assets/images/emoji/bangbang.png new file mode 100755 index 0000000000000000000000000000000000000000..7270f0afe6e66920a0cc4059ef29d04e50dc1eb5 GIT binary patch literal 1387 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE@fF>W$M~ERcoE8lS43vN5eri;S}Ff@8{Xq=g+yN#$al! z(Ab*E(lO`iw?|jh4ltcn+HfL7IABT3l~0eZs4*;_sbz3Ph0{SyWn*~It)j)?pvVdyD<;lVKg;=^)PJQOk(8_7mzE{v=c$X2fBlQv+yLp(QDZde1utaLGtaH1~(W!JlMhU zvF|K+P!-))lHC~=|Cd<#QZ22({r42#F5{B!f}o+h@%oPQHSX^d#CNQ-st4?HEoO6xo!-E~18b_jkwsg&6WvyzKux5~x z+0Qv4O0$W>T~Cc$Nj&@V+jqZdiBocWkC@Va2ou z&tC71dmp;2(?0!Mc%gQ}gFl{9*rJ@oZ)M{x6S=>;GT> zy8i#y{P^lm$K>Vqf3s;n()f5g^SymVPgfdibLYoJ)qdExlPl;{i$KPltPA(0KLsxT zel2bL_rveE-LCF=e4y|J<9nMg7p6{qdU=1X$@Fe%`I;kT^&K-64*ZEZ8h);>QTuc6 z^vgBO4@4RG`);%BDSmiJe}75U!|1(#1@|`l^fWRsaGYR^kDIq#p6Twx7r)G{=h`#t z&AC;6V7-|5ehKf&jrMz-^+l6-4&061yDA}j$^(Vunfc5W1uTL%1{Tb)YK4GKSqW}FM3q?E*M>4aEqH$rOsd_SUAhUW?_QL zL58ml%>I6BnaUnE=af}z9^v+WIO8Hql~L6t`|B#7A6?nUa=mJA|L;rZ^OIF}WE*xC zvUTVhzg4{lN;{?p`TnFVo>Kq+JlF3A33YBOBfBk!a!>ik-@hNr{^7w6vxD#T_2RlV z?%F8yn47=l08_#NxkcK)4ky{~-e~`0<1q&QzW=2^s!yNR4>7D`zO2fjeE43s;-0^5 q`~TYoAD?er&Hte8oX-IeR8Pt}!sET6JeGlhfx*+&&t;ucLK6V8L50Qu literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bank.png b/app/assets/images/emoji/bank.png new file mode 100755 index 0000000000000000000000000000000000000000..1faa8777e42a17dcf75fe2e702638c83e9d0fcbb GIT binary patch literal 5583 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 JtaD0e0sz>}PjrQ)B*(zrD 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 E0ITv4yZ`_I literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/baseball.png b/app/assets/images/emoji/baseball.png new file mode 100755 index 0000000000000000000000000000000000000000..da004e2ead04f570b01aa9c0723a27117b182838 GIT binary patch literal 6032 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 N;OXk;vd$@?2>>{rbISk# literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/basketball.png b/app/assets/images/emoji/basketball.png new file mode 100755 index 0000000000000000000000000000000000000000..ef694bec4c92aa8837c12eae7fe3c51dfc8d7cca GIT binary patch literal 6386 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 P0|SGntDnm{r-UW|{BH@h literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bath.png b/app/assets/images/emoji/bath.png new file mode 100755 index 0000000000000000000000000000000000000000..8f75d1d2499e46ef31b25c735c76eae87f01c2ee GIT binary patch literal 3210 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 Cb_nhO literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bathtub.png b/app/assets/images/emoji/bathtub.png new file mode 100755 index 0000000000000000000000000000000000000000..1c3f844ab262b2ad6c00b61bcafeea1cc13ab861 GIT binary patch literal 2784 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 L>gTe~DWM4fjUP9_ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/beetle.png b/app/assets/images/emoji/beetle.png new file mode 100755 index 0000000000000000000000000000000000000000..222577ca7ea582012b50223a28095511ae143146 GIT binary patch literal 5255 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 X+4x%?&!}NwU|{fc^>bP0l+XkKIQtwK literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/beginner.png b/app/assets/images/emoji/beginner.png new file mode 100755 index 0000000000000000000000000000000000000000..1f022d175dac777aacc371be6ea0b56ffd398ba8 GIT binary patch literal 2761 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEAm~S)fUus^@rYujzYthgsvGAW^CK1vUcLKtmds+}*QmN{9XzwVFhzGt6NqU^>9b@b>N7)#5r4AMSj5dRkq7@0Xy+ zJry4x-rSu2f6vyfUxjNc+w7b`A) z(7bT>?%t<=KA*pzV9zsm?py{FQ`3$4_wByDxq0}(g9p6H$;ta4J8S&@_xha0!{kY<)+Q~@+nW|GRs&L%m{iZ!L%k~W7FnyRXA$mXc14f9(gH>c&ERH^zwrSJSc1`8X5hRzhdLIpK3dTu;Vfa6(yAte zrJcP_E=9}_&S;B9n+l4FEb#1B;hc4^`__$pUt{zB{gT!&z3;?eeO-?;H#gVE&o9sG zOupUUFPDG6jeLJbTKe~PK3TONuXwlUM!J+NVVUP>$d+ufu`59BKa0R|uBBR>0uGG~ zj~r(lP+QnMKUe$X)Z6!z`m_aDtnZ61mVSO_X0Xsiwd{X>+6-52SU4-c7pTjf+g+Pt z{eHGPi{pi;JLwmcell&?GWVxOUxr?m!^CO)jvG@VrR{Iq9orSn7VzrvmhIfn=a$QD zdu-qH_(rL%fZ zgct%l0&ht-N(mg(eq125|L4&qtp+DPd^mY#X6%B+2E9_!i$gdx?rog6?OyB2Gt7)z z86z~;269;OT!?x;lcA8|l-3c6dKNp0Lzhx@ZFXP&aNsa|<-}^czJ4vblsf&w zri6RHllA52IOUpbG}GYbKk;9r;}KUStBXTHj6jOaGd+!hyS(2n7}>E0mmR!D&* z@;ig4pVHC`g>TkQ!5yl&j%>IY1}jlPzmY(M}$gjMN4R#w81r1Ej3j z1QmZS*dEMUv1zFhmt$rloA3jX7GwSeAx#?#Ik*jE9VcY+FW6|iAfVx8=8QSB z3>l6$OlIht@?f9*foF9yq?#g9Z!)t8vOcpAR_OeBuB;+~-N$E=*yBp33V|J+OSb)! zsM_^#nsnle`w3@0sw!L)*uk>mF|$C+g}Z##= zGEGcfSJ|6ttA{V2KfGukxKvMk;`Fp9A_5cDbz4?9d`~U9Ts~KQ-R^6SE2?acz5B7| zvx)@Eh0A>B|A>}ZoZDxotmJ?8L-PciJjEDJ8^5TWo%}rqZe>3x5arNni3t4NzR;j$ z9p8<;;$?r9PW##7^^c*3!+N#jk8^*|Nnfv%=w|H=Pw(zJWUs_{tzPn4 z9P9s@w<%_Oep>d;Gm?(0;ViTDpZZJZLkoMvC+2|rDFIKd3cPsV99X^nK8tv)P5bTm z_|qrs%sC$6wRasJ47#q7Pbs_F9(58t2h8@ul|h(rt>Sj-C%rk(u*Z7xenGB7)zMeGukgI%k_3BWs>c@)ex2t_UoU?@{@;5 z4|*@tpL8|5_r>uVjoWS-U3jR8|9uz! zaz{n1`1`nJwhQjHiC0xSY~A@ibj3y8J-oilohrTF|J>-WI?p5QNLVey&BPx8hordv z%=nf0c?sjnybI>9SAW|$gVo{g<%RENalMZ_`-%6*u|3&Yl6*Op$2K#c;8P2=T`b4( v@z_E&iTJNR&lnaIX4D-Ia{hU>o+1CQr^@}pgS#0R7#KWV{an^LB{Ts57%U96 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bell.png b/app/assets/images/emoji/bell.png new file mode 100755 index 0000000000000000000000000000000000000000..69acceb286ef2a3ede896e8ea2427e25062bb962 GIT binary patch literal 4859 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bento.png b/app/assets/images/emoji/bento.png new file mode 100755 index 0000000000000000000000000000000000000000..c6d99e89b674f124154f8e3ad748a624bc16afdc GIT binary patch literal 5732 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 F1ORq>$d3R3 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bicyclist.png b/app/assets/images/emoji/bicyclist.png new file mode 100755 index 0000000000000000000000000000000000000000..4e3e0549c21daaeba2ff6ce1a7e181954492475e GIT binary patch literal 6484 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 YVl`oB&D4oq3=9kmp00i_>zopr0567`DgXcg literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bike.png b/app/assets/images/emoji/bike.png new file mode 100755 index 0000000000000000000000000000000000000000..65738602722677c81440b37a42db23c11624312a GIT binary patch literal 4722 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 O1B0ilpUXO@geCx7dLP38 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bikini.png b/app/assets/images/emoji/bikini.png new file mode 100755 index 0000000000000000000000000000000000000000..4ff63b40f8868b49a803bfcc642c229622f17f39 GIT binary patch literal 3890 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bird.png b/app/assets/images/emoji/bird.png new file mode 100755 index 0000000000000000000000000000000000000000..e6be8c027866f2ccdaee2d6389da50c0cea5c227 GIT binary patch literal 4878 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/black_circle.png b/app/assets/images/emoji/black_circle.png new file mode 100755 index 0000000000000000000000000000000000000000..e46f9df615f92e1c1f00e9a45f010a0a9138c13b GIT binary patch literal 2369 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 Iol`;+0MA>Z?f?J) literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/black_joker.png b/app/assets/images/emoji/black_joker.png new file mode 100755 index 0000000000000000000000000000000000000000..4c78f3614d798dd3fd8a1c0331c2c340b85785e8 GIT binary patch literal 3877 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 W3?)kcOj(zLT0)+#elF{r5}E)?eIg?O literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/black_square.png b/app/assets/images/emoji/black_square.png new file mode 100755 index 0000000000000000000000000000000000000000..71da10de81ced24b98b721a771147c9b2e91242d GIT binary patch literal 1332 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE#+L_QUXe44kDL7XF%t84wtGn+G)-_6?^CDpsqfJarO_qf#F z>+)Nxj$K}sd1yj^ro@krjtuX6+!mkD{kmCq{yoim_PIYV&iea)2HT&k)6>iKzC=dv zJH|1C-{JN1Y5WmEkH35|iHV6hpmQk4jQjFS6Cbt726Fx3&-XmNx~1&amF3K<1=o7) zdDc3=y0S9zYo+ge-RY-4eEG6P%c8!rQgYq8b!7&#{64&Sqcdmz{PxF>9~TrA3Gwms zA3k{SU>n1gkQL{%BMah$4tP#Tunbsx{`}&zr$2u#uBfQsFgG`U`0kzFo%{ETnQB%a zc>6YY$G&~{4EW6!vdT%PnZu&F z{^8bTzh-GhxO`~Z`Kj{qoy{B#dz~Mp{0>Q)bS|^_L(HR1b3buQDKhkKWSsTPzxbSz z!m_>+=2d|Oc4fj+?DKSp$*}}8dLWj=Siwl*xq+` zw=kp4j1`Qxln!{ioiWd-TTmgoph@8b^EQ`HhC;it7|!m!!FjBSNAARj1~)cy!$n0V z3$ECo@C`1Ne^6So@rAw{gZeeD2|*hj(}fr8-SUiim&NWN;S(2GIOQTXaUPJ9V%^EG z&M#(C&>^u4A@RYNB_2$f{3Pi3HVKO^ABLX{0tF={TU;B=G;_PP*Kci_KP$>1mmyw9 zEY+^T%s_#$@PCb6d}_;*wONy=|NaxP->gDPTvG9j^n;z(#PZuGh8=Raz#?*r=jf8z ztN*F8WSll@nEcY|tL=Sb`JNA|EV-xFE2=e^1#Ft4?rvkQTiA5#N5L6}zdwHLC@R_V z?DW$OKTZbZ{5|el=q%7wJjL|abVnx5E#VUB>sdCs@G!b9+?LiCRkY;SVnZcn))WV> zJAzp^lV^HtJ#gx-%yl(7~dd7RdO{>@{oK8;JTRzcGeEy@k z)uy~JK5H<>`!a7~IIR6t&+HYW?CxX6&vn#SY@FG}v0GrGuxeE1pS@NGYgg9rF<$j? zIL0*Xif-odL(gLxRu=CSNMKyEQqq#;O{(M>$uqa)uc#coyk3m6N+l_`F}u3{{j(F* z_2!IA{S4f>ZOY!M9coorw)r^EUj|Q2et0r6S)Ay+rmI z^L{MIcJIsnd??m`+KySAPkuG%oxB*cJbkO}Nda?4qs>{aHTTvQ#$QZar+nwPR=_6d znqa0U3vQL&@Jjn8s(i(3{?~otD;6^DWC^JZoWxgk`cT!~E8H8-Pnlts{#y2-4%3G@ zXRBndaj#)xocH>{mX8aTaWPtCY`DbY9v_+bdbiw%NWTl#5B`_c{K@hAqRxE4W+O)g zPeVhi>w)hE4f1|&oE3jvpKe$D-Eh$Q;6d4X#uE>oyBV2hoM&KQVDNPHb6Mw<&;$VG C=5D3{ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/blossom.png b/app/assets/images/emoji/blossom.png new file mode 100755 index 0000000000000000000000000000000000000000..55a97353b474ba5faebf8322a235f7f98a318c53 GIT binary patch literal 4232 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/blowfish.png b/app/assets/images/emoji/blowfish.png new file mode 100755 index 0000000000000000000000000000000000000000..a1d47cb7e69b807a442ddc7ecebdfc54104fed51 GIT binary patch literal 3751 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

    b zFfU?s|P z+i{}Rvd4?0#VY45el2zB^Mt5Id#i-<&Bqg-n=Q+oprToI^yuq#n|Bm-&1q7Zw`ucc z>AgQ5Y3slH!ggNFssC_-*{MrguJ9b5>}2xU#8!9frhZkaH zh8o)8JHMFxwz^fnwTPTH>4;+9U1tx^S;sQkJT-He?yF1i zOTK>}T;Zz~C+&JmqOUtT_tAN$b9=u`ez8~minOePOWk(lk1TD$jbRpJV zBf*l-b*AufJ5M17$u5%(t4*`GWwm(wqgMAm4B=?vln&P`e3w3b=f0h5LuLOS++kmN zKp>cuk0c}t&Ex=H6QohNXH=eFI|jBV0+S4F$DJRZ+5Ij6a)$)rob$?=uds#S}!CT-GbWO8K; zo$Rvk{JF2)U-DuOuG(esm2K9##2b8Vxx&jeXPcXyKAj)4x8U!uZ`bwq7k+-7sd!F* zySTFE*OzB!-=4a5?ce;|y!Y>!RKGVq@!e5SZ7|PgQ~jj2rQVtUR@z&aZMyp9La1n? zpU@AM$8t^=FYrkFnrjrzHu0Spba;b|7uTdEN4`d_(clkSX?}7O(@M`vCeJt6KRmWo z`my$OeY^UXpSITjJ6AvF_dA_M{2A-_SN;1vH!M5WW3TBvx9U6YP1}$C`IBz<>*-_n z==uw>aWy-3-^txk)|+AFJYmC*I+pd9T{#-3gnlwQyl#hx?= zI8|}FCR%iH#0N)|L>;!-cQN*)U@*F{jglTz4XJYqv7$jo}pZ8buPJe z8Z6Dr+PciWc4Kdz`M4rra7iv$5bQ3zNQh21q>TKEe@E~r z+uQ8lyZQUu+uQl`u4?(2N#=1cc#^C1!+w+FoSGLi9-2nU9v51Ed+o8yt5?64kB-SI zjfuW~Co8rzEA-PEg}$Ie7tSAl>{(J^uygO;&A;!&<$uqf7ry(_>-L|U?^nllKeo_1 zZS*)-?Z;V-xWxMe({9t9A@<)v0oj&UXf16(o8@Fr;I%zy#$^TT4#M26~WBPl(bj^Rd iu6B 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/blush.png b/app/assets/images/emoji/blush.png new file mode 100755 index 0000000000000000000000000000000000000000..3a95eb61a3af84e6de44eaf5b4e165fdf1d1d90d GIT binary patch literal 5188 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 L>gTe~DWM4f3?N!h literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/boat.png b/app/assets/images/emoji/boat.png new file mode 100755 index 0000000000000000000000000000000000000000..ff656dc62bb78682ba3a1775eb4100459ac95bf5 GIT binary patch literal 3833 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEHFxQnRAjgr)twP<}E?donispTLQR5Cq{YYJ87*A zSiS!X`zo$q3w2j z*u@;FZTagB{+?<~C@6TNeBG8oP?IrnX_BVcR3}FXSc~! zcfM^c-JO4b+rzKdZ5s{=`-<6Z>nyG}I(m~oKkcXT?Un!T`uf=IYF_y6!vEd#7_TtA zdfJeoaBSPI8PALkR+_W(1|K%v#?O~GTk>wr`_foOQRzg{4|4BCOXqpCP7G?z?Nz+> z^i=!0Y=*A}hcq6D?qUDBI&veUw6^cESIySndGq)Et-8bdih)72D&e)^R>YCdrHdNeB!!xZi|g^~o>86r(7SJiwZHCS_UuFS|Wc|S{T=8c-YAqP%r zzxP|fY4B~fyF}e%qX<^kFlPY=+YcqvmE-3;{$0QSN8N+B*KHbhzn7aCxOG314D$-J zMg>-ei#iJ4+-C!C6eXW{a=3N7um9=l_xt0gughd`473wpRl}ztC3uRJalHc9DOWAl zwvQV-a-+R!eos8Mo>6{Z8snKY_kX;5mXNITrbM1CkDuFVDObniohdv#yfZ&DaNRKw zygQw72b=i8xyoaCJuT_?IqTQ? zJJhrjVl{tV>HR7u_E3Ad+S?wrG?d-mP#S%r-d>=N;YWM+DyFnq z!udN^T2-81mNa#f;T&IUZimGoMpL@vjx<_5u+-^`^1ZpmFy-{L4^w}Czg`w&ENY-D zKHa_Y6`xHR7l`@R zJi1o0#LO@}*(`R^?b6d;>2fQ=*;+QJDDdf=*LBe0>EQ@Ach9j3`OzA?`^j8>+a=xM zrVX`^n}4UpU9EflrT5g41Ch_>&vc(Z$6EHEHs6X+;qKZ4&5SkwxgGL;U2?dn{n}q* zn<(?XWbOBCb~T~QGpc%jzxg*mI^nu(Uyz2)w+BWwi63WJw9xJB{BQQ1-IRAm&~4tA9(7Nl zXXlO_fBwwq#nuB2S}WKY<~s*eT}n?+NZ7%1yNyY1&CUCa>+Bfb7XB-HFL(Hfn)^;3 z4VBLHO3TE|i?Xb%7``$s$Xw6Fa^a5J_S44u`&+A6W=kS8~{r)V5 zJEh@Y)?MGHw&&|JS+CVkH#9Q0T6`N7z~V+*UsJEB0u{cue4bOSL?n0IVN9AtnyfoBqneyNE5x%7(8KL z`F8G-T@KFf-SUW_$aZFK3Exd|lA|9gi5=*xts!zpHGt^=R-~tz(ls7ta21 zRm&r|oMngP0x7Nv{xNflI}(WcR#QRz7C-&0-8!m~VwY6W49~x%GS^hr|Y^vmD#_q|~AhT9@^n z`YmU*t~;Eip@SvAQoMfW^94p54+m;79-1Z6p{&rfzQ*-@#|Z(4#Zw#<6mIQ*`*lqN zt51AuM;hl8rW+TE?pRFvFgJJ)`;W!iOb_Pq*3`V8d}VvRUuF#>Pc66j0~wX$igjI6 z?lUBCB>bEme5N*kLh8o^9SO&t2E)~2+6gR29L(n5e_wlj_mqb_jd{xJKJ3$GdT=iA z=Jw@h_3uqP@S>1oKBGv%c{YLhjZY_^`6}Px_BqvRuF%TBJ%$OqNjdTi%#+f~?4_kA zGjC`)cDc`4Ehjx=nO)uc>*r;E{_*BYsO>%fPPS1xDnN(9Zu_@O%P+*X99hSh!4%Tt zB$3QAVa-NYof~hgnlF0iu(`Wj(^3*~-kmT*Yr5qYiM#AI|5UB{cT~sxOQ@RgQI34;Gh=_hVdiIg4L6Tsyz)5lYiCbF(mgLJZ|Fm#j zdE`P_>(})?$G-guuX$r1FTzmHs%c(_V;qJ)x; zE0at?n?zu(@P~7!nG&{}e7h@Ta(`DZS2IhCM$_?5rY^@qZOyLWrSV;p9);Iz`>$Kj zS@P0;%jXxCU)^PGWDj%p&ns9{a4FJ(`$llr5;+z2RdSKGX&ZkuCAl%DSeR^+O}G_y zwt(SrY>9JE{ywLu?e;5{@Bfv|oH6@Udb!8cK;giEfUgx_7s#ER?GWM_xFlctgF~0l zVwD#k|J`SF_qhLk$GQ4B;-0gYUgg;M@A$fg+c~fKx6e3bp`l(o-FSliCiX4spWD9J z{N2Iv#e<)WhM#v#PRU|WDVQZ5c>nt4^!hik55gqpY;>#3zINP3<#~lj0K?Y_>Z>%k z9x*J8XVQ6G$#z^QuhVC(&GVg`s_Gb6e=y$jnXeQZrxJQiqj@Rd@?+sf{xiLEOl7yUSpST@hb`|X3WebNyn8@)vtnY#oyryN=EO0bpB z>&?N1I##Z>XI8O4pXog{a{33JLxGPi1-08vAHF>9R~!=hmz!xr>fSxqRPVG033;o` zQ#8EdoT$K|(xc-d*uv(-ea%UrL3D$g!D_b6R%|CPb6xTN(Eq)9-mK7jd+rBmJ5HK( z_^hu#*N>Xq(%R?CS2l$g$OUariY=Yw^vGiVt6iM!yEXrBeq`}*_Gj-umpfT)|LxJ8 zAouis+qP5d%~wC`o49OY48!xOM^#_wXy1+a$k*eLpul6~-Z;m+#Y|c{k++56nA2L0 zjm!;UqFGDtNgU8fh?xAnA%$Uy`SkPY3LhSXc|!y7$2khgWR>{cDex%mbNb2i)2*Mve1&_DE@t3bp>!{Os_vfvBaX}j6&J$@n=Wo8pQSmkt{&N1|0MRo z>;4`0?{B_(?l@S(>+pnf=Xe&bWoMpWHwD zD>7*P!eJpT23{ymLucmJ98vT_E@y{iJWoww>t;R?{JyYbfv%Vs_f37@m|fsszxR6p@^=d_ReYk%HY z_n$S~VgI(?(|XB2It{k0U*}>KtTppt5X)2{k?_?@rw=$utXY!Kn-`$28~{Bpja=~GKymAKhoVcW@ZvORlmj7=}o<{qh{iGY(8-HN-gQu5&?c!loR9?A3)gVXQ@Uaq)jn;W7f(Ap{)WIS%I2Mmu^|HAS{cq zbDG1-s1`3*7wKzE2UX5Jx}o?{qIyrhasJ-Zmfyepub;d6yU4;-O~;d}((LAco>uw3 z?*9IH#cw5&Km4!!@xxMruea7@?O05*G==fd~Zs8nf9tVtp$lT=jGLIeTkV| zdVPaf?Vn_id&xe}{_UA?pS$97sL0+mR}?;-_Pcp^rmwa6uh92m>tF4^z`6N(>(QLm z-8su9Uh!JLQ<{+><{Q(KC);BhCkan^_2IATcA2=hx?%B;ax>o?-S+GB+^3h~&ajow z-1MC(<<~ac6D4_5(dVr4w0CyRr}6RNyJEDE>OT@awhPXS&~2Y~1|( z-0VHs+wZ^0UHA5*)I;C6j=6pB&x>r@@uheobK3frXfAYnE&m}14_2uQT@5~N=+nQX^}&_Y_l)z|?i9)AJqc+(5FUEm*tk6#a7yP~Qf0+7r`GP5KJ2@Ue;aUBw_UzpKlBRh#LQb+({Mg8Rp}#(>;`_C)e&T`ai$5Lu*sXp|-h1(v z6I0GX_dcX2Z%%1-%xi31qU%UE``|gu~ix#V&hhJ}-f1khh z=932LynRp0r)`V-f3ST2cX_+tlWu>jD_A46WB>NwZRcmcyt#K_;-}aZ!R`A)?aDr! z=l^!;`23gY?BQ&$4s6W(b>e4){F>^Q6MX~g-%j>dPJKVKhEF1PM*Qltx~z@2nS4x5 zSI(9+c9|9Trfm1}9z)qb^2dwI-qvL=HTt^HSiSGTpPhVmA5YfT-oCrP;{4YCg%7;< z@A$g&{On* z;b)j}qin~`Ik#m+{_K`HzWZ+J+}AP3bDP^A-shQlZh>*H&SmGNUnbA=lV9>x{P*8~ z%qkvj@&;zPJ0IN(D}J}Q+k5xMlA~8EZpLm;d@p;Rv48r$H|86v-UwuURa<0o^w-hg zc-xPA55Mnf@Q!Xc7aIKHy^g}Zg&bQ;MPG4DkbN@8@LR0?CWhVR@AKA_vgH>(+;{Qo zp0kcG4u59av5x!pa)F0DZ3`s59J5)M1}(`vWSqPpsI-1kO8r!oz3vIer|DYPt-d$w z=ZQy;#I}g9J7&ASRy6PSX4aoSZlv#P?yvd4f8q7I#pW_~FK-z8?~^{@y0Y)UFT3oQ zA8RJAuTNoo_I&-yAOC*U)y_8HKeScf@379l+gG#aUGMvY=KKEWXPiIt z=*Gt7mnWBDZjtPuIJ@`>Aq}P^i;2{T}7E(M}s&M7kV%mFlGOo zvS7i~wuo7r%ekD)1QooLR0=(uT0Xqo$o##}>!kIiHQO&_YzdsX>haa@d(_nXzcPM! zX15_A371^3=twf*9($OEVAp322k-<3O1TKMUSVa*rk_lFiX z^EbQ8oW8$lhEm1ce{IFl+c$snT6)Fa{|fWEozGaKuU$J=zxQ5_{+3(C8K&k7wr=Q2 zE0#Mwdt1`$YpG|p&DIcM?yOwPb8WZmnsxJz+`O!A*t7aY`RfVg zQFyE6<)RR;mtXZV?ECLtzu)Avvdg)h|G}A;!aug3|Dzk$XQSF_I&nj%YWt2p=R?<3 zH@Y2WJX=*)q^K}$e_mSd+TTm7iqjUJeUiRCDX)-I+AQzrSM!+W+}Y*}9x%@|EZ|A6 z%47;yYv!?lt?$~h!ap~-4k^;F9?%;OS=mhb(&CR-&(Ib)cxH?e)C!`!LSDhV`Sz%bkJmeoWY{EVapy3y}Ea6xUVzH{4*5r=E`Mm zNS}K%Zc*=I_xYPdlRBLJ?YiFmQk8I6)smJXWz)1F<*3BXC|d__nlhee&4yt^@-_ozv2}g$5XtNjh*851!vDSH?L=YApiMU zI+MBE5!>daPuJE*X@&pss_e=tl-~N1%`7kG*s`UO8zTg)KEzaRpOAXD_+v5SgG~%9 zvkos{5LMF<;d*mQhsE)g{d9vLOmV+Gk^)3$Jf9|cynnri_{qbQ(l0SF)cgKWKcsmm zvr6wEzhTQUi?nBA@q%rw;#0juCve>9@z@l3V?)P*_6=WWY;f7D%CFe(6BBeq;Iw4Z zwYHARNne>2HB0699e5tO%iUkAX-(&rMW3RMA37vt6Daj_&Sd);lhXx$O4vUsn7_B1 zd(VUNovXD4x>|*}TDUk3O+($5@y>{BD_q^}dhDdIf~8|B+sd$*S2{KvfzeF4rW@XF zK7K#{;YN0kVpH?|j8DC;mQ6oa*S4SAL1EhVC+bQLiw%o~W3O;GZD`nVKtqwo`Ny1R zz0A5i2VGhhn6>zHJb%I%cl-Gw4`wy->t{I+iB_f6OY^L8HYU^@@r;EDZ-f;42)0$j^-lIF4 zKPJ98e`4_*vxia1XATPsE(luxUggs52!_t^GGDa>qnF#-4%_Y9U(|E!eyUGs<#qOo zw$t}cBzex_OiEoK8Ff1_$9`{2DGUbA5$_@E*X2*PD zx_(UM@+CLL$F_T1*H?3{KHgZhxHD^MkHHsLos*20xTH^t{`?oeGUS?<`X`Iav(l!X zXA;!d?8KRQuw##C@|@oh7w&jf+;?G7xORT~-k&F!Ts&TeY}*)U<6@|()b%SOx;e-0 zP?BKd>%$Lo-rah{Z+!2`lXlt4!_1Mw6}n0%K8Nvq)d@5?sCFerq@i)o{~NvXg*y(- zWiMczaC}v17;oG5nVN7$m*C+OTo#zzC^A*Ub1Ztc?F=$woy5^IB|Wb1h?^NFW6au;`BSHHZ$GK+UuQS@d-bJ* zj7hvFT*XA5n4Uk|f9P`+-`X_{otxrRmgI7LUCS|1p>y#?&5cPnSXLUR^qe_x<9wOp zX5G2h#20yT9FVWDy8J3@ZP9CWndLc&$2u0=J-s|>smnX&C)di08GAM^_2V-X@a9W2 zRE@kf$M6)dvVKCxS5`BY8EX!lb`DsoW48Yuqrr?8hBZGDmwuH^GCldHZ27a((+^FQ zXI70{6p%2Tm%GeadEvzGAAX*lV6#zisl6y zCHlne4rgrkJH5Cj9doAsrQB^gB?ZVCIf;M)~BwHYoGYc`tN`J{1rW_qtR?bvaA zVN&ZUe$O@ABf__p#@QU?Iwf#c8AlMrxn{~&%DDd^o>FK|6-PxLKPBh`|r!8WSI&nuK(S+qh{YZ z?*yL>x&}QpbrNC*wz2NpZwp@hWZdkt^gdfbnG%zPluN>bDZl)Wf33e=7^0lo&DWm9 zsIKFscD~0qr>^UYzlGze*E<;sQl3$r z9Z_pNv&CP(7N22r@TBbu_U1cj?BK*E?l4Z)5(V5dA!cA+G;iUCW-k&-?QmbsyHu zz46~dajCDJGDodlx5(+wwI`I%%Q&Ui`bz0t|D01k@j5!h|3^sE!|K2=P z8n>RoJL!O-u6T&fv`>6|4ToyuDvAW%1dmqD>RdPm+G~kR!)}wTR*NteMWM zO}(f6mpeDlQuDhI^L_Eet(UaFx$NlY5&gpY1w62Ze_yzs-?o$=`nU@+dC|`PfjQj9}0F_UnXU?2k?D&M=zLG)P zozL0oVuOOB#S@#4*$n@>S?tUU8P{-JW-t@}c47Md`8vUk6K4xKO=)qQ?Xtq(d`Y0x zr)?HeT!uGfXERO~oAh`m1H<91y*;O&{P+>;SNr;_TH15*hn0$aHQ%KpZ1){@`+ClKxC= z!-gF#LK7dQEwg{2B*nAi|MW@EJI?Sit&^B{N7iYnQR}M`-m_KGPqTRUzH^nScyjy4 zy2hND5O3nT7N-`rA{|Ff6WK;<*ha_)c6p-ui{JsQjFIk$YDsdl7SsbN9*m z>k@lp4-_8Cs#AZVuGql5Aa(L1oriv#?#(`F6ujZ?!rr%kPRxEBwdzR8+D5lxw|DQS zzS#KY(T?VnY`!Xs>Te?F=3A>i?`BwXm6vUCNf9HVw=zriU!W z8cul6`D4N=A-*VwHA66~Wz*M==NGfhCvn`iJwJbO#Ilp(tF3ufN~`(L+9cRDImLJR z$-t#o>KOP1_xZnw{PdhtyrYJT!QPnZ$=yX?8_6u>F`WO_!L)EvcY^%yWTgk}6XcB&t&cwz+h4=-gwz6z- i&05&{#lP|o|5lg0-$G&MG8q^c7(8A5T-G@yGywqaCjImP literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/book.png b/app/assets/images/emoji/book.png new file mode 100755 index 0000000000000000000000000000000000000000..8b698415c3df31dfe15d7ccf13b158404557e024 GIT binary patch literal 6050 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 DS{&UW literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bookmark_tabs.png b/app/assets/images/emoji/bookmark_tabs.png new file mode 100755 index 0000000000000000000000000000000000000000..0c4e3bf17df928c5d90fe63dc789dd30fd42c371 GIT binary patch literal 3162 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE6g^!WLn>~)oz0medR??l zSoO#;PQN)Uv#fLkGc&n7y{53WXy`s@S*Et&NEcURfM@o!M{P$pF*f%aCVbn}%su01 zqPVrh?W1h$JW0Z{54fcXdfz-0G;M=Ov&G)~qV7_?bH3c1mu|12{CAge`Lo#jzwa0S zD?Yd9xw^}f|5E*&8f!1hT;(~$lO=s+HNz{3KUWm4Jb2mO*>K_HWcBs-B`+?Nx3;#5 zpYC3?Xc4!xS&qf52@^JKbL*ALpHb+{Gp|O1W5w2rkB@4@*T+r${QUgyp5o`{PTt&{ z{`AYs%SE4_cv_adnK8$r&`B?TpU#AfTQV>EpS^M3(P@G3hsmzpVsG~sJ>}y5D5>-9 z$H&J-PfiGG>gi2mX6HMxE_U~l1q&ML3bsaWPMbgTVYB$yXE{oh>w^w3&lg2v# z>uVx6Z~STP$j{37^XJb^1rMDLJju-c|K{fA)T3RZljhD{TbsrC!+y6eJHOl!-Zv82 z*Vj$$>EYQ~`dX|-hM$wOl7FvZ#lkrUrq27O&B$@<-{0S;Kdi!~_TlxU69)`t<2j%Bw3Y4>?{*_`}LACZPD{=h@ljr&$E8Z(jf7c3^Av z^(SX$8b58C)F8TmwL>w_AoY~U!vw|&2ktkB#B`^hR@mj`(A=QL;CO`h+nbxocT;X{ z$vjl}|6lFS!pChfI|>}%-QBG&tmdQO^`XW=&><-}&w)i)RcQfp%i)>E>0NRej4CmE zDgwQ{yiy(==@e*v{X?iwtCyihqF~*H>@#7%1$N4-GAPb5&7Nk#U-tjk*VjcaFRAXV z{cWbQK=egZ^+A`Zr&Jp{C*Ips+_FA!vD?WnFE3}l-2B{on$E*pzbfY2)kZKpJol|% z#xm$wzr4QN#=x4{>?N*uGZMoC9Fjxo%6?54HF z%R$`*7dN+CNBN{oPVDONY%{1mV97aI_287JVu#!Lm&+?@^)s+JEj-QLaad`FPLiiv zr}moY?dQ}SUcP+!f}@h5yTzkSUfePKf}mICrQ8_D)=)=X`hOhEmbb-#ET6JeE*?lAEJ@!oeF8(#@6AYuBBLnxiQg7`rqxq@FYX z-_|oHB2N8CnSM{Ofs;vsea1#Hk6Z0UueXZ1Y>8QXsrvi7RK*Sn;goPi{*6aeKV&<| zFvyr$?BdZ zOH|HttT5Q15aV?BV5CmsCcg~{4xd~eIjc14aJU68OIb7J0e_LolF28$@4Cdj*S@3@ zx+L)V)k#yV_=0{`-xF{MVw(L%hLb~WrEcvW=7dEvmQOqRg}JuvIpaRRgUy_q6=Is7 zbeX&A1U)>Xq}a8;-}|HGu?~MZWykmF-Y2I2pD1n}KgsIi(NEnkm@2n^O?YXqA(+uHNPIHFmQjF$8aj>Pp3=U zBDM)v1^1n}nR)Vo#q#++{m9FUZq!f@q&?Cc6Zhow!f%5^%E?z+6$z|bPn z8b52M|9l|_4;8BkMVI*tr1Lo*Y!%J<#eHsW7}FQk%zMvdjfxLuNm}M^{PVB7qH=F4 z|4MPos8`!xb%rW7xiEUAcNyH%bU1R@nV~y%`PH1#?>9HIG;aV>+d#!_g2OEKOU<*T4a7b&}3X;a6yTqc(KMpIR(?D^PbB+u$+H@ z?J%Sd-kv;+{8kg8zS2{XZK64%z<>%i8WeyrmOkipS!G-ov32}KV!$9pNaaN9j}x$ zS1vxGz*#$32EcRFx_k%7Aod=8o#4tK&V)%58dP_PGZ=EM^IW3Qs@Wnj z{rmz&85PGpQOdz8(k&9_ISw3AaMZRITl|1OuqNQ|%=DQv?3Q21KBghMFGAwHgVwVC zABmb$o)%kHBz^p+w7~12j6waEW3rwW3P(fj9p;p?urO(?7qpDwQVQ|0+|h2fKvl|1 z-jbio#5y?oB_%zwKWi0dQXw>@n}KtJ zGv@(Tjz&MG7nh})R63S)nc3OdU0T_4q3_r=0Z~@1u5~Y3DdIg)WwE+H*(g=kMva{yhF2ZtpeuLVVeeV{2Bn z9SolE;Pv{W*-}@^|9*IIR?T--kDBAd+`gtOGp@-i?7dpf^^Rkq*n;?nt=qk(JmB9y z_0@b4?;G>?P5!lU`_jPkN}Rv1PS=+I^T~FF2~!Ol^OpSkc5yDJULAk(^H1A?nE98B z&)lh8J5xc;-|Xip_GHy1hf^;yt*VRZ+;g#X_Qr<(&1de^rv=ZbM{}4IvvGJ|-k1c=iOyl__aom$(zurds`I1&8E3Rb8sUNJ@ z*x(wHaa(7lxgzgEwV7;lwYnsD}?!U5j0&TVVHZ{6?n;6bgDUI*KjzgmG&rCt;H z3|D@-_x_e#mC}!!>*fBmy@+iN=b87ht%1SHqeWw0fqs^NNwb-iRn_E~`N_>yE~d=_ zE*qTw8?!VA1_tg`E#SN3)UBwyYz2Eo^qk)b*PCZwS)J)yATki&mKAY6NS&;rvmk^q+UpWQ9t`73TLjUs>w@ zTlMOk?XQ=?SD#BM^n58^x8F1+N9T;;v~7&848qq=UfvWDCAMbm=a}+P&Wm=o?0!r; z!ZaLh;=i(ZT$K-XbGYlEq+n@jdHc-EpQltFq<(JOHsL@2llf|^h5j5)e}8YUamU}O zo(=*k5?2&|u1IQ;ZV}oh|NrxsWTrZq|Ew#H-_!k~@n9zd0|SGntDnm{r-UW|*7?-( literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/books.png b/app/assets/images/emoji/books.png new file mode 100755 index 0000000000000000000000000000000000000000..dca06a1ad99323ebebd02ee97a07c8e12a07e307 GIT binary patch literal 6539 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEbFY2A ze)s*Kvc>(+Y?fS1RnbX2$!^vsTYM!+Xir0E-WBzE^+c-MrP{)2tiO zx0lv`{dh0@Yu*0;H}5JdEj{x8eD938MYR+H3_h9^p`4c6~=9DY^RZl750YCn0$A2!Ci3!6?bzPe$yS#tu@ z6*Yk%C0~mQ?>q0qxc~o?-v9B&m;cQy5^wqTZr>3o-BKSg% zA(4f}rT0t3M}36}Zk&hGuDCetKNWsze(jI@HhaFzQdPLF=XLPxAyM|FN7tvz-Oe`* zTh`;my;NaJgQb`P!`f2DjuvJi2E_?ZFTPitVstw&S%mX>N7O|n&Nb)H)~@{5nm(^m zt#T@-!7bUJssGcJKS*0lV!oovt~0$ab3x0YPdNgNtP#wUoU(*Eq>2|_`#K|nMd?|U z-cA;dFA`TK9BdYG^2ik|lu*n#l0N6e|0jp#e;)iBhM=b?T>fb zoQT=g&*am%Ifna8T0;xlYN@Rn6TFzOESuT3u(~-&D!6}VWq706k!&T7DcT-yg%mD4 zHt{&H)J5oMNA%0baY6sC#Q*>GUGD!&fdq%m*K2D&?dyEYoa}Mb;_J!Tcbam2W^O#w zFUhg^R?kYN?7+pITx%0KdSh(O6I4tB_GSeh?wskkj7cSWx>B`2hp;q9V?ej$^voFw zIj#b{AANT}`~S^(zD3D1QT2p3f0LC@zr6Ei-t6x(a`JDhC;KoyGl#U56@S^L*MrWe_$(^jzy8T|e+@p1ygxqou*Dj5&*%=q? zH&5Sl-saCrXYchAjJEIJ?KJ)tCcn6^f8%vt`;FzlkM!Dz^_gY2znU_2_Nphx?(jM& zx1=1o@XhGVtWHj|vo%WJ>z!9+TH3R;Fg`GF$v&3ABGj~c%1i~%9bJOmVGnBbDz5!q z>>O_`^6$RzhvKL8qC0!-7rFY+EGhJ1L=sZi(yHeOD2`AYw2rI>2vDp^R@!p`;?qB@@>>U4rZzAZqt( z-ByQw9=T-Jo-Jo>>z5pqE}z_K(7kFiPiG|;E9)f{SE;2Qhbnx3*#9UzzPG>j&wKg$ zN|rlOe|(~{Y9~!$c(j{gxq>Ux>20&k?^c|hlY4V_<%zAD!C4G5)fPUU>a8g3thUuR zOL(J_%frP|tv;LIr&rC|=`AghC^^w-#{HmKN5v*RzLwpT-Zkx(?iN>-#3qd%Mdq5z z{9XJ1&h@vge71_?MV0r@>q*ys2FF}p~02G?a05_+tIPLOM`Abk zrDug;TgQ#?8%6Ka`TibUxYSqhLcRO{ue=*erid~8FxdC{=CkG{Ni9jYuL<(>mniWr zxn`8QYtGeYTne8bm&*J1td`(?etKr~i~5;UBUrAaMSZSpaN+Aod#@U^U%6tMon*H9 zRh?-bN~H-;HQi-YJDMvdF8%g=?d84k0ga#3uQA?}UQ@ipSXQ;}+XfDS<4h8#O&kmi z?zF$19Iaq!RBXO1+b8nLxCRRXJ^2}@^4rp`Ju|x|WgJ+x zN+nV-H8^9{r$ySPc@sa0cxqcdUV7C3--GgbcO^6q+Wmd$|N3B*e*J%ayZ;`yeD3p} z@H1%G(a^)nkY_iGd98xOR>1}9*RR<+_1H{L+Q_dn@zK$gX6%@o#Tgr%E|9r(6t`;@%}r`qbC=>AThTl7A;x?w?tg6TI88$aW+5mA`807k6i>JN(g6uw)3j zdYi$x`tQlNi(kAcSZLhhe=sKY%$k1QV^>_axor{SW%&E?Snn;y%RRSuA2ZWzC=@)r z?Aoq*?o&myjeB=$tB3Del=h&Xr*FA%t?;{yN|{Bf)AVC@7*xEtu<*;OZHH6Vit_*Z zZ@IOpI%2vagO0MZgRp~)DvR^pzc-9R+-{i!-u)!WVYuM)f(!-;`8Jnl^Id+fk=lM) z^I|qz@;tRhofARMQ96N^;t5}4m``uk))4c)VY!Pt`EIg=UhjeLT-n*KduL{w&9?vX zCf&aJ_-Q--idgxX_S@MHA367kk#)f_vmSmiTL*!X?Pxk0=~^9!MUtD7Z+kowX779;Zt|e7kFTV>Jo~`YqR6vfcRjZ7n8dPkQoRym^!Gc}?>{75 z7yjy&%CqN3V|MHlsX?fa^{b@AGGC8MJe?4@8~b zd976-p-1!obr*|u#kZfF_y2e7%wpsJOJg~56%^vK?yw$M$>vzPpnSpRn=y^CUmPtO zb-p&}GB56QnRsJ^KVy9{uj3n)NCOi?$72kMnkiG1S`Xa3mfFMjWnsjI(t;M%h8aqG z&IHcRP5fCCnq6CyA!F|Q=ID)moFzZzzWy7Ly<_!iZ|3c}(Tw2@q7|%R{ly1V);np2 zF1q%$dRy}3cYW*ZbM9UH-EIB;*3XBR`RD&T-s>o^uk`i&mObyo-}VLG`E$&iH8AM& z;th>S3wiRtSz8o56O?J_ZmeTJ?%ZeT|6uiPC6+p-8NWC_Y?|{IN}#feKU9L<3kO7|;7go}H@Ez||9V`n=ND7_XVl*B;00 z`+w*A$15MzKOQNzKk}xvxa07OsMr-(QeC9;@9h8F=KNhg|4#> zEiU0P>=ba*HCP|5y_2)kPtow4#4pvOwwGDrr53N4qMXdy$*5oH#^zhnxu<4RTW;;` zE${D_9$qW)epW>Oshc-4?v=)FUAAR4LzcKgOGZPFA#Y#tx;2XOufO}9_kVc1eSfdA zzTCl&E5)b0?_MAmw?=o3*o-Z!pZyYH6W9-#N&XXh`jCl2d57oSX#vLiqYs~R_h5C&otwf ztsLh2{-yQw^(@-IKfd|x+qa>&LKuqc!xnt8xnA(@cIK>A&wqMOP)lFBujzPvg^a)4 zZ+4s7M;z0_rwLw}HT6}|+NmMI_g@$Bf9L;ZXJKUbZSV8_|Nh+R=WL3~Ikl+U!-;`W zpv}U#c-xP*ySoKlc}-N9SsjICLYQ1QcC;kiN&Fyj*js8|OM7rS$FXCE!S{*G}mUy{X#0~bA5betwS9b$9b?v<@HG9~DJ94JOMICh!z=-&+59&sv6O4O`njuZZQ&vM74RQTOA{{l^_OuVb=Yw z$Dj0>T@}6wYgmUz0k&xJ>Rs-&wiC!pG}77VF#fPEL=%Vt(|Y7xUDoT2-?0x0SeWOR?O} z;;YhWn)E<}W5MO553MdIgIt*QTt56M=>xZZdjpHZf|k$6woANv|3HJ6fi;&kTu*<& zc8iV$5lpME1oEA9X#4bpV{vQXths__n&Cf5UV7xq4?Y+`rkSfami%cd1u?e?4W zdw=zwvCF14J{Kj3RQDsb>n zSe2mjSJjH9ge^IWjE&Blx~8SL2cEKu>0;uj5^id=I$V5|B~bfdNHSOb*X{R@F!TQ{ zm#O{5Ij80$%ephV3qpK1B)dM^rrKn#AG~KH-y2@mGJ&>4hG<>xzbr4Vv&_(VYRu)v zpvItXANRO{Wn*4lvnUa#K8CG_!=UO?;W0&oC=+tFBJ*Ot+ z+`;xV)pv0sJ2az&uOG8>E1df}sflUvlts}~cQ|D|;OjVN^>3B~gI;pg{)E8IuS;UO zk_7&DuP$Yrx6^UP#0v?2PhWe+{NV{u>8MpGD`+fjXjC!~PdVkoaQtHO)tcFgPi2Hy zSi2j&`eawd_y$k$^ZfI5MgR7By$=PO{Ja7tG2QK1c!Z-%W*8}Ufj|-p`@bkfsmATXGs477IE*=qiXfu{-Lemc_VlD)wHf+xSt$dCH;_tl#1$B&=KOsnvXF zal>4%9a9!OFi7rldU1eD`dLzlm&GYoVMgoZ!^=cAK8W)9tKhqogG*Cr0#j<;(w~Y9 z|MPI#UIo4jUOKJ~(?k`wo>zA|aLL^A!n6E9cS+-=V#~dh@V41jJ%7UqCA9ADZ zi#1N(zj#C_DaK`8+k4flO*dyN{w>^4(`aM1#hBE$rGi+F@cl3zQ z;@z`(bpw}TgkS5my1KJ_3yUY2uJzsY&}z<;@4Z6yRgz4`%Wqbn(D9k{XYs<50!|Z| z7>@l4(i1pl=pvDL{KmBSs_UJXZkXD-)0LU9D*E9Z!6ps z)%x|^_Q#z+D?6@ou^6gvTwf-vkm1R_l`WU=x3>L^7xFXj)$n9YKEQZHk}*z(eY#Eh z%jm?If36EUwru7RQvdMlmx8+b!<~8iA}hag3NW30nJP1TuExFtGs|08-0yGCWV)qf zme$e|F2}MepS^3Z=yBJHl@c;CM{eAhvF^QO@+=0;r>p%Mejj4~aeRgRnb(!xwu%2a z54f-Y)xU&8k*6WK%=HE1hNI=x@A(#;?5|s3f2<+?=#k@f!n@1f2F;d^eN=QVK9}i> z`JRgN`;UoBu{S)j2+BLSbrHYpzlX>7ZL8!q*kmYX(vS`Uw{8H zw_;o=(;|(gn?JAp zc%Qe~X;Oa9C*z&hy*BUOz48CbPOBTGOYVCbN`{v|33@fCl!DF zZYIoZcC6{mKXz4yy$suKlpQb47yH6pzH`cf?SURF9#bA|y>>27^4P;>d;Uow%lvKr zzt~z_T)c48o7HetK>^=d|wiq3^X*r(LaFEcABK@jlt=5Bq+<`@Qu{udwFQ8+%x{w64Feq3Zcr zsC1f~W6Un;iR>HH9Mm^lQjmBj-FAM~1e?~!WotUQo8Fj(a|j$epz1zh%Y~eEi^5_L z9r|Q*iuLQmy)WKsCZ%*Yzq`b+t1EQ}Uwf+N0vqmKt^v3BPjC99{Q2whlds|&=UQbu zN%gWVTfRJX*&db#u6JE5J2RO+2~|FJ(|kI8KjW9Zyc%T+nhY^Y8&zJ}91M7F@an3o z$1#CVEN3?~d41)YHtku0F}rQ;-y4^1H+CjU-(COOvHYO>MRRNG+s{7ORQsMPxVz8h z^oq|etOonvMe*C&2V8ysbo!z>(ucZ^u4~N67f$aI(K@UdGg~1cIVvZb@%hJ9@8kaD zJBIuyRcUq*Iq=nH$wkpMX4wp%3ljf{xV8NKXUzSbt$+FyJSX+|ShKHF>F56S^Fe}t;prd0>t8>*xqpYa!<@ti zr&bkfFSy|nU7jY8u5!ilx#?}o@2Lxx*&bdb*tXqcum26po9%aZmnYxfS8Gx6LE+o` z`~BJL_lBKczx$olo12^2t;^qC5m%i&d9v4)+QwasVT-hURK0$4#jH!bsy$)nv#Ybz z7KZf~zBwvt^X0ANpL_Ch2iM>E%<=Bu^!tbEfBfNI@a{o$x!jKz>YF~@J7+L?_11>6 z&O7%st{$#Z@=2nHK!nvi9UR-3d$!t8`zR&SE$BTFEpk zJ1(;Aopxwxa%kk_tEQ31&g>LDbN+f@erv~MhTdmF>qEr?<98l$nDODXY~y>;^%Z=x zPwlg2RWP5-Rv%ONt25_D|_8VK}&mylbj3- zwk&6O?oj-JD`DTV#(8tsCS+B~UhpoxBCWV+M{8PkYk0W0NAg!8*3GT)I_|9ZBfrX6 z@<-0+du@C^bh@A2>}4;7iiAx+YWK5R3B;{s-QxYEtnf1*O_zIGOk_29Hlc&>3*r!wyEdJcWm8U_V7*d)>Cgv0v>N& zu=b<_bI$q6JPP5P6kjEOUi#r`w4<_T)aSjdX21WOytVCh+sKZ-01rb(Pxh?5ZyB8*QYtG$Hkvsk_tG#>W0Za zolC98Yfqg_KKtvD&htI9vJ2*#&6aMEYRK*Fn$G=AbQ6QJw3*ktSFdgg3s>j;&$|$H zqx|Wa`n~7%r&)XVrL&%$+Wl2({nf^6Y`tci?d~xcRi-xX`y{rZaPgD$X#ormQr%zk zEL$qwuuQt)*)r|x52vjE``>!c$1?{wZU>~C*wYk~zVC)WXZ+W1`x%%wIINv^gCmiF Pfq}u()z4*}Q$iB}gZM}1 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/boot.png b/app/assets/images/emoji/boot.png new file mode 100755 index 0000000000000000000000000000000000000000..58d0fdbcd0cf81be6e14ec0ae8e65edf8317c91e GIT binary patch literal 3327 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 T|0Nh07#KWV{an^LB{Ts5!{Idb literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bouquet.png b/app/assets/images/emoji/bouquet.png new file mode 100755 index 0000000000000000000000000000000000000000..ce637832e17e2e2abea71a72367ad5f9e0c176c3 GIT binary patch literal 6915 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 SB9?)Hfx*+&&t;ucLK6T~dx)9< literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bow.png b/app/assets/images/emoji/bow.png new file mode 100755 index 0000000000000000000000000000000000000000..024cb610492b005e11d41c368fdf0519c0ecba1c GIT binary patch literal 5143 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bowtie.png b/app/assets/images/emoji/bowtie.png new file mode 100755 index 0000000000000000000000000000000000000000..28ff0c787d533e2322317778b67baee8f5c441d6 GIT binary patch literal 6478 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 D6!a2G literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/boy.png b/app/assets/images/emoji/boy.png new file mode 100755 index 0000000000000000000000000000000000000000..f79f1f29807f76432586afa2304b475ee3abdb6e GIT binary patch literal 5946 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 V1G8!2Tm}XP22WQ%mvv4FO#myeV$=Wt literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bread.png b/app/assets/images/emoji/bread.png new file mode 100755 index 0000000000000000000000000000000000000000..7e7c63753d3b1f8b94a4a96569339ec15c487e88 GIT binary patch literal 6214 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bride_with_veil.png b/app/assets/images/emoji/bride_with_veil.png new file mode 100755 index 0000000000000000000000000000000000000000..dd0b0cfdad1ca4d627d0ecbff9aaaec706e08a54 GIT binary patch literal 8515 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bridge_at_night.png b/app/assets/images/emoji/bridge_at_night.png new file mode 100755 index 0000000000000000000000000000000000000000..495b06c3dfe7cb55791cf54a934d1453acf54da1 GIT binary patch literal 5137 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/broken_heart.png b/app/assets/images/emoji/broken_heart.png new file mode 100755 index 0000000000000000000000000000000000000000..a1bc850ecb4cfcdf75f8668bd0c668537a764223 GIT binary patch literal 4118 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 Sng0w73=E#GelF{r5}E*~a9Ife literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bulb.png b/app/assets/images/emoji/bulb.png new file mode 100755 index 0000000000000000000000000000000000000000..23afca1c73f07aab1a20a73c41d67114ec031970 GIT binary patch literal 4490 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 E0Q(4R4FCWD literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/bullettrain_side.png b/app/assets/images/emoji/bullettrain_side.png new file mode 100755 index 0000000000000000000000000000000000000000..8eca368458a3847fa2da6c92e0ad4c1a127bbb49 GIT binary patch literal 3842 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE6vx?69}wnp`4ZS`8k#I5k%@LSsn&q*x? zJTFVE)~sK@dE>^7W&Q#M4-d62?~}Fu*6G~NH&Ls>ZE+%}##FD0dFhSTeZ{vAd`^F4 zk!Bzf@!@5;u429wW54~sAJ6;bY=3pK%hya;x>PkSJ$>c%*Gp;}k~UiK$SwZ5VS{6X z8Ji*727#m>w@%ql-M4ps({`_lV9p;K%lACq?l;%w=gD?Ine_Xww7N6DEuZb{wX|z$ z9oL;-Wy_|jOw3xnCR$!g`nPX#k8X2F?6&=TGFkRKUta%cdY@eFhyK}_$C4ix_&ZhQ88My82CtI)(Ufpf3lIZ2tD{XSCYv^6MAz^%p8h-;ps%F5}s zcE9$`cRG5}gZ$D_#kYnvPE69DzHvjj7^BZ>TIMFL@US#>+<&XwrSxq>HhPjyigR4>U^D?%~ zoIiJI%-V%5-6jvJ`1)Q89PK)LuVK>rW`Qs4idEfrZ%y6G_gwzY;e5NFEPLNAV>M*D z_G^aFj^DNm4EBELh+qBRHFcNgu4Cz&;*M9aE@8U<`9sX{zWkD3+gQ5xolmoOkTm9z zQ)an-y?V>4CjGw$+YS0oE4;{OxA}fiuHd_uL&vct*RyIaPg$$CU{Q@EAlLY|8p zGRF@m-0(U0y=g|)(i8lLZunL9F$h@JOfpEj|3@VL@8tfCoA#X8`ueryfwu?xg$!ig z?_rvg_IAJ2+sO5{=EvtPRo#7Mt)EZSN$Yjp$}%QWGc{({x=%1QQ9K~Q({Rlt=;FLJ zA1;3XuX5I{d#ki`gF}bz_C3}DNq^4?DYSezH_!gRzx?l~^Y52G`=U85_yPB4ZWC!^ z5pB`k7Ya8htbN{Tc1vN-#jDZ@4q8X6$`2f!uFt#vtL}q`96fW{mQJbU-%+f6&^Z0v zpF_g_HXon1_sQ!o+iflNRV;3y%W`>x4pn8dU2*3ddwbd!Jx^2P8z_ z7%{T*%js;p{dW1~+_&fDEQ?xftG`{yF`GGO&JrubM02^H*UY{a-o8=D;8tF~I9a-U zQ;qnG%6VU>?6|A=;LFR)?`>;-e28CmJ1W1l^lDz_^5x6dK5v)$89$@>KHHbF^F2*+ z-~a4Le|vt??$^8QWf(PYTsn2?)aB)VbE}l5?w~4x=kH-RzxU>M zRCd{hw;dboSneIWt@fa%s%|>d|JNp;Tc>bDtqs$wtezFDBc}Ty=9}_^?UM`YY-g4J zUi;_Y+c{jCOE;~lp4Yp5ZG(K}?VbAa_H}Rms`trnl%5r~+PA7B^WgGH+aI{Us*Oo2 zyLC9_s;yn32 zt?8e^YV(TET6**8_ch-p8ZWo|`|Wf8hAlM=`*(RP+;oI{dbCY_pi%Jp8)vNhW*hH* zEG2s*@8zu9e(!sKAL~2+{Cd*vTOvtYw`{2Taa vhKx=jm$p&x(a{9Y%LE*r8m8= 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/busstop.png b/app/assets/images/emoji/busstop.png new file mode 100755 index 0000000000000000000000000000000000000000..94894847b54350bae3d3d7d53b4464c2af563d53 GIT binary patch literal 1676 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 Oz~JfX=d#Wzp$Pyv0lD)4 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cactus.png b/app/assets/images/emoji/cactus.png new file mode 100755 index 0000000000000000000000000000000000000000..5a2c3cc725e393a3a9836280a8efd8fe414906a6 GIT binary patch literal 4509 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cake.png b/app/assets/images/emoji/cake.png new file mode 100755 index 0000000000000000000000000000000000000000..efeb9b4b2145398db357367573993a03da9c30e3 GIT binary patch literal 6129 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 Q7#J8lUHx3vIVCg!0Itg5X#fBK literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/calendar.png b/app/assets/images/emoji/calendar.png new file mode 100755 index 0000000000000000000000000000000000000000..900b868bb9435bb3d410ef3ae5ee04f680c79bd9 GIT binary patch literal 2920 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 D3Xf)u literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/calling.png b/app/assets/images/emoji/calling.png new file mode 100755 index 0000000000000000000000000000000000000000..837897f261b2f2a2e9fb3d040b4cec6f501b81de GIT binary patch literal 4037 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�+kD2kmcGWq?k9tTk-*V?~r z_o~hw-5}CXB%pY6jX=)@D70L-P7MbvIL|x2ma1btky-FwAkB&LF?GR%x22juflO%^1Gx!mdp# zm)xFwE1#pn>DbA}#7C?N>W_-#8!K))u(hh#M{Lcy8lXJqPOD&|$pei=+rJ6T=452N z+5U*dI%mtfrCATJn#2{bdO1G-zt8je`}r=BfoG0|&07DTb6Hc#Z^yF#pX51wq~)7` zughDoPmy!q`B?wAN%7nLbq<}3myql_e>$tTv61gV_sP_19;8(=@3S zroTJXvOL1BPB4gFc5LBRF*P@<&f`fclR4j1%sI#DYp`52O3m5E(>G|Ip!$+Ud|NKb z85AjtoV(F+Abj2|PxpLw!PAQ>pRv4o#xbkY=jKPInb+&vloCE&$#h9S?wOp2Z|GkUdVG)NSCf#NKlTOoFmr_Kuz2O!%N`eW z5l_`V_xIIKmb`{ADdV(L>Rva`XmHe=(p=7v;Ic@9DL-?@1(VM1*RMI5bdNugkvcnL z70dIQw=y>N2LjkOuIQZfber?aN3p8v<%K3+8m4N8PkZZnG`seZZEDbqU#cOEr^1_x zTBrL39#YGh&dQ+~&MEqW#aldKh0v*>IW1ir+8zQ5v)8JAV-*u#uaUlntJUGBm_}sb zw%qOmOeGx~68}v&dw!FTn3B`+$E}OwSP#8V)jY6C=OaVm??-3D9x*-=WLj|I{U#BH zIVP-A_PWNc(LLn#Sf!AkA&PUn_ z88&{1~%F*?`kMp zTlzagLm{Mz_X_h?2ceF>MdCji*ex8mUR-S2$+&oFLy~KRgG>iQ+Xsyu^$b58{IcH~ hFx9?{pZ~vpMYGN0$+shW7#J8BJYD@<);T3K0RT5LY|Q`w literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/camel.png b/app/assets/images/emoji/camel.png new file mode 100755 index 0000000000000000000000000000000000000000..496c186ae6cec08ebd74dd6c2778e5ffea0a6a5e GIT binary patch literal 4485 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEvO)+L#kKB`&z2^CY95hTKyx`Bo+ zEvDI}qY~K{lFP&?&}8^%1Fu)z!CKGOQyAcWSDjF(?yXRR;@Jq{pje_ z|D}I#S^no0_9#p|d97Rgyw<96ZO~n>mq+mRX%Vptp56+ zTS@P?)X49M;rsBsVgVncss5@RrOvO{yg%sv7}|F3(>v0~=L`s&O?y&G@BHrxtW%e6x=AT?8NO@>B&LUQ(5*(QaK>szj_ z$;;BX8522+KX3cw`RNl`C#Z6&glxafbv1QoYWTVpH%iWN+}M(MbdIld^!vR(Pc6N_ zt0r=*wB6#E{oD4fU1ei$Zhe|JjFmAmWrD6y)KxCOc2O;_nhm=OpY8wur_Z!;+fq~g ztD#~}Vbi#Ex>}pXR0UZA893cp*Xy1rbq>vZ=UgAkWTvCL?f#~HFSpIF`~J%L^|hEC z|KIEHeKGI!wU{3lj`oHg%nrYPZ`-<+Z-iznnIiV{-_k87_|3NLF=FEiWiw$w{*S>5blGzf8IV7#hy`az-ff?YP(>vC_u`Tz3}=Z=q?j*8!{ zeEdp1>Q>aE@VITS9&WpKEGr;6;DJw~kXFM~-_J|dZ$DdKar4fm=li$q*&}>T;riOy z+jrGn`_gLHQ|UQPV9Jq31_=izg-!`BUh7`7cZyq>+7>cjmNaN?JaSTL{lW`{2fi@L z>&%QTIs9wdD&Kex#_%<3GIpn5p7r>w_Otxh%a=-GA5Usc%5}AK*ut&1`>SHbr<>si zwcQ!7aHvc!oWR1iN$1)6wIXZgPy6{g?TLNo$DRiwd<+j8mSrwjmFclOG{NV2oI?5@ zr)jDGW?C5WFq=3t&wXjK{IQL?g-qFkf>rY@d1t*kEf;zJ&rgpDXFXpx$>bNt-RnLr z{rbRD2W=0|3CVW_{G}Lnapl_Z{t!7CzyHI{ zwp)|tywMS7d_3*?rA(!U)$5isI-ICrTA86`Ki$ynz*)=ha!0dR9aRpc_`R@EIkPH4 z?&gi4*xy&Q+yDRkEYR?v#(!<(P7WI}*_IyyOD5JGR$8pR=;{Tf%YXbfMC2-Ha-Fbh zo)sBdu*3Rkv;V~Gu(SJqUwXEy^yrIKW_vR8YPr&X9q-|>;L2UM#m~X=M{sNN^CJvG znvJ5K9?_v*ljd-At2A9s`?)-NT}H%@6Ysz4{XN5?GI{0N+vTzuxAPYlDL0&-&ir)7 zmOFCn7H`AyRMnX})P)R;gjfO%4!jMy#(aQVc-KEy)6dgm1IqsQB-vjptXBJ`x$O93 zImXH17Yt=sh4<`Ct7=@S(78t{rLWtCrBA3pkU`63mz-4ozAbg%7uVm}|G-%A!=Kyg z=I8Z-;-wSG{en4|m zUS;ODN4GxZmQKBV;I-TNjUF?1h;dl4A4*|c&e3SnIQzlzlLoPJp)Q*u+FUk!aqw77 zyppc7(*OMaU0c5$RNpT1=iL%ch068rce|NaYWiO&IJxMh^t5xr^ETejoiO<=TmSK1 zz1-%=RMu^`*XR8?>+HX;bS-DnL8gP3jCOyV`*U-5?oP|Ndmm10Qk{HH>ir?&p zW_@wuiK(JL6OR6wssFh0X1s^`4e1UWGZP`j>yN{NCsb~~%(wXzcjDVkv!d(Ej?X%* z+r4V{v@6p?er%Fe=$!JxXS>=w)^$xC2Soi&?dY5As9?`_V~f>UPJ{i736e_<6pUWX zG3?)TA~`Eq=R!n0(^9*KPmNm+JXvB~@@M7a+RFa(8Yh|ABRis99`Sm*dfGjyc)R&h z)};I5{a(k8-JQX>{Zd7nyFpXluJ6b1-1V7~7V%;ipNh$)S&@Q1raZxo>TZEjzvY;( zZ?e&g2znbGFi-W*kBE-DwP7qJB?hIBT}Ah=)sejCkh>x$^w^r_19Lo@8g?WZN}A}N zy?Z53y<01JtNhx-GY+g}UD8mj*2LGwc}k_RVYXK-lf0+T`30tvRniRndJYEg%0B-i zaqjpD&&N@zo$}gqe*HZfI#1Txp2NOA%)j|y#HZuxzuFWfxSVaony1VYStM~2A}L%i#g{w6#6c|Ji%+J!bFdP(9o&tm!Ea> zy8fdwD(ZC1YDcO5&#xy=NYG#_^u0B0^5gfq`d|JQ9=+4_X|vLUrE~B8w%W~H|MD%r zlZsHYiw)z-C0!K~j4B5><_OK4d%n^~+ly^MqTLk%j$d;mXL9~XJ}~*D%5@1LTPrIs zuVSUfDf179dJ88gah+H9Ez-YY%FH&g!CBqS{Qsw?%C09(tfxHQBo`Yuf9l_zP6wtO zT=-(U)$aCtA1c-;crd--IJ9i3v7T1?8r?^8+`4amnK4c6!m|vaggz0bWu-fhJuYNA z;x5EAZ|c;kFEwU*%FXR&S+VR>dQXH6Yi+aOSO49+{xN8r&$ExaZMFY}`y;?d-)lv!|&P+&MdW zrHcIGiyGT2EM$(o=R17h0K=DW-<%92RDyi`4c4A3{Zk>ubWo$DjQxG`lPt-bo0dP< zlD$#?jH~keoU45o-fx%v{i~6my~^(!-@y+B9Lc&(=2ABtukj> zDIcFHtCYOuh09Ysj5rluA5SV&n!+sW8pO4vG??=q1UyTpfJ+u6m#@O>s(o?^z!*AZ7m3I#SUMK!w@s$2Gn@w2HQk%)+7C+D4ZHvy;S1Qe{Ten4lapz6FJXT&t%`k3; z(~Nv~H|GqOBL zH1Sh={I~6@()0uBo=tzJXy&l{?w=6fX&Rb#_RG^-^ViRLw(6L=`-x9hKOdKT{Nhxw zbB@f6nOhluWHgyS=a?s?y#6D{v^Dnc7#AjRI9UYcbu8sjY4Bys$eP2>Tl~E6`*q{q zfT+cjX0+AHf0MSZ+j{%fxfx|`VL#ra{%&9BCzBOs{v+;y)SfWk)fsD9*n@*?=I&m- zE;CK@Oph9;&gC6Fm9AZztd5n+9QTNEb#)SAYe}+lN#YS&bzrxjZ~BJMbIT_tm`|BL zy>Xh#q~r7X@06{65f|gsnRh#WE<^CYJ>@?pX^Z_{JSoHCs>u5LF{e*=t+Zco>3HMp zL!1dKc1`R|28Jo04O#7CFE>@OlUwbp}$Fe7abyI>Q z_w0Qwd#~o{vtJWG6i%|$W1XY-+V}YshDq}#Ua5^+{)6Fh!lMw`inr@lt$FZp!6RR; z15cIT`9I)&w`;F+;*Hvh59!Rzi|sSsOY|IK33@CZ=klmd#k=A9ix1QH$_B(*&sI+z#vp`(%&VYWFPs^lkUt+28ly{~x2VsOg-< zedRBymQzZ-y|2#?W-2qDCdcvGyj56a`4Rn93LkaqK3rh;aO1CXW4g{^Q9nWP`|}na z*5nK3GP}jkDaad53o3nSE1>&FaE4;f!HG*s{;x0lceit&zyqcAW^wIIcKvUypZ~f0 zAiBM&UtZqluIZ$Nga)2T9@eI2cJJTFa=y2`QT*k^$wZ$lO*x^oKkZ5@FLdY6y}>tm zLW|zkW{YiC)0U?5bB0|wbTGNGUY7HCW$Q*wA)nKQdU>%S29M|Lm$_SK@g<==zQ#}E zpo!Y4KW@RZ7~1{a)>S_+uTIOezp!=H;|v8EH=z!OV0CSu_UpWkY~5=<%uU+uyJk`A z|LV6V`1?y*+mbs?*0Wj4X*O#sw2`p7>;Q@><%t+_<1+meY=d^ z9qZ37?^jF<+3Lf5*oKMqn~ICr(cC+`Gk*8P^_hq^x7y6pY1(#0Dn{s^h0hiS~zqQ}BZRFqOUS}xf`9ZEh>(8oRHS#`AWwPDh zqvIr=@kvw>#g?iTizX-*#-0R7Vp-q@Qa>Y`~AXpPdf8Zg=BbQW|hE zsexzCE+4s%uM2#Z#x>kuqsO_^z;j}1-$%7U3L|5^-7Ch>U1|A;7r&e|4%ScV`D{>|4ONK z#oa!qm^bY`b$!L{#px{xDus7fz7C5#!)%bCGO5MI>f4J-RRsypzeY=?{;2C6V0pXc zTcyRf$$>iUckFpS_#RrUGXMC#S%!?em^LoI{hgg}zFULqtcA;XC3ueAzJEuaYhF0h zB+aiEGn9Po7#6LNUcQds_?y6_Bb*abKlaEKeB86gJJw9HDNxky(XE#K>>IQ$`P^Bq z@JZhO{eGe9()$;F7lwv6a$I2jo%#0jyLmqfRJJxV9^R!JdRS8Bbn0)j*5K~}Z?50| z{*`~;F2CRZ!y*G#@N9B<)B4$ufz!-7b`ys}BTE@@Cc`T>eWBXugc0+R^{^5YU-+MznU)Z zbr5%7DYEOWP|D7?|IHHLTu+-m?MJM67Te(;{<&@b6Jq+mY9%miT(a-6w{wF|mn)OO zhDa9!mTkYTlpeky%fqw5@h9J2?f$#JnR7{M-od*! z^<0;@=Pt|syKP{;Amn%Nyk&brt%*!NZ+EY(l&nmu#7)Qo43Us^tA zI`x(Lks$-KKtH2ILj}(Ph9k)gY%e@I?(PW4k~{h+q#^6ouU`hfza4Yd?q92S{=J6Z zyV)vh84}F64nMSK=wq0?cS`m~U+=Z6XW#$i!3q*i$r-(d?YU|yCO?-SF+MXT(aF25 z&55J_Lfc7;nM-s7oP-YuG(BcI_JG-XiSU~u$=jQr25-`d+!l7-YxnBC`&OU-^K5qh zF^TA|Cx0gY+IsKjmRnbU?>+z7ZvW@W>*v*$h92H?Y}=Oz-BYI@cer>PZr;dwmbWxO zgjL=D`@4md0lKi;=B z`T4oIKi0fea0}LabMrIfwtc%&SaC4PUaYZ6xPQ@VKl z@ZYz`&wbyvc=hgf_K636zu$kpc5m<6=zB-DtzoE{h&dbOXs=kqVd?Q8aA$0dJW zqrQGm*1a=Mdb?L_S|oHZfK$Y^HTU*~Qr^0HhUA+%I+vRs&)9S8M9HIZ1=-=%2fN9d|R^`AcEkB|d zJK}!`^xR{Uz1eft+=tm?`6UCN$NlVFj<5IryYtVb^WD62$}3F5+6p`tO6lISXH62m z8l|$x{$hK-{VxH2`yGBeS1>g-Dx|(su8?P7^!%V|v7>(djcO}nuh1Ww<@Pmpb$vY% zQ)VYhXh^XNJ$}%2%`#$V7B5rGX@h+yMCKGT2=&DLec{NK0t8@}9nt?_@$8h4$h&Kr7itUD&``*%OSV5WFx=U#q({)h9nYHMmb zD>=sI>T0cCCD4CdP)n1smbL9gu5fMb3(H!m^M7tvm6XpvWN-UTg^iu<0iXDE_J)QQ zn~%!NW&|=;`gNy7sRaG$)o*Z^kn*}NW7jK92R4^i9Bj@n7H|H2Y}S538R_`j4d2ey z-K^di@!><@{KsvMzADMH?#y82E7ag>sBpD(b8|cTE+n)(@@q36+phalu6M0-erg&N zbxN4?@P}(3pS$lrV_Dx0VjUQL7 zQ1U*Z^0o3*-#7OUYAoAws~aQ~4bBLsCp9(rA6#p$fB24N_^Ib^Kdm#hlx9mWE$KG! zZD(1np}qddr~O$ii6R@HANJok|KEyTRZ_E}qbei>U(D)z@%twFoG3OosW*z-; z%h$Yt+4b-d52IF@&gNB$9;FwjtXN?)>C3b9b9^2B9n+^inw7n;=V-Usqu%ZJ4lb9k zZ`%3!xw6~U3!0N#6xU6ja>wBve?Es?I+NOiHeT;%OWGdajSyjqFkr1=+`HG-;!+*Q z{g`U$XJ_UX_ni$3KW=C-=g`7$WhHa1Jg+_#SkmdcdT!&YS5k}yhl20^eVD#tz9H}T zy3ctzRmsLPM3W9St5heg8gk<#p7!xUR*5Q>f{&kg_WsfnPA)1)djCtUEPuSQ`exENpzxv z)!d_RSBE{=di}n`?SsrJi3@+I%~gyFKB8lv&SbXHH-Pb5hzNsuV3F)f#}6w*x*psv zxO>TUhJC)?FQMiY9n&43p3J|yPxk(eFKc{Hl(D(fXq^|`_Z%3k}U&&X62j366e>ng5`R9o5bAKbw{b-G#jL?d% zLwihBRQyh`=uB3L5L%^XofFNmU<&t_6Ur8)tAxw%e!DK=nJVGdU36*vzI~nt&d&%u zUoH75a+2#K-;7zWQY-tO2Ha9ik$9!0rENG(^008fZPR@F&rFB@R5mRv6FZz9>npm; zZ=Or`29_!FXP>Rw=U^as`-n(_uOlO$%#M>HMXfeZ?;Wo>*#GO;ObH38w0{CF{~svG z{XE|O;>W6o8h6&L>wa_j<(3u4O+GVthM34UbcI+Q{j(rMXk(SoHCHF|JzwH?{C_X6 zQs}zQ+DYC(eD?Mn_uRWYS{}?Qzg{d-IcVz0$`Sl%hfeXOPs{%c+}2Oo>@ml-dD=3` znDdPX=O1@g{PRg%-+=K|qRf2P0OgM3r;qxtn6ySJ#6hHQ9a9-&1EcF#<RrdC_2j8w{3-(Ug^h1*Qbn=T?N}1IS-vbyj`VMVn*^;2N?IWkaGM-5ZKGPVY zQ+zyw*F_$Cns}u)Rr6_V!@3odINsj)*EgrmYVO06ZidI6uy1g+efT3O+t+V@?33vBqPIF%A1O-;@_hZyEh+W>>Eu0b%nLZw zlBBmQt1NeC2%a0%l5#xgk@um89E=u|4uAj7zhM1#@rM~9My|*5A`fr;^uaw%`Cf(c zvh#60k0Q*ywrDu&Hu-C|`ZIII1Yb6pG&}u{{^5(s?TpcH`m!a2*xZdXKdPQl@tk(_ zWuici@JGgAL&nbcK2<5qH*5SH+Fr~M@o;Wl^}^L^vZL<~H<>9dYAXdqSL`#I;_~=~ z?FQB;wNr8TvshL?dwik#HOCWy9951NeG?=Xor%ocb#ochWEOUbtfHH11fFWMt>9wi zt0|ICnl*!eg1`$S^P3zF(dvwCIZGl8b_j~jI(JgLQD}#=Z+VS%8a^uOX4+}UartaZ7eA4kF^U+1jM}SGdDQn7{Q?+!=o^H+41$OT*}kg*X`IO$|s`8sItX=;)77Z z+vY1Bf-gUG5P9%OYCgk8(Zf?LEtyn0ja>Tp6#QP__$VB4$}ahs$Hyz)1%JPqKWdG) zY2WqIc*3H~LAlPq+E)oX?W+)Jowt1An+*?ExH>F6b5)>8<)lfM%~!4;rM<6Ttzr4^ zBs0$~HRWaaxk(LOr=&c%&edidS)lFI@IY}}=gfxGQ=ER27@|*XUYh#OgXPBleEWBC z#pXF0J>Qjg{5@xS2)!Uxtdo#~v-@cQ#fYscf$Zr$DD z%Gj|fEIPrg~RXGfZ-E{WUm{9gX&FU5~Me%3Hlm%X3pH9>QOi_&S`S3Hr}+`Ian{ng91;*Pcz z?a~cLS86O1IHfpa4X3Dco9c3Z;TcheDa>LDrInlqLpLt|ea86wqQtbt;;dD|tZV-M z+PSLq32T^z@~E*{ubFShjTHi_w*ce)8J zoyZX%{`e`ce)8ed>o*7*NiXyWQR0(q&`o>cz!8#D!FjKxOL61eMJjxg<@y8|+Ot1a zPh2=ZaZTUSobcy{HlOyke>~89|7cSy_mW-S6D6K;JvuWh{rtf>tlbM%TX8VE=GoXz zbDsFsd5cL?RatY*tUmem|2h9XzWIE`inM<=ejg@%++oWi?Q+nzf>-chimwirgp%`N z1GRqnd&Ue5Tnn<4&L?2P*eS3eS;c3JM-{VL1SU^Sj ze1_gLze{5C&KQacEwOyLLpu1b=gdVHmw!Hzd}CuWyWNk&@*k$AUVr>bU-xO|xhc!{ z@A~q^qk+32R#oQCcJbY1?~bsmC{ayf_Pv9AViE#%fOG4^@zeRo}Z?CtUkH;)EH z2J7k?Pf}IQ`R}klq_)PQ*~3EXT%WB=;Tj{>8UeeLj3u24GEToN`4e-UH}twUv`mVK z^s&+RoO4NmF|Pf_q%XG?oaqiycv>8(8LKV9_F6h^lg~MU6t7!x%zv9F1!c2{s90>< zxuQpcvEAkZ)11lY`Ht+raM9_i$w}EK^NaetC#h*}?DcLiQSiQN@6=!vD%imnv;4&` z@sEa|L?n*J^j)`^!CEA?v^VY4n;BoQ_-*32 z_xpF#=kEtiJ9A^0!sb}qJJ)vJyP&tGz+t!q&hM?i0bD5GwNVtil2{)9re zq)v6-Bxd&~Nn9sNOG|T-I(KSGXtu^D9fJNW)IV=m9Em$0{yo=`ZEZF06%JqF{ zaToWs=);9JA7ak$J}&+-@1|OivZnUL7k60{stuXWoO$u#n(*So?-@T7&YEMU_cvhQ zgRNEfem_^3& zt_JV*e9wgh6HdrH=T|*nJDItj?eI>H6Q}hnM2=7#3)4PB^qMD+2i_vP2)zKg!zx9j=- z^LEwqH%F>&x%MaD?bH6*|KBsrPE;y7qcPX|?m?^5lirma=js)S+9AXkQDeiRVG{LX zjd)5KyVmY=%0FI9&-K3kQbv9zbK2DSf`^e)Bs+gLEc6&WOuZk=eQYlx0%f%wXS%p-r#bC(dh4 zwzLS8KE83nG#BoF>o|C|0xIGfrhoa!#Q&5f<*mub1>Jo4_G|CmQ(al|YL)pT?^*no zO#fE?_@kLR@zn7w=j3G}yDUGhlCTzD^etG_$6{}v;AL$MSy|PfR|&1UEl=Keg$XQS z4w@@Bm)G;#n(XA;-M=&LU2@wP?NqpA%8F2{^^tF^jFvxr6uxWzEt4GfGktLetCp1*~;OG#p+j^s$V-j zK6bsOPhpl;;+Zd2cJ==|U9@7#?Cu}iw>5T2lnqn-;^sM;c493oiJUso0xJtwSTAf@ z883Bo;`1w;ew;FW6SbXRaH7VQA8v2&YPVSUKbN?|xcT(+`jw|7O_!fqsrqWFK~9)d6w~YNopt4`g`}^?H1j%;qatH zMMp12Ck0jy76z`~o!Y#X!3z9#$6L>*v00?p{Y>YvK26b2DR& zi+kf9f0bt3*j1=L)k;)-O4QODlG7irlS#k!tBw8pgJU^MlrMN03tST0vCcJOmq5e| zl_kP*p8DR$zE5b#zHKqh*W^)>IOmqNA3mO}uyb6{lYF5jLnmCJ#U$D8<*kh}hGFcU+iw*lD^?4oX9lCh+Ro)i<(E)njVFDfg!Bgzvy`7xJ**899^!OP0_M2%crSrXDn7-(-lTp`W>nlDws`qB7-FqXb zwJG3lr}zxX{uJdszrKXY{d{nK#l={e`jaermc>TFeYX9tUKOo6eTq|<&BQZk$tB5e zCfheXZnj+$ySH_ETt(yWf0vwccXiF2s{X0o&$jOsr|S~eSw7d?S!X#P-Q;@yMsM4z zIn&Nvjs22Q-03H6z-cwj_K>LFv<;n8+B5D79WQcx`R}OvA--)|*8RO(r1om@O#9C|YV!h| zwdSZy=5vsbs@oFN)0RxM%T@dQ^Ua&nJ_ZIo3)@(5@OtsL(7c~N z_tre$b$dt3-{(K??8!XxcFIZq!>-!7TN)UaT(nrgyyXIu3C9N^xx5pOU(dRDcq={r zaN_d%%@6uF^9#+-`s^WlBFM<7Np_+LgTCN}EvtmL-#Em@IY()BMCpk?ckIRff1Jx2 z^YN->%(t7-mB07p#+d)FacMQ%$#`}G$NdaO#*ADOJ{iW0lJ|E%i!@$iSG7Mbn)Bnd zoLk+(Io|qO9scDNYyQn=i@H`mQ+AQ?B%ePuyzcQa@e_on*%TjETXfOjq0#9O{+Awy zo|-)sP70BiO+M0Nbm%D`Yl6>Di?DrV{P&|OwD14_n7^a&-O?M%CO5wr%vsPo&F)s4 z9S`RPt}W|-PqE8%+-94Qo~>pPzd7@9vdzBp#oz4DGR6+r;!?wRPSD_r>p? zvtPG6)B8NWDOUNT5hL^D>kJ)u#`SwuwX z;F|iY>g+!xTSWzXtXEF5*&YAdfpOP-@tf*(;_gd>_u)#Sf)2f20YWymbyn&CZjH z711+7ZQ_HY|fw4f{)@G6Pii)YYPar1VRb`D_-*5bJI^XuZ1 z!arttbT+4Yemdfwc4ONRoT^J5o;aq%9rEW5&#@U4mS&W;a^Ys8-wo$_>7T(anM!}-1Xy2+(Kz1RFb%Pi6$ zt1ow;?ChEki5(%RpB?%^9E}CYrykOYk^j(5$ zDzAZYnDDXAs0F4Am1cjRW>R=Y{PjwkO*3rFT+i4(cKW4!b6V=jrqYT`*BvgiUKQ=& z2-efRRi^4&?dRo_C%89uh0k{XMXI@r!o3%B_VC8A{!(*t@DApEk>&N^n2eLESXq8? z%FV0NGs?f0oH}+)g2mWbTP#=Yvh0&1x0n5?o#MeRz@^*6{vpV2eAh~bDNgwzc{9|Nms5vc30P9efiT<^m|mI9$xDH_;23!Ta~{r zx=F?59_@^v^a?a@l%Sj$fyC*cfo827v zH~$oCgNQ|tkWk=~^oQw+ui2N)&xq_=b8f;JwG&I2{!H|~1x%Zl^4)@~Jido1TpN2|b$$b+xmUiLJe?6zP6d;Z?D z->0fPanH!}-jH?Lcugwv+nghAla!ndC(k_jvS!zpijqQs2Z<)fu*ioZ-{DQv- z&sM=8X8U>fKQVDkFw4+9%dlp`N&%L*1TX(x%H2T?mwui+uwweNupj0Q%t8fQn!Va0 zWNc1W{X3EQT<)l;cv&Fhw1NG;YDOh4MKUGZUF`_I?ARAc7uoVRPDp;3xKhn?{K ze&#CysRj-U18zwy`u?hWrtOpq0t`-#3@RRs9G%-7*`-#RS}`PhEk1Kz>P(LICxruo zda;^E&;L|ZKlAa%zXQcRtLu+`WwM zQ7P6rb;ojJ>Ro+*?^;$Gw*HXva4(cxwkCbLPI8arV94GInT&y`}a+& zN-YP2?E+8kM{_l&{d*nFuxD$XW%O~~XaC-IcP{BFkda;-_NqqDpj^j6%GrZ!zOG|& zwfgZn25pbkeN@li?v^fkbUipsUN!1*((xrPWv2IcUf8p;+5G)&w|NG9%6%H@uV-%L zPjxnTk=T;uwB%6Y+5GJWuWxxy>0R}tS$BQ$qvhuxZZntuQTBCvN9YZe&{h7%rt%^` z4Fsf26qYWVoabk~UqLS6=-b&H({|oa;b$ytKO48lPO&2uRL6xxe^; zj6;3p+WiHNm+uQ1MD!^rP3`N(?C>)Y%3EiX?wOi(LC_!HmcB|?(lSlBffE?s{hvg*LX zj7eWq<5}6ZW-L9;uKyG}Jr=aawxZQL#QORb#s{~`VDcU^DK({bH3Wy4z~9fu5u z#uKyMxLrABpL+DDi8+XK)~?%yExprPX9_zBhw07ET=J%5w#{5$&0XJ@Pgv)`U%B$& z?MDmROBENaxRv_TH~Yq(8uQA1l`prJsNQ?rviiZbA53+-zV5%dZSmBCWmA$?Pw5ao zxJkD~RZwWkr4}bX$L0R>UVU`U*|vRRX5)m%5)YlYy5?x`TJMfL-5pbRb>)-F|2yw4 z5w<%db?pVaelwS_8mqIhK$wS+R#C+ZZT+I7kJAl4z7b>)abH#O%h&f8Jb(MWDE9Mq&DA5YxCoF^vz5?Ht<(E+l839owMGBz-ZK&h_HARkmLGHc+S};NTf6)J zu9aP4{q54FOJ1?DiD}bq_w|@xTbpwA)%BHY);#Hc9`AIbbE5j)ryHOAGVh$ycILOe z&bI*00*f1oo`tzHrq^$sxmNpo;la1+pH~{cdfC6L>*AT2wo+-vD#pv^r@hJNWIB5H zxvlT_MiJMk4-YDDeQ#R9!XY4Xjhp8-t3rv;(X7uHLb^u%F=k{ zRoC9$Rrz7k^Rs;$R#+ve@Yvp6>Tw)xo^|h-r+nJX?AEZ}Shw*T=Z8QI z6)pi8twT*Sex48VecTqdZSS`J8{fkXi>gHDTdke9aru>i+7!;Crh%6)zU^0#o^kEg zyVBo3A1vLQ^Xs$Tt+Eo~)qKKQ8++$GTo|aaSabPW_s5NlvJf5m6{hX7WsI@{{JY|PSN_3pS3bAe^Z7PHU({mbTrnjv$6Q8VacSpNI< zr|15fer$7{}`*be9e%_QJ!*ZN=0tv%HUeZBUxpmf?eXHt)5k$Qx|DxEIyiDvD008g47$68Sgf}{m5%>mR|n$-G|#At5o)#diFbW zzQ9Ya`z^JTm!)!Hf`vdH02 zGuQR5hK4ogCU6LCsa$K4US{&nXI=b-7quI>Z>-;Xj_0R)uv3Si!rb~|o^*F-QgqVc`gfnVn=x{({VLb+ z(Bc4_8zbL=D~lqZhulnFr&GFWnQMw+U&+RnRtF_P`TZ3ljeH+MrcHUZ>~i+q3$Nbq zs!#s&G~Mt4V{cS;eFnS8908_RjO@&xf+tR1E`B>y{plP7O_f7inG(4ZKNc=3ZE*W7 zIXCZIXZ`xy`LTOdzdo~a5Iu5v3jg0k>jeUwSC|a#W~wwi`*Vi>X~RL8K$Z}OL_5hP zjb>|0|6KT2RFdKD(jdpp_{~1R_Cf=HO2d?ER!0qf*3VmOqEUI=^)~|p1B0ilpUXO@ GgeCw^T|x5z literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/candy.png b/app/assets/images/emoji/candy.png new file mode 100755 index 0000000000000000000000000000000000000000..33722f236e96f848610a7ad2536a79adb4ca8f9b GIT binary patch literal 4502 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 G5}E+Jxom#` literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/capital_abcd.png b/app/assets/images/emoji/capital_abcd.png new file mode 100755 index 0000000000000000000000000000000000000000..ffc0cba4b4362c1c3a11affb2d6534cb211525bb GIT binary patch literal 5136 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/capricorn.png b/app/assets/images/emoji/capricorn.png new file mode 100755 index 0000000000000000000000000000000000000000..f2044e78935a95143d9139503ca5efff1927603b GIT binary patch literal 4670 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 h!<>#M7H=x5&-nlV literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/car.png b/app/assets/images/emoji/car.png new file mode 100755 index 0000000000000000000000000000000000000000..d70a2f06263fa99a8553765a6bfbb8a9a86a5597 GIT binary patch literal 4278 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 R+MrPh22WQ%mvv4FO#n>g`YZqd literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/card_index.png b/app/assets/images/emoji/card_index.png new file mode 100755 index 0000000000000000000000000000000000000000..374e94e9e8466c0891b05f22af3929a016960034 GIT binary patch literal 3749 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 K=d#Wzp$PyjD%?i^ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/chart.png b/app/assets/images/emoji/chart.png new file mode 100755 index 0000000000000000000000000000000000000000..ac2c4bb093e395db35ce002e96aebf82ea362a0b GIT binary patch literal 4331 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 aY5#ra_THC{c_Iu93=E#GelF{r5}E*UT=QN4 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/chart_with_downwards_trend.png b/app/assets/images/emoji/chart_with_downwards_trend.png new file mode 100755 index 0000000000000000000000000000000000000000..65b82f04413831335404787f55d68ca342b67543 GIT binary patch literal 2910 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�PUR1~Z_N8{#n+iX3hVlJOB{%mZTs)+d1mQ9 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 P0|SGntDnm{r-UW|Er_P6 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/checkered_flag.png b/app/assets/images/emoji/checkered_flag.png new file mode 100755 index 0000000000000000000000000000000000000000..ead4a68dd37d2d8d817e8452f2430e85b9ab6211 GIT binary patch literal 1675 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rUcL7py-Ar*0NXZYvHq)Q&F zzklZ4xpjNXHV9u=%*=VE;(NJe!4g+Sse&b|6t+HU5?R7AL96hI)6y>PN0SPi9vzTZ z6!75S3{d5J7;s|YmW~TdxwnEQI?OUr?UiNUuJY~H@A|TRm6Cg zVvOR)TR!Xmdo%HV@x1BryDF1T9J6a}xwLX-Y;}3fie1GeMiTmL9i4gG_g{Un=G5-F z(GPj^E-9)^s%Yl)sbABJ`0q#i1FTvXeh4noF!espwqpFTl|mq!TZPV8F?3Nk2crUQII(E_vzoq z)ytND^Odc7<+yvg?Gy#&MePb%%#02hmt9{7HXpJTNpNOt;xD*hAMy8&iE!bCHzo7l z+>vjy-6&zdqK8fS>Ba*gl~UY#uS^(KYTrZ)@(4_L7@WG?+)k{2?lE@;1FxQ(4^EC9 z!Ge10=F~7+ZLunUnfTS`a$}R(h7AiDL`1nCoKXsI=oS#XRJuOl!R_84zhniqLjg=q zvm$PNY4dlI)tF@JYILAA)9$qKoTsO4&T;mA=J-74frS0@@IMna+ng-i_W!$Z$Hi}4 zTr>B|Je_QF#?$Ulb4g{xnl4VkLm#(r9?>c4dta2ip<(ir%9+wzBHZ0?l!wI5OPDGw z^HAWj#4eGSR?oOJf)>mTP-Npdq%!~6{F?j?4YD<@p3@=|W=ip1t8BEDXz_Du-hJnR zuioeMnyQwPjHKUDzA@RW^k=zLs%^P4Gr_)H@u`Gj8=Ll(xoWbnUQQEyz9PoOaOU(+ zJ}Xvt>nVm^yyVu@UYN|j`p6N>>+^rAUvF8IVOifhX{(@)V4)TB9nKXx{I_D=dW`3pWTcO;TrAzIQT5Evp2R!V@w5qFKy$j{9vh_F~l7 zaO64XjbkF4WfJsNyDFKIw5ELgw7Fj>HA?3L+w>po;WMAI^1fp_T2jq&=d@^P-E58@ z4DFv-|1cgFmPs{d6Is}~(ABuuiqSqnT3mSDg|;cBN?uxL+`ZTD=m}WhJY7ovY4w70 z{X%8MEr-t(@(a&-CS=;&iD9JeqMEVm{qIyCS}_D4A6O-#*36` zKY8yzf8We{#`s)zjPjD! z8O~Q%c+g$bE2h0>;~_26x|2)#_BuC*<`qv?&HG&Hcj-b!W>zy3lb%GnZ1+BQefuuy z79T@*!R9FKgUfwojW%q_crhXM!MVxbKWlcpTp8xb5z;jMo^o_~_Ob=SUBB*JTJ+Dn zN+sbl>w_Kk@&~n?d~WB?-?U=(!WGd6FFAhdS5P@*#i&)g>CUp563aNeZwAM9Dsf*s z^6&FeuK**_RXu_)J|?koajaCW$kHyqleaZ8wN9s69U7doduXPIAO*35+S?mt3 zcVCr!@LNJ!%KaM$bBm|WyxLIFz%aj5?_!$x?UfI*XLZiz)ZDJQ@r>8|bGNg_uj{SZ z|LdGmV3TjH=7JfkA86XKYVpfYmpsJC#Kn2O@a@i6`FZo?%tgI=UM#HmGDma9uczhr zs`h^K`nx_qZn1ZNN5qo-3pZ(-yub>)Y6zWDmM2(=RF=gLm{=3Tx`YgD7A|Cl_lu|2b~a9{oH3tndoOuv|k=zRPC zw*8bYV>Ht?mK@F-LJB9IalKG==((%ISpKFoEONPI{-lQ2^_A1EM=bfq^?$PwljIv~ qVcW9rHGj{jaoo_^R+Qj&0 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 a=YRQ3wWICMK_3PN1_n=8KbLh*2~7Z?4VZ5L literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cherry_blossom.png b/app/assets/images/emoji/cherry_blossom.png new file mode 100755 index 0000000000000000000000000000000000000000..e03155499902f52b0d728ba83559c07f554d9dc9 GIT binary patch literal 7174 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 RSq26M22WQ%mvv4FO#n(LoXh|K literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/chestnut.png b/app/assets/images/emoji/chestnut.png new file mode 100755 index 0000000000000000000000000000000000000000..066fb6bf6df4880c20715dc3809f1c367ff9a4d3 GIT binary patch literal 5875 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE-%B!N-`F7^dX}jlC=gog^>n@qv;>^LBIQ!!2 z?>XOJ*qz^9H~;vu+~}X4|2F#bH_R9M5X_Xf>(k8qeJ^jFzMs|OS+|H|$Hz_0;(I>+ zJpXU@WAV3t{+@Btwf7IuHGvofo^u(w#AKw!(`<1Pi z|K5~eS9JT~)Yk9!>t5~pK7ZG%4|n=S8O`H=uW7y>Q+IGV|GSuq%m1F{Zc5GzN>j5= z3f6y={c={=v(F*le7-+9@$P3d-&(!eZ&$C&*1qd!W!yfm=G^K2b$Wj;@4Bxl z>m{A7k8VpnI?~)y6ys=q>B`oeoF0|NxHqYrk{4-4%GZfBZ(N_XlJSnE`quTXLfk@8D{GV= z>o7*jzU(^jt!}!0#gh5U=KtI}-@fj3_5W}8?Y=mBAGjU=YtQw!_f5aQv-Q6HYd2#Z z*SZ{Obq96N=`K?qaqDjr{g~?bT3hhk_Dd&&4exo!T1H08duO>$PJWp+^Z4eKTQ2WC zcZU6b$>FK(_x^sYuZ_OF?O(eZOON5V?f!q??Ea?b_y6O*r#t`MyUT6VZgl;%%B7bP zFa1(3y^j9)cp{T=1KwVqj*oJtol2UuApgd< zYu0%+=i2>c<7WO|sPLdIdH1jKeV=~T@7rbYb#`^)SKHmsQnL2xTi&ray|$!k7@n^7iaN4qs#%M}+Z7vQyYrwyg|bqvLyW-P6dKPQC9Br5fM%@_T*$i^^;t z*0iZQ#*?J-o#v-v8_2-`&srbDVcZ&2pdXzUR3{sbtBmvkILzJhd+| zg_w#lN+?FWSoTc9VUIX};+^Z~k~@o+yIj2?ztD@PE2yZAYu;T6v0FN#kDdPPnD+Ff zPuMbRcKx_HKVJBTzq|d9S^2@LTJe4FKg>Hi+4yeEvfq+c)(q`etBvm_d_CfQZF5qh z?(BoP*WDjU-Y?Z%%lv^WIjiAI$Lm>^0_lkvnhtJCO{H(l*NQ9^erUUPx@k+x;bL96 z8xitdM?c@b81(+#^XYLrYQHI;ard`mEZ_6u$6R;)h`OhTQv5f6{vwiO<0?6utwP0S zcDhneXt)RWY2m5W70yvj{dzn)mtN^_k2Z8`nLK4$-U8n1o=l$`yQ&;pt=U-jFg)p* z5NvjBf_TAwr9-*t>U*C(xOAv`eh^dM?su2M4}U7xIq&OXD&uYLKJ#?6K!Qs62L_dr z$_9P64N?yIJVy)p0`6HbuompHGYxc3a=jj@ta9L!(!-+Ovzr3fUr1+P>?QLohxyt? zQ?cft2Ki3IiBmiOnC>t9bRl}45K~<7(?(_X^0R+0&THK_rFo&srBhE-9Jceu*iTk@ z>>77V@o_DWtpIb%JDoN0+a8Io7ER_YD997heItJ$c*-2JEY2p!Ktq`(@t)H`#~ybn zHWv17ka(5eaq`TmoTQY}W#9YaYu~Bbe_kR~aP^ee`$tD#et#Q1V@}$ijcxw^%v!`K1}|0k0(GxQA{@Cq_lQ5c^YhBH)x~?i->tZL@1}Zh!{X{?_qOFHzWQNeRMW|G z$9HYiVUwv(CU-`B+tzXZ*%?d0hK=|0|E~Xi6SKHpS^aZQ#RtcfSD)XN zQTIr8f>+_eJ+C zzG|^<3akFSOI1;Gl38^pvS`0jX_T4sK1!MOgvQ*<0?ctYFKl2?oT0*N!`SkE=9@kL zo;|K!|92mU!7-KU<-hlDuU>Y0Cd=Q)7bA*d=51qmD0{$oS#+;s`Li`Ywl;2g@m)G4 zgR!8ksoXT%US*17_;D|WkEV`H1w4$xwhKSSt-Z;>Go@njyv6B7%$qjEUGY63uCPf% zfa`J4?&B^uN=%KW&q^sZtG{lTyh+{Xz-j)qdva2j6(^Y;7i3uJwl&4(E(_DAIwoGG zgv{-H*VlU$D%U+)eKq=3G3)KPHIrG^Rrc1qf5@uL@-5NgRoioKtJ2IF?uQOIW$|a) zI4ewOF+A}^Ggf|@DNl%@euhPv!;QYWvOk}+!{Yz8a9C`-UNU|8=Iy#AYrjkiJ2&Sx z!|kO@f>wJk@0=)-wu)VO#~-#y_YERu^Y*VlV(j;jQ%@oRiE4)EB z-fHXO$ujf&T%*r_P1Ky3sVb<>ySd(+QR3S-=faN4rd)6K?A;S~ux+(y>ihVfVc#mP zb62^gIzDIldaPjy(5rIZVxlX*n$fl;L6B`)y0cO4tPeGvg^v0R1=m~puUcLcvpVT2 zUiK-x)}KWp`O?$6Uu`qbc!lq=Il-^A=J2vcQ)$6nNm>VgY1E3E9;|AR3un0Oagr;* zOhAY+_Ig%fIQxfC9%lYn^D8VIpDe!h{5<<)hBT9!WJ&q61p<70PV0?g*l#3q`fFsL z;Ij6-nO9k8c3nf+1;72Cvpmjz z_J1?){@+;JgiVv}^OZK<=9sr}A0xxEr3-sS7FaHJ-R*X2tHAkftO^a=?j5)#z%XHo ztTIEG1@~%e))Wpu$LqP??=Q5eZBLYySYjyP+tzkZC}#fIX%8h1J!hHMY|0#)IPYf% zQ?d|Ku*W5-jcbpd@QV6WyQW0Q*z~67I`N6$?bR5ASI$XU``)38i{-#3;hE2b4fq>6 znID9;=~VK1awRNDcZsfU+TiEboUoDWx5&Q_PrIdF>tyOpv)+~ET(GEaZMd3FL)h;Y zwuC*RLJmcbEW_GnNEr70_%oa|o{fWXO3V+vj^%x7a$CowG9J znnc;xU97*VxzL^A($O6f9Xxw8wBIl;xhS#a)}~o3Obv?zJKi_3Jm8VLJbkr;gQkkB z!n}wpzx0G2*nBhi@F!O}V~w{;!{Jlfj{=z1PIOyP$rAJ^CTY)-gtbEV)OWp(I{m8b z=*3jyk4Jyseps%OkXHHW(3MlHDpTkEdAo?SkWDfq!uaFk%$o`CUWOICOkjMxmdP_i z_3sU-FCEi9f6>SgluUkSAaPV`{*mb_YVWdb)EQDe^*lT_JTu*L=r3c&mxc>!yEz(K zOs1vxs0HQgavZ$T$dh5PA!*Xhze=B4-+MTy6$#ip-BZH6eLkbd>T6ve-OG%XSsm7k zH#V3qkDT7~vM#N6*Q17YeWe<`;TjKDq;xL%swBwb8W@xOLGP5j+V_M_+?fS*sxT+~5b?ex6_RGtZiWf_ zz2iA$J9$BPckcr4WQLXpE=8mNm9_x+N{wqk-|~S~bm_eR!XDZ(vVrbyiOWO~bKa%7FN;F~`x4eJ+k&dF3%X{}bd)bTuKZLj54ff+67mVH;- zlcV|rSbG6_=&vWI>v_~~87rgFlV=1fuR%y9; zYN$?G=XKb7%af}T**7$H6l~iRW*_`xM_4A4=+<;LN$(x2^Li#FCUb1Lu*dxhGlS;A z%Ec}$(|vNPkn4QWSN z3=eko9!ryUQl6&eo)E(>ICom9HKT!g;Qe+#?v&ZSQ+@mMsg zV(qbZLz{)2-xq!sJaFdE`+}ddJskQL%smsdqh8f-x8P#WwI)2A8N0MgUz@(<5kCF* zY>88<6PwwEDL#v4X9>5IuD*8d+=ars8j=U2zpS~MZgbpjO29{!sRur9`F~}v)vYaI zk9vdhu0E1T-Fd@=_w-b@+p*786JmbvUq5TvJP+Zj-kjIVJ{4TmI34zW^TPjqdat)U z-?l41X3b;6z*%NO0?)5W7JiZNKYiquuTW2v(VCU*5?eQf7De_I+Ns?&+IGLwV@1Fj z(Wp$3E#D-?u5J4wHEDv{rT0%1tUB*oT-~?s&;7a68+M=P*;jJ+)SdJ+tGC>aJI<6E zy;S|eAY)|6J^Mw}1=DAC-`+3Xc5tKGj31*&K|N1WU%-Mc@V&1&t{}xZ&RQCVR*5B`Tzc$>@ zAEE#1e(K%y^Y{GMo_V%M=SWajV`tbYp$}}iYgJGDSjlU3Ek5d~BZuGSo$3lqPd+E^ zRWZmi6sbLT{JERTHK7Gpi$D4`GF8s9Jt8U4YW$`^x<`02i>D&T{grY4_x(NU7S~sO z_G{Tuf2RL%x$TaR{pX|S{+{fY6o0)enzy<5oc3bRNewLP-`)1td3NxMCr{DkAp2c> z6|*ANircbST`Re&*4Eq>dFS^VT5f*sUfr^i_?i_3Mw8Pou@)?tB9fHbQ>nLf+Gl}cl><(X zxC6OMw*>J7H+AW*54F%051o1E)NgnGtw6e(&3_KY&Pmr3-h91j!tgx8J38X?Opf9_vEJO zoA@dhG8@%o%w0Hj$qhy(>*H(N-0o~PWQk%}`0S2@w}2q)y&DC7Gp^oli`87~cVO1r z%O(?Mru)>mojg&vZL$%|js6PD&31cUAKbb%{@&g?~#y=KhlFz@t zr2cr&YgOYfhb~-*SiReXt<i;c?>-qox{J--#-2dc#uKIto)9tsVoUwls zF|V@L{`9>IXD^BFGB+;d65Pyrqh;T0v1Yaed7=4=r;cTDcx+h`s>>KN?UjWxW0cj@ zl!~ZxlcPGPB!83sc%QxdR&937wfB`T4i>-P`TWdG)1Pwn^DflSxnpX(*WkK;+||>Y zqL=Nyxm0bJ!sJ+~)h*K>eDYO3`0Qd*?{&+&Vb$DvQGGMdZ0bplvaVZu&x0?>Xm9)@ z`x!~H2i#qM&VRh>*MVCb{v8N^zx%yor@g->Bb$BnG%NOL%htbLa#ORU{rd8ik%?11 zl9U#IQ)x~v%{;c_c+?5yNS%c?$5%NSPLyd{lKnYm^@6=3>vnBlac6n^(%;>im%sn} zX79(>4IX}{zb~#+V##4m*C@<+e8bIin+Kn#pcr@X-*fU0EMUrwGJ6z1TZ9662 zEj^av^N}GtINSNvg2h{wmE99PV5{@`*P9)Aa;skbs_T&#o5*{j>PoZkM8hQ=yPB>9 zx+iU$v?;RS$7WN`SBIwURQq6Y|CM6&&9Vtv`ve?Jq$m6~eCK}1YJ!cI5a+!=(kIV8 zKh2SKqNBQ~LqJE61Ka{lXl)d!iPzH$DSyZ_jqV{Lza=C=JI1_lNOPgg&ebxsLQ E0F+id`~Uy| literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/chicken.png b/app/assets/images/emoji/chicken.png new file mode 100755 index 0000000000000000000000000000000000000000..6d25c0ef4ad549d92e1e5da3bdf14c19cde2d268 GIT binary patch literal 3988 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/children_crossing.png b/app/assets/images/emoji/children_crossing.png new file mode 100755 index 0000000000000000000000000000000000000000..b0302ae625866bf2cb5f9b9e3637e9d6b6a05cba GIT binary patch literal 3460 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/chocolate_bar.png b/app/assets/images/emoji/chocolate_bar.png new file mode 100755 index 0000000000000000000000000000000000000000..c7ec19d07965810f020c25ed0ecf2160dc3c0360 GIT binary patch literal 5249 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/christmas_tree.png b/app/assets/images/emoji/christmas_tree.png new file mode 100755 index 0000000000000000000000000000000000000000..d813b9593dc12881db3146fcbace5ee62538ce82 GIT binary patch literal 4721 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 z zA1@rG4+tJG(&jqQd#7cCPeI~N_FkDQ{QB7*o-rMhQxBOGEf!@xA-ywrTBgkbUtuMM z19QCfivMkXYh-@c{N&k~XC&E^o5cqOzM##oFiYo1?k|)wHd8i)qvy{>1YREC0Dz*Pl%(8`V zZ~qIBn6;|$CC|I9dlXKp*na<6A~tiTr^OwazPQT?-~Mc@UC)xNyZtCYIax~|--xFCqzU55z{cav!$8J3NF}1r+SLElUDQ`3nRJ-BD%RE9&otFLWeAG7`C`p0YM zS|2X``k~cnL3yX?*I%my4*8bdc{Jti=b1d0PHOt}f7x$*rTkC+arX1^Y!jvh@ihj- zGVnUEGsrSr%iZ_6$q}H|B=2C|`M_!C!q?x{HWpmwi&v=G{OmdKI;Vst07jOnt^fc4 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/circus_tent.png b/app/assets/images/emoji/circus_tent.png new file mode 100755 index 0000000000000000000000000000000000000000..4af8719aa0313843fa3393e5f224d980efa9fb99 GIT binary patch literal 4683 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 Ro`HdZ!PC{xWt~$(698{pAcFt^ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/city_sunset.png b/app/assets/images/emoji/city_sunset.png new file mode 100755 index 0000000000000000000000000000000000000000..7cb178a2cc6686f8282cf53ab972e86fb1d5440a GIT binary patch literal 3841 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cl.png b/app/assets/images/emoji/cl.png new file mode 100755 index 0000000000000000000000000000000000000000..15ac67525aad1469e911760a403654cde6c5f840 GIT binary patch literal 3493 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clap.png b/app/assets/images/emoji/clap.png new file mode 100755 index 0000000000000000000000000000000000000000..d01c982a75acf2968d07cbaccd4d601e9660eadb GIT binary patch literal 7110 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 A-v9sr literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clapper.png b/app/assets/images/emoji/clapper.png new file mode 100755 index 0000000000000000000000000000000000000000..4e1dc111d76018cfd2c1986f039d930bf3a7818a GIT binary patch literal 4192 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 x6FuuCRx%g z{;S3M>fO~pd1e;j?_-XWim^XGuX1lctejMFwddL*_^>2MA66pM@w+!m?AtuMp5 zsYyYV(L0QTbAp7lbV{;xQ?8J;T(i9K<;%75&*xO7zM9;3<@>7TPxl@C_9uGjs^C(; zx$EA4{J(Eiai~{kxp2Sjw}|2=CnoBLg_g2ATrah^DSdV2{{5=gYm4tOXWVnO`Sanh zdC&33^Xq;bmaogGuKx7&WXh+fcjS8A?9V3eVc+nEu~f`~v8UnJcEuIh>vpF7xw^jY zYrNmwTUNgwH1p4^`T2DEf5r!!PU}@a*mnEfjx4LWc2#e;UcdM6^Zfrcr~bcYfoKU#q_N_TR6*`_O)WLUK)Ttaw^=diy4wi(Z0_A_pZ{8_e1!SWh`vI_iwIS>n7=%>b>fZ-P8iXRZLl|%XB=WgfC8Ds$lQ?Spe_t%byXsi)z++OP)8?oln4-QS%J8yW-+kRVrT>9$$ zpC6Ln%?tPYs?YH5E!Towe>YtWH*@=X^u6__lh@YAFRA^j`b;tVh(Ts`UypZy*mK)u zS~u?9I%qCl@YA;b%=Qdc$-hxZ@kl86PB|sf5X<|wyzgEI2Wv4dS&9h>?U2y zk{1Tq%eU$8`}^tZ`aMOjp2W+zFr?lu4QCM%G1aUn+1VD_$dJ>g?Gt!mmt3e+*)m-b z)%bntrV&{~ZD^m)+DAIyOxr!ECsUShpzQfXN zy=m3ieS1Gt?Xo-3eOrXlHH7!|W5aY|se6tcqHl8KmU|RW(sj9^$rco9SoycoZ0ceS z?ke`&4v}LIoUL{+{CePVU{Cpvx0;KWxk#VgroZDocl{Bgx=)kmcc>lhx$k(T^z5&X z{U0y(*G);Sd7l4oigTjZbylA)nOrWv>#AEr*~J}FwQpT}Sk-UVRVH_2d(5hv+}76C zIeB@TwwbYsyyp>`e6r7F@?L|PTUWT9{J*+M(ZW5ICu(*xw?fDKC@$X8z)3yFSU>Db z*N>@sxzy(8lgT!}-)!E~JVB%Avak6@@vcLUep&Vg3N8IGEAzIXv&9aEJ>`c!oiusm z{d%ctt4HSAFZz!sdFv&bNPXnXU-RT{x_MBLzH&wT)D)cnjf}a6t=&VkCp=iOMx*D@ zZ_8~PLcS)Zz0Gtoc|M`;V5@lCiE7Sd?i07R&w3G6c5B)>_mHSY7H5tf_YAdkcdf7} zer95*c5#Epe;XI3EauSMn=>P?&6>4K$D^?IZGpU~m-NTgyL1e1d8BBFai%K1Is3eL zXWjY*7j~?$w0(I&LxfG_OD3y$!8*~)GtWhto${)w4>7&)nw7ia-OlGKwRdmbdh{l2 zTKwNv;YGE_Wy?P_^4Bz!3oBNwF+H+CQ>*tAqwK*|qK6b%x-KPgH@h}o%vkQJxk0-8 zUZwhOh0J%=ZBxv{gs-{tF8qFG?{a^^u!jw+GG=VE zWw?d5US*YjExqGhV#uL&lQ`X!_MToMezCOi+e87Gd+uAV@l^c#`JAz+Of6H(;j+n0 zfnwdi4sxgGOb}PAEx%v8{ln2QB@lNr1+e`PjFII~LUiyA3 z3ukBf=M61ciART%#Rg=U_^u2;$!wy>a%z=RcB`M1_mm?U=JP5Zb*{PSczV&?gZ1o< zIcoBS3T1bp||5ef87`5#BZv)>6a!Q{rls%{khti4>nDGvL~^F;b+u4 z*+Y*LJa<2f-ms?n{od(+FYNAfS+vG$Te|ML*B*u^4)T3rzr*vjZ`GO?P6;vBM3x?8 zZH-(K@-hA5nMrQbxBh&!di^ukXTMYb$b>1Kzh8Piw)*^5dzEU@OT~>r+8QQyF2Bl5 z#V0VgYHJ<-b8J~(%(m|$u|Np)>R%qXU=34sx|EX)Avp(N2W38i;q=8G9V&^F_ zrSH5f<^_#+HqVIQ4Rl`f{NL~Q>5@kreC9btH*GpHBSn8fZ`9M*8x|T>3N@c!_QWmYq!O3yK4e zJeaX{!^UmLq?d1Rbmgn~^YQrRvd!N%vu!?BJePIi+T;(P9Z&CkQf;i>@vS^@Lj$WG zqmlX(ouHN-@;RZwGc~=kkF_S=^SkIZWm}MvifW5T=#(7xUR|z9-rRu?e!X6QKDF^A z-ougmlQec5-Ow?i?oKg*}9MPg+)+u{k|8n+*AX;BOaVbx+? zGdr<&*?Z>QANRhm?RS@}Y{{?tJiF%a>v(a-Js%En@6=7c|L@!OpVzkUo4VL_pWHk7 zV?`&=KdX|M{>_=+R^_Yld7H^=eQxdl^Hl$){KT7EjvnXmTCAF{>1nlglPp_+Nvh{_ z=GLo6UTB`GI>`EN_xpWoX6CHp_No2$-R^g0#r}O)Ckp*M|GVR}+qn~z1&k#@%?xbZ5gxVWxfv~IHu5h{bR`j0b8?C?t8U-0aO>+Gg+m?vTV9o5R*ZaA1O7ihO-H1bWv+O%q z-;}S{@Clu!*U;bT;Uf65cK@L?4b}h!wX4p7&Rl#>TN4=Lf8V-ZW?Yf>{|vM9zWKk~ zW9NQ(d+E)Dm%N7cJJQR)O+VgNx#?MPbWy`zVP)4$-Yy11uFmPDo1-MQXygQGB-pH4 zv8wIz<;go-GrKhTW=R(O`B8ZB5@T)si63Fl*yby3-k17>r&YzlgKK@brPy`1%OfAtQ$lbB!JxaMTdl&Q*x5?GtB8S8t9?buR!?)-^sKVB}M zFSjFUMQV-0-QvWM>mkdWrJ1!1@6HrXJ|HIcf=`0ANk=S1PxV^XszZxv59ZZ;+dTj7 z_38OL9MlDJt57XCr%M^)I6jW->$uQ%zSg^h-lca))PDOE@*BF)69wV z5E9w!;1sceVeQr@pL{Pr;h0d~cIeLhpJ&or1n&F(U`dT!T=LJwj&bqQxsSM1Jh~*Z zi(EUpS_BjeFV1QCBUkaDQIV_QcJB7KTNhV{w+JS+ED7K|Hgo@+$+kV3-UsA87!Li2 z%Tz0NU&ynU{}8jG?i0qDKa1~(Ihy!RF3)#1Qt3P^a4m1oN4I;KKLiR5lS-6Yj+B@k zx7IkLrSih|#Ka)S;OSH5Ca<2$B)WS-{X^Z<18=wAKUdw#;k@YBp4Tg18ps66KK13@dlbFhNkpR8BXDBS5~ILROiQQiIQ+9~*#?Q&2TT!j4`@7O zU4KJ7On0@&l)lbQ0XytA?F$o%(*L-nr&#XSYWw8$d!5-o8Wbies0MKPuKQY`8Q`Gg zc{;vf{g z)Pq8oA|nzi9nSw=5Mwf>Rn$y(wwsy6F$S-B7p(*rF$z|s+?kTo zqaC#J>2}7mJ0>d1Z~kPXq_b31q1AQCK~|oohiX1SQJSjhuOoC$vNmxiiOSpTI(G78 z2*<}WYnGd|E?L;svZ<(}Ya{Cs4ZRfZZUr@$--ee$R6jpRZB*0TQ|`3MQ`PByH^btH z4n?*8OVeH`D^>}5bS&^(wBVLTpKRRp^x8W4s6X;+S88>4doqTdO5hLj<`mOl;MG{U z@Llcd<(D<*@=sZ8IQRXATMv4c^7i!xo?O#ylIq*VSK|7I;e&WTFo5Zqedd=bPZQ==%au)>fTk>fY~rA|_r6m@Ycibd&Vd zv;AIQ1e0E6oa%acP10}fyoWXG8@;$x6!^X>G;kR-Oq1%GYq`Jf?GaBsi>e+GrHLBq zhZLJUPaHbds&=GBPy3l(e0s0SnxI8zPo}i>eahuqEVMD_Lu}I8D_>%duUMt|dtTO+ z4*&gI_a2oJJ-Z{R`q>I!7tP+F1w9A-pWl%15RBAeshZB3&GA{&H8ye2@-^AJ);-=I zZ+URFdfnk~XXZ2LT;S=x7h2xT%Cl}lcilIY`w|;#?=PwS*0gwb_KamoAyYLJjyCjr zZn-4V+H!g)w~C3GYYo?wZ3?O!nu~;PhPYKp+PBmc|1`E;V-Jek z^ZkcNs+~}Y;)$BlnfIkz())7yI_(_KhzY0&-nu!f=+hO+xcgc6Yo7V;Yi!`+XqYZ_ zW#^%U8}BSWZZ`gNGWzWw{@MTM#?Ka7m6LF9k;#cgN-J(PF^Tg2==j7pOK1*ruA&>u z($;&7oU;U7_>1|SKNw7kZ*b$1DB!H&_hmfSZ1m|K%L4A8Hz{XVX0|2Q1oarj8+Bee zT>Ss>kKKF36y9v_w%PN7DTsfaA)C|zzGUyMQtPIloN`}ol1ReIn#%=y-QPA^8ZcTZ zyeZB1%1mm^Q#iP^ifc~Xi`)CBed6Ox*m;Ec%J1Gp#_daX{=NOX-}7v~eCE!$EdJK! cZU6ZVk5;ZzWaE9sz`(%Z>FVdQ&MBb@0McRa3IG5A literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock1.png b/app/assets/images/emoji/clock1.png new file mode 100755 index 0000000000000000000000000000000000000000..9174d4e0bc027c423e65853819207b256b63a334 GIT binary patch literal 2590 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 UZ=d^*i=cL&r>mdKI;Vst0CuCr+W-In literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock10.png b/app/assets/images/emoji/clock10.png new file mode 100755 index 0000000000000000000000000000000000000000..39f590d69458d276f2132d95c23fd7b231636d6e GIT binary patch literal 2590 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rV1Pd!~6Ln`9l&dkn{x%%^1 z{pQWq)gRZr?_3{wTcz;Mkunb-rbZQBMj3}rjY4U~UrSY1iLCN!{kGmdsC9vsP}c9( z3(JI7EDf5tz#*t*2aASk3!ABkM-CI;#>Xms!uKEDUbpx4-ZSTX+}#)FnCyPNb#~2@ z+7dUvb8{-^Ro?slW3J@q+?wvz$MbHE%dvvu?$)0sbffBQnX2>F!8Jz9=diG4O`h6k%daT3j)t{?w@do5%F-Zs@oFS9486W@sp#w3z(NV?i{Z zMM1FNN=uPLJ+mZIUi>)no^P+)y@Cnqw`N=4%c?7_z0H=lu<>-wf%cdsGtRzA;;;67 zlPEr0^O=(TC&uZS55&wi>|6WuYTx!-v)5m2to|PMciYAd^VouFPFnD8DP-olseID1 zuXtWj*yATQf4}(g+n2rA`9IKM_WGjxUGnCe<|J83rrAn=oM@l+v*rAXBwodH7rf8U zcayWU+nvBzKILb8*1c^_qCSN^VPy}P4tVIRo(i0`a_e9HhEvgVQkYf0%=q!^?+JeU zIVXad%YGe@HqXmW6kYx@$=sTCZ=&+8^VM&ZnKC1u@3?U?Z?CyLj zqkO{8;cTEr8>{2=(zwH}?CXnrcvWWHU0Wu1Z+`fJW!FwEpMKH9JoU{Hht@e?tY&fA zwlf%bbY)e{%#)g#_UNVWf2*pZJjPA`XC8AWPZ||zv7uH!Uc)ozW)*w# zwImh`^6%1}9;cM?W8JhmRo2hkvi!Y0fd`Y?HyKBB&3TvmRK(C#ne%p%{{M&Oe;WM@ zAMZ}unX)ut-^2wIHM=y9-|aJYKH%%U*LUd(4UvUuSN;puR8&l^{qpc=v&sC}gxy_U zf?QflE5h#GnV@)J>$VHAXLv+CR4z=I;CWo_n8ea4n*UD3b3Al)oK?=1Qkcio$(5$D z?84$T=QNxuOBw71S9vU)S+MAVixc~!J8rh@7OtJ0lS?k1E4!$?R^-e^VVOs3R5TS_ zCDT6&H;D1wVzH3gt8qkAtW=k?SX5-;Jq17B{tG8he+lY5;@G#zd(P6ciF;Efsvq@d z(>i)Y^Jw>;L+=`N!Zmidtj&^85K!;zX*!*?C);PwS;j{?X3lWOK+^*dQ1Pzg9S~?f2iw!VBNZ7hC<@Zny<$;{hKSM&?ly{o59n2 zNlUHf>Vzeh-?sR1ut#S;%%1iz*~~UO-^c9JlmhkEX(vPs<{o0<6mgtirf6+)tgu*` zGf5(0`8IBW2_8xj7o5u&S4<8R+HvGUuIGu?9i2N5&0}akD&RVI1Gj-t^D+jTmXFB= zdk@7iCfaZ?ioap{QsF;Cpqn$eyDi20kSW)O2P!>>QV(U^En|%O5)w0eg0zHi>m!fo zj*{LlP7R?CjCGQlc9>NgIUjg2^TC6R0999(qt6b0-C5t!@y^n#B;kcg*olaRJH5lI z_Xm47Sg0yT&f87IAZ^2EB?{^jCc z?kSP6Z?f2zuuh8i%~vSwwCXcH@#WwRl@zXknUXb||1{3Kl=?$*$*osuOdAw9+unW+ zJ$_W7?$8$lOT#Z(g(rL%C04!pXq{iQX_B{yQhG$b&YU;~A)bK4%jYD0__?sWBc+(( zQOkLGjXT$Z<(Kr?%`#9}EV8t9hCYK(?Ulklxnt+%)=!i?@sMHHI*G*ZZ&xj5G=Ds0 z(y6GRohL6J$^1R{i?G9Ej^|tcsUMziIQO^m)Ml-w)Abv-B=deZXqhZ!vPAp5^-o)a zOHOMZO_o$~HGO}{^Z$Ln|6SZFMV1X2S5JM3EYIE)l*%jYqUq#*{?5&rSGN7Weo?1t zsukbmqf3SN`oCyC8Oq`y3=@^bksp?l9+oENA6&wpjC zC)8ZSbikMQs_R+vKbxvfdc9L}FmDY>xFHwvtm?xAiPTx4XFf14myomgo^ryZ@xvdx z5H*QJlRI~RA2|>nyT^_HwZ?+!o(x-T7-lS)&UEeK;p~#ahbixq7Yg?n*uLkVdd8?n zBMWucBU>YiPX-&8EIF3I`R zV&>YSsm3w!l>3DGbFPZ1&om4c?qF*C)g*n#@w!s_!qe(I4+LDj84@Au&*O6b+?Umf zNiH+fPPy3JmHIsKhUZ$|{DX~74N8iKx}{lfwj6G`dSpXfCu?QPhKk&4M|%_<*1f+q zsn^Q)wZLJPO{FCdkLDjzHhSP9c8P^kGeqdfOx2{m7J(&^hf2KL=J|G{?0?NuWLYcX zG)IHU&yby?No18q%M{lvPLIBTSeLbn3*J@SQmTk4Rp3YpFm9?zxtI|z9 zt@;kAVt-BuFRh{~I*?*=R6YpHxSo_;Ie%I4?b9dW)evmGAXXoo_ zyYqit>dU=tRi^U)FvGTOcYeH#mYcJG`P-L$^Vj|kd!CzZzpw1K{q5t{`O)9k_QmG< zpTGZk<=xwPcW)i4oG{<=;?##-s~_Kv)?2@F4afA>Q&%h$nOFiC8vFd_>CC)Ua{J1) zi=EN`jDGH3XaUk_-eBM2q{d?>JyjwKgPA(8w+9V;^#KB|qWJVI3;~Xii z6NYC39_H-&etxn2zsC!^87@dg{c2r0KYP}7i7W*l`DB-j1V+!FSG2lnS(v!FCyUhb zOjtb2jqA(h^>Za(?R$U3-#<&7CE@X*WAb{tm+jossq&X6_;^qj=L7whJH^|%i^VYpJs*HTen_ADB2rGAV9cb%iNax{lOfo5E zjox620drf6xAz%X#gxiv;UKjUvwmrZ#v-+OCve}jKz-SRi^h$?Bv!d%9f6f$4U<@;GnqK6i3h%qzb^N?TT_uH z#t>ece)xJA>-3^IRb~$kKYHYGG{wGo%V#t9t#!Xgm^OXvx;jY_(4gIv&W^zrXTtJl`~y4GNb&o;h|lo8!{?uP%lG0&zn z`pka0`HvY7GiT0;OaA{k_WJxQUM>g!^ly#1=b(E0ri0`x>8G2v$9&}oDPPy3yz2nZ zqc!RFZ*?9_@_l^!=UYqN4Lg#)?(5aQZs^)^_J!PME48l$4ij@794=~o_$(wPy605m z^?Ub9RHAbjSJ_>;a?hb9Zr#yOPpsTa0{uO$Mc&6B-hAbv!{b$(uYb&#$U5b~@9#0C zM^jTYpBH^{WfEl(cjiirQ}pd=-m~TT&Fq$^zG*u3{)d;Ey39U2szWqe!G#QNreu*(bQ!~WvmKdFcb z_D6dym6MARm8vY!`7^~+H_$cy<+(*G8n0<27KJ1vC>mTmxkxb}@aeJ8JLgKDymU_Z zAannzXj4m|Z0pg4kmyP=S>eW3N7hOw7fzi*VZk3wTNRm7IudrVvRjHY{rI?8siROd zyRu7MFvRFoUR;{>T8S4LdMum~6ZiHx9-Q3cQ^`{3#PT|pVZkr$zn`u!&l3=7Xj7}_ zU-)Qw8~^5s?iIZThJD5CuYcOym>FD{#VR|w>CaVZV>U;JqwP^|nHY}BGtW=aUGwNk zx1$`Zyxkw2XZ4l6?JpKH$@drQ>V7MpB_T0m2FG%vO&=yazLRx_`9J^*(|i|wo7QF4 zo0cTBX8tMJ)S_M)v+9hIuUI4NI@vu(XCC*jX_(N%&9FM*RQh$!BrElos&kt5G&pvw z{gQAZmbIiH?!uv)Z}*}&fzRlN}73z~FnRsrB;Ba4{wj7@#s+y8GQ!wlT6=IlIh@{d^C*|UCXnyX$en*Sv^Xsh8-AAY&{@prDza~N8dmhjqN_}i=U-?=04*~0UWnAN5g zTZVj53jbi}!_k~PN2S#N|H@1EJBb5$?HIo=x0)CyV)Bm?RqP9o$3-i;6hE67n-*4`xJbWs$kt=SK3~R8@ z#RG+Xg`4W%yndXi!O76FZjaDD?GMcXHV1^*Hh3&h_G$?|sCQ`1q(+H^NhZ7{pV^Kt zYu|UPy5!sWl9^Zjv%mfuAIe-8W!bHEIcQ@=tl0Hh7EO2km30!6TlXA&y=Nu={m389 z2G2gs^b1t#<=(gB!MCZ6raI|OI;JdL+A2H1fJ|@nf+3s{psEQE~l=*XTnbv*eh(U zKfK-i-Q#O9Bg3In-+AwpznbmN_I>ko$5|Z4Cqxz`D7`r#ETXYsx8_OBvuct`KE};^ z4lwrd%=vfdM6K}T=Rdc`1U?S!>yh%c1xghmuHBQi_Dc}!f)*ubc&t`giJ`8 zB0Oiw?1R%Ump|d-J9D6tiNRHITE@)s?61DOrrkSR!X~}&F=GDlLD1pg^F7l_bQHXr z7&QHgy5!j0)XMzdNJ$A;osn!<#PCj(;&{lIpnWtj%RJ=w{Ro{)6W;XXd+ynu6=%9N zB+ys2@DR&KW;WJODV~PMER=gDNzJ=6y)x<3*E14Q%YyqO@)}tbT6hnHzGnzvl-IJ8 zZtAaCqP9(=E_2J~JzLkPtvl8ssMMjtm639C(#A{5m+$V}pY}byDn00lVXClD%gePd z=iJeDKdKNCa?+Dy62Ab)wDw7jw{A>&u;{>{1m6Wdy+4{0MApoiXXdu`vYY?6wTC*) zR;Iqaz9i?|>qEc7pQ;K^WM2BhV@c?ug&p>f_*W{3gHs_pLK|bWgHB_VbDVmuIri zuYUIX-1qefs-+o=i<06yAj!B&5-9P!y>kqGwU)A?L5Nn-XfAPvypS`UHmd9pnh!Q(ocA$B_ zRo0qi0?9`XDL5ZLUSD1yuX@71c+o=CmE;bFN{`Dk^Ghw|#qqIq#u|7`wj ze!Mc0d&gR{A4$izE!9b#^!;UuwH?EmKLL|u7B`C>k7o?wE11O_ayj|oX6ImjIXV46 zX1`w-UYqAcpX54M*cJOm;LEb+4E_9%I>8g#|Mv9DzIi0_JmR2N-VL#;zuTg?+QjeN z5aQW$XXnOdSDD3=+&^+=EiYB`y!BGq>%ztCu74c;pOoHj$9?tMgH*`O~n!cuMbzlzjWIGP~1N9$b^({yyrM&^`4- zd=9!n8q0Vc!#BhqcQ;@E(N6lrq+3hp*=*Xrq``MCufP7XxyDyEF$;@!U6Otw)}zF9 zKt+AkL)CK^{N{XIZvOZAjh8Q3PaI6Y<^0yAbF+I*{KrbFK==4rh3 zX;Yh@sQt@?Y1^IsAFhQRl6lNnvm`eAYBQ4qoAa6bWekfA_WsRj_+8QIyTz#H^|asj zYd5|ydb5VZPHGmN4*yZ&StN=ZrXLGY!aJKIOD1-8|Qt` zc#>>(sb@#ml!62Alzr9J4KtRc{XLug@At&pj5YV?zF(O>rRWv zc)aMqCMib&x4F+&oY~Z9=EkwHUxV#ckAAFHqDV-VM)baYXH^euUv??pwW&%a@V<~y zs}p;fQK#RTCdcobQ{DLWI zOez<>?qu7{$ar#rp*KoTNQFiF=KF#Jm*pH3okg|UB&MkJwzaUI486*)B)IfU-J*mW z%BGi`mT6uJb!BU1_!P99c~i{#2f|xdB{w;=$ry3jrOdu{FJ|SF-+vl8bJt<2aC;#Z}AV~_zc`GOnZH@|A2$L zs6nnKo7#=@oMKC&mNWEAG8~Dyo0>XdqeADyxQjf0Y|i)xY}lTp80{?XE5N1hbHcnN z<<0EWou?UX%p`Y7bX|`6{bQ@|vC~{(g&jvv^i1CBdv1EDU1BAp+D{uxR*$MM5w2Mm za+O5mFE6rpZ&Lrs*UdSp=*y(`=9tagG3R%&9x>IK;41i~QoKvCdHU>=lMbE;zU>Shfo%c> zM>P+e_;RGfXugE*3y(gPGl31f`i3Iwgq`gli!4w-pZ2A2XK!Gj#=JeP9>q(JFEhX3 zVbEV_RP}0$_kj~XPdxB&aZTnr`u5bt}_uX^q;JKRN zQOUf2%AeO2k`8LeJlpuby>~Ca!Z7p3#20;a*9v=CXB2-|@XvEj?{PaPq*^I(^(jM; zR`_PqfU8_HSPW(4&gA}MGg|z_;OC5er=Qoa-T9rd=+%)UvzzUAIf#d^*y_J=53|DA zNpo!WYCL5WE1Ki@==Wve2Vx5*Nz^QU_ix^;qb!n3PTHMiNeC12IetEzS-zR2^Wxzn zKQ3se9GJ^w5V}+6#omjji`Z7Ul)ZnodAWFl&R>(yjOmhp9$%R4BU;2@bVP4|)Xufb zO%FNgZQv1(S*mgNSPkQZ9S5BBE*^fd^tAqj1|_}(i7v^{_ZL;&`e5wF8+CA!mft+} zbGP3w?H90mU*!3|TI-wQ$4B}rZA^qBKYez+yL#tj#XTmAZB_sn<^oSZU4>6}X7 zr9Rs%DJk={d;i{cZ=A1?sI^j|L7r9e=Dzh$>St!HSmHTR!EKI-)wf)g{hm9PR_yn9 zyWp#W!U>b46)7A-4hQ?iBRhmunryt=M1q%`P!bl{RKmj;-E~^<`ZK+oAD*0K&5;z_ zqrnun$4RBhOaHoq;mQ_jeFuwawt+lF Uw7-k$34j`Xp00i_>zopr0MH7|fB*mh literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock1130.png b/app/assets/images/emoji/clock1130.png new file mode 100755 index 0000000000000000000000000000000000000000..415999ec838cd611aa6d68a71f53684a3ffba11c GIT binary patch literal 2854 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock12.png b/app/assets/images/emoji/clock12.png new file mode 100755 index 0000000000000000000000000000000000000000..87b132878b701dfe1bc24596fce80766f8dbda9a GIT binary patch literal 2504 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock1230.png b/app/assets/images/emoji/clock1230.png new file mode 100755 index 0000000000000000000000000000000000000000..a6527154d1f40f0f4dadbbf0b568e8ba3bb49cd9 GIT binary patch literal 2797 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock130.png b/app/assets/images/emoji/clock130.png new file mode 100755 index 0000000000000000000000000000000000000000..df939201900046dad0404d17487d32d067707c3f GIT binary patch literal 2842 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock2.png b/app/assets/images/emoji/clock2.png new file mode 100755 index 0000000000000000000000000000000000000000..65b3b3af0e1a2833dde63772070f1f26438374c2 GIT binary patch literal 2595 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock3.png b/app/assets/images/emoji/clock3.png new file mode 100755 index 0000000000000000000000000000000000000000..3e44d64e2fb5698c8d8459643d77c517d807372d GIT binary patch literal 2492 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rV1&7LlfAr*0NXJ+R_Kb1UQ zfBd*zpRo10wZ6qGC$CvMduyhb^rdwx-kwU;G|+N07D$SBTkUz*B(phof*Q+ZHO1Wc zhL!R&w$(Z|IldHVx>y*eWG#QZmGyJ z4;|%q_a5y#UY~ySn!^QuNx3^G8XEiDCb4|Xc(VCO^e=n=ntxNdUwl~eGw$X?)9vem zvQ}()=zj9jXZ9>_m{c-KE-n9ufx~%udSt4Y!!4#?UJ-Mo)O6& zQ?YX4DZf??VKX-gTjRgSg^z1U>2j)qnru#?kE=582)qO?n-&VLH3T8A0jx z%7(om1#>6wIn5jO=2YyP7a7$%fA_B2CTdmiec~?rmeaE{9iJO7%UIZ)zhFbbikPQ7 z%vUyunltlU5|^%ibENqH@`k=krss411kT_MDd;mS+b}z*>$r^kC(hCw}% zsx+`^5z;BYxWNe2@@~-O}f10;*9UQ4acNo62zx|x%K1G+avsb ze)_d+EVU1|&i1PY8+W$p zA)ETQpSAj1-{&REF4ue>XwzhM->O?Bk*)K=`Q2HJLW*)vS?yBzjjp}htp9fR`@cto zSS#k=t#Q{rTXP_47h|x1h2r8zPHfLhbyRHrOsN0BxclOXJB9xu`Sd*x1j){gxe$ovC z#?=nJTFV}~R&fX?|5|DL->x>Xka5%hmjwzwEfVfWm=@h;Ws%5`h)~!xfu;3#Wgkak z8uMoV%dHzb8fy8??q2hmaM`A%{fbic)h&rnWDK}3FfaL7D6hY%J?&Wj?e7nM>x+ylRzK~tx_GlJsNt!E!*hXG8QsPutR#DY*xOl$~cpHeGq}_Rw2_g3ng* z*`iWhjwZ+dh~H;D`n}0bfVEf4%j|7VA;*Ut{qJD{%f&i**o2BUwobpp6nQ0W!U|PC z)~Bkc!j21^ie~=d8PMLBc(^xdc}wJkIH%)I`j4i1Us< z&5s?F7A7rv#I}d~ly_I!tQ{LzcsB00(KxY{k8zz>f z$rCRkIu;5oy`)rqOK7Ul{zsDn-to-Un$>B2qSQz6+zAWTBPBT#90k8vigPJ7&-UYL zJvT?;ET_QgRWF#*RN@(K`Ap)Go0t|S%;mT>P~}U=fcMlmBtQMRa!*_9kM+e#ZEsw$n{%a#V7E%tCEWU z0!tZ(S;4D!)rg*LXqCVG@SxYT`z~ohqTT@A_=luG) zj?3rO7xo?8AOB1D`U#OD2Az^AH$?My?{Z6)zO2HTlw?)DZL-z-@3SQ$t9sS^3g@S8 zdep0Q{kbvEwd|UvG(5hcW!2|8OG7j3pnB#qKWVxpB}YqkJFC135jwWu&(TLY_kxQR?CiPKgPbtd42BR3-jCJjE-|(5Wjmx zbw~6_1MZv@Qz&ta!D?(0fkgvd#tK ziW*g}hkOG(J_NTt;$)e1I%<#Nd9CuD%R@eSOj?;$T;((S43FyiBkWr>GKG%JP<7IJ zFSnJWcXAk$3ZuAC+#eRrIMe!4+NJ+Ch z8ccb2oK%{QIfz~;-lAmqtW&`0+3AAE9ZLLG%{*F%>fC!5oNThua(q?u`?viI>pIor S@m*n{R+*=(pUXO@geCw!`inUL literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock330.png b/app/assets/images/emoji/clock330.png new file mode 100755 index 0000000000000000000000000000000000000000..1dc9628ea2426bf2ac5cda1607e51ea571053ead GIT binary patch literal 2739 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock430.png b/app/assets/images/emoji/clock430.png new file mode 100755 index 0000000000000000000000000000000000000000..7726aaea1bc7bd44cf7b6c9c029a2026e6d7e12c GIT binary patch literal 2847 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 bpXN9C?58RgTe~DWM4fOS>*4 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock5.png b/app/assets/images/emoji/clock5.png new file mode 100755 index 0000000000000000000000000000000000000000..b010b4f8aaf6fd55b0cd1099812bf35897f76cae GIT binary patch literal 2624 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 E0Jde!>Hq)$ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock530.png b/app/assets/images/emoji/clock530.png new file mode 100755 index 0000000000000000000000000000000000000000..e08d4ad2bac10aa88703e8c08424dbf012975f40 GIT binary patch literal 2832 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rUM*F9YvLn`9l&Zy3jIbM07 zes^_s{-?g<)V>TZR^^d z%-uJu>$m+{zf)L0ETUcG(W_I;EB%+edoSmE{PMyuRmTn?QLc~`N(`+GiAgP;L8_-W zMXb^h*W0`A*OgD3^~3I)ACSL4sV?R6+qq|DtE>f!bb=gIotiidn>ch%iJS~{5>R(; z;wnBfbNc7W|M&iQE5HAj9Rr(_bG`MK@V&Wr7v?qjY<6kUGn?e(?CLtvS)rg{Lu6u? z7GtEC5j%sl^polqN4^IJ=iJ@yT37cu5&^0{R8}EZ|^MIX6PrrU106Xon?W68Xvi)@9bk$n-jb~*5=ElrK_VJ z?5cQfpL5$VB6xpit?B)3wa2EtUuX63tl*81&QFSFhJMn`uRg5fy?;}7?<&@Je@@*y zpUcnp(QNJ;$HNc*c6OaTea7gJsPbp?aFof!+!X__ilJ^->r}=vhu>| zXV=aoGcRoG4tzfU`}@~QM{mDT?dx|sEqdGT?5gQV zzjv7_T4-+l=D_!<^Z2SZE}6WxwqJRz;?#!~6Zhy&oHluv&c&*NYEs~H2Bbj!C~I-+IE!6M(n!6F^Gv^6a0_g;oC z-__h_aVAeZ`PL zm(GMsK1Qj$l?+?n8ZMP=RuhrY(USOQp&PpHsolpbUMwL87BsawEahyrC_K9B9_xY? zzZ|9rqzc`z;Kn|S{G|{>8%WFYGa$>Sl%4yS;LN1Q3&fdEjr#SdHGKa{-3lud3 z`EG4ufFZ+12*`{rDiYh>VjeNR_utHz2#{)PY+CSHMc=M-$xw!i+r zf@NiZlk!RKlEq0*y!ULmUr7Ybv1(#C%G;27YwNqvpQ=FtOC{(2+8y&SV1-hI(oq}z zLUGmb9gg2VbUTISC9iIic9;?FqjSKif@$O1Q+rh#oqL27AN^^1ow4xE%j*@c4AR2J z&ly+fNlIjdc&yPE@U}i0q0)PjTV~;&zIj}tCOoG?#P2ko*p_xGgd^C6q0dL*^ggR6 zY1)0x((iFPfsj9QKx$7$;ss2-3%=+W}c9|c|oCa)u-QoR`1;&cFbF(&BDE@ zdrpeJWxnC{=>_IDdM!?JTZbK-6Wxh-_yiH>sksJP~;^^K5~K~M6;P6|Ca z9@F3V(tXA5O>T@+jkMRqS=3%*cCh(exywK~Gz=QQmRNLs6+JkN7V|3?-{vC2OC z!!8PcqD?sW`AkWjrnyJSN53KR-^n)*Etht)>P*+tZ}3jJvSG!f=Wc8k{ypM1eXT|1 z8-mIY+GIYPA$qm`d#=~y=xu+muid+yxzH$N=d2eJHhxX6|C(fdKJY$Dk$h~t#$*qF z^a74Q{Q9voWcNPkWOm3i`+et3`f|y{&TFfyw`hOj_WH89|NjBCrpp`FD|pW;Tz2xm z!>V%TfXH9>uBhMl{UVUqXf|DXrNxR(Jge65E38OLyy|dDMxp6Y`^oEfuS*|jJ|np7 zfQqs9(Z~NL3m%G;iLdzm3F2m28$-2MIx0Fvz>$3ZBoH_j632v`wEu+{lp?xulT_)Ufp5Hxv z`o7?|Y9BKF)o4==x0cma{DBk(D*Sk{++V zb?8fZa`MTIDvP&1n6zT{e;&5f1NuY?b6d~)i@vX>-Wk0`C5Aqc`hosrnV#~ zUn`4~$E>(zuEf6GiUB7!d8h~aed5X&OYe)TtFf%-EkD{N^)ko$&R384;~ckNDth-B z6lQWBFaA}iBCz6;;Q9bH&qwWmIVD)+69}GB+t;iO0c{`Z1Q#|586b zJ(QB!%2lSzxijOzzOpsP;}{>b2Rxl}?aAUri`i#8Ywoo*lX!Evx=C`cXD>@r!tAn} zr^3b8mY?N5T7HH#`KrdL)Sz`Yzg|7HI_Ae-heKBa|2QvNB*^Q^G||C>H!cmdKI;Vst0Cn6x4FCWD literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock6.png b/app/assets/images/emoji/clock6.png new file mode 100755 index 0000000000000000000000000000000000000000..76bf8cf1854be600717d388ce7307b3f5180ae0a GIT binary patch literal 2577 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 JWt~$(696C&`mX>0 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock7.png b/app/assets/images/emoji/clock7.png new file mode 100755 index 0000000000000000000000000000000000000000..d48f645d8350f54f0e83dc24184599c363df32b6 GIT binary patch literal 2615 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock730.png b/app/assets/images/emoji/clock730.png new file mode 100755 index 0000000000000000000000000000000000000000..18aab22fd8ca24e0ef9e7743aad298c90f930ac9 GIT binary patch literal 2820 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rUMr#)R9Ln`9l&Zy3bxjOf_ z{r7WsDsRi(Hm*DJ-l9zAd1BLKhmJ`CQ5;jUl)Z#5X8q@w66U&lO_Yn{t9X$s?-qG& z30fVR!7W%HvL%4!Ww3YILX!ZFB`K3Fp1e#rUiL?>|9JBGJLTc-;l-xKrrAMCAN|k! zf4^5e|Ni^;mFH|HolU=;vTo<%>MQjA71O%ylrLYm#g@-&;8r` zySoePd9UC36XSe)^Qrxtla6M+s|qeeu`*Tdtb2&*n5Z#gjNIVxKlH}hQ2bHc4sj@~KP`uN73gL+Y&LK+#p+UI8aG-$lNb1KiLZ}EnCrlGap z*Zg`qxAuBQ!#=5*%7ubxj{5XwdpNG)loO0*_YcF&Ffdam)uk8Q+Uj(^3SJzi^Hd>ZqU2- z_0hE5*M85ESTI+Y#n7hhTi27)z8Aj(E9Wa-Gd!00`0)L@Kj)86pQc!Fd-8UheTo}q z^=BkV+pY1py)k3Y>Ch_6^O|381iSD1{$J?Erp^Da`d*cu;qdG;%Y{}s)myul>FrEv zzRu?%v8T~ddAWsM^{?*y{o!UD(T8~b*Q|;2oTp>`VKL|X+fFeIcUIqcAfvmyzxw#g z*%~?N6K&qES>tPSRg@*X#{a>#>HJ@8uRP9vs1&_Y{KL`8ys2|`D~KF8=v1`Qs${W? zt6j#5vopQF&;Qid=8ztGfB#mE+@8xG(z}u)!u7W^c)kj&}c7u{?KbM8aEM-`SH}A{Vef-gUUS*O8yQ#q(0Z>1U>L z;w}F)1y`zj&ynKU@vq5|w{X*y$sJnd(*-8{xw<=RMcO>G>&@5ivYF+c33k-ocvqDr zZ0phL)vnL3FHk!8Ra_+`>jH=1@=f{f$$?UA)sH`VnH+LC`PkX<3BbST2*M&T*oN8kwW+b}eNQcL- zs_RT1MfKq`1T1G6Fh~bq2;flIz18*KyK0I`O+>^4 z$r7HTN9*|Qg}8(q)hxW4{-CMzim zzl519XE&!P!6j)3-BvJeg=1V7M%XDdAPJ<+K$l-m(de$wh@<4xInA zO~PE<)8OT^-talw@9y=T#-Uj>ULxK@?}DbafyvA!7dXG zy5{N4ogl>!(W)P*BbYL=@(bg1hHZDN(){LfmrWK745;H{5jW6uAe0@ntJfW&uJG!()niU1fFR!oAQVM*TkQ?VwFB+pS7pB&&QkREVE`RhFv&ry8ChJBALfLTYZYe&pvSxh;o|qY_70) zZ|7#08Hv;0?A{h;qkO4oegAFYmI#OATFOR}e2XV6?7FM7sJmxdOZ{~53y}&(SRQZt zD1Cm3$-SN5>dUs=q<@`@n;-ve zb}eO?AwU23;}_;`FH_rGX8M?QY&dfK%jRAlH8;idoN4)L#VQgBJ!eic?VG{yb7p)` zUFC{ZQ#V8;T-@_?hR*9BTETbv^cr|e9vUzU@2q(8Ib;&U)Lwrh}g#YYR6LBJoi>q3hWVU zIP>G+k9Tdq)P#C2Fg`F`-`dy0%H&giXoAtw8@`U6fq}d93`-^s*t0=>tk2` z&e}9b`G5uQJ$VuKJF@d!c{&!SA6%sJr%7VYL#CDTeQ|pGLuSj?>h1db=bM(9p>NkJ zra7%WEpLC_D(suQNp4Y^V$lKhtolj&i{?#K7PjBI_7k^=hu5d#yXU`~-a8U?Y=v4| zq}j@lc`B!L_&3kec{*!8Pv$I(!@uW9$lf;oqBvzc!#2IW!oTKyl3zH($vjyiWbt%g z?Wr3kvzJBA$}}=5Y@9qNaz;hYk1L;6KfQTHyV32bq36UG54ECZZdxL&azwN#WMT4j zU0b!aa~`uS|8jEqmg_mmkxbikedB7ciEsROHLT>C(Qyq=5ug5lb$lPhuLZQfQf=rt zXd$X%dA5Ddwd4P5Ki#}}M?FS!>XQKP&(6C1-(9XDT$s7 z%`L8Tq?TEpcGWZZ_xwzG@%vuggQh|Zo=Q^jq2C=I?OT?juKiM_(QlS2<4fm*?I9YM z*u(@Db}?w`70q-!w(J?-S=l)fn@ctP4{&q8Th=1=cy`vlNjE~nZ+aQ)nglhfo>`-) zXkEr3aJ2ml)8ih4Qyi0L-n?#X?>{%jM^sla>Gq_Q+o~)q8ms~C6Xx#Un6YE!GW%`T z`?hY=^OW7H;?l__cz|Cb<4L4~?lY^&XC}<@kv}WvH~+-B1xZPq2V*~rNN;;9Q1FnO zB}IVirwo@}(!-Q3%G)e2#or8_*mE*4iG`yQO+qVpu4#O|_|BpIl9Y#*XwePv2?i$G%hP)@Ydxf6 zY?k}3%nUtqZG()V?Af(J1^GNXQdmUSd$)ut9o%65hX0h~e0k33O}=-poSCz6%K3#{ z7Vg2{IrP?;vrQ9hpJ47+@U5&f@vg1j6{E-xH@EI*WdERX=|*P4Q&8*H)78&qol`;+ E0C`e2&j0`b literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock8.png b/app/assets/images/emoji/clock8.png new file mode 100755 index 0000000000000000000000000000000000000000..74c770d891c5434631f6c00f289636ad8d501fae GIT binary patch literal 2603 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rV1pFCY0Ln`9l&dkh_`6_v= ze)DGQ*ITdO`#SMQ$L4LGn>afk$EYZ3a57$E(GXP4)8um1>eN~qx>PJmbfr_kR-vHZ ztSde>t_oQ-VF6=Mmj%-lH3w&IuCtC!&TlL_A0O$HycZal@7l|9b}yb9 z*?vUl(YdGZcK_MV9v;H}C*^W}dyLav0!Vh1r>m~Fqe`y_BJu7eK zVv~UEgZ)XDlf6$&R?148v+>V~>X-X__Eh=&y~T2;GXL-TsB32yUvz4)dF-<0OyUi` z9Um?^%$>?r=%&kKSd;UJpFMt2&JGRX+g7{d-`5o0oyB{{gZ+BNbmthg6KU^K`Kxu` zJd86Feqz*KF+IDaKv_Cs`?AkR-(BBcTIb6C?#}H$zYBb=Wix6{S;($=XeF|&-$vZx zn5$GoVYaKw?~2*WJscUoN$^|WJnMOGQ_s^icjErO%Khpi zomY_5eSiD@>|}Lr3nyOw$AVXmUYogu)7XKh{$i-`1dfje=RYgXo?vJ$cYpuWdEbML zMIO{v-Mpr{yw@j}-!xWc-2TsGPc>)v zj}8HA#;q=kXPB|v-EzIursOl1{KiI^$-A!#w|}21x?$z&mz}LGFBi_6J7Yz_q`GcOg39&XZ0U~uECYS6KJ_mI`>;<*!Rqu*8k z|2gUMhSjJ3XLRt{rHigjIlV5FO)BeWXrIp7HIIs|I3Ct-S-olr^TBtO-cAxJH+*D<0Uq>zK5Pr?QY`iOQ2AzB4;mHc8BO zUNlj~F-vQTXrJ1Y@Q}yquEtWkSk1ep3b}b!aq>x) zhwMZ)u>=|(@y#^K@Yvxs?T~}+UFL6dr6eyot!ng|pu=VNimgM)JF5fff@v+nSbSC|)C9_4$jNhRZM#Rq10 z%OgdvPBi&uFIdAXi8G0J`Sf^{7H=bwBfT*RKdC@?1Y-1mUP5|&{bx?g)5_nB~4}WyX?#E*p=J47yh~OEz=fzHrmte#wOZNmW~mnr#>El)bojOLX7s=#^^T zx>7etg~jGZK|P|BfFxTD<@2oYxGM zrb3m)FVz38c_{R?BQ~dt`O=#c%P-9Kh*{X1%rntqLT5v8gICdut!=-nUW+|S?+~jt z7j`(JQ@uZ7e`CAipCd0-jST-NMHZMSCafxIyix;2aM52{{6*@ULr0%`IB~KY@Eq-_ z&JT>0t&m*KmwRiPmT#Pb-i`NZ4Ou1ko;TTjsQ9DNc}ag|jEQj6mu}X(t9LXf-Z|sE z{d}3i)b9+%T>{L)GZjsuD!PSv{=9vYzr$tS6y}6Q3sufl@BZYgwR(nvF9Y*o%guAI zxSr2naQll^uFNx)@V@W1X*?5KF7Y+E$Sz#9)O%hA@7kwkY!_$hb97f7ER50;%D7)B zIa8qhM~n9KUv<-L4hsAd=Vq9h7R7v8{O`J@g{HSVjeK?|mltppTsZwiazSgOt%A zSXHjP`>Zdm+eYh(JB z#J0|aCSjw??(=k(c|O^EXTd!&&N<4C(%gl@8z-psb4oOYIIFu)n!(zvCbr-cww_Ct!uc!Cx*+fj@03KU!MO zd(~NMQy0@eN#zua;T9v7)b$=aI5{}$Rt4Bxz4|s(_TGf_zTL-yH7iw4o>)CO%1QP# z@3Qmi>{l!zgH$?%l!LdpO=cI$p0(-0${Nh*F# zJXYT_mu&E`Sh{0*kod)20s<*gg&~`Md|de8Xs?bNhmhku<ADH&2 z;K;@u-exhZMU2sHtma(}(%S_(7hF8aonf|i?u%d-4#nWq9fdA4d;QeicJzf1=);T3K0RZfZzvTb` literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock830.png b/app/assets/images/emoji/clock830.png new file mode 100755 index 0000000000000000000000000000000000000000..ec3e382dd4c421a1ff56dd65aff742ce04539501 GIT binary patch literal 2847 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock9.png b/app/assets/images/emoji/clock9.png new file mode 100755 index 0000000000000000000000000000000000000000..f009d14ac114dba4a03ea41dc6b0b9539a7620ac GIT binary patch literal 2486 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rV1wVp1HAr*0NXGZ44T$Mdm zU;a)AgG!rxJX|$aOsv+SDaQWg>tM4bIOfx z(BcotjSpC;qv;e7q~X=TCdhKu>40L{oFj#Mj-7sUJJ#At%5v6Dxnt`ppZtFrbMxB9 zefR(Vd;a6j&S$fKxp`l|t6N?DzIw^~3(oEGcHcf6x0J1ZQE-3ZZ@HVdtIN5)^*U9r z*h;_sUiI!%{-<9yArBAq@w~`bq2ejf?`G${XYJq5C!WV!J8WP4&^nY|Dlhusn#F4B z{O9)AR@9z{E3XgOmNRALy>t7_t>f?A+B-KoGy`mxZ z$IerM_nu0qB+TUq(OJKxjtpBoA9c%Jb1z4O)FEsH-&8gIFLme(S3hlpO`q|;Y6 za#~N9OfxY1cw^%8fBp^cPPL_9`)hC{>d&0CrnPStO!_qSk+a>xiDzAQ98h4cpZDkH z$t#l>->vw%=fci(+1DJ!O?uxRF&x-)&TrD=l1o8ff*GcoTb?e!ugkA&O1OD& z)m^#o-m%tJk!K56Rf@E4(Ca&=;@Od?RAJDq;GlG3@tybeow+JNW z|H!Pm=*_(0_rYtoZ+|G9(_Sz^Z*RDv!G-6-23|LqQwoah^*2p6Q_H{q_rY)dDRcBW$T#_diSE1vR88Ex4xQ$JI^J8+a~fiPE>4S*Si~-__0-$d**WTpkGL(*MJMBT%_q3k z3SLi}wYGQB=GY~Smy7;ib6v4;ny12izRX<~y^hL_x!d!8z6j1{ve>u#QrLMDMJ)r3 z=+C+lF_IwyNwccLZq509fGeT=?aIUMGXx^Vf`j(4cCXb@JoID5;j7(unF>B^1mG{Dmr%G~rHcUM1%CK#Mw7TS< z6%rmwG3tJf{h>El<}|V`75x0H>&GdVqyB9Sc~44@a-JyKE8HHj+DeThHDE(<=k6!( zt_A9FdQ_&wM!c4|VbEH#aleek#MinE+oU4D+-*}7a^Ml3%Tce~b9Yihue6~>_ssLm zhDRhjwNjo1^7x!MFRbUW^(cecW!?u4dQo9{eg#uXXCyeTIO3OZ@0x?NxU?Um-1=p?kuyN`8fx@+oVjE zH1X-}|8G_1HnFp4)<t|>Srr_ONcOvIQLijgwNuHPw{Q~@jrUg{#rLII(K%j>9@yQ#%$U8 znLH8E49m2_E8dvjjy$h%^~AInXP4gQcAO?S>*tK(p1+xYbcMK886+1?k6(Mw_=4Dy zsftzx2RDf)Lyry?D~DX@{P-l`{t&VEcy9-?kC9^tO{&uM#&i_ANBo= z|9tfmxKh(<9U}w;qmHDak-iOu8 zLSO$hi~F^5ncU@13xa+fbWZA$knZ@b_k4!L&Mzq{;!GEh?p<-l=w!&2`VXBG&!7Lm z#r!4Us6sKri&Pea;|if)3=U||d3fsP!Q)EHXQ*s@AwG4<3ZP~3mUJks5!7-@`S7Xr{fc+_nZ{^mTF$gs$IOQ za9zet=^d+&#UGY3yVN&Z#PiXT9dT1DRxX-kGX3Wq#X~L1#qMtL!D=(bP9JPp%G}V* zpw01MWlqkH%l~!r7qiQ+=D5@$Z!UVG!LQ9kP)*{YR-n)kb*1;ddne1Np5nRgq5nMI zOi1n(M}Y6rnAqyzvu5YpPFbmoTAYlX=ui^pD0uyf&m#LzAJ1so`phxd>~i6h#1z-b z8y*XD$gL`{+H-H)sqSBIuXO@dC znY1nFpH?4JOvQ&lU(vi6i-{9ADvH(^T@CP@tmHREBJ<17oddPU NJYD@<);T3K0RRGKfJ*=X literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clock930.png b/app/assets/images/emoji/clock930.png new file mode 100755 index 0000000000000000000000000000000000000000..fd35221428f989a438afbf433275d118ae79cc16 GIT binary patch literal 2746 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/closed_lock_with_key.png b/app/assets/images/emoji/closed_lock_with_key.png new file mode 100755 index 0000000000000000000000000000000000000000..e6fdf6cb2040e18f7faf326d6211c23753485422 GIT binary patch literal 5701 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 Q1_lNOPgg&ebxsLQ02orMU;qFB literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/closed_umbrella.png b/app/assets/images/emoji/closed_umbrella.png new file mode 100755 index 0000000000000000000000000000000000000000..0b719f086b152fd4d7f619038bf47ec404cc66ac GIT binary patch literal 3868 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/clubs.png b/app/assets/images/emoji/clubs.png new file mode 100755 index 0000000000000000000000000000000000000000..bfab5365695d72bd44f75802700818e8a76b4c4a GIT binary patch literal 1685 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rUcF`h1tAr)~)Z{&8wUKKt5 zF#T@zbHB7>K5B-?Oy))@uU()du_7v(MVFO(slL1ycUaf90A1HxT}xRxIsOK@M6+~z z+!u(y#V;g~qq|HbXLV4gu19a}M&DJcS;zLAPkDCE_WPPT&Yc@1jjkIvt~+eoUi{v! z`v0~1wR^waRloHAy4AS^!CO{Vx12JPI-`~bojh}u;ncz7zLv+AtP68y$eOCEe%4y@ z?;3Zu3x-ecoZepl|Co2VPhNz%p$G38+0gpTe{0R>|2->vzT)=A2(8eL5Gj|_miIp2 z&^50+9=WM`{n>k0?mzeV=FTip{%^Z|>3L?&O=6syDUzI;4onLbN6FnvvB-dO~ zk=d;1806tI?fKMbK0$#E_aqi;8HDm#e(`$v{ncBKlPwzqMPEp$hkx_$Yzw`$w88Lg zplHTRl~(;orZqFzm#S`x)bxuGZDh%4xM218L+Us2>nve;%}TwqH8vD|Ti&3wc$MNN z4MCOnVhJ~R72Cs?OzW#Zvi@!1i6y6N4!IkB<&JQ;EU<*d>*3a|e-!dIT+Y+4KKIw| z@wN*0?HQ3iC!Q&4ywAGd+n!UnRrlITnN9Z>{}b(hR{3kvrs-^o7RsN=S3!Cn>?EU4jbZG{kgGY%7bggViIocm?mH8!Hd-;7C-)!D^?=O9DL8Oxl_HoLn6Mat8+P2pwWirjfYeyZC#rhu8Ii}kNdF|GR^ zG4b<}RrkKfBwxC?^`EBi@w*e`Hz^1-ICz!rRA;+j{`lFO)k~LXI(VJlRrajsXyVPO z9<|a-N}b}lTBfYf*>(4+AJ1<|SqIClGQ~^TbBfPwV!U*~^RwOSsLy7Jz=~PdPbFLK~zE-tVfh$uFH~Set9Su5A6>pXSNmcAnC&J@>okb#k|V^^NPBmrwd6 z5@t5HjdOvuKB8NChXJ-?B*Sv`6Ey2*0iC+|6Qn=h)XY+m~84GfbuZ`XhEa%NHI zi4gC0+cjcpZ@&4&%)e~bxnxs_&CMNr6I{Qp=9zG4OZ%fp;f&}{wztn(X`YfYe6#T6 zw>@kpUwTY>5%pfYaJ`<#r(wRZ>B|@3|E*`j{QB= z-@DRqUGmO5UlsN~(vQ-bzO!@DQ7PwunWa-t8ZA{>6p(%MsMD#-yWp0*_nx?Q+C?fJrknPO}uBoSj7(K$=G#1BitG&*3h0S5zEA51mdK II;Vst0CNo_cK`qY literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cn.png b/app/assets/images/emoji/cn.png new file mode 100755 index 0000000000000000000000000000000000000000..b30dcc53df9fc194f69e1e058b079ce69e08ccdc GIT binary patch literal 3634 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/coffee.png b/app/assets/images/emoji/coffee.png new file mode 100755 index 0000000000000000000000000000000000000000..57e1adcb04ac2d22d05664a54aebb718b83801a9 GIT binary patch literal 4306 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/computer.png b/app/assets/images/emoji/computer.png new file mode 100755 index 0000000000000000000000000000000000000000..d4d2687627e06cfbf8aaf405ccd239d397053106 GIT binary patch literal 1705 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/confounded.png b/app/assets/images/emoji/confounded.png new file mode 100755 index 0000000000000000000000000000000000000000..762c3766abc2276eed29f9a3727b5ba9813f36c4 GIT binary patch literal 5857 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 VP2!f|K?Vi}22WQ%mvv4FO#tD{)U5yj literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/congratulations.png b/app/assets/images/emoji/congratulations.png new file mode 100755 index 0000000000000000000000000000000000000000..dcbb1d229ed4f80e4a60d9228e81f3f3a5c7b647 GIT binary patch literal 4883 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 wzbz1doX(T~WmU`eJzopr0DA>3oB#j- literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/construction.png b/app/assets/images/emoji/construction.png new file mode 100755 index 0000000000000000000000000000000000000000..523e9f10bf6cfdb64715cea6e6044e0affde5ed2 GIT binary patch literal 3700 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/construction_worker.png b/app/assets/images/emoji/construction_worker.png new file mode 100755 index 0000000000000000000000000000000000000000..4d6486047864e90e06df51f298ba06094ed6e0c6 GIT binary patch literal 6193 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 ajEjn=w4ajVtY=_gVDNPHb6Mw<&;$UErTN+b literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/convenience_store.png b/app/assets/images/emoji/convenience_store.png new file mode 100755 index 0000000000000000000000000000000000000000..671696c2dfdbd8970c72696f49a35bbc178ee3a9 GIT binary patch literal 4073 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 WGkleGE<3)`JHIYJc(bY4 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cop.png b/app/assets/images/emoji/cop.png new file mode 100755 index 0000000000000000000000000000000000000000..43a5a84f821473f9a2b3eb5700e2a503a080d339 GIT binary patch literal 7141 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/copyright.png b/app/assets/images/emoji/copyright.png new file mode 100755 index 0000000000000000000000000000000000000000..38493c33fcaf95787fffd6d6f1630c93513f5a71 GIT binary patch literal 1579 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rVHpFCY0Lo)8Yof+*DTrP9m zpM`7rmoE%^i>ek}n08NdZLVd&txMB>ByF0mdb_zo+U`xN;p_}vyO+%T)fatN%?zHb zYOJ?gHHl{yuUfHpn#ydUvw8{%S2j)Pk?8ai{j&e?i=BV`y>B;v*wAwSdFSW9we|b& zTP}ZIucvUrE$4{apZAM2l6v2C$-dnoBi(!V?T-6}_GRW~UjIu?Hfblhc3sA>GHzo+RtRlJ>nMIs`AHjFe)D0`M^O# z?iGjB9xr{r#XM3@vI{E;6fCCCl-=cUGJN;$V$F?JVzFPJH`!PV7Lt zSI2Gk_7<-LqJQQpy^(90wUEKRI6uv=c<+DTSGB9!UwwT4HTSF5=9Dj=vIC6e7Cm5` zb>4)T?|)~{pz_j`{9vsT1c?P9S`{&e=!m-XBk_cOjO zF=J-?UYGHHwawx=)252QV~9DwcYd(#O1JELjCa~?8xGoLHm<8aAL+Mv=QFztU(C)r zelMN(+$!kI_XvaUD*m=}*4JRdYuw-K9uGavZzA5C z<#@Gr&h?4af!p}47@AF)M1OYN%$t8{N_X^)wSwzb)f%L)dfUgVlRS6(%Y{nQC6AgZ zd^?tQ`SMkX?{n{LzPGt4Rfqqi){7#k#Hp8)*cDdm@JDsF zDe`*5pf$5{PGR&U%iyz~#u3XL4IB=yU$d!;QR^JE882xei zfiDfE_fOj%kX4R2W)RQ+mxK3t zjl5r-)l>TZ%KJ6>fD^=93*?T1P>id(H4!xVx7K$yYT+^KA z_N00ZQ`Wnzw@qsDn_snWSfrdSzj+_)!;6A$hLxMyHaL_stGfL=nfb)|?zvT8todJF zsy&!j?`6hOwrckCT~nWz^(Y(>lub}jn|gtnb7O18$(1I;N4_5^-zB~4`JUXphfE#J z53a6Id9Ugm(J8_xvE}ZDsK1QMbw9=j%3ZzAq50-Q+2=1J6aP=_$t&6?wc*SvpAD;S zM$dip(!f45wCS&T==q{u-)1*W<6RoQc?GM^VGqtVtC?@fS5`@#<@SxA`oVUGi}jh) z5m!Wh-E}DrW45?5Gdyo%*6L?H&$d~utn-+BQMaIjL&7N4;H@=p4VX$xafs&$PK+ue9J6WG6*!! z*czap7RtkQM_uru;>tJcnQFA;LyrmS)PFx!@l?5SvwY;$=}K!JWvMo-lsL@)K)Y_y z!QLN@T^o7MUu8NLw{p=QdG;EuX)_M9Z`h&JCT+mlq-?S50PiLVvE%Go&!&~!P<+3< zI8NE?X|2VHJ{wj4N0WanvC;HjJL9tYw}-0UQ_4>*GgOefSyHLK$*ghGrpudL1J8=5 zE)NunJngXZQ}LzrrwaBZ*DSZNM)qrLog(YxeqoA83cK$@< zS4q}Y{lae(;Y)!pMZZMc%sW~2|8SDBS(5TK<$tVgZGY9Zzk2QkRRW%_elF{r5}E)2 Cv-&as literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/corn.png b/app/assets/images/emoji/corn.png new file mode 100755 index 0000000000000000000000000000000000000000..fe5d8b1287e27fc852b48262327547aa0a951d74 GIT binary patch literal 6694 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 n`g|e literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/couple.png b/app/assets/images/emoji/couple.png new file mode 100755 index 0000000000000000000000000000000000000000..9e51f40e16ecfaa96b25c2fa4854d6e9935fb1b8 GIT binary patch literal 7615 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/couple_with_heart.png b/app/assets/images/emoji/couple_with_heart.png new file mode 100755 index 0000000000000000000000000000000000000000..c503f40a931aa79cad2f9f5f72d768fe2ed53561 GIT binary patch literal 7370 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEPRc{C~=5*2q|sxz3iLwVx8aBsh3xa=UY_A&Hq}lI!yOWljMaz4}YHfbuOzrXGKJ*WDWmf%BsW0U_oKmO+pSU&x;ywG9mDH|fSf30C!Dk7_(WFa`ci|6Q} zy-|10en0Q_UrUMe^M}OJqyVRS&jNYg2{IfEO-hZcoc$^>{aYERVdN&5)f&jftHG)ytF(k^W$_Y+M+$;F z_gz{OzjdkF;rYSK=goNZj@R>3x2DmCGSR)SuQ!LCd3*EpKiO)@shU|2lCJ!WpX#3X zob^Ly=^<;Q7w^Rbbx!IgKQ(N>xVg$ysc)vN^^N~O{Ep3B*tqUUf!pu*HmClpUYR{j zL}j^Y-VyXN5c2hPM3MX>Z>HyR~20Z-2aE zc0TufuJxmx54OE?xx&i4_mZ$gzQegJrp1O`thNWz_aq;3v|6?7+{52~3CYE(()Rz% z_i`NwTH?#bs= zzxyve#ckG(zoI@8i+Y_hdl@EK#b_&;a#de+oA>jKugw?p`$}p*PPsol_kU5(ucCw| z`!^k~*|zpoOm!^#7RsKzI>M|#qdo4Q z*rN9~eRDkxEV~7JmoRZeIT&Q{e%!|S=9kg>pO3!_$JEL4{@_g5%rV>UAEb;##^P8L7e=l|vnA3apc-GRr4_IR|oUS*R z_-+i#UL(Givscl8Yq7~a1ICZcJ;HO!eJ8)_I68Iemr1EltK<1^FAq3eT4L6mwWMLe z40gdS7EXan{C$IC_O|qj&pZEu*FKhi!x!`W9+`)YQm*SX8m?$_){W?8m|~INlc#oK zn&1r8Sa}Q1{hYt{8dr9W=#Mkfk9l8m30U=I zdK~?!W#D%4vPR&d_Dctn?g$Ghf-{< zmlnL}s#j$G6Yyw)1XECv2q&k5alFm7TR+`?SgdE-Rs5Qzg-<-L;5dtb36}{6*V@}# zxSHM6UN6v9`Q^%+Fwc}pgHcLQc0uU%tbfTK?R-uX!h9NzKA4*v$NVKGfOlTQ`F)0L z_gR8lTv)!_%vErE$e_9@z@Xlk%a*WA1;@x_tpX1zQkvlQM z>`V3;UeNt0?r?pM-?!ac_HAD7l(R=rBK}oV*j)ZHR}Q}q0U57ar8EWC?lpdLExn+$ z-L2dwKtnz<8!x1Ai>dO8b5&TsGV4 zRK51WZ-?tGeZQIb9FMl$JS3tU6xH81f$z)jbGm+vYyljn_;(#SK7D?vA19RcU=Q&zPKE z=4B#x$Nl4rsXJI=<|M?pZ!u!v_N|C~WP5~>?_v|T1JlBP59+>@G`nBbFnz_6>0z5S z@qBt<=B|RnmvftP%Xqyeu~=INJ3cphQ8T-xVM5kH9Rr7zKTj*EI37y)uOQ90X8FeC z83{H@~cuRW0)^APEL!HVsL&EpHRJm!mV|GQE*!2uSsS~M2Pc}&&D&t{l zz9f~;#1(R!LG<^e{Xb5YZ=7RSl<}!0rGzi~T(XyCh+*@oD1&3x9VPqTTw&VC#jpF| zu9!fhiR&!Rb+-h- zyzEKQjRm`}1ahv*iQUp$y!@O>n80E~zkthU&5}(RR~(q_VAe3F(V_Y30@KgmZ(Fc; zHs5emZcTf0wA;l(D9FAgLNiIkQYZd7V?jdiGwtd7riOa|{yAIw{&`XPT@&)}e`Bcs zf4Exmj`bB&%Xkd|wtGDB{}Kfjtcu>JoVc)EA-pAM_NgY0Gv^G=w#>J+W~=;l@vY6? zub$s*w$HBG>uEM!dHVSYvqTCHEv>$H`c;W$HAnuDM2`o|yAJTBAL5^1#5uIjhA<7|`Uf4RRm->G=c ze5dfg*fzVLG98PVr|G?OzbgN;ParK&&E@5W$&$U>W;tXVG%&3Uxpj48cl*1_3Dxy~ z7I(_I_0V{b>YpFlJ5fF?Y>CZ|9u)J zSNA5fjOX3aeIK@R1ZppmbXN(StkM~nJ5Bt1;X&8u1u^*}D zlVxVwPP#l>{c?yVSG(JV*p0XP&;3y~b!3cL{zh1alT%m7E9GZ?k-ER(nfG&RdD_=U zxoMX@;ku>&+*8}ly7%KZ%^dAxXH04~O}NI%Cgh@qFGk}>H$T4d@9LYIrsr-P5mC>p)3utlX#bq# zi;t#0(O7s`$E*2AaqkqBt_vN^&#mN^xD{5C%8c&ei*eskHkk82O{D(srQQ^Nh#OXIEuHXpCZYWX{s z9VIafE1>`d_nX?bAE{ztqyPowokpU4ISv z|7B&NMsK90mRwym@ra-Wqtz6Vw<;eG9X-0kY;s!fT=rv{vOizXsX7+D^RxWFX@C85 z5=+*dWZr)7*oSj-|NPo*-)Q?!N$V`fYSD!opZwk=B79hOru&cQZ{D^{TI}leWa*N+ z9Y56?`aeJCv)^UA-?LZhs@ZdiDSzd6^sbFx)ckLrOy-pYwTN>Y_kUHNQ}b%}&ZpAx zsTJ2R_nbBT@lv*Y!j;)`zOFkhQK~H=FMo8WSY~+s>_-=t%;oY3E^t~Lw|HLs>1WsH zG97rRefo-;bj;6_{ToFhw(VeXxPO4nfN@)Kp9CA*YM!H4KJeeP-eJ3EcEF*$|9&1G zyM^|0-t{RtTHe!@d2x|nvsAE;fallw{u9^NTOYJ#T+k47?AHqJzdUQAcn=t^K4nvM zzq#h;=lRLP0eWdCGH(<-+Szlau}rh0`N-?9U)U5hI~FuL>A9<|+*n^B)8HTfJJ+u8 zpkd73z~ZOr`cJ>6&p-d*1&=WQ-4k7tj?Q3M`ghaI)(EB|zJ1ev>wRa9=1^JiR5wGg zJnLZTN}JX#yKi>>S^oOUjL(nUQ=i;B`|0}h2M7N$EWG-J*<0e-i`8!)EZm)^!n$tP zzcjt-%Tjj5Tb{nkUY~Y2@c5&K&WU@!r0HIhm@>I9?)l2S73>!6OkAyUX1a~B`*$?5 z%h%1wn)O)OJoj<(cmLvdSMR5s-v3|PI&bH+!-qUSwaQ)Kx~%5V)xfMRIpx6gqU#?! z>SVN~_BSql$GYrD+y>=OKD*zpbDV7XDr81lQ{v6d(Ek);}wLN1gxo_x$HK^Az9xym&UnUGB+;(7zg~7wspOi!Oaaxs|a?!Q#NFKbjzJnM||^@&NYjc;3;&Awr#Org+XhCiJJ zJ+2%4?RGbpzP^^w!yvgV?e&(Rh|NW;ufv{tJZAIU%$PYlvb*fGXOyngS+;)@jd}|+ zohDhh9AL~m{y;{NJ>BYNC)RhMHLMmu7V|7R$NTz5$fH2-pr-52a>Koj4J*WwWVVSUZ909ykxjbojjWW~^u~Qb zf|oi})_uM+Z|{xy_Ma?nZPEDtP0=bPW6z<-=XpOzKcDYyH(9Ze(JZ8{UZJpMve>zw z^(7VJ(Sc6dgEk;++mI#W{l@D*93)V7vCv7Z!1&( zBr8nsrR&a?oij7*cBZQTTK9JM&wu^fi?9EU-ue3Z|8r}<+nrgr_xFeTD@z?78S8lV zEXh4)m^n#k_mme2JxPmJxbBrxTygHE633(GQ9OqyiRe$M?@W5uCy{1F%*u5$-01R8Dt5NrGER@CB`dFQD*j%V zxBt6h-LG!lT)R{Jb>AfH>)u$t>8j~$pC^^_+RryZ_o-9g_c_&KHxEoYrhBCHNVV{u z+ehZjeOt8Jb?dz)f!zYEm)0^kvIGUTbVW9ppZI$I-io@%J3>t5wS$#ZxF1NTv_`5e zEqqe_wD0a73y&g7q8YV>?=fzErIw=Q;-Cx6bVxZ@W8EOYsry+2HvRFo#p zu=se}V;1}73(wB@%&j`SaH|{39EUD-&IF-jFCNGiecm?fOy0bNDVlAz%Ow{pZB4$X zTW)jM`+#urN&nSb)iz&MyXw`f(O2WNNTuz$_SK(W3cf;fROZwix)@V-k~OB{*K3RQ zxyP11-!spD?`M%WkB*+Uc>U#S$EFnq{u53%ZnKzQ8SgZ~ZH0bEcAUCo^79D<&HQJ0Hf zH)j3axu>Cao{nn%RPn>4I?e=KC&zX?2 zck@>nSz5Ypy|zHobxY0tqJOjg|JfD2<7Hp_o@v|E7NyCqPGXuXu%m*`ToUy8k>u<-N$2N9vIwyHwXn=omy_Z7 zsI@RCH+Eb3s-o8pI~{hK`>XL7xGm+9a{w$~@uJNw(Yn{m`CUpug@)O*LLL*}23O21piqaiYRv#49z$AAXb z9C=2ztBM&SoPCN)dRBGH)A#?^aa*3Y(mXmuI``w|soQ=;mc6w+(D!`VMYqXio91)P zn`_z09GIoOUMVelbH2RHSs$HKsVCBP%@$vbGPE+hy6>BD<+q!HdAELvFtg|^yS!XL zKA7dUl3M#mGlq~%LB{viPc8O+IKKbjku!7jzgKO3DShwA6P?}sJsX~GWIkfpvhY<| zZF>pZl9D?0cY$%PHe2J>{3TB8{n>fppG7v$Ee#=cmCP=MKTqfHnL97L?gYQw9XB=& zp`-?@mCNn2KfC=Zs+2mSA+lU%-?aQc7gcLMcHK|d7M5O9b<2E8=gOI8%Wqm6onhvG zn^>iGFv`~cb#7Df=VuK|avp~s+s|)WXJlkq{PG%e@*A01DND|7?38pnzHG+KxsSc4 z&p&_t|A!<$yPCPzBh=Fh_Z|7Uzf9-btnaxg+e&TNm&xp{bq!np?zm(03yZB)-BF7V z<}5w+=8nwnZ~aB@o2wLGWph)Wd?p9PJFw2=ilb%5|Y^hEprcht5;lH=PS5t>I2S|liYuZKAO1q zYrWJwnd-C2)%$DDIj~>pDKGZ!_(hn7r(g^d{D!8hABtM^_q{(dBGohH~iK)ko%|Wx@||6XoUSE()2cDlV~Uq1u*d z2PASbGQ*Ow}sEwGEMlkbAmMTf{w^!Uca0`tPZ;RF~O0#VOxj zi=*(7$D$caE~>1%wjn!gYQ&Zz)|pBAr&2tG+_y$4_sxE>v`yKVwJ)xSt@rBQkX6Av zq2E5=Iiqm?+?#|oS6v>Sh}dxIjCOs%q4}S*4;4z^+hh{3l65)tV(wjNiP0FGNyMmKqETbXSCvZ`J8 zxnON{=#;Se#=4VQW~+t&D4uXB?ON_W|KW4z{ZBTYlsz*csnMZXcw3n3zQe0~ocs2D zsGaosf5?_+y|Y8k8|AF?vAi&2jlr(!Ig_iupE#wuP-~i3ijibV0>j5B!&~c9wgqTR z;C61x;q&PbZVhU4TIia8>+qML=G&o5w+E;!Hd%G~LDy25)#B@)Ofgm8RQqJ*lY6!N z|5Dc2{k^NM-E8YSasRW>BOBfKd~Hsyb+325Huv)6*O5N;3tb|3IGLEG<_Kl<6dakf zENa&l_GqmMXT?vnL~db=@lxWPbUtx&tIp4FF0G8m(mWWmMe;Hy{wZPmU3~PD`5d?W zmHe;&EOh^Fd)uOGgXC$?o!4*hK6O5K({fkx`=__dYG;HCzV7=wcXyiEp3i6Z{?*pd zeYLRm?~Ryi>l1EOlqSfW_P3t&I$!?bqib?~F?pS(Z3e=NrXE@<*m&yEA{{H?w3_4m zMhp8F@}Bte^rBz!gZ*~LKYdN#@af6fC%F!a@e5|?Z%gh>+Sp#Sa{4~AYOh+ISJ6i{ zxt_NF!rs33tz4Yyn%cAM?^ovRcyLymKlc12XZ9DeFP5iQ+Alq7`{cKm$Zee|-2Yhn z9{a_+em)XhdHj03^ChhfB@-1lY+G!4fQ|8IPQ$jnV%b*t>CD@5IxkOAxBsEA^p4uK zeQ(!_Oi`0gImsfq$;?~t%mn_;BE_s#U8!QC)i3qGZC;jd`uca+{C~Gs-~YiFmzZPs zX%D~8TD#X@M44A>tdHh`7AF&DMCg9eYi8xPWr)`kyiX4=@}pJI38zbz-{F4WEXv1$;rw zOiFAMC#Y~;So!n~|C;CP@}vBIG}q?rEo%z$_ewn%_-gLs&+)Gh+EsrRNPNj@7E>y- zmAQ1@z9)<&$qmkSb%slQp6AX#kg(;TbVHJzi;P>ehr&tm$SLthy8awE@cY`n!k=H8 z%lr2zE#3dJ_VnFV!R%G1Qj2VVniaR~Y&f7XB}`|Bf(uKssb`Mixq@@<*FG+Ot#iCC z=;Mp&--G35Je`$&y5`$9#y5$}|B5x=-#IZvGpqc((1v-T^LNeI!+Aogo0Dlx&;`-` z3``FKBnxiNs9NVzziztf)=ORwL=6*`<=@>@w6H%%(>+2%AkCSn{)eLehrA694UPs; z9l@_x|7f~zKPP(M#K)!KM`DWRJbQKf+V=eSzBhQ?=eqrW^wj2e|NWGczl0-yZ@jN4 z;=W*uc>WYe&B~ABGNvqkf-QjRO)(GAE_R!ZSzC@%o z&bRbfV)0BFrCEO-ElqH!aW>R&cK_pT;Lv=j>1fhXp%o1c;X;hJ*zToFIjA9Dp}BJ- zQ#@vv!f$clrR2AY!^G~%RWmh?(I?>`%TB=d|m?{t+V zfnGw^Qn~^Td(TWiFZ)2|h~^T$OCmX?d3;LESy>?&2edA9O=lInWU?``*x{ z=d{zEY6?Q6O|(k)zZO&E zPpJAzm12{}S<}Kf)&-tco5^)`q30!)WrooQ+QgPt+$^yB>@@G56)sYmG(mu=QNW`^Bcl}(xV6Kmt2pZ;fF z$$w<)EB9UiB)Pg|II$%=n7Zd=d-9j&TV@2 z%f;DQ_D){2cDJnzSlHAq6W=Uj=ALZ%a+P;v+5PJgyFOJ-TlY&U z{ocpWd!<)ZW$u_C-lekpy;9*B@i@h-eV3Z|CBL)Vd|Ey3cj2_Vzt7Jpd|o=I?)p}p z-0sph2Vbh!JzX*R-a(V5{JN+;U$ypp(ENC9{TuI!zk$o=A6dEohr5`b-K-0s|S?;|Z zRAu&dNr;Z{v(F4ErLNhp6&xcsKgpI~Xw7xw%L8HaKbtMy#&LB2p18a28|U$jAG+n2 zd^n<@DjT3Pm2)YJ!s@gwa&j%6O-Jwlv{?JSrn$Fz`(L3GdtdVHaFO|b(({SMmsgu# z-k)?~^E%J>Ep}awjRz{2xP12sOvrcHA}94|#p&}4zofKIe0E}Q!y9eCrxU!-FZ<)t z+N2ktC313g!JGHK9uXoN7IPgdcri8IsO0RY4?%@@Tu+}>wyz786if}+W9$- z|5hrVs{Jb>?5St$v1LDdvug50$_bl86Mtt?sh^f zhZHU_c<{J!heRmcGdMJbd6{A9B_21n?XgUIcJiH2eD?kP46nj;A3d`cUuS_Vrj;4p z3_Ta0^g6tnkdyDWad-bb{rUV%O$G`#=1$^va$*hA;J*AYg=1@>A8)Y6JHHpRZD#&? z@U1n!imRoi)k#gzSy1U*_2a`LEonY1LcIoToGosP7W3#9Ds6RBlFjsN6JVOq@G@e( zs8TRXr(2)OluZ*F7JOM|?Vz+uDd_S_)eDmr1aUA4wD}3XW9N2ekT7=hPk8vw{GT4r z0tsQ}V?WZ5Yr3hwP;phz&fmpsbY$5xkJ`9P9Tz6LqzY;=XgaYJO-Wj=yhlzyZI0Y- zGl`y)0a{AFNt1Mx4l>4Ob>fR>yPm0kiaTe#UdrGpI6T()z^axCzprj!j_rLry zSN*|1kDkSMo&FyZs+F-4)}rmzCr(kuF}7nJ^gxYzxT@#bA$idr4GxmErZD$ZaC z5>S?MOLF*dN-=?<@#C_@mJde+RWgD^YDIps_RlSuC(zXJo!!VHQlhXy_8gNMBV)2r zLeEXLmK&?4RJmmTZIHG1ZtvLcuOZp!z;(jYQQ^;4gDWiyjx%v`Tns$da$Tri-)Ult z@40(linYm)8%rv_I%T*mlw~=kbTmSP>q%v!Y|Yk+{7wa% zvsMy{tdG80ALyML#Jc+YmdD1QfBtDR5O5N8_SBppva}>n;iyF7dxi-@4TXPecV{;* z(hSxP{dstc^^XhdylejZwVl6p;E;mgdO_A>{})_rI254~WW>XiDiS`u-aV${rTJf$ zMj2Jzr8TDCX;whR9<=z%;+}PVBVglKJ)pOzf>nbesw9oa?c;3$wyS2Bn4O+ zmH+*ceb5>G_C$5nBDrTOPncc?a5NdR|IkqQP*rkAv&V{I%C#`>U#0S^m#cN1XU}_`}N!Y(18VF)S=m3)YBvU2ryEo%VO$K40O;88VJ4 zLhby32%;1*Il-@PBuOQ=k(?`Jt zTgzUk++W9?`1|dzb`JK3uN#i;$hJQi!S}#9{->wFtp_i~1__~vaZvr;VOdtqi7#(KUm^ZiW{DgPXD~ncYfNk zd9F%HDs48K=6+wyccSKjaCF2fo1@+}JAS8eEQl|&44U>~wdH|cYvqJJ#yXM5PYUJt z*Q)%qVYAx0o8j@vs-83hkN>;R$+$^17MeOIsp#pRTGj5g@X-11zw`BO{K-t4p{XZi z(k8R;H)BAC_$N(4R;IWV>*uBQ(`RKE9rcl!|M>Am$$xy0m;S9@u(`mhmi`7(}jwpfNtyBMmYutj~%(k)R7 zm>+Jr68AeP!|GB(j;BekLEF7G)7LKT{ZsJj`_B{e`h!dsMl117Qer%OWRCj&(`*~N z_h>dO%q>v=Xm--h>ejtdxVqy1(dPxX|NqnMt?K^AX}fQe z)ME~Ix2WFvXWD;6+$a~gdP~1sirYc@k7<+M)#KbxOaCN%(v2}FV3csyP++yw$a_>- zCNM)FQKI&6;jAQ{+@iB9=`FK-&tz;B*XU{A^kL%Tt?ail-)_Ao_O^P%2dguma?ZU?2;b1ndNEON zub$EA%jrkHG1Lg=PWCWzmGD^AD<;8l_`pO7`DO>q?n(3{%OkhJr_o5TFcCofI5_-mWK z>B*OJqyINt-xyb`B`$OjS|5IQOv>RczgHFf zdZu*aYpcW8tOGY!{L5LlH$(IJ{=XjQtUqQXG0m&bY@b_xX`CE&Zo?-=o>g+jjnXy!cMp`DU99zbsc>3&#EMz^h zg!9VZDshg(bAGZL94wOrk-(0<$Fle5i* znp`9noZanvL;FJ28idUp-&?e;uYY>m=GP5wpE);L zCmfo1y=u*E7GWmAZY!m8X&C;=YWTJTQZo;D_oHdW{uYWWvd*A6(q33TDN-}HMUNc!5#gU*NH^V$R zsrc8FdwEM#=5yZ>l88`vs`1h9;O|4{rCk#kmHWK)rabYk0dyczGY6*3zn_1~B;-L01DAi=_t*cafj;RLIqnU>Y_55-w;O=SyeJBo^Lhp1+` zN~}HDQ)ry~+th>M;YGE#TMb3HS$ocTT-!#VyO0$EbM;iLY8~p(^jS z?oa!7!Dq~~0`IJ24BNeIIm4b7akVc~t6L_pG&*?cv=qBdNlTfzDCSJ_HQAKo2{JY3 zXL752O=}L|_>{Z~*O>ZO*?uai;My_(m1d#}??iOV_e zj(#kzF{ia)Fsr=&+kK8@J_}awpY8A~l!e)jYme^_x0VI_+q3^aW{>&$ z^}o}(d43yXzDQfxitS`$Xg#u7-uLUFBXLdl^x~p6Hwydz)cF4IX`!22mVifra3#lL z!^w#OM53=08@deJXoB8O>N|Cp74o!UDuu*_b^PzoRfpz?@ zNAU+zMAF_lXZ}hN7o4}cJb{C)rSM_t+48zWtFC6>d6x110SCj*m;>p0b>HQIWc=bbHT=3Da7y&pjD7p`p6SmxdzgRy@;kbB z|Ex5U(%;S~9zJX1`gc)_FX+WaU1fW3`B7un?yftj$_wjHwp%>?p*+K6VSoAFryh3S z7H&QvCAdoY_)7DicT}H$S}Xr=TK(Ri;x)xT*GGI?r`jTPul&_Vnapqo1HMc9Lz~Ss z=kNaD!#Be+cgmmJeRflLzw0iySvf!K%A&BQsQF9oDX*N-5>(##|Le~F9b0crQlHLk z`G1P)pQq32osJrM&iR?H?JS~t#*Mu_U&Xwf4hpF^H?F-M87-Z# zpE=j=q>Ng_++C-BiJKL_5&T^7?ce*$cZ?rMEov(D3X@zEwst4esvf1#Q$n3DxBiTN zcWSbVq!EXQsbKP_wF|ReuW}QyX5XS?Gu@ecc&U`bDO|#yAc$cpJPW;st9-Q`m+bHBd1EmiooS#Hwd&#!mRE#Fq4$Z+)i zUpTF1bp9_o*Gz6ZwxN6XL9$HD&>V2dmNg+UEOi%V$$-n z7Q0jOw>s{Xj5g_f)MK*og5(lOPZ{GN$%RppYF$a6+%9e~i-?}%d(A9;@z$$1-|R3^ zeswrhd}5^3@1;TgYo#tpG|Q(*EH!v%b#zCen~b}RNjBSanM#Yp*6k60e?-lztWuur z)5kBfe@2jddo6K{4*;GfHTO)P!#*0VP=a!bvkZ|{w@I$Rvor<}K@hD&1Z zE}P5$-1u2{bbNRy{mjWPx=82$<2%MXKYa=QaY%A`(b1dUmQ@dH!a0hgc2CH0j#PGq%LA&s-*{)jLsZ>H76Y?j3Z@+xb>+-~ZFqol_nZ zWKRc&$J;HkYi-mYTQ*&moMs)Q*<9Xq`%%?fnTN;1j^`y!-Eyb-PiNM#Mq{<&Cyu{2 z7JfF<`|+svPU81lI|YK4c1~3~XY{Hth4aV}&ojo^+X7ds>-{lYpwn|PT0)(Fz5JT6 zRlT#>-LrW5OeEJ_U%5R=oYQj|hryp8-$ZNP?E1gNEa+j2Yw^sz=Ux1-Nw{CT^(trE zw#Swhesg7H(@)P0$aGycg*$TU(ibYnI0PIUI9XEaoReM%tmR}rSm@37bjM=8q?_*R zAAi38M^HQOm(fp$NopHcKRN5x?IyA@^*O`&bvK=6OwM3DBq5T(GP{!X=GUS>Kj*!B zb^Q14Q(vZWi+r~H#5jdpF?;*lXQ!m=j%|AUyzpu2^QI|R*t9fq=ggh^Xtxu0YRtRn zytiLU=IE9ma#39}^Sj5hxeXH&LKvJZ+vGvunDvQ%TOzofV ztSJ6tLa*?vvtpvvwjrxOKWNs!kdY?BWto&b!S0Xa#%bXbmY2WHnzJY4{^@P}BKza@ zo}PT}v|U@YF(Ip-zx;j$>;6s0lb+W-inloY?*IMjPe~~XffD)ZV#gTfS?s%DofrAc z>3-q1JDi&%cK-3Y)MDZ3QMB;Cm(CRX{BWU*8^fnalqlS7pAvr~^|;1S-tf4Ga=X4h zz3Wo=YS*EORhM6>@vn_Lzw7I6%_&Y(7!6YFSUVE5*DHOu-<$k1)BWB4H8c3npJcss zJLOO3=ZBxaJ>Ia>*z&Ql`GF&+g>qCdIpHRpLcQauvi`QrOCK8F)1gs>QY6`TN4VT{pVsz-FyrZk?DF|G(^Wzp<~n zAv5?_|MWFFNha!(t(}jeV1sA(2GtR2X#qVZaEE@mg!^t!AjSowi9tqfb&e=aN ze z+SM-YU(T*>R(F}3_e8ma#2GaUCslr$_GR9~S+1`hbuX`pb1eV&1Z#(LY9 zxRbBN-^KpDv{GGn)=&RwN3N&&y-kn*{q6a=IbMqMm3dm{?swD859s3U^yXB-xJ20#6@a>8jrmP?inT?~yIC#1M7 zo?^Y_Lv~%(N&fK4than}wOQO#C(cMZC?1q*vhT)r`&oT|!#$T&H2in}`S|kf{r}Fn zPOb}C>1zI7ZjIjDJJ((F%V(|&y0`Vo&zJ|7c<2Akcs%{PMW9JE=eDzH1xpUzn`rel zt>pB!jPFmA7Kt!B&GxiiI$`H#^;>tZsigV5E#*Jgs@VA7qbWyTUgBxT_C-@{olURZ zewX+5mn~0NR7=nV{TA8w{+?RJYiv)$8G_c9hfbM!?tlB9!kH!>)`WycLH*Z}~ z_{tf@ejJAdH1}{%xumjkk*KQ4q8VAXQtOU?)b(8bvzOic$~T4%&xH~kt#g)4{Xb2d zW5$K>lvgcA!oR&srvF{8qNwQEds^9hTI0fHw{NJN65x91*LUn+{i@Fb+vYNb&A!O5 zd|xi`+2%ctMW32p9v5QE=U-xDHl=8r$d~NqgEJn6tn@vV(jQ&7I?QhSbIoI&GXy#u zHJ`ZLG`m-EUeoxUn}g+B#e=5mMgkp$-z9H7DO6^j%Q_)qHgoi`oJVKHkF*5Ly6C9h z=r@C}Om_O?^=B*8OETV`ux7s>eDxX6KR=a_nQ>YQ#sREts!NtlmS3=NmSebF(?>oN zgGgsjhxHsU1l!`6FE^faGGLvtXzSj#zdUPJN}hZ4-s7LXTe8v4rv4K%7#J8BJYD@< J);T3K0RXksyHfxF literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cow.png b/app/assets/images/emoji/cow.png new file mode 100755 index 0000000000000000000000000000000000000000..12e1ab6c0bd8d6923b028e2a5336ac388b977d60 GIT binary patch literal 5745 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 LS3j3^P6O5T>Ln>~)jV=$knmMhs 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 J%Q~loCIGm0AA|q^ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/credit_card.png b/app/assets/images/emoji/credit_card.png new file mode 100755 index 0000000000000000000000000000000000000000..be1c1dd3063120ab9b0844346731b7e2cdf88671 GIT binary patch literal 2648 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 V_dXvy$-uzC;OXk;vd$@?2>>iF^N;`l literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/crocodile.png b/app/assets/images/emoji/crocodile.png new file mode 100755 index 0000000000000000000000000000000000000000..7435d5ab3c485879624a025d8b46185e5b28dbb3 GIT binary patch literal 6125 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 E0G&CYIRF3v literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/crossed_flags.png b/app/assets/images/emoji/crossed_flags.png new file mode 100755 index 0000000000000000000000000000000000000000..2397bcd0fc9892531b3c714cd34d65a58dfa3d89 GIT binary patch literal 4015 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/crown.png b/app/assets/images/emoji/crown.png new file mode 100755 index 0000000000000000000000000000000000000000..39da1d52873ed8694b5285f2baf5b413bdc067c5 GIT binary patch literal 5655 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 Z8EVBg)VyGN#=yY9;OXk;vd$@?2>?#bwBrB( literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cry.png b/app/assets/images/emoji/cry.png new file mode 100755 index 0000000000000000000000000000000000000000..6d0d9afd284b9a22107defc3979c9384c192af74 GIT binary patch literal 5699 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 Hl+XkKyI9Qa literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/crying_cat_face.png b/app/assets/images/emoji/crying_cat_face.png new file mode 100755 index 0000000000000000000000000000000000000000..42d4c27cabfaafc0c17b92483050aeaeeecbed25 GIT binary patch literal 6682 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 ZO;I~1#0$(i&cMLH;OXk;vd$@?2>_W4_C5dr literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/crystal_ball.png b/app/assets/images/emoji/crystal_ball.png new file mode 100755 index 0000000000000000000000000000000000000000..6d2c6c42d448ff1e77ef23906f4048649ccbbf1d GIT binary patch literal 6236 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/curly_loop.png b/app/assets/images/emoji/curly_loop.png new file mode 100755 index 0000000000000000000000000000000000000000..8f051aca43e5c12bc059db4bd7d156b825f14e68 GIT binary patch literal 1264 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rTx+dW+zLn`9l-mK3NPL*K) z@V@wZS*-cCoHe&^IYr%y6*qMYI3ecP!69Vm#gXB1py!QzVoQh4q?L^e*f={A+3FW` zrg^Bi9dubN!RRQfmz>d|CvaiyT@9z(y@towZtwagc&4J?_uAb(%D>$0zx&@`GX44Q zebaY8-#bm>zb@zh>kKR5&~E>u&%U8%zv2T<)p}2P>bhBUzBRj4#obfvr?zFMzx($7 z!~1<@d!EhpRKBLzb}Dsq%E`$u1Er3$&hR`FHfdp(;t}5;&DrcyQB6PC%lnRYTJM~Z zcEN_Hyrtev-Mr+g+irIbgOx`@`hsq(6j=P)vG&pBeYOkv{;V}PJV`fo_Vk5a9G)LN z-#qG{?R1z)WNM&fnowd6)1L17DR(+~q8Qbm9%9PXd%#eCcei;-sX>EL|M!V3$)yF> zdciyl6%67RnC$N|tFzeM*=})#QDE_k);kibc++>z-jwi+=aj3Ijzst7jA!P%`FQr< zl579NVY$;i>VRrWQ>Xuju4l>DnGIO-jyV2n^J8~9qf&k5@62m4+q@nd^w|a!m{%GW zF0r`NC>$bv-+wuipvuxaqUIC%`46AFdgQ~|<61@=d(S=mTM@fK+;d0H%h>^)(W_t2 zQcqjUd2-*!BNzJ4?7RLm^3(y2AJ#fq`&tYoof|q|J`2xy@#gl9)@2XV+8=vIpSwRT z&LQ)e)GC>eV?cpQaj_?os5JA&)F-vnA8IV?=&iQsMWTl3hc1jacx7{ zo07#%g^xW9!n!{(6@Nc<`^)}?V46khSSQL1|!!STi0G?Thn0UuG_yj-Ati#^VdCst3vf=Gcvy5GvDIfMWzR5N)mZ!K{S*0~ zU?;J6*F_tOk1W{yUcltX=Tk@Y^S^lOl~ombg)>AP{nPKh_<~BHc4*hjyZymdvnFP< ziFG<^8=EW)`_gsZ_1CV4DHaADRSNr+(iTQeJ^t>Zx83(wp z)_$70;h%fqbcr>EPZL90RZU`f{Ni6-l5DWt81C|M!?btX7}E?h9_)B0`k?&BmK$k0 zr8!PPeOzbKJ05E@?@HX!Zr|u2Et4N;< z$?Gq42T6uJ`1GN@E$8GS-;e1(ghDp^Z0-9RSt;--hBbO=TjJC2?qyOx;sOlj+9|W= zi5>D}5lk@leaOCo!MXL(=Ec5jYz$o9A6Y*wJo`ODIM3wARh=074K4MpY@M%8I4|0x zsI72g`6>4aZ7IJt+Qrn~u2avkKgV4#ssHoZ>N~FgI_1Tm^2RYX=2RB#zxj*hnS#?& z9YtXu=8gj1eZAX?WiE(1?EZ5mWBXnSoygAQ!j+rf%KV#pWq%s1w5Vr{a69Ai@Z93V Pppwkf)z4*}Q$iB}Gw@R> literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/currency_exchange.png b/app/assets/images/emoji/currency_exchange.png new file mode 100755 index 0000000000000000000000000000000000000000..6ebebe70afb01c3f179258d04eb9a8a22ff5b543 GIT binary patch literal 1959 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 C4GIGQ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/custard.png b/app/assets/images/emoji/custard.png new file mode 100755 index 0000000000000000000000000000000000000000..9f843b4c13016805cb3f8a64cc02b83706528dec GIT binary patch literal 5810 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 ZpJ9@-Y~x(5CApx%WlvW>mvv4FO#psS4YB|L literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/customs.png b/app/assets/images/emoji/customs.png new file mode 100755 index 0000000000000000000000000000000000000000..92691e3117c69c9a4acf0ac264770f4b9528d46e GIT binary patch literal 3899 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/cyclone.png b/app/assets/images/emoji/cyclone.png new file mode 100755 index 0000000000000000000000000000000000000000..5fd2e4512f9165e5a9f5fcc5e84e057560fe91b7 GIT binary patch literal 4890 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 KelF{r5}E*3OJx}V literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dancer.png b/app/assets/images/emoji/dancer.png new file mode 100755 index 0000000000000000000000000000000000000000..6885a0bc3d5f23fa4be974ab6ca0356b8d35812e GIT binary patch literal 3737 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dancers.png b/app/assets/images/emoji/dancers.png new file mode 100755 index 0000000000000000000000000000000000000000..2dfb451a73a1566fb1d916861002b3c6dfe4572a GIT binary patch literal 7918 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE8qo_6CjrU@P$uXhDir>UUds$V2 zrkGtyZ=0F;Yj)-5S8u=9{JyK0Qp=K}uskN>{?y#CwG=l87ndp73tT>9wh zdUU>ssAw(MgC)$p#k=qFhlPf&kJTJSg~o#N@1}-t^y2ANsNjXDrGV zy!2T`)jYJsV>82Z-W%&%CcB)h)$5)8=;Mz3Wio0H3{)N|80p4kynn@F%;2SC)Bm_- zY0pgYa|Qn8TsbMFcJFuoU^#yw-QIAb-?l?fzcEdFaqQvg3p{Oici(2X*Sg52P{QML z-@`k4?Zs`UI~O{4RTN&cxPFHJdg{e?kvnnr41vF{@$PsRa@}D6Y019j6%0I#^CL`t ze`@&np=p8XwreN7mD(3|G_;&#NNZwoeQL0>Prm)|mC)iP#`Au)Fk2)=$#i{|F^>O{ z88FwzNW;*;!;kT)pj>v81cR)~39Wu(HOpm85uMH={md_3S)P+_pJuha@@|ty=M6Ru zsR`jS2Ttq~uwSFsvrzf4gq;=7xwniuJRQfvM7uw~+kawz?mv@tEbR;C&wE+9ZqI?Q zs}w#kFrREn>RPda)4Q}(@k(z;!j7}O4v$s-aGy%_=-l$-Tk)RvHQH={3Z{Mjb}H%n z->X;acFg@Rb4Wp(=i(-gRqkR7k|N~1vKMQt*Jdf+&G4dna;M9k6)TJQS8IIPc4qFO zsfhx+o~4|hJvH?mxAy89fm{{$M5k+wlNMI4keb+D^h;-<##-$LCcy^AXtjWdH?F0v z&!@C5ua^3!%zV!BoZ;3z7fQojck*8?7363#bzork^}IRxtLTr1CqEw){&Yb2>q7HH zh7<2@1{!&tidnJdtaIwja1H$rYYsY=oa8yro2q*5^6681R>+DquF5du-*Dm9yjGD< zhs9OXj(GdX&r#I3+AYd(i(&G~73;n(+H`E87@jxW!*w#q%3`a@8Q zBk59wzDlQiY_*K)1Zi|P7%!}RIADsQZaKn}E zM^51v`O|mhAN=QV$;k^-Og{K9AD4dd?o89<4o%JnmU4G% zrPl4)A;hh>(rMNV8Htdoig|`Di{xCYOk0wFB{2l^oora(|D#ajO_TbIP3qInN}X61 zlJZ;F|Jo*u<~4n-lsU**V0=U<;3lsi#orhq(rv63BP~ed)ULc zN9L1lk8HKvy{dA>vbxy*rcXsbnj9@+_&&(EvvDN+ad5I>oAk&c^gz^Ht$)8nt7`IxQ?tV-Xx^R>ALS+d#Yw>R z5yykh<4>IyJSg%>>OS%*sDkAO)1@2+eZEr-laCdvx?f?N+mk$Dvy{i2;8u} z`^5vbB>9~xFFlNSmK|MjDMe$i5sN9m`;>D|zHcuUxOzSKP*HGfW`FY8S@w%I=h~jR z#>e5uIO($Mp2h+mgSW2~R4m##*jt~7sPW!nFj#)wNYcdBJ%4#qNWMt0`}`)ut;z>} z?+rL>QgK%yf#LYMot$oIj8)aME?nNrx-o+J*JIrm@B1A$3pHdYN^l)~dB)U-?TJ?N z=33ITmSBS=yM)9fS4w5hnAI4tg-3mErTr8a^Q67j7ccMZ zwUeIU@y2b>dVZ_!$tPu)78=Mb5}wBD@Wk<18~a^m9X7w~Ix8ea*Pi8Jy~ic;>~|uU zmXBKFW0i)&3#F`StGM?l1Xl97Cq9*MP+v4@*{V)O>HOpCmTkRp<5xMyIvv%AZHY`g zb6Wp;T=z}69BH!M!l2H>^iU$Fm571IhUhNV6;{^lIIV)DVp`GEYfiO&7(mzyGX7HhhsGj;Juh<%%S*T%HfIVvq7 zMuK(cWCxKqf6sijQAskA+i;*`p>whoi}S|WYnMtJl=99wp(vzxXvwbNg=u?N?>Y5sGBNG_$*{2$GK-NhlU{YsypoL`3>yM$9+CbV`ZP2xPr4FOpGc2 z;1-h=QEZ#8wJ*@;n6_$Bk+0*qCudAItk>bb5R&w1QSOG*y0?6LXBliXS>YwWQTM|c zsf1aUYBQ(3Z9TB^!NS`&Q_oDu=r>vs z$-67B@P<3v<_f1Vaw=4zurknD?X}aQ`wE{=$ov)1I$)F#bnk*B`!UHWd-x{YUg;yX-S(fD z+4m1SeqPsCyeYqZa!dG;X8-+dS6|=$aI8K1!>vtI3wE$p=SMALJZrGPn0HQalajQ7 ziT6>vBsE^+&a(`YBUUXts91R8(uJPoaq*44xomYs?~57on;z>r7!*E!^!!6;u~`4! z4Lq~AnI6(?s*v)TcKT++QRxN^q03EK2BjC+Ua%RZFzh_gSUkgHnemAeT7UAy^=26h zrY+)~etvFe!+mDovkZ~E)8|-n`W2OhX3oQp9AXUOT(xwSXNDTAS;XKjZz!@y=J26zzq6{Wv4IQ*e_k{ND{AbWVfd4y zXN7L_EX8FD4=Q-5&23H7d=T3gbJWp%$B_lI6WCRQ^NKEnu$@d^s4nQ<KjVbHp4tMQvl|jtN%_sRW3;W0XIg&Z_R<+|x&^-Z6!b!PMEb|(dOP+X$LP^Y6ML>cTH?J`;yeFem>sni6=87 zv|1;%EnK28(L#hvcXs2N>EM;05khw@Lv{f}Y#mFFI>y#X^ zu4T7;bsV)fCweRY`YCaM9S2 z?3{n}_vL5Y8|`>c?%;C1xMi-b^_uh7)*cT3 z8h!Dqw6up;IQuEv?<+G+I3;y+b0hXu*@orDvfuP_^3@F3WE3*<*venM77b=5ujRk0 z_Ow|TKCLso?mxv>clO7hyLfNxNM*13{WxWpkIdb)w5yG|(|ne1Seq$s_w$kWE;n1A z=1*P$c1J=st-88a@_VwtBZ=f2;ghpuHm*si0`d4k}n3{cE@k#Mw z1*x{kSj%>w-+?!ek3YVqe(z9z{67g*$A!ULo>+d}y_NR|+tg`A z^SJsgJd=Y~>Aw8Ye6D5Vdi`BId*|+~{^RE2%=qLv>w}_Q2~r^oSDM_iPQIYSs4ip8 z``G<@!n?Kp$wz;!)!^8$e%rPs{mbr{@VJ>2?0@*lZ623vmqd(W+2yC7C0_rVV7mXa z!0*?#(>Ji|+c(}Vz9&+4edpvGi@5tz&)=!gyS?X2-LY%>scXKDHUkU;KP-bLD+|cJX=jdgtuAz1@7T`ITjk%krNql-2ht zuwq<)yY*ZJ*LA&r#`Ef5)Ia#(!4VPnqejl4t#P{%gN&lSL~rzu3qcmLOe~Hq%Q7$c zwoO?x-{E?!L!Uk4rMemB&J)zEI9{+gUwD3O)%w{Retf)M_?Y+eLz9vg3wb9+d4}#| z+zL7^e-z4ca}KTl_e1YfQyj;lg!@ga+gjIT-SIlJU#R%6qNG9cqZRC0U5jp9y42e1 zYx|*E^3%&l`t@7HE}fS+PSf^lU#;Nb zBb#tUMD~d2hOD1%F-6zqC!Acx@iTUUsA%LVZT$yFCvH8;v8#1I!wTsV{)#u#KI_MQ zzGS;5{b%x;*JoYdl-tic-F7`J(pB~8noX-_v1ZiwN?11O{`z<{=jZ1ADPPyyAF-?W z#P@CT>3!$DPH9E#SkS_|dUbNDXlTxv4~nOxzw0NQ&A)Scm)$Sk)$vvQzyI>u|9HKx z`om0D?s+%9980?9ex_~d_RZFMbI+bSb*kr57uW2U-6ES-PFCM=|KFpmZLg00zS(xY z?rdCi5%=yNZ!C30bkkZ@Mc4GrXg&Hg=bPbUqxrVmCY0{^%<%fh2lJe_o40RbUuX6A zc=J2PpLPF@^NMV??dHB+R{EghRKo8Qn=aI5Mz%f?2#lP>AG*2VfARarPg?sEPA&cZ zNM}{o{r$gI{(TWMNxtp+M_3+mi_x+ z7gKOMxZ>~SQjTADJKFvh?7mxI<(iZC@|VJ7&)BQ?gq;`ZvwD^++G6ql`t^C1EB`Er ze(>=1`JK6kR%98Rc8S($dv>jiDgAiuo{c}*C%xEkSIAXx;sjwm&xTd25+1zS%h6}2 z=^?;!&@aaHtm1V2x}SHK*ZpeV>FUb5{>l{bg-aBigta2L4lo9}Mm`a|wfjN{t8Q*= z$((O1rrZ9wb>?gNuXt?^c88|J4;|t(IQoN|*1b+>d6=u>Zg^m+VcGgy_e7*^pD*{H z`}L9R^L~vJ`g`_mQQ&`i^ru8n*eA7y!uuHxfps6k<{$42v1(p+&9CI!m-y1-#q#C% zHLG56E#ixq#(LP`jsNbF3c24W?@c;9Z z)mZ%SBl$T+S564WPU^T+H-`oit$^Oz>BoIUl(jngs#eJ2y+XC7ISmR&5%bV%Xs z{@1Oo^*g>ES~+n+z0-~Nu9=DVCfd)ke%qtEeoaO3{_>{s_>X&qxs@EJJ3p9s>corA z<#B(GZkD%aY*;YuoJ6C~<+xI=-}}E`_s;0~d&eR1zt1LzUEdBay`Cbnc5*V0P^#zh zBj*>nUd&#kDDTp!oF-=b_hoDOo(~)EZj9xNdu(tZMC54NB+1{&x7boQM^^Woa6T&c zwM;c#YZhN0b7()u`sV%L8$=(JTd(`HYi@y+s>h_3KE98a>ep&TdoS24tfIlE;&qA7 z_xi%ux74I&AC)V#Ii4=cdNO3zq^sMf?pWe&tGE1av`hPxJ+FWE%O8|`+4gm5X4K@D zQD&31Ue2EJO~UuGqV_H88;b)J9xRSIA#=0NA=o7ME#rJvkyz=)uiN&{Z*sI(^V6uv zUVpmnS5jD53DaBM|M^0y$@kZ#8Go95W3l+VeMMW(tBM|Z{P)F+cT2gvV?4CO@@6dC zTfcZ>!Gq4(=c_B;o0e1>s@h20yVq*y!@O+WKfWdGdb8f1)&7*ftjleUe&4wWnO@zs z;qn(6&duBRy1e|`jr5EI&ktTWHA#5>-=D6x>)gbdG-pq%U-!a_P5bJFm9u2tH-EXb zNZVdRpT|FC*}TUKmTvyOe*gd5yG-B4)^?xZ`F%HehL3z)WYu3`^RxBY=ahQ}^H4v-xLnRWZwDgEzuSA-PX8z3VG0l|3eIcyH&rnb%?mrwn`O z#UzE=4^Ph4>-V*Bvz${pTz&D5)NZWyj~P%lhkddhWaxvHbGo+rq+fbt$Vy!PBo@&%Uu( zTE4#eR`~4lb-5XD6%Lz-xG=5I(p(X@@5!y);8$JR#=jIM_B57v{qo+w=gqB64b^Pt zc}hyZ3vK4+y+m_59efo73aX?`^H~W-hyYYDE`Mf3y3A_c3078~+tr%y_f; zrlP{cQ*k*clZ?YnDh|MTzd)!|9Vfe656`Ke&WpezDqWA_g&HT-Mw+~(&szuYd0!eMlk2-Ry|y79iDrm@Q%3j zwk`R0cXG#Wv|DrgrYn0(igbYif5p7^^G^?@OV2*GWn1}-v%9T-ZF}E0cmI>Gq5KaS zcD?O?e>Qe&=JBPg&2lbFMVH- zySu;S=%(+luj|Pgui=r|eBsvJ{+>k#4Sc0{<-cfaO>uJ!ujjg8@}@8H`6GeS8<(&Y))ZfMPl;hMXbGexvi-&lEdieJ+HlZPIeFberBdcjUt<7yK{#ZAN#W2b%#!GKYO^_d~U1f z*4CZRMY?o^R+{)YALUHe`uIpUJ^AkYbw`ZtZMmQO$akMq);1`B3t zDTy=0PH{QUu-GG`E@#SfTsHFeg+GyxU-iqz8jG<{RO$G+=z!x@-xISMIS+dkzJ2MQ zSX26?ao@jxr)&BC{rh?R+QU_r$%P@goFZ2jaGkl;|77cw`-Y2G8B{0DeSc%4^F5p2 zI}G#Xjd$4;-H4wy&BaBwO!!g4ES`-aY-i{GE#UZZDd6gK2Px}qFBrcXKYqMc*H+j) zRBYiUi=ICV`13qn5|8ljKi>Igg80&(2Lr$M&V7A;hSjT?$EMB}zhb;hb_J75V8emt zo)i)m$)9iE!}9k&pTH|nsd(P;WJk5thRhirr?skri@3jK9Bwibw&KfJdUrfDTdD;DX&Hu^2j&1+9m+6O% z=M%*O8=Z&?oik6I@Hi1={q4oxtJeG21m+r79$Bj!`?uRIRCH0_4AqMalJA@@JZ_9G zx^d>w9tFuOmES8jAB(?sN6z}~=d-$Bo9{9CIrez%SCBX+Ol^_8uCaX#fh z;hx%Z%U#O^j`zw=N)GFjkK38~ZOO#zJhvFSH)>23b*W3xc$$>Y+8n9Ix1c;c@8``~ zxxUVJ5qnF&ZrXZ#Ls7Btwzu!x@|ALxy+8f2nAEp3`S_IwGYn0`FV+3!JzlsxfW_gF zrQ)L!i*NIOi+%LzZVb0*`Jd7Jj?e%t)&(1)8_eyz~zyrC*tu-jnGngel9)$c|8RAvxy&|4`#&*q|k8-ESA zh>Xs$H_KLa9x^wYo}cqWz~SW=<@PySx8AIG_Vv7XB{B7gPS=fS{RgGVA)$gnk*44O zeR$~jm7(34$6CX4;-Qo?b??_@vhn!7Kd7)J$@#K4!!tjr*w`yK?)~=g%`AzFtrRhJ z4HS9Gx*_MR*_&5ye%Jr!p7~C+weh{CWLv6nXi}L<4-4Bu|7-7Scn@SBmkl&dOOJlD zapBU7D-W-*4-sh*fmYu`%Y z1D2EBr`)}EL-4n6XyUz`SJx_j?Y;VA`i2Qk3nzUIy4v{IviebGRnW%z~@ix6e&m<#F=c{KMf74Yn?-yMCO(&0jv& zItG^#le< z^w~~2U|pG1Xv50js(d+Ac2(wex zCud1o59euf(}TKJ559U7bR8=0X?gE)M5m}L>EG`7oW|pxKFe9y-aUNZb6n#0vXp;3 z3IFUG+>91{vo=}4>hRO`o7fn Y?mn+MmFt2G0|Nttr>mdKI;Vst0C-j&>;M1& literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dango.png b/app/assets/images/emoji/dango.png new file mode 100755 index 0000000000000000000000000000000000000000..2d042aebeb589162683b4eb8976acc2e4a3c21e7 GIT binary patch literal 4449 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 Hr-UW|mz94h literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dart.png b/app/assets/images/emoji/dart.png new file mode 100755 index 0000000000000000000000000000000000000000..0438fe54f9993a2e374cfcbf31b24a9c44111d89 GIT binary patch literal 5462 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dash.png b/app/assets/images/emoji/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..dc2c0a8f4684186167596b0cbd7ca1fda70744a3 GIT binary patch literal 5448 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 Q3=9kmp00i_>zopr0J~aBIsgCw literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/date.png b/app/assets/images/emoji/date.png new file mode 100755 index 0000000000000000000000000000000000000000..6ad2efa5fdcc5fb377fef6d565a0e72cef0990ca GIT binary patch literal 2977 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEc!2Na#h4f%Gux;%Z7vUKYrIdxBgwTJKy^Ey|in!&VJ-Tg=Fh4|0j6co=Y9XX^JVw`H!<6iqTR~F z6(_1FY+Aw>6fWj)VXgGS=-oX=BFmL`Ec|xYiy@=#4nymy4d(^lycBg^)}iHM+~8KC zXv7u0qe?XUdjBcM4=;G0oZ{rg-g5T%_I(8}g9L23bHB>}(X5a5Txopg zw)&)x0uu@(944(`+`zg>!^tfr&*jRlx5eBtt9C@N6=<9|_DtlYgWP~J4rLHzNB;|y$*7hTY_T&VP=YfsP2 zuM3VU+0;B<-(KH)_E^2Sd34>SJ2kKGhR0b(s2z3^X!tA~x@H5mq(3C0+Bxw zs--*;@68YFV3@pj#`?K0+pOHqE-WvU(h)h{%kT?e|Mt8RxLOpKth2|6z4wmXgs~v7AQ!=e$ZMwN^@hJYimP zI(O?yqlM>>$5_AC-gsG||5HoAq?xX2td7^F?}_{T=+B?Z^54Hg?iD61_N#KgvS`Wy28%BK z$A?nSmZ~vH2F?(0>iF=j`@Zdu&zG0Kd!+P^LFxEgy|DKa8xzu0hVuE-6FK;|>-NL^2N%yBur|NgFE3*Ii({Z-^l+IG&U3tr-xjOP0=5$O-nB;h+ z=-=a)EcIt}LpqCZ#^QS&|;?OViSXe2Ap(al51Pkk#dkgpM zTJ`Gu9x-oig-wSa3K_jQd%&{v^Xdnh6Y}(y?qExpHirkY3-I;%%@%ZE^qO>j`a`A_ z3@uAsYg9}o=v8N*D!$9nDbEtQVWP60vhw0vX(9h!`6vD>U&ZMDVHcxT-8Zdh&eLnY zy!xiol7DqyH+Slv*BjnyMLFDlIpOGAmd%IRR3^=Q7BYoV@J7wMLrxo>Ki?>A++C44xv)Hx5Y}-WI4zENqy*e9aS4wT~YYJZ;;e=6uYU z+2C+VfMuSQdwV-$Y0^4;C?y_3jU+_LM&fI_dsPXZD`|BLJiH@f~I&@kxybdssv|6m@7*cut59^-!Pa|2rH8I&u3ywLn zN4j@TbX1f3Ij`U6{?u%E@R50!rP5b6omngRw#|_#I5Sr|FwRkl^RmM1njlW;nbIQf z81IyXELc|(Y$E5XFRZz9v!3IENtHX zKEEox>)U1{8G8yON}exOUy(nP!}RwBGx^sq8a_HSeCAY}C@FKi?e;B$&n!1*)6T3@=3d06V9@wxQqTz}@hcBzn9sk)sI^NkzHN@G_adH< zKab@dpFe-D7~Avhd$7|55woWBNUqk5`aAEN9rE*4)}6TVj@j~v*2j&B`Ydv`j~FYK zEaqMk7*@SNT_L{T@A#5Fhuh2NANmx3wW0W(aYo>lZKqk^KDS?73a=9`x{x8B6?gq)Pq;}kfD&s$@c!Wt5 zyiP^J?L!R`6?+cu}4KeW_)`lESABR*8vD4aH0(p081)7{;@ z^8U*bzn6@^OjXV?d9oj{t^VeqAke_hFXy1NpsA2|L-BJz57y;=bDP%h`_=W`Jogrh zs;X*C9aC-4Nv4>eEp9t1Kc{(JyrHo!W+#(;?H9rK;o;$judR)KeDd1T10tIlmb*kM zL|%Vtd4uCmo&BEA=d5eaEn1{>V{5kf)a(TUM$=f$^6qeKEO>KcW9IjU+TY&}o;bnr z{{6kZ(lL6|{qmwB4`lr7ZC&i%?$Y_u@&wHVD>eQ)IDXA|@Jk8i7G+LM6XU@vbF5P67e{as5IY%7tItZ9NVAO0# zpEPft+}(HkKOEvV;5C@Q#w(!^8u|R(+{-5;_t(|hNV;8q@Fkt`iE&E9vSn(qw>IB? zyCL=TG!03%O$R2|vh>N@uRHnRzVI?Z|2nBP>(^gD8L_vjROG+#T(*h!Z%rybJ@Ne2 zW+@pO8tVB;+Q0djVD5$~W&G#&9XlUiwQ2L_%6hgG#$?A2udc4P`j>io+RMt`^hR|n zUbk9>(%pA2CpOG1WHI>e{xK{hoVoI`X#o3@7_MTr z#p@4isNd|L8@Ok6*xFg|^pADgcRu{Nba$W2%#HIu>AP>7pg3Quc$q1o3Zdgm-=VlfXxD>&VeGD%>9hUHyCQZ-!$FFxF~kse8sB#V-Ekp* zUh2rn&RWy)-ez0+QF)IApXP+fhQ=mKCal=J`LeZ{*|He|vo39Z$njxHhlGTLL|AEW zY6E-q_jk3j>$@lD7+4FsWd(!8;+7P9n5iU+{qMXXAyj|2=GFh&fBWaQebkBH=v2?Z Pz`)??>gTe~DWM4f2$hf) literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/de.png b/app/assets/images/emoji/de.png new file mode 100755 index 0000000000000000000000000000000000000000..16a28548c9e5b2007a7d5443b58696c9bdf93509 GIT binary patch literal 2640 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 THqK;VU|{fc^>bP0l+XkKMp6jv literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/department_store.png b/app/assets/images/emoji/department_store.png new file mode 100755 index 0000000000000000000000000000000000000000..68d959c507de127674ab7f3176ce0adc2389306a GIT binary patch literal 5159 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 P3=9mOu6{1-oD!M<1#v)k literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/diamond_shape_with_a_dot_inside.png b/app/assets/images/emoji/diamond_shape_with_a_dot_inside.png new file mode 100755 index 0000000000000000000000000000000000000000..dfd1098b3940104aaae590dfeb533fb22b230c9c GIT binary patch literal 5698 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 XFHT*TASKSgz`)??>gTe~DWM4f&%Q>1 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/disappointed.png b/app/assets/images/emoji/disappointed.png new file mode 100755 index 0000000000000000000000000000000000000000..82552008719d2841dbab81f34008db4ef830e6a1 GIT binary patch literal 4764 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEx-o2G-{LT9N5dvqN^QN!WQpzye$Z#UZ|zp) zEWRE8Ydp8@3ICT+vd<>$?RN9;Iy!sTZrPFI)h*=pdFrDY@4|;1PeqppSv^hiO5Zd6 z(@psWMd#w#T3>(I{b757{|@s%{y*XmCAS>s>X($WwsEgm_hF8^3v13EuWM7dYj)kq z*7so(npD?4MP}KY2|Rj7b!>QztJp5>X3{+0yo4*sk->zCLt_EoCaGHz?&)y{-v8mO zJ1(3e9R0DECpT)7rn}k9i!%!E=P&tl_SEe!AI*<2WFGGh|9G${be%q*Xw{p9#wD)| zuePL=h<=;VZSeWJLuy>hX$Jm_1uCE3m+Lk#dO9@xvZ(w1c*pd2s<(fN?3*_6Do>u$ z(yiuqudjGndOH8{=UaV;^Bq{?zvumW9{yu_(fqx;41!c7H{9q_j@%%$`w`cfrp=0) z&D$JgmD>LMulNv}@!M{NJ2xE+&ouDiwDo#bnE$yQhD^1EwyOaJA3y*`u6O-7Dc z>Cdmz7FqXf@>cVyJQsEAR;hKmbUUwqw?y$9QIAZ48s^5o>Q*zgf7baeU|7~;rv4%N zmRim)y_-JWIZ>YF+gA9deedrtzWVb1v#axuw>){?DnIjh?9+#bW-k4ynj^2`?5v_5 z*C|;mozaytS;0tr!%pwT<&nZ`j;`Cm_0n4EW`T9mwqgz>HhC4xk5WGWH%@rRYG`TG zezswcQjBb-eRuqQ&tLr33 z?@QP7rpI@E(QD0F#Js+kv2HH!Nh!tl3EVk<*qpfEcZV45&3b(G-E!^xr=Q!697Db? z_`tt^wsD{AB>5@g)2q8ad#n7Npkph(`NvxaHYJXR52ty1?N%^x*8Q$ciI!KH-E{4p zTJPK5+UReuSfAI-ozK8-qG&1c$8_-&@$ZGsnL927OK45_BK78i)0q>Q556;Yx%@Ie z#NcTC$KwR2^=G9YvKe6x((BR-ukBiR_CxgcH%lglAG*`l!0;?N|GDkdxZP%%hi~6w zT9#yRczJ{AgDlw!!FwkJdev^Q81La)`}SCxlhKnEZ;G?+zmDn2 z?$6#(9$eANH@i zxZD1-#bl*LihQArY#YMYJ?IMBZ>#vy-(c!CFSeJlJc~Nk%Px3+|AE&8l_wo5dt2vl z?wtN>v+%l@iLn>W9;|L)de^{q`HMjqC>nnaG6- zO9YB^rf$d-zCT$&;@7e}Thq^8{$G(JqrQ=cFNBfl#`$$mzj%d)-M+^XyluuJ$1c$$ zDi2;MoD!7OQanCEd)bV(JDfaIvv&R3oc;C7=l72U4=}Tv9AGHhay=&O#ny)g%+Xss zk`y!akbL{p=tDm<--n%yo7MI|br#V|wT)jT7QD&hph9Ot z4%0r)AMqMHcOKDywt;i!BVo>+>}*WlOXtj$zY%xG`JMNw@<-))?^J{VW0`~77JP!n@DVNZ|CjK6l~i z`{nY|O0Tn}5~hFKsHHixOHpxsh1N@ZLYfB z=)b#>v3JtV3B?k8T(gdzHfeXUdS!ORCAer_#L~<&)47vx7rz-mH=$acN%4c@>rUPpa-aoX~ne_6*nv+9XmX33v`%6)x7d@@=ZT>?>`{xo!WCvfFBJX}!RAb2WCX<3=dDuoI93rw_% z_9@c69Nyq^k|=nVIJC z>gV?;CCyu>{QjV0LN{B+m4DTZXN;HLTdbG8+IfXx@q~3peOUCH^R=YsovwJZT+=_- z=jP7i6PJ2DV{9znxA&0g`&AQ8IBGd2DNj(mQ$SltFQ>?saVbjdc8XH4wP;9%)pwF_J)(~f$S=_uWSdOKUI^x?aR1Fi{EBS z(fMXg{ruvH1^cyhBn8$8UJ@zmseZR_`#Ebp5wSiND?T~SH#gTltbbv;q2NYhrg!m-?8aL zK)r#ZlKjR1Yo1w}v$Ps@H)VHRU)AttspkHdEz^!#AFb{WY+ew1y40WT&u3ZPd3P7c zm}jjNv$ET%Hl@Awv7b=bIy0SU&cnrrefQ}L)<#alQ&c<=fpg} z`D@Lle4mvPi6VXT1nT`p}cN(`HmOCL=HC0^S z=AOAnZRA|Xz3eJ_=bc|x$JM!3zDhrJ$j&in0gty|WAHt#IT!NSt8K5y`c%*8vQ1=| z`Izkj^KJ&gw$lbRn-affB__F5yvuy}vVF>1X@{&987IA*+fOahCOU8_6kh6`I;S$` zvN@CV1g3uuY)j&++j8Y?Ci^~JHg8R&jv^0JM`*y(e3rhrL=DX~mhl!}bx%zSeEa1K z%ZB5}yE->`vvY|mdgUOVit6BB(JcfsBOxtp;Th-+S<^IcSbYHNR*&Xv~x~J2- zm5*kh@|o+~_%?w}(u>%V1o* zlTqlT>+@}VA13j0pRIRyPPA@F_guf>Nzmb+(<3}u=Na~|XBH9-KOq$o&UAU7iNM7> z^&C%x6S=Ouzx_%+X6KbX_L(aRbq!Kkr`AMY2&y`^i7!AZ)|_iv#ofE-gbH3u_&<=_y954w!X9Zlf}H1!UcPg%3j&VaF0!S=??1?*Y#{~Ox>-aGm0%Zru& z&TdovaV5c9NYQGo6)U6Xr~8Q_F1v1V2=Dw9_RNgO#3N05%I?g^&jMZ^P+q|<^TX%j zvg226A5Z>OlE9QTabmM%zz!rObtT`E|W6gJ;$6%sXIvg5dLV^_p4U)SZfjj9HY7aVyy4lm&IseR)p zXOX?~zES=G`E0GGl?@`i5oaeGKG7BQVt8bG_ZUY2)0|IV{9C{JALx^9@_le4d5Y=k zsY{PD&UBdku497Wy=T`mL}XVk)^&`Qi~qhO^Zb*z{i+*S)E3xHH+M5isJg6jxj*OX z`dFhE_KDRz`ws7HT{SI4IR3_>d8{7?ex1Zh2 z_WjQb?NeL38>_Z+{!C*$SuNN3z)|u@p}*P78#|A$=jUl;o$<5so=h&2@MK=LeSenJ zeN_JYt~HPms^@FjY>wOck*G*RuA%SMYCeI|h!byjoNq@3PEWE8dZ~DCU$$kx?&pFiR z>gq%-KvA#D5V4lKp*Yw`zzRZ1mby1$` zHf!%n&ffN`TL1sFd%SNtd2}0gN*Pq^Nw8~O|Fitx>Dcfetc$PB?Q%HS5Yeo#A|r!w z*EKG$Vy-w@;kw_o)5_yCb)pts_!My6VxMTkB95zqsV{>b&be=rQxUb}@qOF#xgTRL z#HP;M^CsHC`@*b8%WYoX+g4^-miyhmEv9j=pq>2hVlxHvgPkW>0)E`ISZcq^-TwPj z@4Lsv4|E=xbA|huqy{7F1eJBHB3-OMj-+=@`7N?ccF(E>yZ$?IG>Xg!6FA>_n)mwO zTBl^Eh3_0+zAN=$&23u$`@(10A9ES+<#JeVE50kZJy^K$q4>WAOFF(VE1On zr^Qdl>s#HL6BaQeft|;5zJe{AW}}Fx=9Ae9LI+$6CVy^fdiG~yyY<2+pS{>D8ZEAw z3UA?y`kZpPYxb8V)<$tRU(Nq9x%!K|+?``)4@47|ukzcUH(x|_qGAH$h7Ug&-SYOw z{HyqR@!6t7HQlmC7g-KYVfAWKQMkz9;+Vv((0)U(Z2cRf0P*U5OMkR2GWHUSe}4IH zpLpE2`@jFbf3bhxg_l1U++DTn``3TRPPq8YeXf4-YW!9GJ3saAmYgem`CHpG`rBc# z+afvZ9Zz+!2zM#)9r3!ZH_;|VY=>Lwk-s*Di!Ptrw2d!s{&8Q;n>!ZUJ(J?kpEP^@ zk7fVL&*Y~!^j|OL`hC*BZqiPd9q)g=UZ4N${rcp0Hx}H!r1m;2tYpipuNuAeoVhx; zE4CkDzNW#i@zJVd&lO|GXvYP-uGtUL5BUD}+u2{aX|CRsKfk2quSwf|VXl>t=>AaM z;F)_o@$VLk3+z1ZyrDX^@q1c|&qb@fmy$6&eP~a@Z=PjZ9lip}TE$Jy`iuetx{a&^UycQg7n|Bbj(!dL%ezy1Yo9tP(F z3K#b8n10WH?(tXKb*6T=x2J?&%2t_?uv$%Cs8C-pg@@q>N8d5onAMke&Eo%%VjOq; z*w>Zr+g_Ic|5kS`cYY$R02zio4t@^;>79PM6CM)0e(< zb#JXq^qLuyG&x0BJP)Yc6&3jYUQ(ccLsaSgIWyBvKij+M-TrysU+2XfPg7`SIA78- zziaQkn#22yl$F?4xctyq<-i}XDdFDENvzq^H~nZy++4C`Rre~^XH$i$xTgs@yvi^$ zPRr7KT%GmlRB>|MYyRz<{#r}le0qS{H$gt2`$OQB(5v!-_oajRl88*(sUqMIX^qM{IQL4MKX z*#Zg<9F-0gtt^$Noi&mKm#&)UBXYzrL{y)OqVCAI<5hUH?bzVcVVApLgy* z{{6dkrzpdN#%-(&+zet24f9P~-`t%lvV2CjgI_tY}0+&hEGMuCPkf{c;=c~Sz)&D<{e8vdgKNFO{@ymRsQNy8|5}zZ|#QD zAL1^ad}iV~-7fS})clrAFX4ZIdOfipXR|NRO0~JWB300LtEJ^sqhoFIzxR8+jJ{TM za&{c=sv~>Vzn*-u^4i}=a(C@E`fZ)8dU$cI3(u*=`#l-5T(1e{hJJH=!P@`l(qzw_ z6T4FmMa)-wdTvhK;kZrrH?-R<^wO9h+Qt^4)gj+mxh=MLlI}Dw$?m$ho!%QVmbZ2N zSQB?QZ&UpDWhWMNXipGh`Dq{##vf_Zpk>*;Y(o0+JO5b)Itno4PFQPrk~z?{mfO@3BRX{u(fSpmDK52+qA)X^V~HDn9GWG&g<5>!h9n? z#B1}~=f9GI@*1`V3C+3|FRm_?(Isql>d+@w8U5*51u z8wHg_$$M{EsdREu&HMKB-eep7xjX7*ISq1NCCYkJFI8OGOYURWqCV$pPh@~aqT_M zqJHx(9_NS>NnFz5ymY4M0UwDo&*ush+Gw+p}Q1l~YL7oow?{+-b}U)|@Dw z^S(ml$u9fr3cNZF0&K4qb$FfmuD~U{nPGz0&Tg%4%g^^7E_8`d=d`JF6IYd3)2}q; z&ss?vwx{RQUa~zcx>i&?Wm%KVtI4KI>gNeMC5tQ+`f0eZ+$OKBY{t%(g9$TScQ0mL z-CAdPf?I%NYsWFi2}-*NzW+6x;5H3oD9jv~7~#vC-n-w-0Z_+&kQ& zlYYpCCN8nKUVE2$yM92?nQHZ*uIICpe`x4TsMzGe@G52Y^;IvoMHbr!FR)qj=(k~@ zokM4!@{)}cQnpzzNbP#-P}=qO`J%Vm`p@l6Sr+m7bW=y*3)U4zC;F=QCk8TvczT;} zldXPv``n>WhrRWg9iFF>*X?FM#V#K8_=8{S438tid+kf49WwEYrxu8OnCW zZt=^_CmB{u%8fDolD^{AU$c3yrYyBPVRCYt3Gd&?|JxqF=8rXSY0{Qo-kiUV`@mXF zp_u(sn2%XMcAS17GGy+rng+F_)5_l0YMRBph?(_d>FoF33aR;#%|Z{4ezVxKUMsi|TQrlvOZ75S-y)N_R z>n#snRhaF#vY)%=iU?Pmsoe+Lyo3d3I7=S#E%+51&ETE({cly%r1#SsZ5XB=i?RrH z;+^ct;PK7&t2#&Hecv@~|8qXFPH!(i;ClJsR&U9KS4DC^*z|r}3z6Jm8(VpN*{O$y zLO#Bq7MQ0rt(KQ(nEbq~>Ek+wf>jmF4bP2M+^hSv^0$9S^qYy|JzI|_{=LPqaDwkw z!%V&l%XCl6uUd3K!k-~NzE1wmuD-+8aXh|!;_Dc;=ZBq@uwvt_I>O61J!YNK?mLSmn@{Jo-P#Wf)6c(SHsAl`;BMXB zyDP5dI3Mp>?_1w`@aXb}%~A0eCL}J`_22UE@f+l5)ls>2Ks1zTDc{nbR<7$-BRzt~dBr+n*_Qb-1h)o4J5N)p-f; zDueiAd!`)Rcj>I|;ZS(m-0thZrK!h zK2?B0KCEZ&g7%VmR-QXLZnuimsh*yA-nZo_08v$|-i5C`eC|*qKKFM$(Z++b!ZKgXv{@5CPJt}BW zX(y?*-=bih-G^@;xfj-M-1au%)0?=0$MNloOPCYZ=!%#;-(%9o@I`!g;@%*wdo4S; zj=t>Uxpwbr@g(sDCUz|>7c0KMmRQB*#8*1mlOaQB?f5z)q z4SLzBTW9Q>v^;fvsKkwL&;31P_sM2+H_u9B|FOhcWRA$1eK&Or^qd%ed9RF^-_up< zv5iASX1de8#;<Q!g=`;nrnlJ+`DeY&RMUl2D>VogCK(+S=$ld=;e)?~fZUna%KGp$-;ZTPcu z`3JUlxJdfFFOc}wUBA^%G4ti~_f-uWWt5FMhY$Nx@Guy69&(N>CI%TiSm1Va7U-C2ZoZ7pQ|H-|I-ACpId^QtLYM;~e z|NdNsE6frpjx{Q60t{Ewu6r;QKbK+1%I__<-{q^v)jI!Afc3n(H4X1Jcu(FvG3VeM zm0fS9)^5!_tyZnFzUy~tIpYc2UWT?++mf8M;@>d0>fh7*suuDyWQ{>>GDGvn(`ns{ zWX!$p-!_wHW~gY#wvp4FK*HkdI; zUt)PAn`+_|`XbI@$?hMEHeUDNa@7Cz5=NUR-`p7PerI?ReP$m6vtMVws%48-M4yZH zL#-FOOCNn_2ytXswf4paF1>xT+Ik%rl(!zd;ZbW)wo9#}e$%1(8B>0AovsYAn)vdS z_L*BxG-~eWN>=GuzS_8Ur_KZkLzlxxk0+KhoXKGPFVlTnB2jJc4i@_z?__=Fad&DR zU}*VJ%fKk$@W7T~aqq$#E9`iruev74Uu*sRJH*i?J$1th*{JPCE)~1%nE2cme=Lmn zozCn~%`VEi@1)pn<0Ff$ZPfkhpC**rwZ75#B(UIyeAs!W1~Gf?1FW?yWeY23Upy9- z{4TO(k}UN+oYK5ORO5Fuh@Gg-eLitSdU5DC|DxAbBewp7Duo{@TI3X7f9l6D{Oz7gGYv3Snjn|yb_w%+H}V~Akb iz>vUr;QWnx#?x1CynnovcOe4<1B0ilpUXO@geCyOG^lw1 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dizzy_face.png b/app/assets/images/emoji/dizzy_face.png new file mode 100755 index 0000000000000000000000000000000000000000..8001d6ff8f0b8380298d77a6238188f516e5a188 GIT binary patch literal 6278 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE~)jb^V14c&EC zz{z9pPV?RgaUM>b2^p7W$5x37cw{V8?rM+~5e;x~bPOzUa6J$>OW9X-i;EzWN4vw4 zP7%&V1;$Cc??p|vec#5RV)3}=^SvLnudR=7{=ezk{?j+p?>}I9@Za=bbi;qK2jzYS z=T5Hl37h19v=o#TlU|dZ)BW)-d40i_4mt$)lKid z`s8k!xVGlWYKg9;GwOdZEh#N4vc7rx+RNkjw)vmq*(7WKea8QvZ`7IB&yknU*#99& zL2sW>!=3QIg_T(hdj854x>f7VZk`CU`xMG^G|1;@Sf70i<2AElt>5MkYjd*w_&3kB zH8)due~5)^o=Aj7fg9_Sz2cp#yR#m?`n0>ibgT6za~_AfUj`hzt{ZPX>9+0D#PvxU z(~`8d6=_T_`lrZM;NWa~)9nA3fZI3UsQ+CbS26L()y4T?2d4I~dhlx2w+;FAj3=Tv z{!HOY$yeLPY*}kja8DLTUXRSg^ zYz#kZ^l_%+)0xsQYrctokp5`Sx|c3e@6A7E9jLYop1o1=g>wAS0G*>DIZp%ho`&QV z{&2t6eqZI!Y&o<1b0;&?+kVcq{_nHEwp^?8EYFdv{#lC@9%nvyqBY51`5NQ$;L2F; zIX{1GQ;`3u)t02WEJ?e)NOO5nck_;p%lVo|a=Y(eyl4C%WmE3M^U8mV^nDW6pXYG8 zH%H*f`nL?f`MF(YMI2tZ=TbuJf%NUH?ejYq&*)k!b86|FQ@VVQl>8o*?RMRf`|oi*E04stfBtAWFXy*O^_2TlyC*kU$ZIc3NYp8K68hj2+Y`B2{cp9^6K>vS zHp~y=KQsTD^vZ6x$7j}+H`aWMJC}6BUr$3cMH|zblXrA3-Z5<($5J7G3;CCsbL+kZ ze%*6~eQ|=POhFP?S*@+4K2Kg>oUYSF#fwd4rZyMM4)U&Dz2ou0RdE^7r`tX@ODlip z;4b{7e53#TUey%k=$|LT4Mn^SMWZdJcw0`5mO0`&=ZLS&(a<^G!7V|Z=WA}v`t-Tr z+|TJh?CP~eSiO@c%s1o+cC+s=>kQk{S?)MJtKO+U%kM?xVx37@Q(f;@$-M}j{$%wu z_p@Aj5tiu!1%-BR+|%w0A#w#ukgN4Q(mJ25&UaHSBxqceJy1<&VVYQEzU2Qq@bX z<@tT_Wy}#ThFqLM*R^@a^pKY5uKd`GC;vvozn=7FBjdNz>)9XQYJa#Pe~<9_Z>!p7 z{X18&<*{sp;rG-z78~R&)3-mG&MjT|^wD#TA2XBu_wvuF;@>4E@GW`$!Fi^f-wsdC z=LBV0*JKUk1PP9*uFX5Vn-_B|)pw9Ql%V<`8n`A{)mO5fwD76$u5CakULIu_t_Gz^^o#Mlc3 z)eD8)3q{ilr?X{FToxpH;7i?2M^3+M^6WSES^w8*|F7A4 z>|8#6DIfnEcOG{B`sSF0MT@QJoNZb+9?ZT8E|AZkeG5vV)$1Sc1m%IQ&62DW#4>kX z)Yx(HPI>Ibd#nGwOx!nJe_v4JR37(#kGwXlU&r@*Tgti3`!>AyX!`p*<-wDHH8U;> z{f)l(?01Tgci`=>7B}Xv-|i@JS($J1u`AQ~tF?ZHmsKs>W}a#M?P0~w6W_zjP8Ckw zIi>jNY~4orcBhytYI%<|);-dBcS%9_l1lESiq%Xjobq;8N2sOrKRtLJ)46 zeW%MU6-jCKFFA6zv)Xqou*+S}vrZ}gXu%DGZACq=1p2HFre0{-d3_@DPK%r)g}JdE zpj5TRWAYZy+v|5~te*U|{ol4PbHpwFJYVrWIWhhq)0*|?AH*i!zqL@H+A8V% zt9vgZ&dbZLwpbWz8g6q_m50^Zs<5%DA$b}U3WacFKKqpt_xvy>v?2!<8L?g76#}&eN(aA{@dD@x_W$Zk9I6%JQ8_l zsbka<&s$42zA*W5^~3zq{`9TE&bi{n@lP9%wa5IK7X0T`1zRfPwk@rHcZad@KX^4U zB_&tBTkt#kqVuwPFD5KdYALYW_PA}C_A=geEoL>>wr|sBGx>1nS?J#h<&!R_eBQgE z-n*ulpXKiBnYYZ=zhS?5YPoK0yu1`QsHS`ua98xy(m9dV6@CW-o%HzPo*>24(dCXG zuij5~wSJ#xld~aymf)G|o+fYN1O9}ECdP-K77%~9yK}dK$e#}eeRcLc{o7YHJaGvx zS@*DQ<=;ae?meD*;VGZ_m(`Ek4*KqyxN#TjI@#U*Pu?}yZdH4HRiVW6d(ARPo&7fG zGVlBTl`Kc!ocUeX`E*LRrMtsUUjD;7pAOZc#~T6=8J3p~FdEb;tWe}{t;ms$M%ySL(%oxD%Q zg{IE6x)PTUaZ8?-et7HV?#$@9+qwdoGMuA--D&Pg?OgzB?fBn)e^}2NG*xs8lPw3F(_(``WY5Wdy-1ez*?!K;t5y7`2 z3}$V7ZZCQA>bymlecpu>>#`M!m1j;6%baAEIVCJ}UmzpX=3mjhHEWEC`GCL^9s#;Bsfb@hyJN3G)Nbp7}g#YBB7#!LxHxZku21UAV7Ho@&)fZo$Nx9mMY?Swkk!s%?H4xq^8EYI9`k%Pl_QqtX(&ThQ3|M+j^2um}V z6c;=-+%X~0O#Q)Uapj%a+RgK>-Zhx;$T-aO0oT0-Zjsx;+KU^G^yg&v9hdv!n!is@ zx^>#YD~>Yz?oa;UcI;-tfohObs;+AE2d@32vCoq0+x1YLqfhoNR@`QE{6O2i0Kcbk zZhTLi>Oy5?N<$Zhhb(K8h*=0p1J`EzHf}g$cg?rn`d8KT+Yk1;7nX{&M5}pX0Uf&eP+E!uk)DHk-!)oEH-z}N zF5Pf_vQ)H1mDH)}hCVt+??{}M`TF6m_|}DU&hv5|b}bSRKP>pO$t=(1V0`9(PnA#i zI34-=&o6x&#;UQN>CKzBn{}R7zGJ?}_bkq;srpq0+v+0^j)ZS?;d%eH=Z6~K^YZJ* zzLm!8;Jd1FP(!Hi+0+{@OO6Um)HvaFpz({vdbb znBmZU?hPAvpYQp6{-<(zm}^Y*iM@X}adf68s2cp}a%$CARxrH2Eqk@jCf5nazJ2l7 z_IZ~j*U#S>o2{qqmG}G*=_dH%|9;UM+qC=SZ9abKp0a;IL|3H9sg-wPCM$J#9QL%~ zEIqd>W1g7%qf^Hh+NiJL$egrozxabR>4jaz(UrEV)-UhQXK_6D(_2|WXHw(h86F)b zo}Hyfs*;>r1a&1Y2`Oxh?&L}0-ssDu-1yi~;7z2HNkLHfqa`&IlV&@zyeXuwom_fKE z_sCa)&R&-&3&llFES}PzB-upt3WanR#{2LeN|s&o;@$;re)ErqiudN;*rg!xqw{V1 z;wO&}TwB!IQ6Q2$xv0I{InZwz#}Ti+N0lagPc(p*Xz;MF) zLkVo0$&4a%9Ip$mv3e+=uawDl-^*sB=^+mD8{Qw&lQ(2nYD}6{_0VtLBeN|#7qrG( zntax6|FtJS;-X~ou84_~1sVTHEN-&=vz<$ATi1lVPe%JCIj@U9)OKS1VbYVoIl-gb z#B;WZ*Xy(Am~A?=W>;0zPcXJ)sNAgm>G}-=Hsh(W{y953f0Q_X*qy|BBUYnM@c!Ym z6&Ef}Y1-X3&3%7HoobktOVJeRTkN|R?YqkQb|?Fdohl+0N0r`~7#eknDxCeYZ!yDl zM^=p=N>14`Og>m2kOwt&BL3Jc_+cgRHOKkCgvRn#2&W@3>VXc}eaXg7<&8t4^m!Da~^Z(>5J5;KC@MD?6k&_~g9=!tL z`~EvCK#Os6TTwkbUa2+<`+}MsZ-1!D_SPN<{BXS>?0QJd`!{F#KK3d4zcI29>D^Ns zm~mF_tz@*^V~tOua#=pA%kFUa-gMh@X#1hyuQnI0u82Cn`+o7)Lf0#SESoK6ZD$T# z!;x+IXL{j}^W1GayqmXJwAH_?ljKr(rJMEKSoL{k{hvjF8#G*`<=q*#3Ek$|r(Pzw zyK`^r1+RVOt}IbS2djIU)V6;)w58gsefq5Gh4rR-J#&o0zq!A@x+inrHJ5wB=*c3d-}k+Fd-0aN z#=gdr%lBCGu!}j!D(A6!A68iR>yIedx?OkW-I+Ug`I~=|C`{WDe^0+kS%>E$Q}B+r zch}78SCdRy-!eI6nSk#KhN%;_88GGUc-5c2e&5O9MUiiHW<)ZjZQY)*%dcLl`jgKA zVaw_rwRX!ENxccSYo6Pp+3>P<-&Tt+%flNix_6s+cxTqj=-P2D(tSGjUDUq`-{)`D z-?3)p28)nj$HfPD{z^)xYYF6Wj zmWjMJ7q-u2{Wkemu7j(o#epAM-{gWD-ac9IbAOxj|IGp!ySi3`Z9AR+mzh&~qQLXV zcgz;gFO5Cdt#e4GPUYj)8S__NpD)Q;o#f(kNY>&M|ANn{T0iXi|TLtt~D-JpRH67sKO|ysF<`}vn7&$i{P%BzVw>A%!W=)WBQ26w;)z&w0XKOF~bKG`!r#`!wU;BBdtzWNX zTqwA*M-g3nqfAo%iJ`p|VNUuzE$Li$EpZ$MXJ06<8Vv&-K#Pdt( zw;9%P>a#q!v_@f{Y(>?Q_pKqHcdnAVC7A2R^1gmmkFopf#8;0KC9WN6wx3rJf8n6? zdfSwPAxTNr`8_*NGb_LQcFcYK@kdT&wte#=_P)FFnD1exjOeS7}Jr3o=`ZKmGBWcGKPcr`+xjM%*9WSYyHze>fJET6S+#ler!gIpOP_ zl^-u0d7~66aLDio_r8S>dRcNq9e&0|hTM4EwerTPg)ygA-g%U;BSO~p|8LO+KMqN_ zT~V0TR&7<9Bl~{VrUl(k*ETEXR-dzvpWz@@xTV~!qT z9Qd?^)rAf6GB0e8oBy{~y&GIPRF8o2I&m@1oNasdg*%-t3o_c3b<; zKU#DA58vEsGX?*>>V{Sec9?8ts+;M%N0`O&d(|?tnPl&nwBn%tZ7R5|{r!Nw%tocW9Pzx!9s6;PzO zr<1|h{_&Z4d!`9q?#ReFVk&&5HhJsGV>i?!?i&c7zODGj{(-#TtnIC{72kQY2r9aW z2uRjbBpn=0|@e|37?kQg`67HKI??E_&)&A=~)jpnQn3ElP9 z!RqeS=qgXEmuu$k6;^n|BB0W7Vo}crhiwZsY3iL=WT4b_!p!QEONoHEz|py`5`wN~ z%o7=yxtbJM7&{wV&Ti1i>v;Zmd5|#Y!pVF_2A}u7d~Y4E75e?(f6M3pzTaEr<<9=# zzv;j11NFQ+m^^nymadCSY@7YdiuZ7SsZ{(M`LsE9)k^Z$JCZ7EJfP zzh(YqgVK)EJCaIfd^&5f{pE`z9G5$fD^D>FR`#*?={A`=_njtle`VkG8*RBa+iNA8 zH~v%Rd9mcOq(zg=MZX=l2(CTzUk^_}&!(3&3}s5&Jk zZ=Ct~{yBz8uO0`u@t0~v%X6F06?l{$FUZLKNasg@%Tu#1x4Pp#IdT^`quswB|JJFz zq4<_Xjb*aY!DOhj6XQ+Uk`2|8joY6{9iH=FjP1#Zn!U$Yu9^S9Z0?`g$7|l{N*-ML zG3<$H=dow^Zr(7=Wcjwwmb-Q5=>h|Lan;%O2Pf+OwD|W^P3Hc#nGX!lf0VktLHG9t z{bYk_Qj<5Pd+?ns?XsNtdzEBCw_p0p=Rs+Gyy1PPUi|sx*25})vSaOjH9_ll@0W8~ zd^wpVb91|2?(jleBx{@elVbK72PXOevQ0 z`W*i7$|FmQ&vz{T{CJV@r=p(!kHsGCeLEKmhn4IXJHI8nBYj=A!;0hCRof0Ow|ona zA5bVa@4PbSj4$64C%^C`4bg{sa@(wWch4))PQO28Qq0thqto8$ZpeRkKVVa)uGjUt zhWF2GI^~b?9_T;3YvGeVzKV^pwO_s-RW!cSm$6weZo2HoL_Zbx>Ip)^OaJ+l?Vh0U z{Bo>WiQk6@3)5EKxU^k2*+4AWXxpsh``N}bg3tb)wnot3O(VVCvUm5%xA9pAbRV|$ z9X{L}Z!el@w_V|0)1DIbvQr%*YyWcGf42U>%IW{Rj29PwIDFSU$@%-V7xU%1Mbb5d zl<#`@eppnOrZ&qYvuT;{>{S`p)<~L6nV)@SgW{_nmnO&v^R7SKR#uqjlON2#{Qavl zH_jZ4IitDr_X?R4t#eNF%KTSlyAWIW^Fc}f&+V;~K1^m4yz%!(hRFK(=1WJ53tvra zv@l*G{OwzAZ=>YKj_uJCW#q&4W+}}!&+ik{jap&<`pQb?=7Ry8X`3Y_B_*@wAM2Gq zJbhA+#mZ?q{oKV%C(UTyIb-t9lZ`PaI`5p=s5VvL!<^}x?knr9?!0E&<8tuJ@qkTv zs$TK4nl2kXy3f0Z&wrbT^Qy~i`6VJorVk?{BSm5uzrMcSemAduk%ok2k;>K~_QalrNc`bFOH(SUOFd_fEO8>pOeq zd{biJZ=Yvs>_vip{j2Vr zm>6?%=AHi=82`>Wc5`y-#LDP9v9pD`nmE5Ns<>LMA!{$8o`3q-zITxs4-1uU$@c9k zeLYFTd%M?$*o+K~uI}!_hw0bX#THn|<$u(e`jp?(sJ1`Ui7wWJMO1-?_-z9;ScrqdWUU7eDPcZ?ADgPAqeAb(>&tl9k1e z@!aS4`~UBo#MsU!`{>sJvwy!f3ms`uak=?q+Rjw2of9UX%6&dJHe}rspLbUZPO{y3 zYOrpuV(}~H!jjWpUuwks)9dq*>$$K3r6y^VXgqa!Bt+!H_E=_wBH3zi;Fet1g%{fRlZCOkawZ|3BJ zh!45%#WddDli05Au5{*Q!};frJ7R@yZOLqAvlamduU@_?uXp# zZ510MmF9>U2L%P~hzRALHD%hgwjVz#N?WhL{<`62&YorKzTCWdlO?>yblK6QMCsDy z9lgCzEsuSWzAY=)W+unpSCXqBvtBj4C~Rl&;k}DmXEB*A=s#U>-(~wJ?eHtTUk`1l zKNqYac~SUy-n#xrdS55zY+rFCC^%SiO_a)MF)=y0zFS+fi(99!vHF@`P+-tHkAL3k z3vIP)!nB2igjV&)YcU(`4YaYGq;0wS&dSE96`BdmPi|J9_R0OS|Hb6qLz2P)N{9MO z*EKJ0>W^N&z&*+)Xis5G&nlNiXM(ri?v2`-wQ{jt))fsA5s?Q68ks|ret&yA!zh(Y zNm)6wrKkrt`yMJM9^0IMbmm4y zU6FWS*=A?v`~wsHB%f-$o6#8iw)V%Kx%}tNe4WCacuof9uohhL=y_zh=<+h(;O~F$ z*Zt~*NMuOldVlxWFNGsEPMGhWL9{#L!a}^ zk0C9dv98TMVy=Cvr$1HyuH_3i z5x$pAlU@fG?vR=iGri^R+Pya}8Og1`*6UKWf|bqJCO?OZoBOou+L)c2+|)J*?XbJh zFk{9Htwb};imizzmaFgV7vYsxk973C61J4_u8!4riD~scl0Q#|iS)?!C{3%my=2wI zw?_}^@N)?(e++Gsjz6+%g80h=T-#-J59vt!Kk(P0=n2Pz}XPjB@)=sis*F#N~M z%gd+Fe|+wM?2*SGH*EUTWbJ-k!@6?f?p2A-n|QCd#`r{rCMG6!baW)VoZh^f_rB!>`JKUs z(=Kj`FbR}4{bhb2vF1_zf6M>Dxi_k#twpwWg&UrEeWW6u<(qlGYoIZImrF^Yt$Noh zi-0GaAI`Rr?&E#imaLp7_(kLRNA{|PUk=LDSnuNJTJL?-UgcfFYR1*i_IEl(zSaNs z^Xv8a(1o(rWor@|wwX?AZu`(VDL0ejXz_8wmKPh>d2TsX{r>IS6|PsoA;3_{zW>8a z599dI)pPf~n$UP?+D0uKHD;wXX(~}Y8Oi1eeb<|u;#VAKJ7m(h#s1EI*}m=@+zM`A z4jp`bIbcR!`0f1SnT0PVI%@no&5=|2w^Ao|%YsRqYZ|2Ub}XF4D88Ucvu4UN$v;11 zcFo?ivN0;e_lg?7$LGIN7w%`q{NAG@rk&Z)aqILYu{S456g|9;v>bG_vdCsvJS);N z$6&FKxHjK~jxz-!W<7g2lnN9MpEJ|?=Gm8QlICMCVsFFX`j{>G|K`UV)9z*8*qI!? zld-0=XrAJkSlLsSeEr)dS(^rQuj;(@Yj;ofA1Q+y3u}&DowWLySy)5QhksuJ*7$6T zwV8P!!u#9v2MQ+JUK(27YWce|?2W&0M?n1z>BUk3jP7!~LRTdzc&Xj%%`KkSdN}D( zb*mQ}OV^x&R#2gFs+=k7OZI`en|$}koYf65Zdj}u@nmb*>VpXPlU!$13PVL;DbhM~u=i6eQmmlp zPg!Y;)*Ig~iQ$V~L~LyY*pKr&_8n$Q_jtf|=Y`H`Z{90TzE|9OL)S32F4|Tr^2SGr`p8-GTSb>;Kk}^m(HdtlxHmv3l-iPxcGnUfy6sM7MVPXkGJz)$e7Ak zH!X|%M8kv$0$(NTudWKsxV*P`}^5v->Z_eUf$!t=^EE? zH;G}R|2x@l+d38t6s=_7J98^V``+}6Z!^pfl*t|U3{=~;kS#0FG%(u#;*0AIvz>VL zeJ8uUKRM^V#@ubogK8vSMTIz;GR2pziQ6kx`|HcflHSWtmK)!HJbm)g7gMgX2wQJE zbUm5<(S#25vXdeK#oe5{FI`REe`94>EAQ&1TFXxI6;D3%-__`DMX%I~)>$ihrT$74 z%#E$TKZQg1Uhn3FSfT5Toa+|m&)9g3ZO`X()<2$3kN>f3`u6pr>*oIFd?>Ay%)uvG z(|MNr{*h}d`IDDR9N1%eG|W)RJ~FKCEhr|k7MW#z$#$^ayYAx+gU6P37HcM6x}`LC z{{;hYrYjd1?w$BhyZ;T3cE$O3=Nmp1AMcYr>~BBk;Q8f#2cGjB{ko|@??cp#|C1b{ z$)%2Wg8z&+lYgfbD^96A%C2N}(&*8~%K|aN%sb=?44=$8@SW+ZRKcGgA3qhFt^WGG z^|Fjg_pFK5j5}F+a;5UK7OG_}KDLU-pnPk)PMzDcQ$mGx%@*G)XR%!JTDki40XI`K zM{B+d4X3{U+sdLAX_4IAeBqK+ zeLUQc*BY>e>+ecEJ#B`0zTCn4|2r6`9(XR$9^%?1)Dowsd@U>c>QRSxI`vr#m+54` zwO)B~J!6aSa_^m|SBiYvH#0u&(dic5s0042Z{J=GckGw5{czdeUU2$RhX3aktz0}p zO}4!H=rUzxQ$>;5_otkxPxaUT>|SFPo3(ZQktf3UjxL-3GiAvewvS>~Cn}HFh96bp z%vkwMZ%z97c^B-a-vk-5Fi13bk?&KRlQTiZ#EQ;aOok4fS6TY)>MD+p2V3h|6xVeyx^zYM-&u0sauT?G6(GDdG`k_q$%#Gs#1r+D`*Y;e z1LalB)Qk&m?upVqe!Y!ti$a_ra|Qd4T|HmYd~J3@wM|yg2w;{eo4fAdT)(9a`~u!b zJ*QoEQ@gMsMCizjFX49?niG7MH1YlySwGbd)LIDOHZ=@gz{bM4=jO90Wi^kT`xRHe zD2mLzt~y=yNBguFriHd%ocpraUa&eVi-e_Esu!t%nlo7o#Im?~CN$*?Kj0v3~A78V+X36j7^vzK;HA*B&zX?L0oTk?{1gYpy!6?KhD};Cn;w8tm|R6p3*#MM`Go}N&6KS zg*K|YEMHx`*Vq2jL4(KVeLj@u-xOE*yoKw;^$nBqW0TJAIF{yMz!~r6a>}II;n{DY zT&ZW-unrfvx3KczB;E@?D|A1cidl7C(In-~jDpAg`YyAt21P4&UN2w?@>s@`&FU?j z%6Du=MoZb{l9wN5eUZ?Zy4Awb$N$o&3~*Px71UQeId#s-zng0O1MJ)!C$X&aFPEPn z^w?&${Q29d+(na3l+QV@dr)iGbpOV#^J^C@^p(F5t?FEG)A#IIKW5)01$JjcJI=+8*qoq1j#`h~r7&UMkGsod!&jh{zPnhovKo}4;I ze>mHy`Xf^$H->l=6kp{t>f@LV>VI?nKY6r{`p6@#S4VomcZ% zab~-}x96woKc638(G7N+Q9MI=jii&nN%4l~Tg-A!+r2q0(Q|Z0&smu>N9UaJ<&zR` zy|eB{ea{K?hzA!rmQ;S(rKWr4pltp|>3GS9L0xjwKh1flIa@CO_$7gNGO10|GA=(o z%%Y7p43wtd2{tb(kAG*()c=x`{B;{cA6z~0!$Z$F;`**;-}-#}_J?~PCZ5{ona3Ke zoHB8;;2g~dr^UKvFK&bl&lulXT2s6F@CUnO!)0oB%I~d+KKXFfzspn1RKGAySLl4g z5!w0b*a_o`w!rIFw?lSoKhHjYVZwCw9X&hCcTPEb*yYX%gH(IC!%j}wC#2lHQ6kuR z(lqb*xKH7C82(>%2s-zv>xZn}xp2vY$6~hB9NaZcCXh>|;!N?LW1z4RKk^}K<5y9) zzpJDk-0!$`tLu%}k>CTWN^#wZX=l6+t>4AiI9qVh+3@AtGF$`ius*Qtzjo}D-Bj23 cxXaaK3`n5Trw(q)pNJ2r3@hO!5Ks{EZ914&dkG^ zzDfJj6}19)xN&|}iocQjGh%wm{Ik15?Z4g>-8a*CyM*nzPksNNe>nHk`mFi=#Qm}B zuNTHlvMA%ZqIAQvLt&xg&J_Ww0$ZlKR);F_g;pKp%?e%F%B{6E=F2kGu1V9jiBAbq zQ7Tv&BeL~`YDdW0SdS2OvwN}X+rEF1Cv3-A0f#*S`oy_&tO*s|a?O`@3!v&+Rh}Ic$e>7woIxDg3T*NW(>>?E~lgDmj^_2R7x- zXk$<~Yjoy$@tI}8J(-6JT!h(bbMoIOJie9sCT2H7@}|x^K{J-Csckly@AEl7{pKJ4 z{a@wH|3CVl!Z~N(_J8ln=V!!ch3rYM?)-gjsft0BZ)@IJr}U?GGL}ExG`)qT|W^$B*7qn#M14!13R?g;Sj^ir#zPDST9@ za{BwC=+FzrCt~IVpI>X5p=%$`EN3yRX5X{l_upLGJGJ$Ov-!7+E2BD`r5}FM)VcSW zW7>57gpIewHoSADO9W~4^ z>^iQ=eorn`bZj?xYt~qqqtX@w7>$Bm4Z@^pG!wMFC4yki)i}6lk$+~oF%dz>LjQn!m|IAiez0V4jRS6a6 z^^5zOYw?W7`ds3UyW1BDyPrvj-6SPs!=ZFYu;;@*`BSnEJGuHEzvE;#bKWUqY;(T( z^k*9>$HfwR+yX9MpORf36?)@jVa^O~BXiRX-9?^T0vBKV6>R$8%f)B!&6J=2Eo_y1 zuJZMSsY0UBafi*Ym-HDLkw5RJif!2W4u)CqROo;Zfirc|E-iL_%-jC^VSPL z_wI_h!FZg*hL`C~n(>#ry92v#>lDx3*w9paa+NoO>&I!Y515=~3Ol$(CxYklvx$kX zHm*F}k|?#oV%th0jw)iq<1fy!uY1| z>?13)!<$5!pGA31n=wP6>ck$svSVzQbi{M7tk~L>wl>x{W19SRhC{dFuY3q?-2Sjy zOx=9K!sn2H~$r$)>AKjYS zG)ax~eCY!h!?I<3%Py}3g^AbMMRR!$eM*)r_YvZER(@Z4Xoh8Mdl~h^G zNlFWO;6Cx)4JD5U`D@D=AOGk*Rd+sOp7S?d#y7^V%9M4w15JF-X-*Yq5$zF7G?~|F zmbE18qRuVT=Cq4G|CO2fWR3Qm2%X=}5u513xB2}Gy*#Dnx{Q+%Ma5DA3K!gx*=m!-dc zBXRBDyK{zJJwjeSnhU=lo}TuE=l1$UyL-p3Ev-LTkHbOV#@5sbBe29G= z=XJF?t{e_hXM6PW`PH5jl^AQymV3zkLFs8^Sc7Mn_lcxGY9B&*!uGenxBs2^=X$tZ zqx`?e=^tO+ynp<3{pZ;`4sA4X*{;<#n$1JYbleZ>oW6gHH95tEX@c@% zmg(nvE(tihO6>b*6!+_ru*CZ{2f2i9Bywxz917vf`*VBx$5+Mk+Zv~+u_WyZ(n~om z8M4uGMv_nN6^$rPwOh8~5iOlLhkmrN{dx3ohnUvy?M_atNA)eer20y(-?TZJGAk+F zz^y(>>7|a?_v&N&`sPiIoUY+}AvsOMm$l~pu69M)53hEfSCsvpSXugWf6Tt;7Xu2k zWO>%riLbu@OL;~g`_o?mrzUmWw*96$xi&#ZYGtTNu(f21>kO0GX;;>4mv(6Qb6H2Q zP^TcH;Zm>vEQw7a)9d;aW%pI(2FLm7=;=DMocJ5*S^VhyJ|1qJ#RiSXFLl_8P7u^^ z_u=dKTE_+_qZggB(NKn>Dl(b*8ihAXM^HyXSIeXz6CdTONU=Kb5)+cGGkd; zqC&R;=j?RO*Zn4r*A49-YJ2Zmp7bJj^?~%ACD$LOv|arw?QuADPSt~2jxTH;J1HDxPcz;X1?e*igwqEDF-I6OEz+*JQbw*2X&mpb{<)^qT3YYw2+?8z2Ql8Tm z7w_s;YUVbXXZ8C0q|;GHqW%9GJxXJqms6YBkn8^-3p>Ru z0mSlIp~lnMB6j{1T)I#o_fPy2&= z_P4FLDCoP^ugUrNz2>ilP1#q@w0W>43aV}5RE})jX>wr8C-$c-(i_ffdhP9*m&03- zdfNH>iOfUSySH05uCcwnuk^RF{@rH|dERT6sOFbGa&vxnxpJCVsKN6=1Esx4&^CscdK2U4a?=A8&o0-#(R3@M==XA%?kS!f&nbcZQqA z-nk>k?a8t%S#q?jP>Yny}sd%8i%XR{pfxv&l}3Z4-y^ z&6bNAGq{-prpTr&H}?(RIiGL2X4v}o3AZn-U&pV+WAo$Fjn`h!)ps1ZXIs5g=;31j z8X154&ujKP`uFL6E$jYIjr^B%R2Ow`-M`-dgYu=56E3XjTg0RzWW`eZ>HI(0`!yfc z-dR*J#oO-hv;XsYdW!R57bk;?Eq}R=?XgYT#A(hUV6f;wI#bw&)^(tSal*|lQS{j- zJ%`1qdwbM1-R8^)R**ki`1F^|R%~K_p4v%xA~=U zuI{n4Me#G9d6my3ZOXsNf4HIi{@~eOUd!z>Vh-s@sa(37CSIlX@8==5xIJ5rX8&QE zSNDs%;(c=e<2Tp$xAEKVX=&Ew|691~XR5lDe177tk6fGUc-|ER>@kpBe95xs^z=H8 z)3XjVoXqlQow(*uOxS^(X?L&i@m3t-JGh-q*leQgm(5y_cCdy=2K0GX%)W3-E?In^ zhWq)C1@GpcV{CYHZeG#7eN`;sbww@qB1=W(6bZ#C!4 z`3N}s%ItSW_R8Fu64Au zA!xemcb&sRXZJln%qNt0@0!4Mot|{bUnY%f4#h}0nA@4kJm$G+=x=+v`eU^T3deS`MtqC5*XA`w5_j{bRT;#+AcZ{~G=ZX3}(L2(-wJN)=00da{)BQ`xr@bIX&ABsp_LTra8r z`fK;D>a@PVyWacE7Z`3n|IK-RCJ)Oz6^kon8*C*`nl921VP;<}IBhoHrKH(&3_Wz7 zRi1S|@!Ytnd!Lf0n&h4TdiS%ESKFNaaCPmJdB))yOK&L2YAd^?GzCip?Vg&NSF9Oy zP1VUPlFi5Lxw}|zu^M-Z-lJ(VPqz69b*lBr??_SW4ixWo?A2wzHqBSZUhJ0AUyJ+C zYtR4wTlwni9ZU9(9rDg^`hTi~-&^i`@B7a6zxU1izVrU?%Dw_c^@qzWwAOWfW@UGn z^I)&!t&3for2lzsKeXj#i`~zYw`vQ|UE1SqU!=Eeuh7Tpce{dJomJvBL<~$#RaLfs z%WZtUYr3ej=#K=Zh&|ux{Msihxgx`Ac6Sel==BL#wgqS;8O=RzIjS^;4 zRH_P})3{3Oh@zolipw(dva+Q2m;E2kO#goR+qSHJ`)?X~vD^7x`h>mPy+_Gr-qg?QUWe>C;4IL_pDr7EqS-1u(62QoI@Dn7jT{H6~Z`NIl%95*mTn{8RVKYQh#9VVCC zpa15F?LIn5Y)gIxOXt$<2Mj+6&CyV6ipU8yyIf|mZFXqPz4gp2GH-SyNB_~1 zeLd&&#Gh|0wpkn$H(ha%$?eYc#>YF%-a9Ex$QJROAHGzgHA3c4Zc*fA|M_;k6CWz_ z^ztN^eBmkCtD}8Jm!;Rr7x_wR<2ob>E^oT1!_Mv)Knx2rZnAgI5B$~=PjPo+mwzz>=HFN{mkke zKabm)3!H~rp3Vq0)i_zjbYEN{po^m;pl4E@@4S*Goo@EHUmLFoMny#_uqz9BUR~b& z?D2zx;RZ)}Ciw{`?K@p~s?wrLZr#M>{U<)^So%KueYNu4CAQ;JS1;|5X3JQApzO`x zuEX_PZU1eb>|AXct1mcZrQ1)b4ZhNSPY-RAHQjJPcri!m+OJnb6c-sdo!CFQlSL@x z;D-~OJoBv@>wEsi9#jKDL2Vo%N(@@ zw^V+3a$?`=B8Nl8bMGZ>)Hvze8SZO&$V9{RRL_DpE`odyFRk#N`#`gFLd)B#AnzMr zKlo+L>dV}Br|9RFhT5O^4_nJk$xPFp8QvM!;C{*JhTx8t)Tl0t#EColoL06lz10@; zPWl{btvE@lPTe*0ZJ1=_x(U-u=kh5E&Xiijby&dph{kQD9QOyEPBDg7(@!tVKb>|` zR73NLm&vSvzsJAZblp2U`=Fsm$U8xU!y*N7-J3n5jwLZ@6bHM`S;D=i|HNgpLk7LE zr=G2@a?>#V^zHo5Z~uz)X1klsRxOgzVgG31c|t^RN}$$d&6btVlokCpipr#XVzt?n ztsZCfC3xEA=?nKJYu0@^<@n~-Ug1cgjjEeU)D-vQ3u)coj0Ox>)$bEc*{ z6j^Tcl!>`^dUx>Q{Qr;Yi@e_axUlkY)y+5O3KyzR@J*j^GA$tBug^5TL=i6+$CCld zUP7_Hmt7X^a%7sDAZ`2JQzR;-FJ7s!k*Dn9%#hhzh4!L%G`lK@F zMK zQ<~XQBU@CwXwl7xDz)yf%Z)Nti3=x$yedfYfBeDD%D2dxg+mhMY71xXK!*?e0DWAPktvOGkyQAh~0T#+eE*fJ#Sn8{kpkoq(g3s z+sT8BMYB>lPxmX|NEN>S^RWLvo4AYfs?syQ9EtfCm*7{h;Qz+n`LSE;HmuwlYU%Ke zCA53>@^fdL7?~HZT&G@F`@-VcimS#U}Arqc1UB>4{Nr zgpk=0`5X6na)1AA+`gsr^W)ZX^#B=r{z zv$vnC8b`+5j5S=eNa@`PwcmP+VjOOMuXUf|YNopBl+pr)CZ#3?rH&2_g=Qy_z(z(H zQP<>UK`S?X(weM!y6W#fyC>IHujHECF=1tuVQBrktJUx8{p#=j{d&E&E?wZ_`d?N2 z2dWwFF@KP2_|CA0{eimPpYQ(mG5Z69XMbEDWt{eh`~S~yMh5AuWon;q2h`47%BHpd zx5_COMWYK5b*rac>iPfRd>t>tAGI?fg^!*f#t?U-`H>J47IEcms0Rz$AXy`_KFJZq4f+LBfCc1hwb_otbjoyw2I+R0kbOS)*M7Qx{O`3u z|4!!EbK4e~d^g=LTbic-#N&r*Z@Tm1GvaT~ehz%Uzu>|osmtX-nNz-%cWyi7`_Ij5 z)}H)-_fi-Ix@Tyg|5LDjX41b_mE>1;4}IS5yjG%mb%tMSWuKGiy|wh=6@05e)|6=_{Nt$zvxjcQ#y6Wg_9m7xA{J%mk6Sn-DeBU+t%=&%vl6~XLmT^Cxf8S&I#nTsWB(vPLeCxIJp;Y}; zp|8=52aXlzu`0efFMFZ-Ztb3t56^4AY|v|XCvrP5d6J!@x`>x^z7?ZI%Jw&GmxPX`U*>i>_|}MhRqw?m zw<2_ZJ^GB_vm-U(*q0Iw1Yj;NfgG=~K7UELO$rpOWP@*I=JP3b!oh z4WH}9E5UE7_r&$(pn`FMTu z#rb|gDeAHt;zF*^%H&l)AgF8jVTb8lzPq2UPdf1R%8V?Rzf-1K(Y}(j~vs_r5$BssC#Ir-Q52olZ@569{uozni(>RP(%8 zZ-;ZK3=PZ?Hq+eJt6!8@=iZz6fK}Q`CGg!d*X7z=7OsbVp9-)3{`$g&R)MN(vpnXy zmQ8uOa@zDq8}=;FN#ee%TfFF_fvl5ExN5fSHd?f zRAPqP;SX8=CBt_WADY*e@Z*4FI^zKir}>`Gy`S9YW-u(%?F?=Tc3g6*l4GfWvSoSZ z3*V=zy%FYbE3;hdUjMrk{ETB#-?Dp`^Ga+oE;qlGPRl>{IqL5xw{5CQm*(~TT(>lK zcAEa26OzUildZh%`?S8?_Sl=c&Ll|Q>u~Qx4SkN6T;_=Z*8` z>));XcJSAxxuJ%)PSlG_S;;%-MqVqqP#0OfZuhGQ<4X_D6-sOIM!2uLof78H!C<^Z z^h(H_tBYnYU%d5&mRA(}p&egOlx6vuFWsgbw&HKwl}|erYXi4TZaY`W(7++}+M?yP z0S8Cmg{i$F9t+idI>i6H411_&HGhSBWn5PByj`25El=IsX7u6vP0Kl6aaP48f3~K6 znw&HJi`dT<7grYWYH{B@@_o6*>!T%BHQaZP%-Y-WVD*XLp9*+yBs$$?H7hxj|F(RM zfI3UV|Kl9DbLMP4ao*wO>LquzHBLMCPI@yvc-CVst#850HytPqk=)u^)x~%q(p<_? z-ed7v&o7&-`NQ>UOO4y-ZC}bY*C6DrbM4b}SNPv07+Jkr{O@nwl{a^zpPxz3J?K^# z@?loZ#)WTK>dr4b`}6F)vg?y#S^3rFCh5G@=e^_bmGibs%3aN^%kK$UztX(rYTobE zu~Z_UalI8!=yL7$hkJBZ9BTem^0ZiaRqt&#Losft84v0=@qBtz_iK~YguRsu-9Al? z*kj}2Z^m|Ozv<;dOVP^pjEk-r+~beq6S?|8vM0@`hRtB!wgbO;7hZ{fd^V+Hm4Kh@ zilf(!bXSCOES=hXF|F(PA%%5LXGLwAdY<$&^*-gPeA`<^5xL#hGA+_e~;&n}PuY_-7fAZ3axARws^#0yimvvTX-tBtD zKkGuPN`+=z|GA?tF1YT=_u9UskBL*Oe>+3fl%wIb3bw2G7bP-S2Rv>4e(=i@!x?h% zAD9Jx+=~pCVi4H7v@BrBvJk$ReO+#x*3&O+Z1_4QW%Zw}Z=cOH67F0$f9dYOB`JHk zCRE>b-QBQ9-As^=A!r9r)8FI=9|fvPG^flnX<_I{aB<@3DQMT)ocxxd;m^&<9*Px0 zZ9Lam4>;sYJ*qZs>+fEDEZ~m*w0X=o#Lf9Ge}4V(F@p)qXV!qjA5V3OtS{a7gXeW( zECb{69gDnnGG~~-33PgU^MU@7!>%F9e!T(AH#4>+2Qd_c{CIWhg{b2Byu~tnSAI0T zWKJxQFq7}>ZEyY)A?YM)_I|0mfyAxG$jFYx%R45yE1b1^QQRSX?RAXqjp`qH3hn|y zFBpO{>?@uqOo0+Q`8yaM9kyN5HOma+b}-)fR#39me;Q zze=lxs@?JAb=@hl^oFi%-q{U{et&pmASUY;Zov>#b>bq!r|KS&2D^qr!#B25j+?X; zX`N2}CbFEPMRd>gE&dW8n>a-#Nv&V=G%})4Q*^)dZmIKa#tlDY6ykgzm^79%TS#q) zJ5k|fqBQBluPN2S8|zM3Y~Tr-tN-nVtF^^Sx>oV)$3qyuxjbzPp6ItH38((1J5j4DU`oqzL zUG>M9c_;B5jnG?@Y-^;+up^IM`jnO2VU-tA(^y&Bl_$$SS5oF(_H4sv@wcBep0BCs zJtoR6AmsAzp8eY+i6`$n-*ErzmN-MfCMNTXP!tmza|6$ZhA*OXA(o$W?hGU=pewb_VOw`YKNv6S+HR2|XoC{A%|1p&NaZ_32K`N&f zhyLFBf{jhFJn-JTY46-bDh^)IxYu!GN=DbL9bPI$cFa>WuH@@i9EyDMF}S8Jpmlpv z!BH+tTRF~5C9Wf1k8YH|C!d=4WB-(2&Q=|!J#1OE4+=M`)vG=E(fxYIExwQU86Rl4 zTx6Wc$NVDIs;F!O-_JJIi%S?LxH&G^*Aus``&D;0XO)xK{bq-UL23fi+a7OK$x$o4 zQ}N`tL5Q-%tZJ5)XFJl5O_0)$@G90iu=>r%^}G5w7XQB!tPu3@{PzBf-V7h#R2jXK zJTAMU;y(Yqm$r?cxCA5u7?s|&{(g9`#=fD6n^{K9V~HHYfj2^b4{onnXPC*bLuy0M z*UOU)^^ceQ5c~E1UlF@UT=~0WF5;RIvg>cK6xqrtO0XVgW@xhi`_gH`gYLj3$BP?S zm{=H2{)x-^SE+6umdSL&Ffm}2hdg77w~6g88Q#ZxR~pw_Z(TZj;gVfSbD1)HruYXI z7A$>KenDV|z6tY|Hhtbhj&m);GS1x-WYFZ8MykebgZGeIg}By;kaB`0((qz?o#`wAY9X)2OBW#!;< zf#KA9@uNb!icSbHrAw#$uq=d)q5pxSj4b?lNr5J8iJ|SPHXM3G9~}3cyCJ_U`d-$NbdL8t4DO8mr!PJXy>=v{InmI_U7PE%#e0^OoM!ACD_9m; z*95#fvWxN9jz$67B`+IZJ>=iS5~(OOV=sHfwurV)5uW}1f-&Z1b;{R;+M+mI!}|p9 z8p@Y?xff4+x~XZ^MT1hOZ=e3;&yZ~hd1!k4*lCUT?d(e)Xv;jRST|FOVacZ(wcT$f zZJu>>d~j-i&T;b9sZA1p z8C|$fWyQBjGc-K>@S}H+tj5l;JCC}yncXfGJsPcFC!Dva!t_+lzxbdx(*n2M)-nnF zRTIy^@Ri+9z~#17w@6RA14G01jJd@herqx}=&K!Zu(fO#Zj`=vK={QmnFD9`ow*{z zdc)-t|Ljl8&3MAsDTVIperpiANnD}iq0Pgvi7bc1)D4Svci+G75|=zf>EFJ;9jbfQ zaf@zm{A3fhzt1Ri)t3wNHs1^R8hn%aTK8|GIn#o>=5mStT(k6=j`s%JW8W{R_(up9 zB_DmYS+nQ7p~1#&u1|cdSk?Sk!@?5XK3TfoxqhK?%hu*}fi4@H)QML_diNa^p7@YW z|7D=A(o)fdcjoP8_Q`8rX`IG-BGYF9%k(WWW@1fC*%rT9rNKLKGkcj%-P6^k=GP;W z-x4jTlO(V0?3=URKvES>f)fv?6 z?3~xjCa$rV(JGMbej=%Z>+92lzCx!1Dz432^*!r?VZ|#MrKdI~F2%D}8thR#+3-ps zSo?e4(nklrp2!aMy0Nk4Q16s?m6_*yZ|?giY&p-oz!LW3_l+%U`fnlY!2PG{mzGpLir8qK60~)x9;8YTyjVD*{IZI-yZr* zTVb>9QRbENm4DLqaOq~O>ArvLCvV+GfxrT`m6xYw_d514dzdzCWtkoy*Ad`=({8Ry8RH|NSxcHM(qU+v#uK>IJ&Jd1AiK`@bxk+iyebO;Eh~b9t%5SHw zv=*Bjc=lNMrni9pjMJQd?=vkuVQl#_qiWS+h0N!Zv|o5LH0-U&cwDo_jL+v<(1gZ6 zH&<2E?g|(7IIPhr>s}tTaR0Azy<0}7=F|nVF;tsf&OG|oYRVF+DO*xHCKnf0*;tE6 z?Ugj0=N!s)AjG|Kf8(BGh4o*r3-~F$zio7OC6l`IKDJL{if&zop&DDi3o@1$&b#nq zr>48RqI=_%jO9<(>^l*jyM=SPVQD~Kg~r2DP7~{21%d6e1sOYcPg!5Q%ICPFrnGS8 zsu|I;tG#U>%+uq^&Jtu5OygpVDg4k8e{!jb_p4UB%#$0JeA+u}{ZE6o)n})0DDtgb zRXghn-?scC58daSee`-}-m3GvxsF>O3FDa3GPhfLIWxmc$wy_qGe2LNJKa9V)pAd1 z$sZH0%d4~c&b_T@(h2-@^TE|MZ?A+l9Txr&JjrF}yzhq@_FaCo=G3BsGo_qM-<$dM zy?#`xalqr8ed%_u>!mOLFWkKD(FUV)MUK4T-7jl0w5~+N1@VU72u|sqcX-~ZLuR$F zmzaikvWogmS=;@mU|nFB+UfwOr-9M;f4n%g+PLEV8b+aojO#v1%4Ovi9=NrB?bYWx z4v~A#w0%$3yFV@0H}F~g>3x?ca@oAGc(wc6y|a(MEjqZW`N=WM#p>3bKh^IIG-mmKWQp9-S;Mw^ z&r2qUsJ`I2;US+d{%htEFMKAExbDG;o##?s?n<4P=(@!=)UV2M zU*Uv_Yy4uH_E~W3W!T30@l9G#&&FBxLX$$yFiB0~)jSe$Z@R7F-Trg3h2gnJ-#GeA zSirw;`}JQgeU)A|?{+^;Zr$`@?G<*0EMZ;_&ESuI3>)0P&pz+}T4TfFea3N99&b#W zAiw27O#j9Zt(?=FMAQ#It%z&yoMdh^SMz|?|BxHY!e>Yrb1r%rrNZa5WWM!-pY2_> zR#*5-Bg!4-JADz|bhE8|)qnTBSM$DyRRq*_8Me;QjM_ZiQY1KMs<~KTrCqal+%??0WN+n+~5j zb^h)g{|oh(W8ZkJ^wZYgJkdvM+pGB}rnhF+Tn>NMB6nBj=lXyX3(aEB^K2Hp6ZouR z-M&ka8QyzS^I8I9&8<7^r%zh2`I*c~$uqJQ9Z`Y{J>#m3X5XB)z0T^i@Oc*ZsB_=j z*SyJf&0XthP;oY^$J?)E7t7g?vyzQ^^p zz*zOH(|+Fj+n>E#lr~2sygBoGw1()7+*!+KWbA!lXdhnlxkdPE!h@T^uUP!oNKDo< zxyrDiu`ulO>BzdpUlM(J;{B|G=Y79bEz_%{>+_`6@8IpZ$IBo8Of3JXk?XulGkj@H zW@wc*gOjh=s?;5;>O!}L&-OZG8kaaJ_$hh;LiQ48)l=U@{#&Nw)O;@SY|Z?w@$Iv94W`<)h~}+JnEYY*B=NIce{`cPht~dJ*8glM55pyRxkbk=OgLU$M4Oy67F_eyCOGN zlKIib8RdzOKK;=C|M{0N!?JKDf#tk+Yrn58zf<(NF}6e^+HlXZ_M)X-Pir`5RtTTm zCNk-y$e#nuOu`0#t_8{%_=tGB_Po0@@uj51Ufa9Rl%%>p{9dcL`0pP3)9Jg*q)PG==^cq}^EUJ+;4BeA&mt&+jb~4%FatZ3=xpJNWE^&Rr|6OGiZL zB$&KDyff9@=k&F&rUyB6?2`_4TF;ny_VL#8drcA!7kTbq6*_a4okdL7hCOSmm0ZP# zu+RgdPvyS7YF}~ct6I@ct*bj6w%Ala zFXhj$Stq|IkHto!fMcJqd8ypvosSwCZ{B3R@=DG=pJU&eiy5a5l(X$)G#5euqIb+Yk0R#Wv-#2iAm3HyGn-N>uw%gAhpA2 zesgYgP}X_w2RjTe?Omy`cp}H?_}=@!SA?yeF;jnmm9?6K#~EL*<^AiEyYzVa)%y*R%K32pCKd#bUsGg8K~NGkd9Fyg z=Z~Juaam(KHzk1k#mTY-QL7R&c0@~kevtl7;OXrf*-L^7H+)_)-}g@a|Fbi87@STQ zOPrBy^>OQbpT~zcsZ2MpxuU8yDQeN4*T=4IaC^&9_WsrJ69M{eZNDeHed}EV-%FEbTxT!;@~2H0531UbbavY^dzz39)k-dHj?dvo7Z- zNd?%*T#-r*{Bz)-pvhi`bN9+_*O|yxXUe&6(>^YSvDZyFX&OC31Wwl40neD>s$ z#rtd%bIo+d`peGw{!+i)*0r9N{QuVfZV$&n{`)IK3@Y^mmKyJ~GcL_wyfxEk{*NPi zb8O8Sx9v+=$=?3p_O=^qCCq&oFHd_l*^Bec865%NRp|@;ympqH3;#EB+l>a+Yu}gu zf14^G#8foFc#_lJXDgp{TxnZaveU(Dam@6^JPzO2OSfelD3`v{Z}mxh{e)ATmTxCZ zemJB#>A|aOAJlc2)^c4FDr%oRO)c6hO|sRg^Lv$n>BenIdvHC`UB7R0@zm@5e_zX|2$kP275hB-! zN>tbrsuStW)TCsn8oW|5Rp$Ru%`cPpG2hg?Sgy3cMXUCc#NN~yYu|13`sV7}t>p3e zd*pK7&I%d+fA{hqRo|~?O->Fz@$|Hh_VmJ=24*P@KNGo*Y;aLLoo4Ma_jld%GNXfx z3x0L&uYM)D=jS!gFC|+i&nj{|C|CQ}R_6Cl$(pC9>szGx-X?Bc5q$Bs=VR%I`tw4$ zHr&nqDw-{=sHCh_zM1QewNcZ#btdoIo6a7Iy;8gWs+DyZi|@Vp>q7;Xf7>xfK^Kw5WJ+US1n-@hL z{;qi-QpRS3bpD>gwl|+lb{d$mI3y`AP5Io|_)l($5a(Hy*&Kmij&v3;2^Qh6eKuKV zYNn}z%%%4B`u}-%3U8N|=q(cRT(zpn$1g6^R7Yg3LH>2)23r^H{mYlFdvM^MV`*!&Rxd5+qCO^dYHehB#=-EnZoi5@$pQ)WiR;4(Ybx3D^4VFq;B&OFH$2;LWxMx-m}T74FJ%QM$opktP?v%Y&$BMZn$}Vl_ z3T%4dRsLc&GHtmr;T(nN%%KooU z_CNUWP`cp$dpWo2WxP|Pdfx|ed6w%O&T2f<;Bs+X1d8=_X>61&n+ec@}Tg;n$sD-%wb}8?etI)mQDw1*6WW%?}Tj#?<`lmp^cQ z-!Ip3rt+=CynpA4D;`P5H+^vo zG2w7fo?;zu+_g1Rf%C$dOiP_*KUPUp*+r{z-S^2Z6~ zWebkpm%2GM<<>{HpL!XhE0;=yEX|l5#&~!`>nzDxsw}AA|-XLcF}y7Ial;&iLT{&$)mK9W6I*d*&8dhr`Nq+&CoteI{KCFtoHgX zQCoYywFuu__$)AK^ zuhc)0wmUjib*5L*`M1EHgsyWs%2Rj-6{W9Ws$^7;(FTYk* zv={G8xr;najq7hse^Prz^}PB4t>be#taPFiPnI9sV5OEbfk{hvS&?7w@k>E+&yVXb zT)%$00>k3PheLkeKU8n~n`_^{Bf&TJmrt>O*U4J{`|a|N=d9H)9*n8|a*^G%`g8cS z4Lc?XH=lai)%4_yVV&@y+_@YIcMhz%_|WXyKbgYl%4e8>Ce zt8Epocrx+##GV}$Z$9&HzWn--fB&A=$;<5oUeyU(lxFdm->cBI`@Zw{4n?CS4B`?8 zjvUS0yFO~|TE4Pc&K7+ZCXv&rj232fg4N&pHY|UC_{$d?Kf{E)jfp8K47onrxz3-j zDTtHS2Ip(Vw#gSwp72fJF|9KwSl2w>-s-O?{~cNuX}xdL-zH6?4#vBKZ(Z7n{`;A zbwkY8hgURaExhzw;d;#)nO$uL%VUo_>fAgQnfp9HCM|wq<75wmtvk+jxGH+hR@-HD zE7a9k#Nn;&xtN28oce@|#f+zmZ%sdVRYUKB|F-LiyYhnABAr+q)aJH5j(8#Y>e;?K z7R1y3nHZ}M3f=I3WRmWaS zE_iXcv}u>keUp+sC7EH-$>uEwH@jbWHKjpOtiQ?mpNXxZ$LonNPa6wJf8+b~v(hwe zX^`v2+&H$-*Sf3rHD{=-OODoBn*H*Fhx*O?&s$z3_uDe@m6kt0uC6&DIcn=vFV#lJ zUxxg}Jj*z_6`6m`k^Hmj$J6-|J0fDAy|)zFe_8#!;e7qWrLk}9ExIN?Wc({?Ipxna zt7Xf(4|O|qZ)uqwpsHm3!!BMs>fRPlNgf_M{?b?xr(DmA!A%0wU+k&=)1$E~?Zv&M zl}jGz#mxwcl#+TEtQBx!f|q*2b=Ec}7lo~de=YRBb-OsY(9~{sIsfNk;pdzO4*l6= z<-bgBQlIwSi1*wKe-)2hyfm*{sdo8{8jWMC86U8>IbL7TKI8Qn&B<53U&y%dO72`h zi^P*#`*(E3T{gbVq%^Z&>jKXm+g6;^YG_@mbZPFiw1mZi4!u0QXP&ZtNw+q%w$@fC z-nnPS&s!J&Pv)=PTN`Ea@zyQ-&XtL)kH3o95;|qo(WFSj&XhKW57!wMWc!->OjCRk zbW-Hh)Kygs*HQwr{xC6Q-yWBBKV(_@vPJj=#^)z&^YW0nJlZyn@PlJ}ZAi@|f3C*#o@ zKOzriS68Vr$gQ2SC?~G`Z(Zl?C0zUREb=FS9OXZKm|F3;NW4f+F z*x#iZ6FL^U?0a|9xTo5#THdXkPvFLud7PEvY;YWfp(&~iV@!m6*}bfjiS zq4ekC)0_4GzW#piY)Xu=ROib6A05sWx3|6R@Ap5`v{CDsDTB|xAD33^GfOO6s=6`S zSSRYwQkOT6%I8;KUV0&7Aq$(yVg9+p&P`Y^K0ag|%ZN?9xd-5C#xnJIon$g~P`{B-wjX4zy z<$FKa9Jt0?-}~_Tzxm60t~JG_z1p#}Y}>c9&GDO?Z~xEck-xl=_kbD0ZH64?4KT)s Z{|tpaKU3o_gGPH8JYD@<);T3K0RUCa-4y@; literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dolls.png b/app/assets/images/emoji/dolls.png new file mode 100755 index 0000000000000000000000000000000000000000..47ce33900ca53b7372c0b6028aed797f8fa8f0b7 GIT binary patch literal 7138 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/doughnut.png b/app/assets/images/emoji/doughnut.png new file mode 100755 index 0000000000000000000000000000000000000000..ccf869129602e60a8b20e5d90d0258b8fda14591 GIT binary patch literal 5209 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 KKbLh*2~7a}^R-+6 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dragon.png b/app/assets/images/emoji/dragon.png new file mode 100755 index 0000000000000000000000000000000000000000..e399d60e1d859dc26b3ef2a4f75e9ed7414c9bd9 GIT binary patch literal 7828 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/dress.png b/app/assets/images/emoji/dress.png new file mode 100755 index 0000000000000000000000000000000000000000..6434e2e2f3982266931f943f41e2640eb0ca7c91 GIT binary patch literal 3631 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 ZJ>DP3*^^6s~2eKLB zm_JB0Txa-msImV4v*rKKMgJFKU|GF)r%6=#Os_Q;i<&jwrd~REZS~w$N}=!4E%Vp> zxymT8U|UAumXDv-7FMgi*&Lf1thH#%yDd*6>TXw`oXn=TBhY!1-PfsA7cyGSmqx7R z`*)S$!OqH$w@;QCEnl}}M(w@W7cTtTe1{Ukcg45K<+OKqr7q4T=-t~VT zx9vVjH|6PfS6X`Zuam#HU~}C2f0{1O%MY!8weZH?$!nLg96hL&8$Q`rE>!lSoXtzc zdP66Fm*RVj92aBO2&~)xDs$g*p{2LiEob7d)Z)J7cs8@`O7IhhU|+#68!olqy43s9 zZI9X4c^emX8Hje72$1JT=Ov@l zQ&Ts#?QEigu*~s4+%RC+A%Tq6@e?Na=IX~CS$M1x{1iB0HpTC$@f2wTS z+KQ!_24TK0>YcW>%-yq1f2QT*bq=i``p)SXztY{bcw!O%JKmY!q}!ff{*kd*^rf$4 zn!yJK-#a1~Qi4@#Yt*?F=CDabn$&8~Q+wr<@o1L4twzz3$7Qd*<9G52WOP?dVbxAP zYMQu*xp#kkhuXUKpzoT+rwRjqr0uIv@XB{RR{G)eVIgs;bzhdPJf<;ghvI^n-%{4p z@!95eEnF%6(4Mk* zL}LPjfZN)cY6^#ZMKU$^Wa~|qzZRu4GeI%5P}ObnuHx?(*$v(#uC(rLD3-YK_%)zEp+|j>_pW%qN7y#6 zW68;1hp+S%XmH}2#^rBx+BZGPSZ;>)>66)x zCM5@F-ZJV@+*GpCFi`whWYGIa>3@F~&sY~Op-x|&@H&v4$`y6w-dz8qtz zrsHSK+%KqzJ&#)TH2vYPLusG69Jai(-ju3%%I2N@8cT=d(6|zIJ&vF!Hx<3&?>tYJ z%-<36w`j+!^5oEaUzXUlq(un}To)|iXWPouu&qS-)uF6=jqZ0&Z+EeTc7ozECie{m_BQ#{|Di*s!z}yv_Jomu7Lm(PB>df{R-6ADkujKR;ZgKP!)8 z;VBPZt2JA%6x=)Yuq1k>mjHjBoZDiK)_cWeIa_y#hp@a&nf0J`>p@QOn`&&gm?cgy z%-A8sFzNI0!-p4V)g*3EueWb}zwA|0NB`@CUv}6{QFGkGA^NAR(dU0iYpiu z7>+uu`grs^;|DhVe?QIUyxG24jboH_LzJZ z$+Njz)Ux-`(#09OET_#glV5neccKoj6SF~rQ)SzOnM~gqBaQeQ%XeI`tq44?$(?1J z=fQitMB}>ix>7ra2ee$@ik6Kc|I{{3U-*& zarrt5_!{LOn6ZN2RYTUv!YbkF*_(R}+qvy-f4(?1n@|73vd#D22d(LJxiN=P;Dv6~ z)b~4I{*MY!;cYzA_OR-&!m?>4&hw7%W@Iy#iD~@u)JHj0L5JrGpH19xhFctAIV^=% zoF8V)V%GdLq2WN&>*JSv(v4E|nH3xDc9u^{d%xszj=$LNo{4V$*8P`%^a@mUWk*`@ zP1&W`eIt;&#OpVw@j1rDrvFUX-b?6|K6hGaQXqZlt6G<#$kn;U{szY)9u-Xdt|oRm zVrO&2P6Mg*z03uU=1J>qnfEk=wkJH)6kc#3KwThGp*wm{+Xa=RieGLL%mP2}HcwPI z#P#u>nE&R8kN)qTT_{Nx;yJ&-|JSFFc8zKip1V)9I{u2kS-S5+!c=wJ9WQ*ocfVOF z-LPGu_1m1SPZf>07aS|RE8vh`wNx#Of9~hX>0Ep6|DBP#+S1&$f7aSHyBaF;PaCAl z9pIkw@)*aXHN78~*v(k>V3xD0+@9u=?`vdjS@V6aDuub(uYR_Xk zsAv=7_KN96p5YhQX@*x_RtNPRW?R*NeQAvU(LXzx4wO1>IoNf}#+-Fkn?TZ&Zyz>^ z`{x=PJjxV4!Ik${fdAH{G>4^%)-!H2PGoXRTk-0V#pCZzpAOajyx-S&H$Cd{OHH1+ zNsNeVj-Rt|zA2xsW@n}nA<}!>vy?(QmY&+B{HlcatFz~UGOcfn z=_0q3Ln}9xaO8bRJ<98Jg5^M_VyfiF04I$NTiU++1+?c~;ZC-eToCcr`on^EOdrl< zW;f(;3LfLu&}!wdeyeqyk^SXI5sq)}jVZ@A@%djiH#i=6`KtWJ=VuG!=7&iy{u*BK zG5>jSI)_7t^wNkmnkNgV&OKK?{lE9RZkeS~9)WB2si@9c^KcQ%ulcJ@R+xLlSxc<< zox1SU8}qp6F9(I$5^PlTypub!y<0kTqYEYY7AM}3-LvT;&%$EHdDFL)^QK057EgN1 z-0}5e)SmK-O#F$VDaKA4lv30=OTv3LJ?}AzQmV5(*dU~<@@?;=wTAY!3-7yR=?L;) z7rv)?LC8$}h0a%=t0J8m{New z+e4kUPf>7bx;nkwzWUgw54QbXd^uXt7xo@BiJp0Ta)jU#kGSK>{f*554;Ff`X6%e@ zPMq73S;Nkldh%54j$M}T1x*$`Sk)W!)Yda(zRk0lI`$8DFfw#pl;l@^!BZ|LB>P~h zR3lgZDwBtwT`Nvz-nkzix#RK8&2!w;b_lKhyL9P<3-vk@3=@xOpEF9^SLZWbPv*`k z?;BMDL38%0^h|ibA1Qgv=HQH_etJ1k6Vn2nHv}*;WC@s9zqIvu9kaZ5N}i_caUPYI z8`@5Yi!+zknHFB{e=R6+c5j-%%dbW@jj1bBiZi*c3T4-S(>WQox;DDteZ<}E_aY4# zl6a0PuU9f#@3Q)0q)9}u&Js-@@1~fkViWIwTPm_#-ScGi^`K?FJgK+WF4u{cJhf%o zGU1B(hwY+0AAi3(rER~r!L&cwJFb0N$8k4xU)}Bdm8(zWd*5`a6)0^|nOL~vS;pym z?prz5a+R!2>b(}w^z+tx#uFRjrSGumr!2}?$iU#)^>cdbih%S!NkhTXjO#{S*927? z+cYZkDxaTcdi(UGV3m;i;nJhC7JWUsTgWGzN6t`Se#1uL3R#}ZBKs6C2%Qvo(Rt%h z=~@2wbD!>cXHhlf1>>7VS}XRQ%x+w>^U!zGbML|zrJOE(k+A-KRax!7x}U`i94xw< zk{xXsrb=p=se5gS`Of}-?&*EDPq)nLo4tM^$6L`Ovli=Dzjx^lW&HboXHfV))2j=A zR7SizyNT;O!^>^b8vHU7Q#8NYGCcpY{afz>0q>2Iyy6TPguboaRl@#r_xc+%n(6(cHZ574;eBJbR<*dI z>;8Aqc&}OEZmaCvmP@!!;=gaPvsX#uy6e2Ru>pd&zPtB^|Ic4>(CFTpPIF;nZHo=E z#d_iK0t}COj+oB0l6LBxlc@ilecSZ|`}l*z`JAjCM=IXSdAf4vnTcDoxEHKg_?W#}(fbRvF-VVx7G)tL5^&uFe59^}wa25r>1Is+E`IZ%aLCIW`=);6=5lznZ|b|lri>P0kI#J<-8ARPyITF( zOIzxg8PYC1Z{KvAO-ZD5#_O8MKIyzozhj$=Txx~BZ0DJBv6k!ai5%fo_RF}FM8e|@ z7>f3aWdG9J9r#?bSVVi>lqBWSpY2a7j#Zy7(Y_RF8e@L2CiRKTbLNAdJIoLNWi)%Y z{nwMt?>~Rj=3ShA@^#lLi?=5?-1WX6Bf#KSaiWwzVf%LZ!W&aE{T^C*_x@Ywwqe>% z-a?j5mz1YmyH|Wo`q$|%v;AjW=9sl1y=ID9<;~N39nS34z04zYdqUMlfx=};$GDjo ztbJO`#NR(m-+i+7!(-8CLE8qSZKCZ;i@v(#JgeE|;vexntdBK+ukm*O4H0jT@8iE- zQ+)C&%isKnnXytll{q?#HX1NQc#3`%iTWI@#xmkjmP9{Kx-#i84Q6f0KVec>0=n0fxRAYfdEJzAN4|rCxqf!=L~B z`{e_Kf5nzg`6WL)xOc-ztu@Bie;U16nv^DW_yyN0_niIV|38>dm|q;c$nNPb&6<-& z7n&F*JYE)H*`XJ(Wnsj*&+9DZH#~OC-t}@1Lx9}Ud-joUJy%{c66U#6pK(8T{n~+w&_u)JCD=@gc(3zIauK2V{ z(BC$D>%mj3tM315`Z&MbZK0LhY%c!1%$lbR8}d&7b}!wxuJh_Lg{S7%_rACl)R^^M zrEHRs%(eLHn~Q&o21+rn;gnjaU-o0CViTJO^NDXkD?Y7eS2!N~?~uT*{o+mK^`}(c z7xy2})V+COV*3B-nK>2Dsl3MVxL?(J^#0Au_*hyefD=1 z7AWTIa$uIJI=FSh;jX!VpUWEd+qJ&hzxUfz27zpqyg;c<(!a}|{gFAibb{^u4JBXx zm}r)-SIRMudJtCf?n0lvt8~YS|8ER}f3AJ8cJj6Rwu}{}H-7X~eSB%q(r{#NlE3PS z2UE8{w`J*jD_m|Pzo9m3!4YBh)q4x7j>tXdC|~etlFq-AuYHe}#d6%ZS7+-tJHP8n zqO|V@$jw)JN{+9H2wZhP^al=kGp6_1wt&409^*xhxit=h#fIW&8fcCqoC>=Joz(uX2u@d|M#mI|Bm)gQu&X%Q~loCIAw9 ByUhRq literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/droplet.png b/app/assets/images/emoji/droplet.png new file mode 100755 index 0000000000000000000000000000000000000000..9eff46339f81cc3b5aba26bc76cc114e0b76fcdf GIT binary patch literal 3278 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 Z^!)wd<%XWCRSXOa44$rjF6*2UngBdM_f-G@ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ear.png b/app/assets/images/emoji/ear.png new file mode 100755 index 0000000000000000000000000000000000000000..2bbbf10c9ef475424d699cbfbd03a33b33b24570 GIT binary patch literal 4335 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ear_of_rice.png b/app/assets/images/emoji/ear_of_rice.png new file mode 100755 index 0000000000000000000000000000000000000000..a9bba5c2c14682fef7ce33e17a968e2dd4a4ea18 GIT binary patch literal 4758 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/earth_africa.png b/app/assets/images/emoji/earth_africa.png new file mode 100755 index 0000000000000000000000000000000000000000..44ce5ecb621c885ae92e8567b1e819b16c4bca1d GIT binary patch literal 7164 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/earth_americas.png b/app/assets/images/emoji/earth_americas.png new file mode 100755 index 0000000000000000000000000000000000000000..97d717671369fe6519a315de350b53a1445fa4ba GIT binary patch literal 7039 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/egg.png b/app/assets/images/emoji/egg.png new file mode 100755 index 0000000000000000000000000000000000000000..c3de6ae4ea0d11983133e477346e6b93e4eaec00 GIT binary patch literal 5211 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ⅆ;`hQR5XR+dcd~ZLMM;y-QgIVBl> zA9qjp(jG2wssLovVPi>>ZBxW&=Z}%oSJcvu-D}48qtM21^titagP+=ri+@f9oqcG{`v{SE{=}9>sKuC zWU%lm`mo#n`IpO+zsak4$uQg#^POvD>LohY?dqJvzH^VyKPJ!+n6hS;$kd-jeiME& zo@@W{+wtGNzAxHd)!O#rANNa?9J$Vzp?%xNBTV#EddROBgvt}J>SH;@q>l$qxC1M51x8>KV#R|YtfIt-zh%tHtRy@k_oEO zX<}wNXNv6R--;;x{dW8Qmxosxid5cPyhML_mHLWzleVSyD`me4b6a@YZ|i?E^=0** z%l5mL>T@!j3v=vRv(Dh`kDacK!C3*!aZ9$#tLNvdyUK*c%;a42;7|WEmO?H*(G-58 zg}4;4+W5`3pE@mNL)be_*?^ jR`v5T#vexg|Jlm=HZr~s7FA?mU|{fc^>bP0l+XkK`{?l* literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/eggplant.png b/app/assets/images/emoji/eggplant.png new file mode 100755 index 0000000000000000000000000000000000000000..66f25fce447f20aaa4770ecdf722ac416a0c6ca6 GIT binary patch literal 4672 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/eight.png b/app/assets/images/emoji/eight.png new file mode 100755 index 0000000000000000000000000000000000000000..7bdb422327c4b93b3de666b37e3f487eddac4930 GIT binary patch literal 3844 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 hA7I?ZihE&{oJDam$>Q%`$ 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 a{o)n=lTWV~)G;tHFnGH9xvX~)oy}bk_I2j5 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 HB{Ts5>Z#c$ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/electric_plug.png b/app/assets/images/emoji/electric_plug.png new file mode 100755 index 0000000000000000000000000000000000000000..7a3d6cee68365bf33fb4725d5c4c3ef1cfa765d1 GIT binary patch literal 2819 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 CGB^AH literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/elephant.png b/app/assets/images/emoji/elephant.png new file mode 100755 index 0000000000000000000000000000000000000000..5ca04570e2425a77b566a17767864394f7657e93 GIT binary patch literal 5086 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 k%L%F;3Az5)R{UrDmULyo&Dkzopr0DrU<<^TWy literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/end.png b/app/assets/images/emoji/end.png new file mode 100755 index 0000000000000000000000000000000000000000..edb0bda2450f079f6c534d5ba60ca5a214a232e3 GIT binary patch literal 1475 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE~)oq00rNtj3* zb7P$8jnH}NyKT-pSDMXB<@u&1Ak4wC>63PbEJw-Z)eZ^|!awX+tSE_1 z>wKM^!%qF5Ima#Jb(rVVqU30!KU3CJm%iJ1-}X7*C38oCB~g+MJPvFM%pVranmf0) zu&(Z(yB6b|xpPaa=Y9Y8;e&yPY{TWtmrG0klqDxCJFH|XC@T7N`Q5vB%ab-roH=`z zRa;y8CBuUK`ThO<^|$ZcC_4PUw?V>U9C{Bzxe`tAGn`8}6NwR$D=bP3yneXBf9rZFo# zN#Am$cEg0_&5s{H?hkax&|_%5Qhw@t|Cv`}pG>B3F>w8ik9fpUX=P_-_U%UN`tR%u zPCj{h@7}%WPoC`3uWPCpH16NuG*$Hp=jw|WFD_S7yZ4*ABB5 zpYKA@H|>!5LJYhyml-5l-m^YT&SF%^Eq%`V@bHNf9v@D8Rba@8JCW`8W3pRYd%OJF z89U^^=qw0*$SV-Uc|e83e$_^QXJ_X|=O>Rp*U2xiT)4txM=7JglIOe(nSL(7mp>(_F& zwY4?B`u6p`r6r-fP7^(%e)KXO;7G4JA876=l6czfXtoH00_*N4S>dU!jVoG|``2G{ zaa3ZMJ9qAhLmLGd(hjHaO`QK!gMnd@-2OlEp==CuP3JHOTwGCgZJFyld1;2pVeani zNhXgN3vM3}tjj;6Si0brqMEOjr!9A^{i2@dubCWH`B$g$FS!1l@qzHRSqJ7M{Vlzb zaHU{Qpkcd(S~$zX4-O0#JwI1vzujy!C7C(FlGD<^`AOi~uhZ9WRGrQ{=lQ&ZxJVZc zf%9?g)+_JuYCPZ0#gOXB@Zn4=<8s?e3T6zSw(Q+28@agTkml9)f|IGuum3MrQjZpW z_j3BlsUaWMOt$cm+|RaPRnNI2Oba+ZH>BAaD0ng+nQ9rz-*ESPqtvOhpPU&F)SYNg zVYqec)`ZrL{(QTSSe?0@IKB7Pv8ywsyY-wVTe@9zkiN40#Sb2ZkhJqxSQR#iyEvR^ z_ljY7vdT8&=c_2zq?-?RRm}`?*Vvr8YEkw2WTpf2Ed&$3ooNqpX5g@u%vNKFUbaqi z^MviC`yv^psHMJXo!7aa|G>-|yZ!<-HHPiH>y)S6YO;!7c*o(z^j{4>m>9lmERM5f zkeR2$dR9(z7Kel0bm#9(31&OWu6!)K^lGMr;kAz+W}UM=wcF{9 z_4f!vj!9mLoc_rQ-KGVaA0m`ac)d+I4J7-&hh@+dU&mi9spt+zp$A z=eg70SSM(nV!LjdP`yP^oMDq}){fdgo6ia@mXrGHonyko5IOJK1YeU*MupxRrA!PO zr`ogTpO)Iu-FA<|@X^|}Ydcv~rp?ljj=64WA^M`>s(Q|9#sd8|d7o9PSNG;*W}ZyV iZ#8CsmW>at)r*(vGakIwsm8#-z~JfX=d#Wzp$P!JXR<*6 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/envelope.png b/app/assets/images/emoji/envelope.png new file mode 100755 index 0000000000000000000000000000000000000000..3631861bbfdcd90101dd9a2b3a2299c63e983af9 GIT binary patch literal 1655 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#Rz6tONasB`QKLZTRnKK8% zT(xS|v}w~A7#J2TSg>Nnils}J&YCr=tE+4A;>Gjl&tJZL`NWA6XV0G9+}u2K=FCNl z7R{SCZ`ZC}Yu2pUym|BP-Mcqz*sy2M9tH-6y?ghrU%&p~!Gk+?>^OAj(AKS6A?9z| zv}wtbB@-r0*s^5{0|Ue6&6~Gv+qQi9@*O*NELpN--MV#KwrttEcW*&K!Rpnkw{G3K zX3d)U^XDHve0bTiWxICmI&tE}?%liBuU}tORMg(yURYSTZ{NO6n>G~}7w_M{f5nOw z`T6;4*RE}AYg@2j!OE2@H*DDO>eZ{KPoKVj|Ng;)2j9MZd;a|S_wV1IJ$v^5|NkdX zo;-Z`@XMDkA3uJ4@#4kn*RSu~xzp6tboJ`hpFe-zy?gh~n>Qame0clz?Wa$l?%%(E z`}Xa#XV0EHckaT43xEFnnLd5`*RNl@ySp!5ym5bTx`u{^zP`R`)27wd*6!J}r>Cc9^5n@!j~+dE@ZhOar)JKa zdGh4R%F4>AQ>Pv}bm+>JE3K`qQ>ILrHEY(SNt4RT$}V5NTwPt=+}wQq`t_=+s)~w= zBS((3w6vT)eL6Qc_us#NB_$<|jg1{09i5$>IXO8KCQO(;dv}AF6OZd?@|!;lnGB9)iFf5CO&!VDe#u?88S-A8K20?{;BeVBzz0aSW-5 zdvpG1p0cBa+r^Vg6E~gE<8Bw3BJ?zN)y$b^&+r)=^L+01+Zj`~d#PM%+WXz>K7YOc z{#UP*X;#vyhmU`^oI2oj_m#nAlSm2Q%R7aPO&i(Nmd}1*uj`}L`TO$ZjD(uU&$#}C zCd*u$q*7V>>f`fc7E%)4A%5$oB+l;KSdwAuKh4)`|4Nl(Rm`jTVi@x0$!6V5)ct#; zAnfCTO`cLWzjOW1zozIp>Dreyj)~UoI!QPo%!AV`5pX=8aQvyG(A&N1VB6 zxw~MU@t@n*w&vc>E-B+ObLp-~aBOP)vi01@oIf`e!$K9dTRqRbV9H&QaPIZ85dM7v ze-2b_IMJ@yCZ+M@^1ISd$CP#U3gyK!uDqQ#VdA6nZDL8Ti7|`ICM3zY{9@)5dMb3X z%ze%AXa?QGg>!PR#6-{;eKHn^rMb1&ZU>h!mTM_bpYe>`9%sFtz*=VtXH4rSlKDgI09p2nLtazr0z z{`~Zzl=%L59_dSpucN1_s=WUs-h1M5rOgHvKKHGC`|jOcEuj2Xd2QxX{`vc5x2`yG zS=GkivHR*bFXe;1GPWvk9C=h;yZ({;?1Rkpx7JR+zO7NC;c)CF6YNq3686DA4@Y3}9!_Nd{$Ba`&xCOB}^81%F=`s=GTt#rQpf9odGAXmR_=l}V=w_SL@GE6FS zZCn4;>pj2MPW|)t=l#NGp$F@J80M<-ZMnSXfY$TYTk@aXm1CUty|Ey<2?p#7=DYdNS?_*){bP0l+XkK^7Lwu literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/es.png b/app/assets/images/emoji/es.png new file mode 100755 index 0000000000000000000000000000000000000000..71b30bff352e05df99c09a3cfb88fd0b9cb072ad GIT binary patch literal 4302 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/euro.png b/app/assets/images/emoji/euro.png new file mode 100755 index 0000000000000000000000000000000000000000..1c5904b7144328c158169abbd1306a827334e4c5 GIT binary patch literal 3942 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/european_castle.png b/app/assets/images/emoji/european_castle.png new file mode 100755 index 0000000000000000000000000000000000000000..8229b8a8a942abe7aa2474f3477c6f0d235dac31 GIT binary patch literal 5427 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/european_post_office.png b/app/assets/images/emoji/european_post_office.png new file mode 100755 index 0000000000000000000000000000000000000000..0f65b1453056ac5c346693892dae0766c8617373 GIT binary patch literal 4816 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/exclamation.png b/app/assets/images/emoji/exclamation.png new file mode 100755 index 0000000000000000000000000000000000000000..77bbdeabcf49dbc4f8b5278bd01f7e14292724b1 GIT binary patch literal 1175 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE~)o#mSmlPc17 z|MT7Kw2sO9#dFEp4ILs>ZW?>4@6=}0)F6;Rj{QiEueoQRu@;Rm)41$TrKY#eNf!V;N@>}hN z8xnhx@2E4RG#tL!$rv!v=}F~;kwc)pf@=1x90=|Y-t5{F{jZ$RZ;Ntq6L7}X|>(2AHw06>jH|C%Z#%Pmbm2H{zjD)L2D_lOh5|R_4o~Raec-_I z1C5LxWlipGqW^-g7q4>A>C0ZuctHM&xa^8+ua*8Q-n+>pd81V7z`PUXqS@0;zS%m& zF7j}A=6e7CR}+Q{FQzX_xAEgWaDKYp(|N26%({)YySuNS_xG#&cInKSrs-$>TpR-` zLss5d8@4(=es}r%b(a~!o;}ZxwJCpBb?*Dd__a=pIO^1zU!L@wa#(<0YijkS0Up ztFVre_Qk%TCTwrG=2|pJeO~L8Q}IowaY;zQg08k#`F@N)7G2yCoK_d%XL6vValyL! z1b3F-O55%EnYQz}Gd?(QYqjr#^#P*#63rW*929jBcJO5Bcl~zDvEcAc&kvV#zJ;1T zJ1%qaX`xa@Cx1Y=>w+rvEVKNY)lubQ4(fI%)7Eoc6cY4x-pcXpe*U)G^>aE?Gq&*c hGxUI=P4Y+ns>On`{CjtVGB7YOc)I$ztaD0e0swKY7Y+ab literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/eyeglasses.png b/app/assets/images/emoji/eyeglasses.png new file mode 100755 index 0000000000000000000000000000000000000000..a3cf75a27a1c67f17e16d98b07a8dc5bfeab89f0 GIT binary patch literal 4929 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 qf4iRC{J#Hi{guW14R#Fw_#5)YC3Ux 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/facepunch.png b/app/assets/images/emoji/facepunch.png new file mode 100755 index 0000000000000000000000000000000000000000..2d41fd37e8d42a282ce48d3fb13ead7605725fa1 GIT binary patch literal 4873 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE1mX70Krk$mPtqS~}%_m=hr1|E)& zT0J^0dQ9Ya(%9~CvfEWjL`2g=@f5R5mlFqvb%#b+K#I9@jvD*++4ENIUiEJ6uI=w6 zzy0v7yz%?auGrYaYxB0hRr%@}{d`XKdAsWM|9`FD`Y*dyT5hfT>x)%eK-B-+s{3NZ z|GD35^MXN-)-0WS-txxY#P4P6|3Ck^c5naR&G&yF`dmKm|Hb!q+vmRc zlhko3yzIY!{nN?jV*jr*d?=RR`RDX>J^SCn>GNy4PCm2Rb!LK>Qj0>H!xp({Q=M<$ zcYgdewczd3>Hpn>x9`_hEnfH~Sk3o;THLhr%UpN9Qx4hu();t?zyC{CN7lRvxBGeO z>-r3ax`&6S|9|@Qd;MMixqH8aK8b#gj(NIXq<^9LGhxM|aSzBLW-~PdH z(d3pbGZMnWCLDWEyI|(|oBQkLhTH!?q|LtDyzasDe-ED8|0!ZnsQc%9-bTBmCdy;; z%RTFJ^UG6vs@;}0zW8_SRMyAE;`3|Ivu~fj(`Vn#u5&y=np-Ams4{jK3OT8?G<!V-8syUV^Ddb~n7%dAlX)`PJ(c4>$jRee~tlx%t1A`tRLWe@FWI`zxRN z>wZs`kGgO5v0Hk%U+v>lzh-#_H8aHAPP#4Csc_cV%x~UA(0`z*;`*n%%1ztWPMKNx@Xb) ze=d9r_W!e6ecsNTYuo%L_UD*MtRh1)TzQk`L3Yek&6mPov`H%h2T zWl(lYVUbj3{7@ca-{SFJruKaXzgFI!Pg3>&Ui!!0|M}-@`oE*;@s<_gk{=%5|8wNG z{O%7w*4zEv_kDKn+s!K4l2Nan`?WML=qXiqD=g}6njo#BFx7>tQ$R+FfBXIZmkccu z`|8E>k8%VZeQ4egv20DwnvJEeuFSl9clLe8Ki77%9q^A+x@%Ye>VD1F>vg$>ul|_5 zjA}GfUiy@QfvHDCBVHk?!R67B7llWnd+NDO`~T?QV{K6N2=q*uFyqPuan{$-(itoF zJ&$F4u=xDk+jDY!wwaro)jwRBe*g17WAS+lZbUe$OXcQW{⁢!!@P=mIEEzrOM}s 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/factory.png b/app/assets/images/emoji/factory.png new file mode 100755 index 0000000000000000000000000000000000000000..6404634793e288a6c77d19918f71bf3b3b7e3b22 GIT binary patch literal 5558 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 bKQH&iX)m?fH|}6yU|{fc^>bP0l+XkKQiO0J literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fallen_leaf.png b/app/assets/images/emoji/fallen_leaf.png new file mode 100755 index 0000000000000000000000000000000000000000..d49f9c1757d3ae2325089fc6e60fbcece999d181 GIT binary patch literal 4890 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/family.png b/app/assets/images/emoji/family.png new file mode 100755 index 0000000000000000000000000000000000000000..b4b365f3a5c033af7e6cad6c67b5c5f5135a7340 GIT binary patch literal 7211 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/feet.png b/app/assets/images/emoji/feet.png new file mode 100755 index 0000000000000000000000000000000000000000..1b0147b1d234c4043f8a07294c64888461324883 GIT binary patch literal 1529 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE|9t7s@;s-<|0+fY#M%8`yw3+|XmO%?BC+d7qLX$)70*TSUejLe;) zUYfZZw>Wqo-p0+^)aKyP!l9O>#KrmWsD{29)8q22>sxN$%{}Q?{&LIyC)0Pn`#$&o z%X3S+1KlK3JuH@{l+6ueIx5jQCxofkulMYh7R8(PyvmJws-J&xS_W`FYMHci$~Ila zx2xNOEzg~u8Edn7h43snKAC&>H~X^b9a!1&n`cTa}`?c)Ml4ET=U`$E+8l@O zoIeE~AEUoNa(q`W>bF2JL02SWgW2h0Yt?Sr3;Hc&+jY(5AX~Qb9!6>P_{?W+g_Bck zxKH2EkQ7qsw#iV!Ym_9_YQsY%<}8)b6))Oa6W?$bD5WxN=FO zWU*9+!pAf0a$B}8&zZw}eckl0Oafo;#9unlJAXos8KajiugbJipYyF}-#kC2|L~W> zs~I0%Dyp|tX#1L##_+$L&Z`}Ct3KW1m*LyHR(UZ32X}9ODJ1+iqq6VYS;5y^C)tUf zTr_Rv=5K+Q|Gi3|$nvcydGU+z(_gQDFZ^3pp1(}>yX)#{v)pz~f4z3ww+FYTMMduS zn|D|FwfR*V&Sp9ca^1MH*`wvI-~Sz@~>NV$qBbo zHrAV)r-ht8#-23y*wvPl4c?#Z_D5e^yD#f{0`t`X-a!3TK4*J>Nv`{QvG|;~!m5Ui z5?QM>3rtPlz7^~FuH;x|@O|>4FrS@qVyR5G%1>4~pZ|6DRmz?IvLfAdb>0>IF|i#i zn$7CISGu0_MgFd3zrOibzo-7+_dDw3oP7mr9v+26vqML!==a*jlt9<%jG14z zOsJXm7=(C6Rjwm+i1yQ#>vIC5^@}5jH{%jZKcy@8* zxf<;R=BGY;m0$6y%q^Ebxy-WA0hd1}l4i8)*o-{~!V_E9JCm7WSm>u!qx`Ay6#8<_5C2|6bKFb)3i z)D+Nb6R16J_Ke?}OPZ3_vF=~Qc%)eIz(fYuN$FX8ejW8$>%QuS!phH?LTfDUIW*-Q zvCvKX`+;RS*GK6GZ0n*n>MYuAA+)5UQocVj{*$i5s>t&-??o;qESi~rc>l5z&KilW zcES6P|8-IfetyX%CiZ-YcZ9~zbK*+5lXQi3RxWov>%l$2Q1H9-qn-2nP5Nu6NBlb6 zDza_9Ue#q8P7#k+GxaqKEFo_TA%~lb(BRdvb5OYMr-4>Xg8?S@n!BUe1`F&Yb>{fq{X+)78&qol`;+017(V A>i_@% literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ferris_wheel.png b/app/assets/images/emoji/ferris_wheel.png new file mode 100755 index 0000000000000000000000000000000000000000..54a1dcfa1ef4f97ff8987581c7b0af4d1187c59b GIT binary patch literal 6213 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 a(|NrE0(wUNCm0wQ7(8A5T-G@yGywpT8e5V8 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/file_folder.png b/app/assets/images/emoji/file_folder.png new file mode 100755 index 0000000000000000000000000000000000000000..4d8bebf8a90354c38612398a95b9c23a6109af5e GIT binary patch literal 4013 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 F69D#LWElVe literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/finnadie.png b/app/assets/images/emoji/finnadie.png new file mode 100755 index 0000000000000000000000000000000000000000..bfc5a0d93de6a433bb15d1b994ade85cefe1ce67 GIT binary patch literal 1186 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#Rd<*aiasB`Qzm^vkv{BKU?w%IcJ|7$DT z85p)07{o9zJj>3$78bTP+3f#`<@XsFx&;J&GcY`B@n>LQ_`he;UJHx=OA3E z{GVXZ&doiQfuWX-t&)Z1R&;bF1H+@_WFa=@cO@ksFRzJUU|D5oa%UDXFfhA$x;TbJ9Nv2^+F#mTgyBJcZR}wojz$4%-vvdp zMNC8G7I}sK|L+~TuxnMQ*R4Al2A&4nH|^VyUH#kPiPM>*xrOH*&%EhxTwIp!|DfK@ zVAiZ_jvBU8wO=h-WGc3yfQiTNX_30aXRifI)K|!BB&N=|8!+v%>35sp2{BwcU(W0l zC|Gb|4~xdj>$};)a%L2A&)%^<$63YI?}E?yH4k+*2<#M^V5ZO5_3Q9)^Rvw-)=6z! zQpD7qeY2&(p-^#CzohALv%8K;QhAE)2Ode?+<9Pf+eU_KdJI3jwf3=aELq_z!tv&z zVx4*a-r&?fA`Xv!h!hCT7s{A1?eM(~Q>NJW>nd`h0PD(DwkJ52krG8|KEUOyVn;*ygA55HY`{9y<-=eJ3i=@j^`9jrLrl|Ut zm5A7GdpEI5z9njh_Oun1ss+)`M;}F<{K#QYe*Q*-J^wkzecxi@W7jmrYykaN>H);``?%6KU4_pQd7zYH^@ zjdESpV?86+XiV`EmE}xP(k(v!Te%@8F=v6K1mg)^AMM%S-B@K~7xHQC%4_PYyuED8 ztp8i=uk*I#X;n7%&9V(Oo;UM)z`;Fxwke-H(lBY#q|hULTQ{~WGGBH^(|UvQ#2Ahf z`n{}sUR#SV*iq8+-gK$eJ?+SY+MT!aZiHSaUGe8#34irn2hX$7tgb5~vIKKGJ@{RJ zFH;d_`Si8cIIlYOYOt{tQ%c&~sDld^<(jwOKd7-lB$o3?CpY7vtT)EL-_80Ql)!$! zs*~wnCr?}W$&`kgzf0!Mxf*)$;WDyBnno z)Lg<3?{Rs%Q|dtL+qe+!~%8xN+d5)S=05XE?3-5cqdJQ;U~*+kvoEPvaR4 tiubD=Ynb?|pZ&z?3y12Nj&<*6RFC(MH$HaTn1O+T!PC{xWt~$(699Y63Hty5 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fire.png b/app/assets/images/emoji/fire.png new file mode 100755 index 0000000000000000000000000000000000000000..f2a3149bbfdaccae39985a6e0f37b1630a49a351 GIT binary patch literal 3886 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEH?;D2 z{r#wFi}d-$=jYx(upnbTzue+hF_$g;7qps1SKGMqOyJ-=#&=L4Q`+~4$+Bg>x38Gw zHqX5>OUPr3iHK=$!t8Aelh`LmX(vo{bi6m&{O-#+d%yqMbv`ot>6|@`Yv0?QeEd=M z|C{1-bI*PM|9^kt+v@czw2l``^nI@AY?#gwas0;$k8hF_d5`Nd-fysKo&7H+<<$hh*O6Y^;57evr?so!x#&At##ZZF{>)H! zn6+WUVTM#zrvFDjyUhALF{v%?)}rYL)#46#M6};vWSbGUGLgZ5dVzR*=Wb)m`l`0q zw~ZSv#6>>hd2svq7Up+BYr`MzQr)qy#e02d?VQ6d_a1#qnr1S;Z4HBG<=M|VVb3z& zi*UXcxxU(thv#78)%=sG#@#XV&N~^gzT|phnJ+St|D|Hz(&dLj`Q|bFdppCP`;OwI zXGcA1FG+5Q^{|>CI;S@MSY~_FYTZAx8Xvh9O3cbF4o#oMy-CtznKTPiRPYnEr&@d+ z;Rho-3m88HA2(qP{9D!@pMT!TjyaP*=lFETYYQ@pzur}v*6H!^kO?dIblJ}=XUcyb zJ;(F>>E{XOs@QL=yuiL};fum`Z;J$l6+f&pX}weQaen6+*~u&}U#)}hgy}fhJ%4Tg z^5>Jung64*8BgxIb0WpT+*85-=8eX;$8{KIr|sBdeY{fFzaf0Tc$EYHCdrKRhp(9A z@6Hd4^W!<}$C|^%rZ?ZhdCr$6fe(Iy)ibt!i*=sLzg?Hsj&*DDDYvUzb1P;OSpp6MsT{q48 zon2lLpDkz{a?{Vm?)FCyt7N7&l~S_}J5TJGDeykv@9Od^RmIN7{xXyw%(?We#jpSL z?4_?x9nL9RZ&vVC%;I?mXNC2h35RBj%GtO4;;x*Y-KA%1+kpE-X` zcRDMca66&9A%M+Of5HaFUB!Ps?NvW@Nb%~c51Z#oKHKfQY1f}`vP!J%Ev?_5i|Oq7 z)xqiUU|NX7!v#|Lr8~FnKHy~7Z_=-CbD~S~`jgLJlCE!$<-g3B=`SD{Yw-5BW#K8|lghn(=SFNx zSaaFsgZvfBk=4^)8{2=YnUrgwyTNjX;;nzB@7pd2r2qY%-SKzn?>NQTGdj-CSGc`Q z?1o{&o zdF!`_ZWBz(lfM1g^4uxs>)Tl+{2Scm)?ehjC%KJ%W%1ie@jB=K!bueyfS%#)9oiUdu)%VM{(zPRWIDP_-*k)6*12seR%~>%c4d}lZ=(+2WREa z`pMvPtZZZ4$1Ts@GjFkaI`RZGep`6syeR)1t?-ynx_jTR5Wev0!!{e0`977Yo($Y- z&virRcW>&8ukx|JQq49=N@aV(<`1q6O(}en%`;Y(JKV2d+oA5{^FsKpg(*`#)2azm z19T22oX>FnbBXWjuN8tHo~C)vu4J8l?1^uUvt!8Rrkn$7R1$U{{B=`6$iw4+%8#>= zfzuVPC4CYy7RZUdD0JngN-k%TO}wX|I=fxWfdk)LlbFTz=A4RdsP2W*lh(BN@J{;1NW}Db`jv$)m?EtFbPqK*3Dono#`zm8{7Q z$3Cr;5a_;<;<7A**KO}F-3wAKOfx55nD&4zLAzCION&b1`N+8M2QqWm_icK|Qsb&J zb63ap{x$bmCm*-WJE)?}z57(+saxJDCVMguZsD0E8NhsHg$0WPhpY+nYlBv0!v!lJ zt>R<~nh;|!(@}^~IpghxRo_(lk1tQLu6!S;s9-&L`tsOqJ>R~I&Cr=NL9wzc?BcPd z(_QC;7j5|xv3`qzpB%5*Mg^g`*U7g;Q@U1)<~A63MXhn2#L{!Lqha+0p`884wjM8^ z{wed`m!*?a-<|b;Rs7nkA?lpxZjo&aCzXR#&Kj;2>yXr3R4RW(DI`I3vKyzc2(!im z2FIE*h7})G9OYLCtekj+vB9vzGui#?^rD87qSLQ?@Tsl49Gvr}Y^TJJJG+D?NYows zvDNfhb3}fyoZt=PM{|r?*gr zO>|jkQgQp~gKf13m&9!P$C8q>IdRQQ6`=$v4vE$q6~0{=LLp%ePK%5T_XjmBs1Wlo zSkUCbnbxpNNaLeo$48eY*1#iDC*E{aoQ$=JpHLztGDq1rL)hKNA*bQ;ZOhavt&4wk zHkc;J1TbB7*(9biKOjn?o#{tQ=QjUGk6*|f32}JQvct1MD@jV_m~g^r3(H44lTX_& zzr^}&JvZZ3?Uyrpgnb0MO*jNwL|1Wc&E26jp?QWOCzArB+KRm6DG5xLd{6! zTzEgGcRC9knf1bh!+Y7;8E;i{V$7K~O|hJODYs#XVrKGQ<|R&nM=V9`7pYuZS1{qw zL`y}1ecF38Vm4`VEAnvqcJtL}ByRmg2Z z!m^0MunVQi2d+g3wn&`%;hP{R8p5Mg>9Iw$aR$?pxATR?J9GpDyd5vj*b}nw-eWsO zjg2}n3Af{qFD(d|A6mF(?R@41A?=3~O}GS(&*94AIkbbja*OjPSpom1dR_T`yG5rS z${et$yvk$3Xu3~biuF0eSB}Z`I03{?vGV2-MA{aalyiC znLk}r)$Ys2s?TkBGMR-XoSo?oLkjQ3&?`4DC^$B)5m>6Xj=RnnzjkwA zI=_R_d!7F})eOWTRXq)Wcgy@q|Bb#ifl)&?|jAJ!_3QjSwh4? zG^W?1H>mx5XKDEx9T6ul`jiR}q|9a^v z-AsARoh3fm??Xz3ctwk+;8WqZ&FdDNqVU;8E`aRK2S@IcY#jpRhc*9n+@z!DAt8p8O7sy^% z}EV#=V5&P`)&%Akg@6(F+GL-JP|Nc^_$F76}9jzvQ%_h@a z90X%7eoQ%XmqEC!i%Z4T@IjWr)bQwE3oK`_oMKs<%j|es>h1am*Szi+{M;MxuH~QH zyB!}qV`Iyi^y+-R+mvkkbMn^ank(m;UpJg~yu`J!y6_Uy+k}FI!G#s!C$@UC$6cGPa?W8)tJlyXU!g|FT=WS2u6?mePFpPSHW-UH$*vZ`{t`KUdz= zZ|Bo*Th;5HFOC;KUhUIn$k`!~)bN5UW5z|li?pI?#I(bhu?_8R^V{h%M=L`Pmt+8d&?*G{S{Lkut?*jiHJ;C~aF@Me5 zlFIdlHC>nd*O`3L*uJYvb6<1j+e1&eJ&bNAux+$8IGo*FvhJXbiml4ON&eaX4m(@I zsxNMGeCxRPxbTGoYu|o(_5QH-f0H$J($oG=-(B}XLH@z<4*B2m>if%a#o5UVl25({*{Wo>2aLOW{fD7ia~}t}vcqpeVTD)9I<}dLOKs zG?%MbOlM>0my5g33;$JpS8iHv_e+4^ZD_`Ggi_501=UwzkKTU&DOrKEB2 z%#+N2uC3pj{&uh4|L^hFt!{f|_x2lE{^+=ToS}y2fctDawgZP%mqq9Ay}J8xpY^{J zg>!CC4U%vvlxaS1vdbfTZOrwf3XhC0wxeC#|3z@&(z88#H*A=2uJEPqgMYu@?|*wrd;Okhw)(GE!G)}EU?-|zd~CE|79CCAMSlMjDBpTB-?p5^2pGktdHF{<3yU7r7N-R^g%iedyk zS`2MWOYOW+l&f(H(*rwV?|d#TJd@ptj_a}Rf>&!3wdE#`GL zE{I{p-SgcBPHzqV>{WK}tC6lPdE9Fr=NiyAp<1WmugmP~`%7P3xcy>r^}C(VN^g((&T}5W;#Xx0SYWHvbK#wBwGz*Q z+j+a!o^1WHqakBj?lVcY3;Sw+D^<=r|2&xCNUF;Q)#e}Da&HR>8O=Ga9z9(oyvS~g z!i}u0pXMCl2w8u;H)FY*2hHcOq@`!D+hD$A0**_$lua^ttupP3Q7?Rj+K$TF*`s z_*FOeS&eP0@7iU_hEu&w<3Ysr>v_#{O;cv&YsFva)x7 zZCzjc_Pn~9nitFRYs?3X`&Y1ww2B|>W>uKa`bY4_*aNIX_gyKYL~ix<$B^i@Z2)7x~j}!ZC(T-seT9x;YF}UAK{Pl-(soS($thZxtt2;Y9l{M~ve8PC=^g=C}_X}<2pFex< zTU0~P51j;-_XTSF8o$F*#HFLXAAEh6$Iy}C(fIlK@@4;eJ>HkE`5-I5rSguVdQSV< zqn+2>9vmt9E_RnG<5$5RKl$9>M^f(IUVc1C#B!<2orVW)jtvGJ7jv%oN*&>?{$^un zW%jN0;itKlvove`uEif+n)IqfVN+B@!N0`+|E7zJi}TC<`PlzIr>4ecfA;rx`Mv8R zH=FwRUSzUjI&$Sg%-%j@_x_~&PgKg7S47D7yxmdwDsGzS&6mkjxi-7VFJC=B`~B3~ zX}dni{51K=v0!g)c+AIe`|`V`^*esw$}YUQ%va;0$(sGTu}Ny3f*LtnRc^hvuYGjn zpa0#O&-$C+Un#vFTmF4r?CvA>XD!UirT<%>J@nMQuxT&LgKxZtBj%r0V(wcWywGH4 z`x=8&F}q6_h2LXmw7x3T>*@C+Y;9-jQL#OzPMom4y(1xuPiT+V(o5`24#sb1AI&KoNrWIv(7!)xIvQZ{?()2oVe<96RLZklAw@^J5F;R1F21qU25 z9=tj|u~0;Cg-lu8K1N50&IH@mHkZFLYc>6sNpmvThD}JG{l3c9Nqse^gS_@8_KQN6 zlfQoax!$Jtur7bHv_5-@lV7WNSwY<=oo`b_{{7CEYjeu*^(tplE?&VBn7Hymkok)p z4ihsCW}l8)xcmQFzMD6#9=+Zoa?MM!@%lRX!{n^Q%_#GlTc_h)U`MW#tpcE>KTcCzSOqQk%LJ(ryAk|#6Y zpS0flc3SRQU2AjBCL#W+7=?_jPc9tZldQJg@xsN`FPL^sZ?&0g*C=9u4wYU zn(@Pg7RC~tw`Rg$Qd`wp*94vJ`If}Em*K`^?Lt=X)$%Ot8`!lOS|+;`?GoH1&yca< zu80FOqeABdwM*gIraS#_@80Afn<&5-o4V$+aS5ZM{>zAl6Y|0h6J#7e@0+a>Fzefm zE#DagZY!KP`DNbeZpN zDx++{qo=8jIdX;T?bp@uFswYznlm}W)^o|0-0#c`OJ!AZGyA9aFfRIAvrwU3`Y(gT zYl%s}4m_XI&}qzhJF|54bEaF<4hDo2r8F=2#PEb6w>7hSS?lklhSxLAUh=K|r_ZoW zCrxZZhW_tHIq`%q=5G@(G))i-FAx!`Sk2|YblPlorItCR$#!bqhc#?FL!6w<&&-|Q^#7Q2 z!M^{s6-y6^%(=PWrS{+T8OxG<&d%8)^{$w4C5!sG1y4-bm=fxLc$ho8J^m{ekY4S= z-6-N&B6uOzgfUX}=h>JE3iHk~*0BZfF>36RxXfb$hvg9rEmHd0xFWsa0cV z=^Gj8g_Y_a9244Jbu!Mo8*=gg^b<^y#aouL$}kBAOXtMficgSg=MuW+$lxNlr-v(0 ziZSheJ!}8n-=#h8_b^3HP0;L0>OE@3?r9?PF;TlFii`iI&V_icZf=pAdNUWDExViU zy4u0^+N^W0Ek#&3A8czZR%|EjJpOStEIY1cw))nlABCz-C;oqzH> zxglqE@aY$C zV&d2Ka=5!k=pB7>^Qe|s-4|h#qR0?Uo9|4=WPdTP*fxt}m8pxreeZ+0&Kc9XGOSNM zd3JTd1TW4vg|QZfjZfB=KQI+DRa4hE63A}-@2~2a--0o%sS}ls^IhO*2;*U~i7}O4 zlvS$0P$Y9L%jBX}AyaR$`h_!T0$pYg*6=YrS!P(Fkm1I0yP^D@$cK3L#@Kwd4>1)U2llmFk3bND(}fdA6Wce~x9gbR3! z`8-!&EiSFtdZ+5hJFA>Mxze%wd$v9`+BC17KW186=bPRzhWbKA>GN?1He7pI=g{)@ zBvTTj>$3Sg#RUus0V%sDUeXqqn`_J({ZKQt@j`=geZ=lf+YJ_QGfY#imU`P8SI>RS z?j!dB{n-Ak*WVlzn|)}SbLc0P+FfPuWY#T`|9gJ2ztUonGbcAOB9e@?u}SQhFcswTNe8M=~I|9?@N|Nz=tVq>no<3sE1cB;$g^8P2u2ZU}Ugzli5DO zidfEgza!w<^NwYA4yaH0 z`cq)Nx1#Aj*3`U$bMx)LeRs*-1!qI>z-QVGJ891LwGu~TeR-hHQ zHalkhS82XKtGAZ9tv!F<>cH;KOZFwkpVzzPzQ2%Dnvs7mT)L~WGdJySH|GY0&*gkB zU6u(u7>@tyTg)ha;93#m>$XiEEI&02x%+N+-VI|q6)LfC+4tTnhP7{O;#!WeX5D1I z#6P)eALA@hZUuqK41L#UNo2WdTb+x_asQFIdaZd?-CO+yduI!V&Uwhw6vP;)*US;) zuYKa5jpHvD-4pd%Za>ycUn!T<_V1ghcszJ{ecT1J#2UWbk)CyZ#+$$my2`2| z#(Jw7E!h_DJT`+nS?5@%F*g<2IwSAeF+8necK6%Ut?Bo~%CBCsD@-D(FK-h= zLfawhO;1Ew_G>CwKB)K{pXq*h>clnSveK@4lU*lg&*Ht6@tWml4&%~=N~^MONz7ZH zy3Zi^d`{T8Kk>#DDYw=-9c#L&B+XEwz9}nX>6ud7zivIXyKXr(9+J;v`|&J^d%aM@ zXQ>a2IqD4MX|{J2z0C;*ur< zpAX-KKUYkYs=xokd_x?gc|hU!X+<~UG?SGcKc0NKd#Y@sA0KnZq}NY8KXGoF{_MC1 zvkbqorF?-%+H75s&Nt=aQa^%pjY^9bPIA0h$m8Muf-9emF>XfggOgr-*-xq)oEpwv zDKVWUVyaR9U9?u4!LjN6wHmjro9t|!K8mqD@ZSG=;f<&Fk8*j-~P$i*udMBOw#|MHD`%K7WxwnqY5G4hYQYs|D~9;=zT zDetaE&9bCU&VIc!k2SA9w7t;c7MmT#xS7+^AXA{?^IwBqu6`M_OxAO6Y~~V)TP`}M z-Fx%t+5PH%^Q>AUnGW3ldnT{zKI7@@Gc-QG=lZ?RB>3>wb#6Szr|p>jE?hn^&aTfV zhDr2ukg`+i+YM)Oxz;2f?<=jFXjlDhjpx?cX1PYu@4st4un&8E!~1615-t_}j0C5$ zwx)c>8xd+8PqvCORIXgYuxDZ8WRtabMJ7cVOwPHpLohixxoL+_O2dtv#p-^WMdm5J z-~Kl`Q?S+BdEL`BzKQESHaw0xb~2=eLoZucpl8y#IhM_`)@3uUR6p7KeM9T(JIfnb zrF~|X&9P*hu2#r*Aj5U#?evDiaAirRsL2Q9Ej){aTSXn0Zkj9=Usm<<`HM|&O-1KD zvJT*K-%__?L7^4P9f^P)Tb6uwxWjO4;g#e$!Oz6F1vdNJzZKkWlD+o&>u33=7*2gU zJU^>uG3%2{rLAojza(VFy_Wy-^WF|`h9-px)gSc*Exu+NZa(*Y*C)Okb}PS5&yBw- z`-A!^%LN(@HpH$1j*yD@X7BPL5M>EL-8x5X&r08iS%+ZOj zKfTMPfbjrFuKiJSRm)U^O$nSqu}@zq@b2}~jX&*qMsB{mOV@^`T`bPYNtZ8QW@G95 ze4OFm%r}$w>XrSD_{v}y@ngs9TVmV3Pu#n|`H#ijfPH`8=4^SfZjnah?1PtCAqYui9<$EwWGQ1r1jG6lr*O|KC3M zIt|es{dXN1bPlt!F&Qv)96#}0prhpb&7XhnasAbPQhxH}f*FfEvkvGxTw2E7@M-pw z`%3ROKK)WZX}@<}^@jWW-~OjEOwbWzf3z?A)b11eo%hYOaj|om*6{t1LL>XJhN%~f z7VQy|yRq#P&jrDRliTVT!(GH0_`8F$UoqxMF7cfEJzVd`DaIcfm;WmdKI;Vst0HDMJ$N&HU literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fireworks.png b/app/assets/images/emoji/fireworks.png new file mode 100755 index 0000000000000000000000000000000000000000..b4eccd5775b319e38e4a9fb94661aa51cffbcb2c GIT binary patch literal 6269 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 BUCICe literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/first_quarter_moon_with_face.png b/app/assets/images/emoji/first_quarter_moon_with_face.png new file mode 100755 index 0000000000000000000000000000000000000000..85ae2ce72dc273d392eb8b2270c1c5f81b93e7ab GIT binary patch literal 4280 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fish.png b/app/assets/images/emoji/fish.png new file mode 100755 index 0000000000000000000000000000000000000000..90bdda2c9203d6af0c0796434cd5138034a5305b GIT binary patch literal 4721 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE+L#6NSjkxuDx8L0P{!GnxyZb+nX-jQAE3{N`f$gQu z?`O)Me_mPty!Kx4zL`hQ-MH9Swq>#G+YEQ>TNjPBPOg;Q^WYj^`P^R<>&uq+|JfI6 z|EKu;N%OA%?GLZ;*ZT%;nJs#^X;D^#3bThm>puDRgVz^p{BSZkChorWz3$&Lj2p7s z?=6--SIxVe4>FZ$i@TBG!sUwcdOjf9|YI z}C)F?Mk%nk@HRzDN- z_1~pCU;CfD3g63f{!+jP9^TbeAIf=`f6!WfyFzmNP~`A?jUnf$_!b60Fr)~*g=Nh6bE zEqvy;t>T()@J7ke;G@C^!&h4k-;_V#t&-@zanK@ke`~^x-zo1eeUIZ;sL5l} zc&mG3)o;n88hd;$aW&*P2l=`Q3#F)R>apmW;G#I`g7b@h1;wUS%tvpDtSa7oh3QO9 z9|N1jw(G_US9V-iYB4cuPqeTxjHvq}eO{6w?csqq*UkSOHg;{#3=`cH+L$J`@C9GW zStj*pzV62@N(~lj9U_NjNF9*hBG_jYFoosmOslkYH~KG~(K+-{qWPLu+g&xcyJlPa z3d@=QZTP+J-z)xq0_PtDd^Bkb-udeAs@S^jch?r~HqFSqd7HJ$f4&?Hb?POdXk{T+K_~f&J%-wPnl0nPzJz*iGNJjOVQG;qOXoY(BEwI_V)gO+A`h^o(PDwTz%v z#h=^#58jl^wdrUUoHC6#%5^5DwSas7n`?Y^Um}?&WXJsf7E}6g^3uCLHFfsO#J(*s zvhP22M`v%e^UgrWm0=1EHeRCQKeM#hE152CVb~>i=;X@+ZL^qZ6@3kJg1D4>E!Es5 zo-#2mVPB!S!_;Z6waMr%e`vmg!#29tPk&ytelH@vNrs`vs4t-ST;So=;{EQ}y?^heK+`y5_p; z8(!coZE<5~=F)Cwl@o4fJP*km)!uvFwSI0TPu5bF>w1dQd|Va@w)Jo>vT%Fh z-f{H31;3IDjRj!ql|n^@{7#5r4kdy9O*QU!I<@i>=8*g@HA3Mu4G^w^9d(qT&Zb$0Y(i zJRRwW@0V~KJUT<6?X@aTbb4cjum?lr)x4`++}By=7V|%>mncj8UaIm(rso z9Ke`cCN=T?;e=elPy3h)-fA6+a1?Q!%(Y-q$f_B~4H=gt2)WHSm!@gBaz zW(%#?tVw0cs^fq7O!e9Fef$SFZ89yc*6v@f@rwPWbeuT@)B8W$7-VYybqZfLzHI(B zt$ltfQ)$&EhhNJw4~B*A`MUkS+NAxz-|a4ZKDYeQg@3FyUu3sG?q9!?ap|u-9(LOa zj0&C_8?tm_-QHiyRCz3&khw|YzCn-6PhkdD!N)!~WqKGHk8Fv`;xs>U;;LbZ?u%_) zt=9ufW#>M9pK!G}8X{aQI0AEhIEzu)U-cJE94+sIz zNpU?jGMjep<9Fs6Sv+S01X&!WXe&}F(4xLub zX*vC$ap{Uxe7@6I8BT9I&{+L$Cwp6BLh@oxKA($9>-e^a%-l9R!jth;adp8fdpVak z{R_Meb>=dp7(DcRw8MsdQs<)(tA`4LdzCIE-*RkR7(C16y?VfuH-A+o2=b z9)Gnce#WELJT>U>+wFU~(yI+iLYdSUOn5ayPbIMm{Mr+yH0grGVGF^NZk}So9WywY zm|Que6ji3IcSuc2VMt@hroU7nN9CDI;p|DjTc()I7dlX3Q@8Tu zlC>pQe=12PP2I$OX^o@KO6L5)+UQ& z1?ENN1)?iBx_B~JL>!xx1hb|%O;DS*Q^(JsQNhryb4Q%V?-h&w z=`WoAg-L5m^AwAYJq()^g%nsg7xH9$S+tb-umFdW!A6P7V7Ggd4f!@dQ)7NKLB+=7 z{pv0yg@#=*uO@8Lc(11cr4x4ZC^X9+{jhB#x5s*3v)S^$uGM~@elF(Dk;D3X1^55!$}X(&@BLydeWK&Q z{0|&V6I#M8Il3Hz&I=zp;J<<+pdoLys@*pu-)NIywNoxZxohpz7^8WF{0^opeIq|n zcLw)b{Zw^F$(~HplLfiFeXo=ZoR0hz`t|xbX9kbZ;r_VTNy7hEzGrRP>aV)^bE@cU z{aY6Gul}8{`IWunb8Y}xA-c11LP({S5<*R}S$-4kt5jagjF8h&^(82jExTJ)x7L#f9nP5mANE~i5Mg-T0U zg;x~zyvyi08^-@Qj@@l3qsqdJU7jMwX(GarM%&mOR@X-uKiU4GjalBuglqr%t<~Ra zALYwsttnZ&+V0b{*IQ>Ua=jlPcXEx+NtQ!}H51Gk4o}$l?}w^mYTA9#f^N~Oh&Fkj zpg;LrH*Edu`%F_sq3cN5NeSbR9Le^%Wr`w97gU`Z`VXeb&z;IEw@vKfMWI!T6u%r# z5fDgn5p2rP*|bZSVUyDL=i<)_zwCO=u(_vO_vZ^QcgtIHtF-Ue@3|WD^4I0vUfVK! zj(mRdOSCgX=)o+9@|T=v&Yew2JRkSu&YzV0{>^;)7aY$h%H_*8NvNy4*a@f~>gWup zl5uM0Kj19UcOkQU!>&DzOD}szM8~&1d2-O`#I_S10*e?tlDH-;J#tU1p=RU1k8`s3 z?SA96c`cq$ykU9L0qz&Bl}YQ@n)}Co)A@UT)sbVTgyxmMF?hEA z2JhO8^XX7Vf`MrVi*=Kom;-e0~x+$tN z-<~(Vi$x~#+R=mRolZ_4IE-0@68GHM#!wO_XJtNTrENvw&Y#>yk^b1C6qUIInL;CaY}k7ExL5BzQ~L{ihRb75?mFG z!e5&@Cd^2gP#|}Sujbrx-907`8~%N}@UnN~M76uG9xH{{78bI0FBdQT*S@^);}ho> z>+OC$U+aB;pRm8w!yTVHw%@GTud@2`m;a@nQ)*S^S>+~K#PIC>_q=|MzT3IK4_=$A z8}1Wrx%k;VuHoJ@fw%WeR!ueHsua)5Vn5unPqg1MLVxO%38ni&iTa6l~Nzf6}*+X|Nri2 zdwbN{B>kK6EVDmGwN_`}1Tz@>|6aZE=3o2&JH3*xYro$8EO2)2g1FV397k*Trez;C z^IsY3%`PU&zg(lc zc>l(Zf@0AiBPWk;)_vFCt(&ixEPc2@x?bD!|TK3B#w(V)F8f zx*UAep5gE?$PlLXBW;|Dt)-{_w4g0wjVzF()shMXLpuLpL?ylU1xTl+_c9|+hs0( zHN7h!kkS1nfa#;_N(O=ULrhE#57<8hzt8V8xb;Rs=6k}aWQnf+j~lv!`|qgRUjOgl zq;-vde@xid@YSnoC#OY)hHhVwp%&tL-fqH#(1TW1Dn^MIy3eC z6_LkzQO8dGTNWU+{q4Tzo&2VY4*YNT``kJG{~D$nK?`@i=L-$JujcuQ@uGf~)jn2-QeZBJB zHNLak@-hT?Zp=#32ugMcG`YJg@9u`Yv%B(K#d7S!SZ?<#p53H-coJKO^pm91MJcg5 zC&N$ey16SNJbK^BNx3J*V|6D^(l{xk8okKJbBl-9{nkGoABDX8MAhHV`z$9nx#*e2 zxuEqoKRrJ9)1&TB#l7dX_fA{hKi=N);=ie#@&jWgJLQJDbvJetJ~r2j*->yHarYGy_XOG^#jakz9=>FL^`93Pv$RE$4qq?OJNNwk z(M5q)#lOBB3HG=B+UhUM7%MBQUh2De_UhGJ*zU9xKKfB*=#yRRfHZDv#ROvF|o0;->>|9)_ngjZg+>WvTyUvWv!;9ZojQ9B_(B~t*!lE zKa=QGdcBp6duQ|s-GjSsUqEaRz&@R?(q>2&V;vuDqAF2^LF*IL{l zx`*vYgyh-d2i_JleBJqD-?kkU#W^Kg3f^2=DmTHWP;IK{A8*SF%k-JWLj8Y+iT(4;5CJ>{jiRvX62Vg zfrcnO(E}_S#HTDQuL@k*#OQ3WsqmBO{`zvEu*=Ra5BmfffBmoup1%IVxw+Q+e>-qw z5l(<%{?S8xjzeZr)r ztM%(1v*Lq<)Tj05&Y!zfYRKu?U=mbi!TQbUNw({Yx2)aw=3UY-6kBj)#r!0RpJjuJCXtSt;&#AIP`t|NT6Mx420=in;*ez)U#&Kp4}Z^^YQ5VdL5<@NA|o!oSGQH-EyxF^Eg!h-FN=^>>2ZCcXuAsYN~u} zTg1n!n|ou!L+$Ur2X+=epSQ!t^5iF{d_B({>o^#a3fXLw7J5YR1lC+||9DNZ>(K6v zlLEWmH9fqYSn`hHXfcb7$oaAWpB@LD{D#iXCKX4QKR-;aG+ZdimT~*&5%SlMYkTNK zC8pyx`@ekZ`P$0Cd%ITn!j%gjOpLVEEw9`vJ?VFJMbj6%J*+Q}u?e0(`{9wJc(v`e z=H7JW#g%+rVhJrwi*B=POyhpM`K`$9wB;)tsw-1uj>B5~59xe5t9N#Qq37~`}@pI^kt@6%^`m6a8@+r;P-Ba_gZuPZ)u&EnX8*zoY8r-ECK=^DhH z*y$l9f4cqSgkMD`Ib5Y;w%jrDy=Z2xJAcNar>_e6xCInBZ)lxh;A~RRX#ec?UFPU| z$=AK{-+xbHkXi2Jys9Bo+o_@?Mdj9|OP`khR$8!Z)vKTH&iNVfHqYkuGwUjx=kUZV zX`z9u`X3QX*2f7UXViMy1)0o_{J7{DB^S3Kb-kORt;=b)4Jns4Svy?plZ?`nU-*=X zUAMUhEv0 zPxo;+?En8`<+N#2S9Wry%|6}x#m?DRjZ5czmWb{1hdT1D&s!g!wq~rby~CFue_2y# zn}$w8s|Hhxv&3}WE(wna=g%UR7J7%BCHAu(&{!w9R$@8FI>DLOpB_5B=|_38*n@T> z9&fD)o)PX0GUbyeXZVL-U;FCStM_-xCD*K6cdl&l!G?*NtQ^borTgXE)fe|wM%kG( z=I}jkeQ5n)@1w-7IfsuhTh-h1sJi+{$Z~xwj7Z5+kYO^2I;`;Uz=|`>Gn-oMx}M!| zd|{x=&FcGW>c=7;#>?I!-(P96GQ2R@86A>a#Grj`+qG-b?EG>ye-;ZJs4f;26}4|+ z+NAu@VEqe*wBWxHA(irzJGS@)ru^5?eP6ceyRwKj~E!cQWoIf3i!nVr{X=O4p*z2ZLKb*lnti zIH_kO{D9M-r{6c)1_}S7#Sr=`M2IQHre7~$iQql`qD{-!#2#2!$aP--;E%7zBBgrfM=eNLKKo2?xJHYi zg|x@q#hD^T1%2h6PRA8~&gJWR(w)s0upw>AnU9q#g&Lea4{uEFTeDfoG3$`xN|u>% zf($(hXCGxX%zb6QLz}U*v{e7I8+%VWQ_7>q1|3T`?fcTe#~H`+J2ZLA9`<|UEF!!U zTQ{+t-(;9$abVu}A4@;3ot(1G=YxdIjHMIg*`y~ic(Po0yez=bqxIvXSqGIBjtD>a z>@b68wdb5tfa1V3lJyZ8*CoDJ*OCQ&$C}=tJ%h1TL znP+-<-MW_yZn29M&hduz1#IB>q+c4eqPA-d1IMK6leIo%r<7Kn$U2(-m^)}<*rb*T zNBf*^Z2F#PHMW{i7bC+@7+HA>7m~>n;0K;Yp{AOV^q;u{gf;6#4UveRq3`6 z=U}^+nz8{bI)@A@Zo5>loPKa|FY_S_0Yk5YpD(9W)mZooC1iM?5d5t3J7DJIrmG64 zEmw;i+R(6pV=8xm*J%~k9ZoYYRVXMqI|?2!V_3s*Cs%8iHsjQ(Pwg!#|5*6;^MgBaM(`t|8=P@ycG4ss%ICfB-{?ZKJ+6XZ-0xz zqP(6n_au$>Feche7LZ|ybW&w+J8AJsDY>fA)6`KV-k*J)(vn-tPS{v#YPX!5>ekAr zE!M3TDrC9juL8sE%CF_B4_d|JeoU>c&P_kRWy^&PhaEqMr&}^=u{K1mdpM_OkHUi` z3JD%64gv}7YbLH)_9P{dXMyK>y+f-n+x4Xu^PfBWPWkoPxCs~B6>l@lf^BlKUEV@HuO$zW7um$7#s8`D9SG0ppw6dF7jwMapL~Y}}E(VrAy8 zaQP1>8b4i1y0g{sd6r>w!X#ntSL;_jyz?X?J%GuvA(Ub91m-iV5{=xS-}F}NY0IfJ zVfmv`|6xmHmw>>%^DK-_EpPvd+%Y~NXFfruH*EsT;iFr79)I}PGQEc(-dWS3ZOUEe zU!3BtEnExruEuMyHZ(lx6V&gHoVqtQ_DV!_^pA;A54-Q)ZNHk(=B%=?0 z8S@nmoa0bRl(hYzqPE6nKVPw(*`+O(8Z(&Rr+*DHh@No4-ErZ9TILi5_YGfWAM=p^ zGGS$pzh=YKMcd;ApEqpaJw9An)|dJCg@t5roR5{Kg93w&XGX(qZBLD+ z>)a1&6Km?^XIeWPh+`K{ka3D@So1ZzPU7tK1XaV8*O}hb22XK&BBHlE{IAwSEv69m z({~>%Iqmv(xnFnhMCBUxmxnnV&i_%`q?&KM_5@c$_fju~>km@W)0N_yJAMnOFNhNpUFfCoMUU?O9Y~$5t)*;PW24u&!rKQg8Au`TG}a zH8|Zq!Gk>_^O@v{`_dloRc10=6;>!ol}I?3tgO8Hy#4<_kH0HDNG$P^v$>+s>#oeg zdLrh)UI!L&zi&)cMTL)>x%^@i&$qiIRj+P8{@`7Tg^Z-StV@PQvDAqRYKa0xEq0q3 zIs)aC%|E2yQl0a7hT_`lC>5)7U!rWaSk|>Z<4nDx=hWuCgzPMtEvGe{oxc4vu;FIO zdAm%&&99*P?Gky338u1<(bkP`?mco^<3Hirsl_$5OfIqq(|aw}^SxTxbcD5WkSyd|h2Smlt?o^20{HQK$C66NE&uWs?3;>}>&%*ZOC9(yuoq2`8}hFJ83$UhVX}ySrSw zlLSkioTyf<{#NsNUw+@ao134<7sgKz=K9aD{YV!}ux6tt!;Yt>6W;W=efhpyVEqTJ z>W^pr%&ID~OioP#iGRda@)R$h`?>vQyV${`_6>YRV}uFAmGKfgwBkT@OrLwyZAp@=imh4QrnC z3JEkm^U!KK-51pONuXJMzD#XhUe2_b6`v2k_$SkF_v~WBH;TD6ebtO64y(Sh&hXi% zrXI8IbAuFPO8J}FPe48HB#KkFhQ$gXu^N)TKQAHuoPi(Way}VkgUVX|ROC5D} zwIj=pm)mVrcljnN8ah8Scj;+8@$bx!{3ddnmI@fQwRv8R`^Kbx^vgP*zMyqVI)513 z4u1H&Vs*WwK`PYOTDOg=bU z>rVNG>4^p$=}ZN$XZMCVL=-)~eD|hn$A9^nAQpq7qN0Ch=IYCLE9jq}I)D20Huscx z$DUeY)la`C+_7Hu?buacFV1@tI+o`zd$Dq^l0)vCRibHGD|I^)B8nFYhL`tQJT zWA@aqsx|_$o!#fW?e49M@}IVuUoP^?&zT|<7KBYI+PbaovXkxIgX^aTGDxo%x^v>f z1#9+Gr?diZJ-cwTaId?a(Ct`*ea#a#a8}PcZ@XdnQEzW=^EtWs@vMw@iVjuG)37r1 zn~>pT5xJ<^`*v`LM!(k4f^F`h58to)%Pz3!K-Q)OEO&MltB0@M-)nmMXWt&wNO*s5z4^84>wSIwKFwkfO6{MMpRca7D5E}d=Jsv7s!~Pd zCMixb@{ze86DjJQrJNoof4F9C zbZ(@ia$LnmmDdswJ%i-Ix&#hk+BrCtYx!0P3-?lsbPyOL-+1KNp*S&A4 znC&aYx?$oY+m8}{wYhJruZD(pPCk29;qb{6t;22$ z{k5dD?)#k2bFJ^Iw+S@yZ;Gf{@HL&Gp6$TnTA{-RjQj7)=kr!xW3yQowq9e~56equ z4u9ihdfm+XLFaUpYG9Jf!a0F&Hw(KyJrc0%&RuJ>vIzo{4%)o1)o!wD>vWY?$`)(= z8~ulAbC2nkWsBBGsfGp@cU@g9nCr21f-$d(E}Pg23qG6k3W^LH*|xv_v~5H6*H11Q z7e)HB(!HK+y+2>J`d3E%r*ILsyn~Dh5^h;tKdzgx{t3V0{YG`xs%uNVr}}sq_D$FQ z+^}q6ICB+;;}A6ClSr}A$9-%WiH9h}$H=Udx+I$XO~*?yq{*L!V-S0%CO z$vNKM0lT8MYpMT1&wjkG{eO|G(u_?u>ho+a zd|!Gn=VSPLO@>z`KOS8>mTmp|?{1x?TS_#h&X>_UUHyscTSm*CuX0x=UHiuH{jIc> zv$<|==i~JJp8D$h9?!D6y_SJX)FZRCmdgfhquJe1Y%-`GXq!BN`U^hKGbouoEIU0g@zq-YLdNwI(PaErk z3Els1eC@uw|HcimlKAvT6K@nz%-GuOCYK2`PB3L&v<@5YPoUk)nof=MWqAjkz$Ms z5*b%5nV7s@ed}@?nQrez>&{!%9y)kUmugMBbW`D2a^Ayj{C93E z^fpayKlU~J^&J~A_8+q|MK*k9bC|S*qnAO}L6SQno$Hu>H$y$*i`)voym7O=X@*LjrjFsX1=eo-#rz3tiZCWEQ#ww>Mew#PpV3I1Ba&b%$LRZ<=fF%i3AY$u_vwoY-!>jQZND@3`rh{N+&#~# zgA_LKaEGWm%PO>(@6nsaeA;xLaD&H|ue;XD?|fdKz3uK-wmTcEOY&ZB`@Qd%>bH-_ z5B;P&I1qY~iGn!e# zjiJWz)6w;J?vzx9^R)3^`RRJ#n&7wH6FaURyer_oCHwmE+KEs5lN382a~x;nX)O0+ z*xGd5v@GW1+I3U4Tdpm$s@N-Z>k*^P|I51{f4{%QZ9*y2{3DOk|9>oA6J2Y#Eq*6! zZL{-<$haR#x*U4HK1_Et+#)CLAlIKBXd`$3MbXY_`;-4iim`-FEN40Jv^OWZ=%eU# zb8}Zgt_lS%CY3;k@L+}(hMofov-KYw)VEo$xGy2J0uy>boMQ96Bv` z%x3l8y?=kbulv5cUB3R$$G_HPZ!B~;4vFiXxRtOV@1*Y6P8KCaeU<49=T6GAP2goZ z%)}!s;3~*_QN!z~O6pSjQUS(f+x z-Q5YPH)T6r<}G->+n}A}u)ypCg2w6$&)p8b__TH*N2!y@fzM15)0%xHZiu~j!Jv?! zYX0x(%JhPZ%ieOV-^C@Jzen6_CqvuwgI#(B?>0Q}{&VzlX}4Zw*rX*tUkKm1d-pCc z-;d5tP8sVmo~=pI=Hk|Y36-ara@bzYVPHA9`Aq!vD^EUF9%yP@q!G%nAdP7Q$AnNF z8JU2IU&|j}zF#k9ZU5gkV-{c1&CnAMD!6=^UVl=)wex4&u55IC>6bcXofSiS!F;wp@K+c_dbFW$c1 zel*vYqs>O*6!UVm+$Sl*ZHW$>Ia1CtDSIf);kvvfVYV8F1%r)Krx;gr|E4uRQeM3| zoykyr?&DFnrGMW2_}E|n=d<d&^;p0V4m3H-sC&L1?ZW)*|2^?q0kF_oF zZJy(Odt2_a^Pk_Yo9%SN(!k)tY!8)RRn^t;M`R||Bt<-tnEr@iL*Ptd2HtXeiEnRX z*pDZjoTO?HDL$|Eqq#-tmwLtL!3mLUW)c#!*tnJUbfy-VmNbewEBNe`VwE}VP*Q#1 zqms^Mqa2N+!k<5MS>L&J>({Tf+wWB!eLMfp6Jx#USAqgX)F%7QfBF7>_0H#KW{PX9 z(8&_2^uKac(9=*yfNiEF=1ly_a#tg{}-<(my%bAa2e<@ zb&Do;I%-T~pV`Ehs=(}h{-8<94rZZ#d!PBx7F)+Zr{4}X++GUnsdy$v&&c;th5Fff7!e95#8NYx3slvuC>Zc%& zyMne+#57jjx*2nP8n2dC?1^)E{rcjRj>FGCJFW|vFnwwp&!uQ@<;NF%iYtBa0m|B$JA;>E$ ztKsLPFx{rmL)-U_W&fS$;p<{{&UIs)6&bPdm(pRn$3EL?S^)*|1n&Y-Zks-(r-z2{QXasu^cxro8z==F{9mj z=_6?g2OAkS@C3UC^fEXl1UM`c{x@aUEJ?>$ZxNp3fegtSeKNn)RM$Vg^E5vv>lFtZ z(+ckP)wP|Okt@1eE?fxc58Bu=Z=YSv&PwiCvxN$R6=cpk7ww#o(Q)Y6T?y?~2035O zaWS-f4e6S^{)xKL`I%9v_WG{tz142XOYY4O43_`ayp?rEOUQEf#^if-zx;l@UdHNs zZ9&Q<5kI-Fxv?hiC!hEte@pkd`uxK`JGbg~FK$Y1Qm_a+TdA&Pmb*v9@YRc>;-#VM z!(BN-8rL@kn8;dQZSyTi3S&6>=E30>0bbLccNxpmUi`TJ>wH;}?neQZ_2RqEHHk-9 z7#ZWnCYV zqH_G$2m9Ugj~}=Yu=QTdm8~)l6F3%WEC^W_!kuDh+t`#QHLG)DWPJPbIqMlexUN^e zrE5F##+mL^i zFaAtfeD^N<@eEr@X?b@e%dW#!iXR{JtImH}uztP#UuNbP@-j>2v#&BJ zaV}R-oO?EO{dc~A*Y8(5{d$`p=X^n9LCU0!_FE@Tn!on-qr3m~XM3$=cbN5N<2;_L z?D=nYWN;=&Fm0*~iGEVEuc`C$;S*nFniRh~ns>3U`2PK6(L;u3fh$9@&aaQJdB}R$ zsNCi8##hqmR+HUV#xz~tw)oqvd0y$O3~J)|?^)GxwcguaFmwLl^`)Pm?7pQMcKY_- zV235`yX$ussUJTOd;b>4Rt6uxunF=q$A5eb|K+u~{zm@Ho8ec3UfHLw{PBD;o7r3D zcZ@T_!`4S{@7Z?Xs@#GYt?<{4xwj{zO5V&7Tei;nz=r(yum8^9y++mMinZLO+&!gn zx1VJA*U!zHdPn{KALS(B$pSTkOZi+rZo0ZXpjjpmX(^N9ui%fn_R`s5q z`}Jq@hMeW0=Bte-WxkkjT6K=k@`6uCK2En$`hH&aVyge&cN2WpKYnBRUSQ$P3j#f* zb{fBw739p_+>c$TE|B*r6`Ht>jYVqu+OKS{?3=zjtXlO=#ocXPRq}oLyxaeOUyrxG zS8HN^;d=MMeR6Ybs#MA!@K@ItKlw0wd-$oR*{_-7Ji|{le(Z|7s8ce(n1w}J?0>WN zjT#~Qm(gle$%>iMhylZhHoLfjO-39D)R5eW>rqhXI9vIKRW$Y^TEEB`MI?_7dV=4 zd_RZb#jZW_?_*v@X}mki6cFs3ur=)5W@Xm32~2xGZ;Jjicimt8mRjezoiC30>}%jW zYr~z8k;h;>H)WZm_2WBdj=DXPcp4(RJm;0vG8a7&gI7%7U-;g>uFgJrg72I1wBATY zgAn7ntl`FT4IjQ)l+K&`YzFIrb-mB7Jiql*Q~9#p^@dQ_XUrZRlcILLx~u)~^#-21 zN7m?C+Mlf~n{`=sqXCx(?=J@l{mXTPA)**7!8yc=gG_DMP{m)V$g{F{mTjg{{k=l+trk@@YL z?ec>r%jKAKJau!ceqktG@j6jpgg}%M1(*44$rjF6*2UngAWNVd($> literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fist.png b/app/assets/images/emoji/fist.png new file mode 100755 index 0000000000000000000000000000000000000000..ecc8874c2fdb9dac387bd6765ac8081034a75c85 GIT binary patch literal 5880 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEzv)_#v}e7yEMC^q!{-m2TN(~J4u&n;fRYMxfF z+EXcJrR85<-g{M7{

    `{?_ci>4go$&$0Y`H8}nJ zpKm8Om)Cy%X8r!xHF5h-59)uvIb6Pvn;}c|`(yY1yWf^6FZWA)cS5&7EUF-?)M9gK z2>-dq2R7a=c=IK*svz^_MSr`JFE%_9q~-_IO!`Swn6 zdguNkW@pp&egAU`9!~AH-@fI-ueY1|@60t7HkQ5o6u-2^=HpBD>Gi4GF4jE1^N4BHRV|Cf9^9v=cQ+hZRdHkchK8GA zpY@JOJfG7j#8hPbI)H8aqlHl$rOwv=e$acKbGcLm)6#m4zye$G-Z0^_RZrLU-?6=2 z@#f~)gYy_ZoSbj_sqZ%b`aj*)@9K8J8G27%~+7W@T8&GRH8Y=TO<5CfylKXKcC;6v6Mty-N?{$Vz@pYlv9z?=H|k%AojGfI|7k$cj39*coV zneq$+jC%JnF)n6_t7TjJ%;&UPR-;E|$4=u7PLjoqLVTw;O?WQpqPJj)iC4Cr&uaCl zm!1Ut3bL9u+vSsPxw4a2`gsNgpR1atV(oWcu5O7;n8vz1NV!Ew$(4;MGGlizPqZjU z@`NC#Co>Zr^c)*C8%-RvG{2-f7JOdXI4R(<=yIoboD3}j+UHv)EuETT$J&r))%eZ( z^do`DJ{`Y>Eles7S55eM8cr?cYnx(J>p$_>gi1cqwZ}P$Zioi@~(Hb-s*FTe>|~PB^}Co5Uv`m%=HW zeL-AWA`_NQXccnOO1a3=;KTiqljC`^p@H^9=d9PykL_x4Xj;HyyhLSx+8md8&rhUG z<6o4sC7fY`!P!YR-d|47$mo^r)@TsuGZFWgbm2l2M}VfI#pN)UInJspw^hVN#Bw!S zNGNf--CA+yoMQ=_p_0oo#aLh4j%&X0HE0OdNx4sW zd8DYQ>spGE(RF_Iz*%jc0*c+rHGd=hNfgP-TvwzY3#`FW$eMVGB)9c`~iO9BY*WSC2;CJelVrUm{qChiD#2Z zw}Ah=xlb?d>MvQ(5a6kG_=3Em+}DY1x;LgYJ>9nQ@a7z*o@E7(+GjEDlRt1jr+KHG z#Pg1J=92Ys2cPx6{@`xMqH)NgQT_;r%E7cLOmpR8)EPEQ=$v+38q^p)n{jjQkGp1U zbuCx@_@~GH64Y3nAs5jWoPVgu)!9-##;p$UIi8d4y7;GuPYXRPI?`_{#DkxttAZY@8%po^M~n3%el<1 zsA9G|-xf$*P7ut?6uWTJ^6@eTuOOM%c@LJR&p+BKzqjGtWdBD87N+W~m2s@ileH!HWja&Cn-H-Z@~mfkbyxR|~EaGC6qK#tu(S6BKhnaP*rn9h9o9z&sCY2xLZ zFBCr1eyL(MNqc2ccYg1T{a-ECxG}F0SPuFH9Pp*T0D| zbl+~7urWy4!E47kjycAE9TZ#op48eO%gXOq>|Jany{BO7YTfOd)^klw?`UK84OKty zu#@+h6~pq|Ud~gVN2x3gxWb@V+BN;e3YT-56{{OtZ^h1t-zloDAAh9#yiId>d?oMe zW`?+}UF?3cbx#~te`;r#S96zH(5d6M`MrIgo_vf>d%v?LS=e)u&#$70J6GO#>Itf7 zHW?h${r&ynm4|<=s^&+(eNZiadq?iZw#)9{lIwD|{<@>I$BnyeD_@#)y!sTzQw$D0 zpKiHIBrp5;QAWdUf_CbRO|=nD4D&cN><=7kz5d~jylwBQ=Zm&(X$gM@-?Zp_o74fBpjXrx}AyNItzY{uJ$<&rC&A1KOw5+Go3+JNbV zEZgbKr25BaE53h9ELk7pw0>{n;dcHlOHTZI+kS7)k9YSg^Zv50Kh0{P_+VS}QDtq5 zqU)I)3`(Z4G837mc&v4q^h_XfmG>=^zJfcYTdHGZniWJh=ywIa<$rk1CL&LC+v5hq zxR5$k?iJ@)ragaY^5R;0LZ{T4n5OG74MKCXzD_#k8l*MRkSn{8@$*!zHy=$?-bi_K z|9+M)|Fi$^OVv*g%&&!P$YyIelsG5*{?n_H74!TWZ*c{2beLQXd%jEXaukDS=U z_3n|(q&+>}t7X6Zk=Xo|)T3hJ$9}4@A)Rhkym(QUi&Q{;jKR_L%!=Wd}Z4a z^uUyVL4$@(nG{FE`H%|*{fA~YI9U8S_+j2uXLfsz2iwceGH9rlsJorzo>t7Tbfve0 zgio>4jff7huph;>b)5N?lUr}j?EZ1_Xtu@nTkX#aLSp%5_qNVH#~+aTe*JUq(Bp2K zZ#rv#;a%P0kjm7+RB@Mi#-YBp@L69pb=dMV1=*K0*-Is*F8=d~UEa#jbu zP7Q1G3|3x&rB^kUOF4V8Na(ECl)5!%?eyCr7G(o5g?S!xOvuVw zb5x@_H<0JBNUZ&lgDHpfjJXvUY*-7twpeTAewXz&Hck&YKC9JPJ7Q18PdT?$#~Ez) zXR~>1tv$5)D2vm|ZBnUs8iJ4TEHpJL+bU9$dVN#Ql_*^u*$5Y*Hjd_vMdYy7V5~gYRXm4r(b1u6(9~ zsdpH}j9Yn19UdJqc{Zi-(1rsBNA$RD{;qGy3fR(M^!9e77o*yOBDM}074csyL|Rj= zEjC$nuYN1HZu{>Q75A3(T}av;dRIueJz=@L$YhO`44S7Oo@|U|cT^PcQcU#P)O7pS zsiP9N=Qc1*uxU@Z^1xFh;-Ey>td2{Mb|o!~537w_b^d8Y5vTFbnGGj->%+dCe|XG| z|MgqGS)V^=yz%drOk#Vq!~Au1&&HO->61>WwFE4k@~3n5!Uzug(?vcmns57~c(!&o zr)DncFmkq9Y|WgS<-TNIN06#DkCke~6z|0{>`M%8wghu;mx*y$fBSG+HS_1d6e-p2 z>4^o;TlDmUO6Dn^7kc6~@sXjuB}1g1`BxLQ&a=K#SuQU&++-S*%2E(B!Gv*Q!Ue3pC48cK7 zo{@EN(X)I_op0%yWQ26A{MTT_cFt1gxZzh1!=_;K^D$KuX1UlMGH}zna%|mm#)T7B zdro>)IeXqcFGj16x2G`a9S^ZTJ!6@LrlY~Z^(W-Gy0TYGCf;GuN?ns5q;XY8`=-NA z){_cpc`P?A7oKl{)USL^EZY zW0YCMEXn)nToYLPEzLJ3EK*qdYsK^b4w3o}ky)#`^)@p(J~VP&#@MrTCF^996?w~a zj=RX6sC)U_eAV`R$fZwVz6-7Fx5!&Dg&3I+P;pP&h8J+ zylZ~I;&tc9|KPh5GJpL(thj6Ohoj=_`PCRs++|QW|GhoCy!~u;qQI6*7EWTWyCf#I zNC`~hDbNv#F=Gvyl+7CQlI{w5`1NkH zCAU^`YksburtBZ&(#-hlucB4rx8|=B|JE@CczHT?*n53C?I##2|QCMMgPFz$e^w_2Zjao;~s82TyS}twMyKr$%!@|l33KdHiv8$Zg zkfZ+BIFW0O#({#(&1VmK#NGFiW1rw(a`P=4r=i4R3z=4X`CrOc9&y<89o!N6%P?b_ zqkdQlqt|JX(1`mCftRFuM16%d9d7ONyB~i4bWXkJWtOc!StGt$O*zY`x;$o$&GRlM zPaZ*aj&|lRRrrI-s z!XArHhHtiPy!rNFl>V>voC1s|;`kXJ-MsqX>h9@>pa1@QF!~#BJ1c|V$_*Q5oOL`B z7N@VV_p1Gj#ewsLm|1k06c}bSEU(?C^FUQX=K5vdUZt8%|*n9Ex_z|9w97?8WG3X1fbkn?~F*XsF;)O?HfsJm_8Z>T~9I z<m+A3G6XSPYH&Dd_Dh>f)aArsfsY&7AKsF>cHO*S@B959 z?Dcu}Gb;o>-kQxYCCE}yrShTMhp*Am2i?VH?|u3zCG7dGhND}X+@iS(-mg`=ROVxt%P0da*PQ4Q`>5}Z-nYXkmm;Z@l zHi;F=k6oNHGsu*KO@fbua|!1sjZ3F~zcnpc7kl(olytaRGxz=dhCi;E{LR;UV?6&S z&%g557v1GU8P=SheQ|2D@9TS#-8!K;YGNQ+2C+`IPxd4G*{L z>~hLXv2N^~qA;_iN0=k`r{bZ`PvQEBUvKfoM7)07o_+ZI-W?Nbqz?pWPTiNsaE#%k zAxFq8!xLYp9ljU+u%&v=EUURi^P5Pj=bGAk z_unL4c)Q@P?1QZ9$B*U}{M&u~Z~c$OWgqrBRn|}1`%R`{lQ}~|DntFBrSI~WIUOsU z^}lGwvKjo&XH05#OqIHm6}r2TZ^|7e4fdz5iwoBK)`{DG| z`Sj+gH-FC5k}BojniX1q^r?kZ%i0+U`vgoKe9rZ5dK%|2`SVm0&xo@ z-kx6l|6_aj?uV2N>*=`Ot+m>eEmf5nOtJm}H zzwc@x;k~^%aC!5=TR(Pf4P6tzzbpHCSmDoKyZ+t!dv$Bvzdu_a%G*`eeO{dWbbm}h z9YexqkLsV&-`Is)CTKOdDNZha-gorW%EP?hZM#ih&)YexxZv2{H(w$ieUoR%kCIHCZ1x9sL+5N|MMZ4u;Z$T@i>=rU8F#ym!kt^{$B zYyGG6^7R>SXe)Rfotv8^>hM9<;Y~|?`LG=_{z5D&VQy$wL7c#S_P^xFfcH9y85}Sb4q9e0Cflq A;s5{u literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/five.png b/app/assets/images/emoji/five.png new file mode 100755 index 0000000000000000000000000000000000000000..794321aa22a38dfab90990ee34c608cbd50bb460 GIT binary patch literal 3593 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/flags.png b/app/assets/images/emoji/flags.png new file mode 100755 index 0000000000000000000000000000000000000000..540164e84e438ae269178f83a7d2a0cfb080a5c5 GIT binary patch literal 6124 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 z≪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 UF}+KLfq{X+)78&qol`;+0EzVa@&Et; literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/flashlight.png b/app/assets/images/emoji/flashlight.png new file mode 100755 index 0000000000000000000000000000000000000000..215940aa8f1bf0b8a0b077d6e93f98c8f60f1ab2 GIT binary patch literal 5024 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/floppy_disk.png b/app/assets/images/emoji/floppy_disk.png new file mode 100755 index 0000000000000000000000000000000000000000..4ad56315ae65f7c669bfb8350514d22f58e8f8c0 GIT binary patch literal 3215 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/foggy.png b/app/assets/images/emoji/foggy.png new file mode 100755 index 0000000000000000000000000000000000000000..3c7b8b04b9575a750a51567b444fcd09354c240c GIT binary patch literal 4623 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fountain.png b/app/assets/images/emoji/fountain.png new file mode 100755 index 0000000000000000000000000000000000000000..da126e6486e1f857f43f13c532dd18cd15afeff2 GIT binary patch literal 5087 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 OVDNPHb6Mw<&;$SvH5@Mh literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/free.png b/app/assets/images/emoji/free.png new file mode 100755 index 0000000000000000000000000000000000000000..c886cf2494c1367bec7134e9179519a52cc4bb1b GIT binary patch literal 3605 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fried_shrimp.png b/app/assets/images/emoji/fried_shrimp.png new file mode 100755 index 0000000000000000000000000000000000000000..c8c284bf14af14f06f4dbd45e61e035e3b8db52e GIT binary patch literal 7550 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 L>gTe~DWM4fY2C$d literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/fries.png b/app/assets/images/emoji/fries.png new file mode 100755 index 0000000000000000000000000000000000000000..cfef66966a729c48ccf081661403d43d802c6105 GIT binary patch literal 6405 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/full_moon.png b/app/assets/images/emoji/full_moon.png new file mode 100755 index 0000000000000000000000000000000000000000..8ff657a25936753687d44e607519b8b53e66b708 GIT binary patch literal 6458 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 siZ|uWsSHyX1K1oS895hn_v>M; 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 Kb6Mw<&;$TTNv}Ls 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ghost.png b/app/assets/images/emoji/ghost.png new file mode 100755 index 0000000000000000000000000000000000000000..671dd0c9e2ef5c61a08f7695b19defaa454f1e77 GIT binary patch literal 4513 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 Q1_lNOPgg&ebxsLQ0589*+yDRo literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/gift.png b/app/assets/images/emoji/gift.png new file mode 100755 index 0000000000000000000000000000000000000000..552cfdc2b982d5d3ac41d44892872f038dfc2d60 GIT binary patch literal 6712 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 kpYdD$<9N`|@K3*MLI2vAGvDSCXIz_ebU{ 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/globe_with_meridians.png b/app/assets/images/emoji/globe_with_meridians.png new file mode 100755 index 0000000000000000000000000000000000000000..b198646670cf4cf4d4d307ad92949cae4af0f100 GIT binary patch literal 5837 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 C{NP6b literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/golf.png b/app/assets/images/emoji/golf.png new file mode 100755 index 0000000000000000000000000000000000000000..cba2116a7e2d627728bcfbbac86b95cfabef667f GIT binary patch literal 3548 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 mI@A~m`U4GSLb&K^z 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/green_book.png b/app/assets/images/emoji/green_book.png new file mode 100755 index 0000000000000000000000000000000000000000..e86651e5c5c372afaad34b4ba16f84be46acc9fc GIT binary patch literal 5090 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 CagA^Q literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/green_heart.png b/app/assets/images/emoji/green_heart.png new file mode 100755 index 0000000000000000000000000000000000000000..7289cb8147c75c638ef01ce52fd777b166e2f661 GIT binary patch literal 4432 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEzAHvGXB5%l~^y7h` zuZk+8s{u>nT9&Dw1e-MyQX;3-8W``kUVnGzd-v~_@oDehu3Q&={oy9YL~o1G|5nR) zr!V{c|Np=H*PoYs?^yLICa>*zNp)Pqb5@QUf8EY+EOOAxzMsO(H`ReJBvGQ^Rq7q{ zJI(9fz1Ix;IrZLR(|K)b`P23tRH%rZ@YrCZjLQK#4L2L(dmmTizgYjO^!wsdu~w(@ zw%yfgYCe7{+lcvK<+kuXQ_IWhj2)sOB7qK$$sYuF%v#s){c-!_uKmj@ru%LB-Mepb zs%xG?#r(IX=`-i7Fm>FkYLIVoT5>*B6y9kleoiKfvF{H0t=o$&+pDpF~4=;k3>pr%!83r*~_LiH%3&QUkZu*{Qwcv8o z-qS|e#@%PTW8+&+O7>a4U^!=(()Z+(^UL!(PJ5jL9So8Jrqt9Uu+?|r9q`R{tHl@SbcdS(1?UxxdaXMg7IO5VQ#d6XR{Rbok2@8ZMV95u4VKR6EUS&hl5MOlp{qCU0n&l&T<;U}4_m_~T*Q z?H`x=?G8VCo1CI`Ggj%2)n-k*;QD1(%|5lCK5(M(pzgz@>M5^#D?aYaw)p>5{PV0( z_X+uL5|&vxYHA4zE3R6>(b$rb+vhq{aoYDc&haTS>C23cZabyXn!#SWcHt_GNkWc- zEo;6Q%!xi$$IQN=@L8Z;>38;ujL*)#f>OpGb%XEs-Cwp!Z)0uV%To`w70k4~_4UY} zR|mq2KF*In`Qd=U>@@R$5?2R91~-q{k3?Bi)2n7H$yn@Y`|VbL%02JD_BOwqb|;7A zLv!tmy}$JPM>RZr{B-Herw{et3Y|@DbJDYY=5=q=GafVX>&8*{T+W6IC`TAJs01jy z446}O#d-eQ^skG=4P$3MS^WQ_pPcl4mwzWCcWqJhTJ(=|knTBmD0+7qMRdbJVxPaE-QIht$z7*Cn42 zG-mhw{*aRX^x~I+aoe6;-BZ|i_}Izy$<=2r9d!M6zQKB4K!bvM`^3Oszl--I&A+~3 z>6S((n{HmF5Zej|t2_7kSl^1YY|<7I{&-D%ZtunqvseCiWQj8@(pbK(PCZmN_;aYk zEf2kld0U=rVOIUNuJSGWdW)8Q|6)F0llXFK^=_^N=W7|qHl`Fh6lK;w6_P96eJHW* zSKEzgGmo@vTJ}20!#T1ow5>`!xX{%rkkM3b`MTaMTPDA)+qmR+()|M+sYefZF}&K> z^Eops(aJ-=WM0XNO#h}E$6HcfynoAX&B%CqH&=oVBclh$&kXg_cxM&GJ_Wf6=dyHU zuZo5QDR-#UR!zJTJ9V3yY^k2_N^b%LJiqT1*{7SCTM$AkaPy}c^;oBy$8ogT_Z8me?l z${SA2Sg~9vbj7jIJ-vZnJ-Sn)c_*}9a=7$Zc5Swme$0Or#k-m=UU9;vSDF(#Vw;O% z-1a;OJ-(ak!CX70X->-Lb4;A)zdf2cXGx>NrJa4#uKdcqIE_!3`%{Yv>)Stbr)+3g zw4$u*8DqwJ#>O;_E1yFi2`N1Iv+Es`%g5$NPFaC--%d5;JF#xr!crH<5CQ(AOE0?B zY@1dnO`0YDa!;&R`VaAKTT9+uPg#?(D}M6deOG@!X=gbd@v~5>mqV$!`;2oe>jbIq zJ9mZkE>CyQXGmr4DRCck-X69mgdH%vuP6zgz-)bjC$$4_9yZ_ze zuqtBfl-h~DKfmh!KECU+_#^gRTpK>8xlONY`E5M0^6j}#BGO&2BW<_Lib!@4T*~Un za>4A=%Zf&km-jq$_2!l;lrmJPDy~~Gi6P*i)ak|6@@nz7JCCr1m+sg2T29NKizONWediSZg*j6wKgs=u0*ZaQdNR!mgP1-FM;->djGEKiv(`KH0WSz@*z+vaYGbA0B%=Pj7t!+9x7pHKOg z9)m1XiR*5GTXH|2+~aFv;*}5X)fRchn)b?Ao~T)o%d?mkLbzaJIdc) z>z?R#vQ{;CT5t{X8gVD#B-a%`n6@6%5k7ZGxaCXQuNT{yzs$DVH0j`sGk@kZrnMhe z*9&x*r&B4);%KO#a-Q+vPOZ}1fKRDjg%iC(mPxrE+337iaf(3llpC7+)*VTGF6CPP zHE+MF2Ni=V`YvdcnL&fs2tbj3xU(_u@BcD_`W< z=jNNQzwWy$<`7!?vHIyG1O0q1_TGzejRp5^bqOBq$~?#-!Kgeh!b_xBCDmW3T!;Hb{%hAuT^-^J?~oV zum5%CJ3dSO{djLaPhMa9m$!-X0^1b0m?REx+=w-3%IsoXwpO9)fS{-H+~@!AP4(?w z;1OlGrs1H#ii6rG;}=;T)7COcWU=Amvbb$QGc%nS6N2QEfY^+vow2W z-t6diKy_25)mGO79Z5dfw<8Qb7qbewEXhr3QHjV9n{kirNS1Mt(ot$C%@afG`sXsrZ_{w@6?aIzhe{lc{hK1?C8eH?8tmT zqhj(CN39mm#u*_3A}NZW&WKwvyx6jPOV#s>95u|39_f7wxV=t1_xGlIAKCx9qo0AZwO!!0l)G zvVZsNpK|`7drU z<-i#9d%NZ0%l|VMPG zTy0(ZMl1IJni};TKfSBm3#WXazFqTcr0TlH?gK|3>|HcZEM;EE^zCk%l~u?vugM|6vo)^`S|&x@A*URljc@@+5GNvw%(R%$!z;1oeqvPyZaZP zZDSS?xcsqc=iA8n-yaBlI`>jWABCwjRhKUsw@A!wR{l#so3Mh^#xHOUcnROzn1^cn`|BZ{$fSH zC_}k2*iqr`2+EvsewL@UL&cV(_+IqEq>_N)Ef zZRh4LGtb~n=oe#1xNZOPirw>5o&sx*&JbV45vO=YEpS_x;aet^Q2FNytDN_;EM2+m zt^ABzBJ+27M>N>RG>AODf8ls|t%u*CTh^kR_xsCbvq~Ds^(-`IowO)i-?{Qsu*}u3 z#>pQ&h3Br`Z5z+f;2VFj^mmJxyZ0^VJcB~D5 zDb`>c((q2=ZITwPk1KZups1J0pDotBrH+ zo1(uz>zj!sLh69hMzufzKzWVY- zcV1on!dlzJROq?V??+ALow){f&&B2){I=%L<0t#%CqLd)eS7xiZeM+_-pF{3{++_x z;}+U8{#Y!|kZ?4{s>S(R+DDg*YpPHG5ZxvAz*3pvz@_3R`l4EwufP6YIqlZx|JG-U hciHM6_{{W2zWoc6_a`;qYz77f22WQ%mvv4FO#tqXSCjw% literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/grey_exclamation.png b/app/assets/images/emoji/grey_exclamation.png new file mode 100755 index 0000000000000000000000000000000000000000..a50d265e9d7b855710b7f31294ae4446bfd47caa GIT binary patch literal 1142 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/guardsman.png b/app/assets/images/emoji/guardsman.png new file mode 100755 index 0000000000000000000000000000000000000000..b67b335d68744d99bc23bb6b69b74f455e40987c GIT binary patch literal 3587 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/gun.png b/app/assets/images/emoji/gun.png new file mode 100755 index 0000000000000000000000000000000000000000..c49dc52c6cbfea3614046401144b5e7cf5601aeb GIT binary patch literal 3161 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE6g*uVLn`9lM%DI+e3h(A zPfIT=`&O1e{qcjo!%w4mTyqo~7PW9`MH%#N&FxwH|H_t$_P1`>FOl-ShVE z&b)hbXYKs&mGi&PwH8ri@l9P}a@5fGfC*!;%w-lIVFMJ-Qm~96lZb0z__~-<8?o+4 zr;czN{fc{qS^9D|6&w2ZF_e^+o;C5k{9pcAXlRJmRD;PUZKn7wfA6Ov^he5Yk;bB; zojzByzD{rFlil@xkMM-kPv32jU4FUe_{`qumX5s6mu$Lw-)!o)y?*!Q?|lwkf2tt8ZP`jC4kuL(CR?7vN9!Ksm&=y_ZsV1}*y`u+?(Y8IaelqN2-kYf2i&R&e}8?wz9wepr?%|%cRgffH=p%SZ(RC9QQ~;v zhCAMhC%toTKP!Kk^WZ_&SF5Sss#;>+97mRit`57nCUSF1f==ZcrivMo{xedf3RybO zUwO4Ww6WEwAXZ#8K+yB_tLPmSAJ;Ej#N6>abi#(29dU~cH#F_qaI^2z%OjTg4O@=4 zwYPhlIBH~HTT}Vv*X#Tn+p5lHd8r1gOfhbjR%RBTe!FmT!*%VeTB7aknF$3QUJ8%8 zM5j;Ali0MZU&hkt!<)_L-}x;!Hh*2!6XL5Z8W|qidPrl^%#5TxTHNMycU)>_zmX?fw0`pI8(Y%f%dN}R zSm5$=p<-*Ve`xKAeO^nG7$x~nxZM=-c9oJl7p!*IOIN{wOS$R3Mc1;%r3Eq9gD zf*pYhx7QsGxB6+5S=RVIySBD=bqF=(+(N#{eRDHWr%NgVI+&eap(DqxmVP;=F~r^vWpDsE_uw^m@VG; z_1ib6ZLUtTryeV~$W}A5>+_13o-XAJT4fN_&->c4#Nkr1)y%@lQGskRR@-bRYxy)h zsGZHCS@Pk5JAd4^9Lu>@m6O;mik;rdb#TklmG5ew=bk#8?ILp2z&*m{iBDIJGor~B3O;x zxuVs)=k;%X@_XO=PuZJZ@3`R~(fMoL^tdhG_U`tdbo=5>PxF|1VcqyT%T!~@Tl?$n zzskIPcy8mIj<}_s4w4i9EOPDs$7Xz|Da`rBePO-EdGq8vwjc7-7ggwRvtkQ7pnBlQ z1}TNFw-i&#xvzXKY)*RjQ|{j9z~iPjoqV?(H=Ck-OCiNR`)`+MeC5Hwi_<^3^vRnwzFS+XGX9ZT-x_eRZ}HyaQgMg>J4}=R^(o?EdjJR5L&>JlFvsl| z^x`))T{1X!aG_(>`@j4zZhYLgAY|2okQl+P3){2HW+z*(j@d4!zUZVNgSzdlZhbS0 zDbwu?G&xvr@(cR3T-9K7?cTU(NpyCG@y(nx(R)YsDRG8em5^-d6ky9yt>r45_uAr; zg74<5tZN-tMyRmAvbgY9@NMPx*?-m9_$U4pc6wLfh8ObkKZ|)M>KtV z;#Vah5j?s7cem)yJA0;Yy7?w!`GpOWPO2g{%SBl93%XbDWiAu82&r_Q&)uvaus*&OP*TijwFHQ3#7H*B&B%SG~ z!5O+WB2S2Ajy#9pnsv9$_8h2_Vf(>j^iwL0cO`?Z*kL1$v)vmHh4as}=+Ar}}G`ClOV7ZBBlEeYMlV=}i z`p;UpYNd$7wRvwe_;?>(+fl!P$0>wG=R~pWyO0>I#cD|s%ihQ+{J19hwm43k=Vo-P zhKRlrW0L-Prlu?U7b727-utU0#NXVg{50vM?~Xdlyd&EK-3rtv8aFlzt(uZOMgMAI zh1SG`$Df}hxCU_^Ty9mwb8!2H=Lz27+s`h!mts_$yEg1jbsz@^)A!K(-Jj<^P_yE` zP&WS(^WVhlh1U}gSWb=Jlp^T%Dt803)hAE+nEO*pWlyeY_F!4R>AWwL{Km5O~6PM`fheX38+iYce#?F%0rDPBJJ{((39 zVgskLyNcK~H9kAeq7%96i}>f~XLp-(uzamCaP$shra8`=vQvxR{>suwJkJ`+aQO3_`7f&8=qk(A%QS9p&bhXR^W{0=g+;PP`@0!@ zCg<+p-zlEB@H+oV!zfM}p?L@P_2;k~ID|_rSk=HHu=w@I!uOFOHVGX?GrAV*6!b3d z%(%xI&X9a=j%EFZHBVv_MdX}(?_auqzy86Q`x4u?rTx2k@#e-m+hkw;^tX4ERq?y; z-O^Yu(a7h(_jbm=X)ivu?71maA>r0^)!<#otKX)c%d$V$y1lF}+xq7QtNH@RLwA-7 zbAFbdV`%^3yW7HwR*h4OudhF{=D+TgmP42RE!pn>FOR{~vUAPfQ|nm$IRYgYT;8ze zOX!Ig+y=XK&U1M!{ysmDXOm6J%7zjyo9UiMO1;&!mmWOV?ZmKn@#4q7e{8aMUH{&x zUtYRS#A({$hc){O7DbhdYjpjX8>?;W@K|AHPHb+}%I%NSy5F!=>DUQDyI4_SqepLSK1_MBnd=Y(%aq-#r~cVg$dMtZGU?^~=#y`1i(=A@Ri++eJ;7PSf0|X0 z@9N!8rgeM&{fZFJaB?vF{ZO#Ocd18r%8#Twlchg1Dm>?kz4-p{yKBqT8k|&_xP$H~ ziF_(xNq^6|fFZ>&#P@zv&}oOCN1v%Wgo?R#O-Rem6?~Ci8#c9Wf#$2J zJN%+J0`shxOmz2gHm*pXBwjMjGNVS+;{#7p?vZonmMJqZUn!mA8TspzVIpgf=!8Sp z1z*pe#NbiBQc3EdHbgQ~Zylhjp`o3hGP_s>N^MQXJ4#MJ$m#oXK8 z=hUs&Ja*;&N)`VzGl``5iZrhH>>bf9Th#g>^X zcsKlS++gs*JMo3>%`Mvx^SE9&U*+`M>`=VRDVJ;qyO#@v>{M#%uWK*{OKSNR`Uo5N h9=LMMgz-P?iP`n~KOe3=z`(%3;OXk;vd$@?2>|yv&Q<^b literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/haircut.png b/app/assets/images/emoji/haircut.png new file mode 100755 index 0000000000000000000000000000000000000000..902d273f6c4428d4a7b4746dd116c0c14e87a389 GIT binary patch literal 7100 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hamburger.png b/app/assets/images/emoji/hamburger.png new file mode 100755 index 0000000000000000000000000000000000000000..9f1a3fdff6ec6d7ef4a52587f434b928b6b6b27e GIT binary patch literal 5706 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hammer.png b/app/assets/images/emoji/hammer.png new file mode 100755 index 0000000000000000000000000000000000000000..482b1c747d1a515e09863a24f34d7451b7ebf852 GIT binary patch literal 3670 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 R6axbTgQu&X%Q~loCIDAu`hWlc literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hamster.png b/app/assets/images/emoji/hamster.png new file mode 100755 index 0000000000000000000000000000000000000000..addfd2e6b03d1742832fecc47990ec2da4374c34 GIT binary patch literal 7221 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

    W)4zB79v-rVEa>V1!29+x{FtbYFg zzy4*}zMo`V^~4#>)?C|=s9#-zRGyB||e%|iKjg+U+46_&(ov!7n>U}h6X^U$( z|NbpOjj_rPGETmpDQuK{31Zb;)X@jWjQ-|6gZzviqHPO%HmwxqElVjnjM%Ynr>29rnEVa-y1BZPS~L z6*nI}6qr-2puQncIB+Y|TFJx7(t&ajzdvrc(fu`g`$B_FjA4Qz!XY_^weM`^Rlmyo z+5cQ!E~nG}s%l-F%dGGvl3qEdC$VJcHbt)7tR2phf7V6k2$u|tS7r*A>x>%4r3(`` z@GaPEx#FH`s*VooNz8$SN8;-?4IvgQh1ECxYKy~dhB1#2`uP(Fvr2zd6ln^@0_FD=l6>I zFR1yJ&lnQ)u~=zR%*C=BQQIe&C`UZsqdsjm^MXrrRa6&o6mSKsDt_mD#PO2WNx5lE zjSHEWPq8>0W9Skz{yG1t%YqpPCpxEQNvY4Pm-F9S^etN7@A`c2z40$Q_Ag?{>a9@h znpIHvs5s0p;cn20)u{@5CT>xT$YN#)5@@J+drF_nS;0ggEutuHM?^!%19h#5u8%MA z9E;ECtbg{?+rRJpf6a#0qpC_5uS#@ytd;aPe{HIAR?VoBHC2RTo$eEL%Vfy~B?}h# zFr+YBEKWRn(6Za_LxyWWfP<}5ahllVeS~HTlZL&sY4{>Q9~4O@6XCP_QhPs z`|k_;Tc)*7OLupauwr=kWaFtnSxvG{Z=?xl90^#nVA_%OdpI~5{dTRN zysvrkyqM@c94EG!YUs~fa4?`(BH~Zv=gm7TD#i3|KP%h(db6_q|K}%X;>%j=9%uC( zN!g~Tp7#7%V0NWS)-}biY!=%Bx^`DLOr08d=aOrO&`P@P*YWXA+cQXd@oDTN~M+8Yi3>5{=DPIFH4#FQW^g_^L~DcQQmnW z_Un49hUv?*pR4Jg-CObUko1c4XBDzc5*AB@tZd%1{O8$9g_q2N3yckoR%yp`9AOb- zyDFA=ZKBERjwps%S6M^S(+cv6nDqPnZEv6Y{eH=#=hh4Bw=zaBeEi|__r6-3egDmu znI>Ar_kukywdh=N44hOo|JI|mpSQb3a9dn&-0($;JwTaJ%k)N-XyM+z3_+*0&kp~; z)XHsP`OhkDkHPov3}Qhax${p)*sR_5abxGs_PCid=Gl~&F>z1V+oljA@Vg|#A<8;* z_JSxDli3a;jDONX@?}T5J^pNCW(fFy@W`G0-=ANt=DK<2 zchAKalG?)53HGbQKbyIwCoe*RJC z$C>uovE}o9ZR6{2*PE&-P3w5YkkvnL=a+IC=ft!`92|PYb6%`}e2%aq<5tUF$nLVs+~^ zqu4hX+&*yS@bWad4Px~H*)Hb2XU``m)eBYx1vc~4a9*`JuZVH>>AiJJM8ADe;9+J-}Iyz{2X);6^I$&aJI_U|!@t>$wu{`yCz;pVxS z`=uBK8kib{8k8Dj7$#pok*}3nzDAer_qCL>@9wRUJj1#wTze^N(~(_i%A2n4tg3l; z$mz?OR%C}%0D zw0p&L;l-D4*VP)Pu3UKEiACjK*>|%W*8gpK=jTmdK II;Vst0K&+zm;e9( literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/handbag.png b/app/assets/images/emoji/handbag.png new file mode 100755 index 0000000000000000000000000000000000000000..d7adf04ddf2238ae16955df83d1d42819477e6eb GIT binary patch literal 5449 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 TC2JTM7#KWV{an^LB{Ts5_Z%hQ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hankey.png b/app/assets/images/emoji/hankey.png new file mode 100755 index 0000000000000000000000000000000000000000..73a4dc840085c7f42c7464d827751348b58acfba GIT binary patch literal 4754 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hatched_chick.png b/app/assets/images/emoji/hatched_chick.png new file mode 100755 index 0000000000000000000000000000000000000000..39c25bc7ccde42bc18a5fb0aaaed47d88490bf98 GIT binary patch literal 5646 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEX0x=4 zq`qlL>F`Zrl3?B@Xz_+4$-zURb7ETTuJo$e*Z+PipI*FgPi5)p?YoXS^Y)p{3;7fJ z_jS$o`?b&K{QqBbzx>?p?XICe|KH?!e)eBrL%qm@wd*H%|9d-|YyF@8e9e8|oA(F) z`_g_tbm#lS`$K8bZ+s_IqcQPvzzO8RkweCHh(z$3#p8dkBUBBgPsy}+4e*KO4|GRllKHD7p)*^N=zH;ZA zT}6g9=jX*94L^H6G^J>j)6y6f9Z?RS216z;KiSUBN18kSC3s}7K7R75o%=Ml`mz@p zUta%zDO~m9|4xpI-`P#G=ly(g$zA_;@a~kveU8bC99M=M`|RBF(UC`ip&=-sT{}7} z(`WI;#fCT2k`{fPiL6WYCK)oU&Q^r|m0`$(J=RrlnR+m4AC*#^yu7mpk9QL0D2*H-OS zJjW{1Rk|!)x$Lb>Tv_4eeZm#5S&}~6SG{DFS-FlX_0HY>>oiAr)Gi zxim&WW6Fkk3k|JLzW?{{pyAK&d!Fm%?R=`b=j}QDjrsEzhiOl=vTjP-FhxsIJNw{_ zKUe+tHvX^rF8}!fzkk8+-SP{}%v+r~4hwC~n&=i9SMvGnqj&?RJs*}wu9&hnyStUa zQ1QWJ6;``n_VSBkW`i3ij9{= ze5gDfowxk%yN3AG`v=8VxF^ZZddbgcGoM}lCd;atZ=2^o+xL54o3C<^woH8I%4)W3 zUWxe^%o7h*gfsru<6yKY;bRfFB(f$nC&jTPY2|@SmxNXY=!tyjnP8#nE6c^e(RW45 z^NmKh_m|(cReSa71QtAUkoA1Dp-+&fgYoK4ZZ)PL_mj)4)aI*s?Uy#*eK}z5k2UMR zue|Pc#M5cN`IA-ZrX9ZpJvY^!@Bhsyu0QQ%`R^r}%?4jyma*%c5udrPa?RY1&g4x~ z7-gPvFJn{DES#bd_@qPlctQfF@0qpc`j_(7Z{AWe$(h~1Vf~*+pT#4yzkAg5ANky| zxA63>u>R?HcX4l!u_|eLy!d^Im9)+O=X%EkdVl)_xyz(`bm&VkwlVLvd@)~bo{_{d zp5)^b7r)-~mUnvb+skE_-)?JQ-2b~zdS{CG8u?oaJL@I)RZn@)e!OsT*8Y80o^0~2 zeOL2)bEDnfyzcbadd>1XWt_+R*9#uk^t5?b&yqT0$5(E*hPv5**M>=z-WI%Qpz5i! zcCFpn$=WrKn9YmM$8P_$|KD-_PqW0&fBMjT-15&y`Gc3l6#4Z19{y1Co`37O@_qYb zv*YZ}$N&A<{qsfrzNz-L_l+a%D<`d8+hGy7$kA!N^u?Ddc{iRvU=3#8_d}WQecY74 zd+SQhCKw#}%%yPXR#bag^?}R!x|41wvhy#UV^P!9&i8HR?Z72rUoM2abpP<7-)hHV z=?8~njwbJ8Yv-3smRP!=$MDtsIQ>O;uP!}XDz`5|$ssiO{Kt>y!d&*>O}FUqP*(NR zd7F3S<5IKLt7{j<9ZFk$_G94gi#`D?=go6+jy&FPYHsbacgAFG+iBBpm+U&Z@W=j}?6rWjE)- z{Fjf!wOCl21)DiKI36`_7IU6Ijh(&U{ms4-kJ42KPNkh%)-XfwZ(NJ7%@xfD1zH_y zM?N+E*!?XY2p8GX_?VL?-^XzRURjW40zkIl2s@)&<`PV1+uV&c)MQP`r zIL`U^R#cu}7hdt~>v@g&YWFqTn$!iP4oW@EIPJ`wn!VLuV#|eD{qNfqnA`-lIlA6Q za*0}Od3j^E+(U8R_UNu~#(15>jf*rQj^8M5+HBZdH~X7ge*|x|QnmitSNCqNa(}`T zmMEe9S0iWd`@T%YxT#!^1q60KL~Rce3sLUE0Vmff99vXx#`Kz^J+_f zY{|N*e@#nn=_CUszk}i~EJCg`azkfUp7PV%bt53NWJXtV zNTWkQ=%Ntm!x8y1JYSCa`QN+r*0|>Vejd4;yrTCfw|-gQFZ0AY-fqp|&0GbSx9oX0 zYxUmpm|Y2a@i!EG{5Ze1`R{xas8iX(%76Z|0IM{2r^P95RWSW`*?0{f2Wu|ZDH?>yMhXiQ$KQE)Lhk7%z1Hxd--dT z)$O_mAL(>gFS}{`e8$X`0X}Aub9#=weAe2<6_MSke7Zp4%kQ9^@XONMw5kp-5#O^~ zVmGsL-~P{EgR9Qp*KElDk(e-J{ZE6?mYH1(V|Y2Z8RHHcBBS^AP`>rKr) zi8ED1m$7ShhrfStG3>~vf4Gz;}4PMU`@3zhH}Xpc{LgP znmjd@@Lk?sV#{GGX7h02X14>=uYcXWe($yV+U2K@w=;XRcl93p)#S;`*`@AfRnV|> zTQbu`t=0>RqXL(`wzA`Kz5e#egZl?QHqSm&;vYEoWw2KG$7Z2<@I2ze*AG!3o&8*{9U$zUy+)^(Uymo8_^Kwor zpP3my&cup5V0}2FWc%eswX2T)Dmt@LZOZpEMJF#mkDMX$Y`N_+f9`-U2J;kFJ*eJM z;!wV~Uu(yeiEh)j$Y0JrYI0roc=(jR>R$~TbugyPm{#V2X z=dMt5Kj!I898;D{-%yeGE%Cv2X^4rBdCeSFlVkhSCS83gw7TCkGAc`O7UR)Z9HNX1 zjGihp-SzX@zT5FiaGR~fl7JcOHh!KZ`K(NI=4$TG#&*VE8-iY%R5EPvGk6s|Z{6n7 zEoV0fC)XT2R`w>}bn4T|ryfrJ_0_#^+5fIP=j0d}_WxR4e#`#P+xpL{=O<5ZRqAC@ zIM!HvWN*uaen5b`!bp@SyR1vwEL_Nl4o2AHk+VA76Z3c>R*#CT2gD zy>egJvNay03x#bL0C4XU?;oF=JX~>inY7kn7d4g0K%vhYL2lme)2! z9A7Z|Ql^%A_|(JNdAau|{Z0QaccFLw3z-im|L*#7YVW627bfdhcx9e*+W9D;bwS)A ztL9ZsuNXGC9qj20UMtlj9`Ip7jKC^Z@3kVA=FUtK@HKi7dFjX_Ay&r6oOK5mhkVi$ zTM#Cam3lZtH=*dzg%$Jvoe|)W2sL442z5BHw5?!~&zAM>cdT_AHdT39?pyY9BJb~4 z=igjDT))2g!g09^`FFNmuP@g4l(_Mf3on=J!U)YrNvz8o7By5fSr|Ad1ZX$CuM|0a zImO0m`Qe%sUw%*9!C3g{p@>0(NE3ro{E8_&PrDYzak>edQgvRK@WI7UGBebbQKTUG zqvjOvBefEIQ^Ncs?=>i|e%B}1uKzE7E{pvqhpO-TvC=V$TKU_ZQ`62Rd^A|eEb1Vr zoN(~Kjr2QCiULi$7KXG`X(k9*F1jJ0>NTq=nDs!%gWt)F$5OhLr#LI}*!Hadv1mn8 zuxsqKRZUGw9l>ij3RQCQEW)Y^*1W9yKac%QePv7?cg>H+FXs0u=59Z6V9zCej?7ga z-%gz7=+KZjCUBOe-~sb1&Se=KwM&BpA6;=4RxRY3WiMpDPoT=^o3s2M2ZnZrbDBM! z>8syMFo(|JY7==qCG2!T(cz*kukF6y`1|eK@wdk(^u4M4{K;+Z#BMIp^5ETbgVtNy zJPt5=#FWMIn2|~80ZUJ4kEF0us76JXE=QANF=K#(#QoX1tNBV3L>o4)=gKP8IdP+$ zODp-)+=Z!oQ!TeGy}?bLx)&g?HMME8VRas zXCwMT z|6M(~>IrAH<*!@mE#`MV9eSA`zi+wYVj(59c-Kwy_s$bcVbSkrb78S~e4nXEnLoQF zreV!BtJ%-@M+ICp3|M%%`)2))v*LDp{~3R;(f|2N_?L~t>606ugQ@-}4Y1A#z? z32%-ri@30nVZq}$Vg?3cE)H*J>URcSxN|qNwiy89R3-kz!)pZJ(l{6R@!<@43r{d`L0p>wnrPWNq#=_pjGNLZu5wx=*9 zW#WXlGM2>!4JY;1YB|JxFo~`_+j0BP>W)cK636=d%xk}VxpVHc^Tlsrf6ms~*LuoC z{s~Z+EyKldjzLMHo`vx_cM=O@4^@3oJ_9w1&Awr7cfCarNAq z&wFe|^U5x-&)xPbuWnaHm!sIU$PA_jEXrM5Be_%*-y`<(-854(lH zc>(Lh)%Vk17F7Sg*#7qTx!#{z*vJ@6!nV7Rx)FFU5B7ouX z3GuH!j4s={9m;aI)vl8e4Cu%`^y=X<>$(H`-hPQWx0``MJNEa_Yhgu;c3z2D6Lamr z_g0m_o(w%ENyFW>m7&|(x2O5AI%vRAZoAq>`&<}-u(i7ir z+BNAzz~$ZF@7EU=SYO` zS_rhDV85= z-f2g_3+|WYu6w)bb@sh28mqr=*LdT@v0PyjTVV71YKdf{Pi!Aq*E~t$;NbHW4VYu~ zNbpM36^lcHRi_PX7_G(BEJB6kexEzAu56M&6I(#h<(z%Lb}Ts{xun?m=GOY#m$km% zt*T9Zzj=Ppqa#6ww(q;Eq~Y@R6kk@9n5I~(LBj!YCVvCv1x*qSe>C3CnY7F+X{tus z!+?qVvht_;35mWsUl-Oqx0~_)uZIo$|KzmNfC9cYup;@HpkoI>^N5@!h0JdtSBY$J*-hpIfz`GcW6wTWR%+Gv|x$*?q}tA6x87_5b%G z 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

    G#){KdCCe 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heart.png b/app/assets/images/emoji/heart.png new file mode 100755 index 0000000000000000000000000000000000000000..7d7790ce4dfc69a8dcbbf706b75757dffec862e2 GIT binary patch literal 3302 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heart_decoration.png b/app/assets/images/emoji/heart_decoration.png new file mode 100755 index 0000000000000000000000000000000000000000..b8be44db343839258d488353c30890df963d169b GIT binary patch literal 3507 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 W->50F+{M7az~JfX=d#Wzp$Pz78R-fD literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heart_eyes_cat.png b/app/assets/images/emoji/heart_eyes_cat.png new file mode 100755 index 0000000000000000000000000000000000000000..eeba240e533783c92e0d221489e78c7f54586027 GIT binary patch literal 6176 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 P0|SGntDnm{r-UW|Cf4?~ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heartbeat.png b/app/assets/images/emoji/heartbeat.png new file mode 100755 index 0000000000000000000000000000000000000000..b6628f6fa70ab24c6e83172221781e4a5077c481 GIT binary patch literal 4052 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 A@&Et; literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hearts.png b/app/assets/images/emoji/hearts.png new file mode 100755 index 0000000000000000000000000000000000000000..e894715385710c5382bd052ad9a501c1fe6be376 GIT binary patch literal 2925 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 HDWM4f@Q`g4 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heavy_check_mark.png b/app/assets/images/emoji/heavy_check_mark.png new file mode 100755 index 0000000000000000000000000000000000000000..336d2626d0c9aab25d10df8570d1342cb65c1f6c GIT binary patch literal 1103 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rTxVxBIJAr*0NZ$|sXgo>~| zsGsX-)i6;~LsW@l)+MtgORwI#Fk{BC9y7NUw*o%q2~WA8z@qP~v384=l&O>ht5S1@ zPv)9!b{WYv2ARU|mtA9D)#hZ;h3wZ9IR!RN_uXI1#}FlVh3HfgC3#lfLEYI;3?>QY>O8qB($L%W^x)z8Z`qt1_IbQhT2$DzcGf+nu)~bPbytg{ zPM0rGh~IX&WlEaw{l*rpWe484oc|uhB$8rT=G3UWWEz7T>sVMvKL`a-{dH zQEk{L`&#sC{ET;(E(vxvzxri;o^?x!i?;WM$iV+c3)-hm^AQSrrzmpk{I4x6CqBEF z9nSH%WmG3*#kAwaa`!*U4YCgFc5a+7dqY@|;G>lR z-!D|?eC=*Gkepk`zClz$Upr`Cbeq#op=U3jY?||^QQ^(1cBcF0SJ(4Rh(5`-Q*l+3 zb+7t^R^6L&?e1Uy`I|ADF{Nym3}q1P-CfMb$MSf`|F?GY*D?gTYCLs6bun#uUEnqQ z%X~Mu93obEzy8*r#J6VqjsI;qY#lLEcvd{MSp8AzU--4XZHww+B34fBW;mlIxMpGAovilN7rYc#X|I=sE_OY*dy=^N$M{-jmB-gCTUGH>TmkH)B3AJydMh1Smt)b2Qz zc~kuOf}%J2W(OzPOxc!ut)JgR>kJ?7{GRN9m-V;*&bY&)t^4l18xzBXI&1lMPWJ)^ zLxDqQwjQ=%%9i~X+tBg4C8sfR@BiK%=|>wE{}H;T6}z+{dwJ2%`|kH*Cqx!LVNK=^ zN?dyNufBAG)1yj11vRG?ORsrx>l6k}JNTyA;b>Fu>*KcyWTs6y{a^N8`wY&+r@Kr) z83!dwzn8Wab7x3x;i^a!j@G}b^P}@*ggW1$dGW`->zwL5xpdYP-c5YP3H3h$~)y|q!W$w1^- zVFK%nhDp~pbPJ!5%TpANu;?-qOJo&m;8WUpm{CsV_|vEJcfVf~ckujl7GI<1F+#K!J>PkKz4Y>*lKLa|>nnxPM^=(=3K<`m=ykg`@fL+ z2HQ1?x8~Xu^zV(R`QJyut e!C*TcJow1`~)ogJML6DZPl zT4l12(Mgrbx1Y>AX*=0RsV&HhbLkh;DM6n^eu;Q#E}atOG|x-3R!gxZ=vRo7=2D)e z{tKtrOf_mTYT5AnfBXEm7K_8Tp0_Lhab~AldTsVw?{8bgdkj05X)e$_FysHJ8#ive zIda6Mw5Vv)DgWyE*Y}7Un3#mfNlF@acXy}N*3M=5ZF4;P9`}p4Z*}>3cxJ3zscCF) z@848A@9@?Xju)?A8*5Yt>xg-7=r2Ag)L?f0%;bdq`}f;hGDW;Qvx}u*e}IOEgOQaZ zo9?pZ%g_G!VPSo!{qW(#q8wTkstnO-B_$=?dzkKvY|%}~%R9HiGQq-R$9tLip*3=g ztjrWurL7rjGE=@7GOaW`Y;0_tmYJ#f;^)<$oUzfdv8LJC*^EnrJg+)xmWG@N{&Obs zI;+Ny(;WY}H=k^nK7IPnm1m4E^9KGuP%SPdcIMP6uGYeN2QDVvPi5r#$JS(@{Orww z!awQ(T(eoMJulz9S$R2>k*iL4rq%K8&9Uvw;g+lCZhkCmb8YK~zh~^4?cM7qm4`7L z`@~w%e z;C9gXFwY-mjsJ%(L^Aq2^cvl|b<4+UuAa3v!_21wN6l6*VD+B4^en@SyJzyxDPBr2 zp6a#t!N$`}elt?H7E7nf&)oCqX%ojb8lGtRiZ?j}eqG$l0^&zd*2h15)HA!tcQ`9eV;M~L}gOGi$TSfK= zH@sE#n&TMcB;onMPTlPO=bwN0=6U{9c_5Wuv4Uw@^%RzGtWs*ByvKL^H=B3%SZssJ z9@qE-2UHY=&WforT@7H~J;6}0oKdwvi<6^IX;HxD3tJ+U&K+c2ezj0Ufm3?Hy?gi8 z*{4XvhzK3&n*(wX8a{j>E2+p{P(ufs^@xfJ9l} z2{qySJ>SFLuyW)?eqgx5csk~)K$}p6?!i-&^qCG#UUA;R_mEpqglbIW zrB6G|nN${XWJ%~=acoPpUl98A^*+uG?Y_0{0;&zN>iKs*1~#b3WY2IpU}mGv_`OE# zLlBeGhWZ5g1GC@#(0Rb&s}RKC&KaY=eU5O$(siHgIqcebu1|b<;?3i7j{~aL!&*N5 z`6jl<@n_h-q};;!j#>%aY4OSqyh~z)3xeN@Jw2^&bpLV1Y{|bHRe}c(tfOm}Oy) zp+NPUuz)E^ix*V-hkU4VTk0>j^T$ySNsR>s4MIY;8#|{dKip**21@IdT=qUYS7 zkN#(4U1z3$Z>4=<;DLp4QznaS$vyew@`0(PAEi=a{^c2PziY@p(2`&agXz3TKJ?UfZm|FW literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heavy_exclamation_mark.png b/app/assets/images/emoji/heavy_exclamation_mark.png new file mode 100755 index 0000000000000000000000000000000000000000..4c560f5e3f46d3ec6361aebee9d689ef79525b71 GIT binary patch literal 1315 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE`sj7Qg{*dhcR3) zCUe2eqZ3%zSj6>WX1dN<_YMSCt$X)t=l6M^_wMQq`LAno_dsoUEBSftGWL?g+sl?>??rr$^Fj3trcJ9W1$^v(9 z2gft%_qbU{PuF|v`Y~q1<>?MAlWu?5Yu2O9(gI}EqVd(3lX+Q<9&__Nu56>{v7?nzB89|W#3Y!YZt ziI2-$&LGi|Y~aE7?%pYPh6kU{&T9H8%wi$Hc*bm#(1Z*#>b_1IVw3n2wW3ZN|b45*(wp%ezhztxzImzw_CD%g3rH(j*bntCHcN@_BwE4 z?{$&ie7wbKNe#?>`E~Mck*W!W1~1%R>|}5dwqsxyTG+c}4NFa|*3(;l4f2W#jDZi{ z&1Q(4%HUvfP1zt@K}}e7QKYsvV^RK6feDSqGh04P`6M#oOjO{Z)Z;1)T>{rW=`dz0 zOL7=;GHwl-YFPHEMqa>aciGR0AH`3sY2PwEm1)YQv{{;7;=aBX%qlJ|?-C4Nq|R*E zb^pF^guUEFHrW+V=e~EGxwN7FkV56HV=R+}9w@9)^^BZ$fO+Mw!(TD- z@9$T9dbRp&v1&qT>Qn9dzn}ijznf)N|NGF_*Zbr5l|420e|NWf$F5J8ysk0*t9X9y zPIdYFe@}ky+!=2>`wwrK^?eWN*XzaazB9KMeZxL~X6%ozkHzC_lyBQUxcK&V{@tjE ziroeKcUsE?9Pdy$!}Ph>_)bJbiu}K;lCpb#{&HVypFXwWxOskEncXq@tBWt5J)1ZE zV1Y;Ew2)BW$UaL8i47O;D)+c=KfI&vxBY+pw5x2tQ-5xKeQf#fQs1dcY%?So5;!ET zn>q?yn7+$!A5YB$U#6fLKb@w|DV${^VeW81Lv_`RXRP|EQyYR_p1Q%jxxqr}q-JBG z*Xc-3iCyo{voAhi!N-`~DR}SfDqg;aCmZMg@ms<6>yyQ_zq3MMT-ROq>AMv>d;NK@0~r=M)8FyWuX^>~qeoRpL4irRbDOpF$~vpI`F0c9ZpyaQ z<&^C#e0ga*)1Lyvmg(YW3>L7ty(?6y4e+$Lm*A8C8>F>)5AVLrZ98t{+?%QSX0_Vy zmH$6>uK)l4H#Ifo;^NZN z)6>$@Qd3h?R8*9ak&%#)5D^g(6cps;*R&WCN4v8V6SGfJUwmgDJOf-+OfEQ~th9zAiFNAGn-E yTf7BkDcotg!1_?IMUf*|V4A|5MSp|^<%Jn)0&mGiu4Z6hVDNPHb6Mw<&;$U-y*TFp literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heavy_multiplication_x.png b/app/assets/images/emoji/heavy_multiplication_x.png new file mode 100755 index 0000000000000000000000000000000000000000..13d666078656729c570e62e9bf287f74391b8d36 GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#R90>3UasB`QzmSlSo}L~r zFR!t&F*i52fq{XhrY0vRr?|MdfPjFCii(<=nvRZ+sHmubfPlQbypWKPl9G~)jEtC}wzjshu`w4Hmw|zSjEsz&oSdPdp_Z1Go}L~bA0H17kC2d% zhK7ckni@AZw~>*Ny1Kfywzi<4pooZww6rwD3SnVkRaI3nF)>|TU4DLkadB~FWo0EL zC0<@$2?+^FNl8UTMJXvM1qB6pdHE$fgRe0#Fi4jK`2{l+<%3{;QGR|A1Q&rB`T0dL zDIpyU42;U2E{-7;ac|FD?K|wi)0)V>&~x^b!kIH?-uu7Stjlfn*4dWEJJ)`S{dL_i zcTL#o?}3J&r+dqb>)2?wu1I*8r^>=wv|U78UQrKEmX zb?}?V$H>(R*+vSmg=?N<-JFW z{;x^>y6`*07oBhB6Fxfs?<$rld?EdFU7F{ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/heavy_plus_sign.png b/app/assets/images/emoji/heavy_plus_sign.png new file mode 100755 index 0000000000000000000000000000000000000000..61595387bb6936d4b5e238da4a8f8300209dc113 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE~)oq3SA*+78h z{FFnJxBq{sHc^8^^JSabi$2(v4X8WroH(H%aaM!NdRqzt_+C zJfV17uT;T-n+z*nJ^L6EdY=7&_2T(POzzbcN)5~f45}V19SoBne3yA3D7b*-CBriY zuMZpyx3<-~dAQ{DZLjCPvz^bu>!qBc;7b|(WguR|^{YSHRpUrsDy~^a&gf82lK$Ch#p_ zE?|&#V6kB9Jg}Z&O3<&=$V*~VgQ{epj=xdAm(jvM$b&!N0v|}o)78&qol`;+08Sxz A00000 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/helicopter.png b/app/assets/images/emoji/helicopter.png new file mode 100755 index 0000000000000000000000000000000000000000..8e82a0d587692e6210f28ac1e3f0015e27b2639b GIT binary patch literal 4100 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 z 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�>@XuK>WKjrazc3+S!zntq1xc}gq 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 BNa+9o literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hocho.png b/app/assets/images/emoji/hocho.png new file mode 100755 index 0000000000000000000000000000000000000000..18eade0acfa91bf5a3531e0d80fea78e4d360ead GIT binary patch literal 2506 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE z*WT6}Nu8}LTuhGW=GA}u+t=RQ9()4ubB`P%mk`txHNyR{r|xYOsKjv9YRU zrHf}w%$(hsj1^T?X=WK09C~dWI`;0hUCD9o^oGR4D#_<$ByB1_R8};t)?_^JV$OpH z37I!HEp2-6_^~n{Umq8fbJB$cjz+arv%b8)|DQ*}VwNFG)`7p*6@Gh1tPZ=h#8bGX zVZDW=r6xz|omU?F>;9&EdUEp8_Wb*k8J;E_Q~BZi_t)3!rg?WFqPFMh`pz~JwYRr_ z!XnPvcsy=z)yWx#$xG7DA8Gpb_V(?WoA?_p&VIpY#Zq5iUszlmEHGzotcsmoT+qK+ zO0m1k{@SXj9JyA)Ai?*c-RHe*JF%2CCpQw0py zZ_MCo;A2$&uWh@)cea_9B^xVir}(O-xpU{9;^knRDxQ>_TwGY|8_am2n%UvTLg$Ru zCmlg2jXJp=D)jaBeV9=2^5SCl#6MlH>rL*abSQIk>@MXv!>!0Gy~%Tt_=%n&1dsA@EtTWF!-=N?d&Yi+b6aO$;q9Ib6hXL<)U#){W*VPVq&&0yF+_}%MO3X zjMWMpr&Z6bKYaT1%e9C`6V}FnTcueBfDyF2I*j4)a$%Tc^o05%wy1hF@MUGkWN$Pz8x`pt3pqmKK=CT>+40ozvXIbYA!Ul zk+d$$>ByYV%_C#+;rW_1YxvX8&6%j~Kkvlt?fFYrt@6^+(ps`+jZdXhU0vPJD=UMQ zeK;GUHm9Ane}8}f`kr-b)`SS$+gq)^K5lQ2fL_cF1@}Igl?*L?%a|ujn&wei z?fmkmW}D|{*z~hFYI5vSfAZ{EnC}b&#d{_U0=IJoAL~o}{{HT6@|)KTKa6dglHvjc zyu7_r|Nr~@e!1`LX&EI9Ci@OIGP9qu++?1AZ_4xY^G~0iuAgb)KF__+ZfRZJ$49Mq zc9nXsi`l8v&M*Iu-zL2wk+DCtWelGg^t5nUtZqd$`&-qwz$H) ziRCFLznskl-rq`*P7liGSe1G`J2TVxzCq{$|M_<78UpqdK6dL{Q1o(l`Fk#@MeBu5 ztDk;+aKL*x$TF>Ret2%K zwdKc&-QxP2>=jsK+d>5y)<50r-Y>V*y>RidAZLaJ8~P9M-MyP1y*+Pg?eA|Jj~E`@ z_{`Y;LxwNQg6ZyM-C8Qo&duF@M1VoV&Sb7p>M6Id_Py2Lxt5(M$$r+heo~y=&P^?C z-QBwTC9>u}*iracEbqn!$FjG#js~V&Kknmy(PH(b^{NhLF=x0rHdeMVIwS@k-65(S zR&&5h@H!LAXSOQl&40r?|1v6yh=>$yKUH#=VZnxgSvx8|J_Sr<@T@)d$|2+(~;mQQ3W2 zvf9u6XJ?yl_A=OMs59eD#)EX%fHUlGtT-7}%ex;k1XNUAVdgy-+;-&K+uM=vZ+;PA z;eGnC-zC7OjYqYs|DjM1o5OrxwnU|=`?IcUUEI^Sv+<bss zwl?Mk?*nD5N?vSv^X84#8I6~`RgVw`fP6 zr07L#cwp-`J@KHr*BO2uUMW8Xn^gu0rja`e9_~JJ#HBuXuSx5hds3e}563jBafESy zWB9@`%`cXxIra3klOG-)cAv@F@buQ>1QXj-?eKLW3fppSE^2=8s9URjMhR!yf}MBX zWm_?b+>eqpNN|Wcwx%cDWSVGmHs74Q;M3FfpKorxedCbyhocM;?f)H2bwYwC^QLfL zZF{5WenPUS^^T(d3cV-XKb;)|G_HtbF}6Af2AEvo^lI4U+!-MMLY@0-bCt90f(nhW z-P=X)W&Jcxs%4$0IOX!&@bz)JJ~K{;H?_|Aeq+hislTT$l$vHXla1jD3)eSZ9vmT*`tSpww+JE<_-QgeWnG<9W^-p1Ki4qf#QBXg@T6Ec=!tq{!tp-CDLue2;V}fB^hTwaJ;=2z`JJtxAIpG>twA;GWuIA8Q;xsJ{z@X zy;~{6np3mPBbqieBu4WJr1N^o-nG_Q@I$aC&BNe|Ko*PXKNl0Th~4Mrf6sE;eL3SS z^V_ZabD6KM$$O%?+Vg@H&+7mk+m>G}eREkA+_^p0&AP*J+9~f=rTAN`<^DYDLVGWs i`tYjfKOe&{d*5mMzw&j=k7r|Oah||q$r7i3^v;#!KbGfze)aO|s%6XNzwX-p>Rz>6^?K3m?%U@I#uRG2G(bcV(kjz1QBy zN$oISBUZHN#M5($5B;7x_N6vD+j;b>>|DhrAjos(47+E?70)G?j`-btv2@d==ii>& zn08kc?%#BI@+Pal)%?BND_I|lMzYkub8kQ1x0dhUzhfuo zb5`@s8|~f2$#&tZZfU%3QB^i|^Wx%aGSrZ14`)7Z&LrK=)ILqt_1%o?r@pzw-MV$s)YSs zJ?W?3#ogL(vaMbJ-4Xu3&zQsQ{{I(g=-3he@8s9|%I_aP{0n}aSd#HX;;XH-g_NPo(s${%0kLS-Xkxl-Z+nnfH%U82+_E)=>m2nq-q7$~SM4pioLn#QfI{Pa`Z z$#*3uRvwmY6~D%IY~jMmUlafAtTWs7T>SpNUzg>7e!jceT;#z0xai;8%h$Be-ia!kSzl-?&x*%r%?aNd@y z43lG>&)3V$^qsKu_d%ru1<41F5iO064yGH_i_NUz{#AbPgUFj$w$m49c&MG3WTe;o zw)W>QUgi%c^WW6IoVInVziIF9>ZfN6OlR?Qv3xb1DYR&@hC+VJ10I$j-k&ljTIW?9 zn#gk`vHJdzAm)b#JD85>w_MB9ug492|~KLk!r7foqd z<^1Zj!1D*i6L_2$SWKEsJ?^x>_qZf?LuS_U72C{j-sgKDRGJ!6ygSTh>#2Lb+8cK% zGTbX${iW{3w~NQ~qBobXG@p07Smu?swx!9^#as`v6`yoJ`Yhv=+M04qj0X7qpgu~7K7{CSv-MDFUp*s^HzLn8rNUNkm9F*QV&$V+dFmg z`ES4Y|6j5WyZ5= z5RL2trYGHRY$x>0lsq1I%59}-VyMb#A-e`)17-sr2E|qGA67JRvtIF$2pzZZM+CvUHRvw7S9E`}fJ-&@M%qR;++`EZ{h&#?ol)7%bC ztULTU`25tF$*W6xxRNU~L?j{^&LnPKaIb@RLBT(#V{308I(G5Iv%Cd<*Hu~~CO>a_ z!Y9C>BW0*|;DB@r^DB)v?^N6l_aq0t8K%9GT%Er9)CwJeqls*aOU3VJzW3qQhig-P-pN-LtTMUyaLz=b z9V!zJX2nOImEHc!Lukh8^jR|1ftu3ovjSHtGo7?ld)#CHW5@G-)z9~Q^bHP@NNj!n zMwo5di?0g}E%wMo%2%a`ypVrAk+&!3uictTwlcN^?FnBG2rY3r@l1sI{3{N=^{o#V zKK)aBV1HF4!?Zbn7OOTgELn2JbVYlDQ=Z#Wxu#@^1A7e4B&up~LOJC zo8n^~KJeO^d|~U``q1>}_kExJetu=2zo~0F$NxtDnuh6J^Q{z{7c2jN&-Z+j)hQN+ zbT=ahmh>hT#}6IfXOydm3Mt4jIZZpL(7u)F8rz|Vfk}@)NFC4LIaApDzGLjSh}gX? z_CL!bH1#%b`BvtpeLT{xgvZxi^RAutV$HKloVsKd9^#GT{~g~lvq?n2Xah%3^2UXE z3+6~$2gly?ekg4J_4EFspS$jHu3J|S{qW6>@7xEZ7OsnU^N?4orDXw=p;NG9h_c&^ z@Iy9Ip`4%DyjqtT&PsVu?Xum?PR79Ei`BMuVg|O%MUt1fP3kyLGikqmeJ0J^_^O;^ z`inTur^OStE!@v`mhXjK1gnnN(hJ2bjW*(Kwc>2G{|{fU<=*ikUVcIki(%uIxmUSd zge=^hGC~Ae7qImvI2>3ZIEB^Xhz3)J$cz}5phMIAjNasL*!%x+j@`e?u7`@7t_tr+ zlh5waX%4LGS$j4$FKVaPs_zA7MYPW!cp$Rlxug08i53Rm1C{O*U5(U593@2Fojp*$ zOOHX?yGY%$-~>~H*4rUJ%?O&`n=5ba=+U|Yd?@4%di0+XB;Pnf+xBJsQHpAzBw z@ec#`otsnrp-?n@p0mo~BZ{FZrt^y`^#gUMid=Gd)$whywOyh7_k!{-Si3^4*al4))stfea?JX>{~gbpjWxD_-o@j8ht zbUQIuAV{e@+T!Lij`Wjha`9<99Qp1s3+fnca#_`I$V2Ny4O45t>c#Tf9F`GmY7OpZ zE=WjzlTpu)KfPYsq5g^c_dgL2j_zNzqvmQs>xA!O0%v$wgM?HXe;&QVU}K?>xT3-M z!^{V3SQlQXI9TZ~@FB^!L38(+4~BL?9hUNaWcW{cz5Dp?D3g!jg=&Th;uEG$=?1C&=O#C?2aAjsk<7~}Ed#lgmv3VcZn&v}kyOge1Sae;|Jn|J@3 z26s^b#k1v_+r1B&9L!>DkLPWF@BB%1%}%Dr#R**rWp^2*wsy{1crk(P=dQ=S_BS8* z79W51xl>%vZCy`doSIgT0L#gRFF4P&G%)8YDC8crv%KQKpx!1tfg`J_^TC|Js>Av| zj1G~S%p1SG-Sluz!b`5bUqz?A+b4OmLf2>q^N9@=th0m|LU%5!_{$&^p3G!?KtyXn zQ2>YZ`q!Ha^ZBI~N=iR|JIOoRZFBr)V__4m(h!jY)lTm|&Qyvk@DmWbna-e)WWnC0 zJoAz0FYi7T$%Xt!1^z5>UvGYh_gcoYV;`<$e`pRBXg_NB$ZY{b0vDUh=3l!Qubk8~ z(Q+|05EE*4OO#o-Lh;LqYsGx>@}U|cY#6miK`@PPwdkIv&mIhtJQ96Ohwn66oM1V!`NN(D z76IlvN$*$%3=X6}s1_)?Ami!ZoXlt^{%kVW`#z;}46N)44ztfr6p=Dsb!*<9Jch|D z{HOQMH|Z4R39zb9Oki8J<-Fqs7Pf0~&O$-e1-cA>n3_0PSoxQTb!01QJPD3ObA`Bhk4hKaxy9iI+6q1(u>ssl2{u$<**JhrbYUO0aD6^u0 z$+JjxS`G-hO2k5c}+xv_K%4MfipMvFFT3Vy@d~ z-dB6PLF8c8q-#@B52sw4^Yi=u`pjRO7~V|#)Edb=mFpQx##5G{>u=AovSqyHIUKdR znMqb+SCX~H1xp3Vj6Q-1PZh-X_Rwtzh|wxRKA!o+1-GtVkdzWc0O|98)Y ziWqytnMRt*Dw*8k3@^H_HMf>u4>-ePB@p}ZWkdG{z9!}%rPD00=Pr`+zqq$}$xAag zZXJsQ&EjW-GFp#L+LUu+w&|O9=i}@e?*F**r&Zhf*Vo9F6N{PS=t2;Xz{J5$L?l?xMEH0km=<_5p>FbHRU;6)ABvz=K zm_Bf@c_6llYs<1u)8DBlcN**0Jv6r~dwS_K8^ecQ_0{@$ah+jaw?kMT?C!q8$C6cY z{i}n!b(8FtygNG&L}@PZD41xIEwK7__PXW=(ZAbWWYcYazc8LtoAl{r_?tNo;^+1K z|J@zG&M!aCXURTh^;p5G1*bjO7io)Z&byZZp00ZEzel3XA9OeWdQ|pnv%hV~$0On1Jgtol<^s(n2LvxXE!nV;LH{ii zLrZgl!&d3p?DL)LIVJUypQaw`|0kI)_e)Fs+JJN`{0l9_3881|LM0ilb`P> zo2YT3$ia=TiqDAsV55c0fnCd*Wg=``_uXc^=X^qef5VmLL_WPsZ}K*N?KPfL{UY() z-=FC_ik`_-7rQH4{x@v+u~5LqgMqz6=NW_Nfz$`0&nDiC(ENTZW@m)q z?RlHx-HIBQ9x{yh)^T8sN!jv(e_4lTim$f+Yd-(RpO?}_4oTH={}W7G;$uJMO;|b6 zQc?ea(Tr=yCZE@Qu6ON2gtPr@LzyOCCU58Czh(vS$V_5C!F^||4%0oyo(Cd9DQ4TV zWm&sDd_q)La8BY@a@v35#n$)yDw3rwk(xc}op=A9__pugJziVQU)|*?^KIsx+|8dF z`&ng6`;t!%^Q=$Up5s)Q!7Qpc^TNDFhh}E>bGqx4`L567I(y5%^phNmJck?)BmX() zi+aqiX%Ql6y$0IC=kv{Nz9yA^oA~+m`u~^RbIK0$dF7dY+#c>!@m(O1A%p4pfk_Kz zb#OWf9kFZ@SK)ZZsNNA@GErehaR>8B76E~Fem0$5v!6D7cMD>S7SZNoaTS=wk*aIb zyD5BW_T2R1Rq~nL`wQ=jS3I+{Gtc`GHM1u}LCzzAGbtoQbnmpu6GOxk*4&j^z4bTK z;ed?e3@a98Nw{tLR(zz4du`GTjWoBp3s(00jL}F=y61ANx^u4Q=AD}({|nv^-ZG!B zUjJji{RhUskNN+;{&`{dcagQJYjc$vDh{7Kbk9N{GKHCC;os}eS_=}G6g*}#ig>KF zPS4TuUG>AUug?^Nx{CtBzJxV`^#>t6qR6AoWedbF$E^xf7E2R_aH^VQ)k?@nQs z2^_B!%pRyXwkXIM7OZ_c_2>{J$ z#LQjxR(<=a{%!l0GjQFFd-h+dp@SpVLz{u!WA@=p4s-v<`MUjw-aliin`!-c+)#<)&l{XSD;*ZSQ?eaTB z*x9Lh=HZ98`!t@hE^oTI=yRNC#F<#-6&zW7f=4SEd!i0jDyuDY)AWA)YTlsoME+n&eZjPAObl5GzcHJa;ait!q{MwaYZHTCb#O~%1`{lfk+ zUFU0GmHd>CzteZSfni^^jQ+!Cd4J~4`pB-gWoIb6Qi+}dJJ$m9{trJ|^53oU6O845 zs_ z{g<~t<@5T!RxYr+@iUAqLz~&6Lc3$8Yz%XZb?Mrg)oXO^7MD7$7ToYC;qR4>>h}@_ z_g5-z&wG-%l4C;Ui}a@Q2gM(l>|XzQD)T`0nM{Ra)bkbXYMiA_UWwW3uKv`meb{;S z%Z;69f4tc8gf)T3=e7;=v$a9oOEVddFuy+F&Agy{dXu14pw5+ha%(-J z&o$96wuEwqSFb;Np_mW*lLv1L4`?!;h_YO8eJA^NiSq0-jpppPp0#aj zUYlgy&%Pv9ZENJMo|!Ls|KD5CVX><~|KpD*3I~{rvp37>EINDb>A7QR%aoMLVqIhG u8>VxwVJy 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/horse.png b/app/assets/images/emoji/horse.png new file mode 100755 index 0000000000000000000000000000000000000000..78d580ad3e9cb256589834fd6d61013127324b29 GIT binary patch literal 4582 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/horse_racing.png b/app/assets/images/emoji/horse_racing.png new file mode 100755 index 0000000000000000000000000000000000000000..e3bbaec1d6c8f8e7257b73023ea7d52ed73b5ea8 GIT binary patch literal 5905 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hospital.png b/app/assets/images/emoji/hospital.png new file mode 100755 index 0000000000000000000000000000000000000000..c05c49377fe19057ebaab5654041a9bd70f7e1b0 GIT binary patch literal 4887 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hotel.png b/app/assets/images/emoji/hotel.png new file mode 100755 index 0000000000000000000000000000000000000000..d29f276a1805e58cdef33235312cc2f41be26c0f GIT binary patch literal 5123 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEe*J3QyH~Dzr$lY}maD?M>4{^b4pZmECyaX<7=@=9PE*cl=Da=QgGCwx zdmOV3GneHD_BWC`Zww=J@1(Z(;OU)n{#%-Rg-m__EbYg;y!*@w&v-I_yDoEk^us&(n9nh#dG)En z6MRgws_VZ$4*fdszdpkaWh3M388#&bU1dH;3@>_r@n$VJbZdTnsEql)lecc4&tNF) zJoC3Gckd~(X|DIA>~`su<47h`T|onjsymNeQOS`hy>LVyUXFVm$kE)goTAKx0k)I zc(X=!b6WH)CASIB|9&lvSotu1t6!+*+~k$F>mSd%`O@FEIP2%y^%4x%W2z3`^VYM> z%G>o%N^QCN!~c8P*cd*{%eVh$QvUa6eBAG@tOl#-V@VwXLZNQ6I42rbgjPj1ZkB7< zarKCbA;Z2+H+1B~SXd3)Qc6;i?|n1gQ>t+xOU2~6wL@IUlckFVC6y+=)8=wuTv2tU z`a@s7-3O7>z(&J4wFTyGN*+pL^7UNXFEJ|2l1fi{FSBmN3h8BRZ=clOS21)7wcMsV z$MuqjC+j@hx~|9S(->#mwmf@orstf}im&Nz5wE61O|DQvW{pfj6e%1*hlAFRXrag`q)3DgXP=H`e!0f9Vrj?w59_SH9$8-hIagu93vJ#52i~x@%8EO0V(|XYBc;4(MSDtG(~GWJ zhS!fhKOBDNv^U|1zj8M_1-F0T^E53Fw!P~^SK%yiZ= zL$+y6lgF#dqudeUj0+ZBna{}Z_4vaTIi270Hk=E0Icd@JhDpJzZ{ee?%F3sV4qM;J z9cehC!1T(Q-Suj)s3pU_>IKsz!xkr8H#@&^8&`1ibEacFix#hc8hU;~i~}S8iiYF_ zsfMosVys;cLJW+~h`TuSEDZ9Wnl5sU?^89)dz%#uEgvPPaP!ouJQw}M^Xv45*Nf`d z)-o1qq|QuEa<;m+#L~=jYIt++a^53fCbk8L)#fbKXwtG+Zt*^0DX+k>bDCNU{`oL4 zEZxwzabw}XZ+)vb=sC_z`afmq-OW9{EL)eKuvOkY%ck&u_|C`I%oBgBaxCa_VVh-W zqOrDHu+3Pu!mw#Y(%Pa7>lrH;@?VIt zq_=7KO*LwsGO6$NWxI_XJT(#;89Zq^PFxz^7k;@tow9OTVqP?>Lm=nUt?6x?Yu3)K zT4!q3)T!jdvUss_qp-#LC)@lNiUlt}I+Zm%^495sPbv#|wr*i8-Yx6Nti`T%#W&M5 z$nAI#gU|M=j|?3iReqCdl0sZ~UYriBxw5Hbv2gO`~8If8OM;pSATWQ@+jq zn%lf@?%1_f6)=gt&^i3A*?q^myZH*)+u472Cm)Ia_b<3yfo%@YoIgiiXw?6)fB!W9 z-#bNyb-TaC-21{jeKEr>R|c_3Pm+H>{vmt$n85y=ox2h)u_-J2&hqpLeDddEtbfye zMw{ce^D{T+fA`5f9l$ju*CPL)&b^x3{Tr)3{b=x9rWv{a!TWc6CL4X7!X?MMDOtJA z{{N}VcRpW_W%%{+@}9@fRv)t6c8KM<>p9CiIrp}i_eo9{Xo}l)Tb%LnhCrW5M`nD8 zX|)x1ejO80(_`Wr_+Bt{kJdFthkIuuEGs8XWfWEO6h3t*C`|70!K*R{Ry1wSnLVR@ z=Vyj%$F(16_@N4(NpA(_ujrh>e1Orf z;a8Wzoe2l6c&|GiR#Iy$nRSb^Vb|K94L>dZeJs6dZ_j4*{$$0^Szq}+$_a>E_!WPI z{~x<_@^a>VDu+XMEIZvLUQqhox#cD^*VhR4^7--%f|>7{tc#yp@a@T&7GG~OZ`xXe zt%o;VbH3ihzDsY#=Bj`xI@%Fu890*r`8GzZUvTa6ONX$7tD08Jl)i1wd$wS)gM{$B z)w44Wq!{llu33`$$l@s1i_=qou4I4z;(PTP#g4Cy^V|y0ES=uBF{k6Z8|xNU z9mtNaervjY-#=5CJNu;#pOr9_bU(FBJn(Y0Qp@_BuM+$BJ&eD=T4X+=6 z*!3069?VQiRaMs3iQIZ9I=^1}ea-n?hZCF;v5}HN_fLf`@jT=H{+GUlaC6nBIQxb< zns@46C*J!$O`@Uh{-!G@8+~Uate*Kz?YP@aDcOUodBh~0=SVQ@XY5tM+&Ir^Q@6fPoWQeBfZ^4YO*)#_c3)#~nYbYC#kV3B#jZySc1RjlaGnPs!O*nY-j%EcuHJSct=CkQErpVY^%CBD&D{Rx=WzJx3lL#RwM)G zCqdV^1@|7hW>vmAbL+DHDaD_@iyNxkZ}fbZX7KUv`P5!s-y8qOe}4Olla=Cm&%OVD zH4D3@^{3&f;kB#}yUOb)vA>IFng02;{Ems+_dWFLOWnJnuv9M8RWasq!H=HR_x}}E zWizcipKkxLtWWPv;+BaYKJWh-`R|AEcjgbz%;Qev@Bg0Wr&G=@-LG_N(}UmlHk$st zU-f?f{W%<0XRo$qa5;8aFR4SnIoDW6Ox-X<&3V_W`jb#Ez_HN6#qP0@m>1- z(syngeH)(h9eCmxQP*@xYogXhi?D7%iAvK0zitRin?GSu4)n_3t~1}Iu2?=GJn2Fs z+k$OMozVuhB5Kbvdj88_3H>@N%FAKyC5idXpK3b#Cm#{5*v+_tKRn=7pL@@tZGSJ= z$eSp3Eizcol$kBH>^Y-H^!Y^=B^Ap%Hk4NKe)=KKbbz^T!_D5JDT@*=U2t90Yg(tF zm%Sr=y|X6grhDzxR&QEgt!DRB$YMCDFuPDrz@WFWyY%0eNi*_d<=!V6%PmM;d{|0= z??Dz{uTaP>*7(9%Y!&MrBBU7#?*-0w*ip5dqe?2!V(-gUC9( zc+-yeUC^|-#yi_@c|hIcSa*x7xsU$H{C~D)($z9azE`i;N&7i4zs*(Qt$Y6W`GlJy zsg2FmQ{wIig?%vIKJV<;^?8g1De04!=9#iMWXgI@%89JAJn`Gt#6i-+kzql+mi2bk zKQBU=o`|G2Z=ILA!;1AU&$_sb3m(M>F1%AsNi|^n(0n4uIXb(w;B%_-k-*mLY^P(T zw=6pKaL-=dbrwntUw-LY&2(j9lVVUhbar~b!0fY6ckjH*#D5@p@A03B{n^d7#}f{$ zJi6NY>=%~tys zz4^U~63b8h9N&MFN`LBRI&27k9>~~mG3|)${fe&sdmnuh=6tk0^nc$cj=%fllbU*2 z{ykRT@Aq7i)#}E4pNi{its}Clw_Iys6jTy%s@`k2|I@_v4So#jmQ@AwPWQb_-ZQn} z`SX28r~iMJ$*^u`Ug!U^mrQ%>EN@iEOcd95`nRd|?B&Gua!tZA3=Qi)7;(M)YOqt* z_?y8!vBb9uTmsL|+(^7p$hSuC(Nd?mN3SP_Y<+ili|{hN#%DV>{K!>syQ2Kcpx08u zQl84o1wY+u$_o++jlX@7f#Fx>$;jPmH_Cr%1lpXuxYM%h(j)fY2bo=8 z?)-JgQqIb*bMuT`sRZ5n%jad=kjW9HRP=S^sjZ7TtUawsd|6!OcFhn zYyS4}^EwUI1=pq1cTUcoVBD~(NKtXs(?GtBHWQw!=gFKXzy5UkwNGme9J88?*Q~l* z=QvM%>&%AI<>GF8+MhnvbCY=TAg*cUg1Tn0#W^L}Q>Q+alQ`fUdf!}a(RJOI-@F)D zIu^HFp1o;{9>1JH2bUX<;?#G~QYt4LkLKU7lk-3W*J_?Ux(@p_1Vk5Ua7mXO)^bQ; z$&O9v)AE{SBEWf1Uff}-qFe)qr;13W9|On2iy03ZxBB%z-D-B|+UzP-KcTX7J{NP2 z9GoZ~8E1WFipLqTO$U3=Q$QoMaSJs(egzwfd;+~`B2!6mPs zANlJhy34(F3jDBd{;o;U`~JuHJ*~`TD-~Jc*s&;p=i#pM|BQdPF-|YM?q1)){MmR- z*{+zvn?FTdPliRy94+}>D_8TwaNVvCIrqNrF8@69|3?9a{5@Yad zM?v~WA7qGgZduo|F;i^y@&n<{3Y`Ma#8&T|Fz-?<-&cl-T_1GBujS2{c1`9$wfBB2 zj$rN$UsRTgo?7(e$Rn?S`+try2v}dUs`b-bmvm&~l>WmnOc`{(755ZsF#I}{c%j;! zrD3aT;hlyQeivhxvvTLcodX>hp4$c%Tf49;+;o$fe<-X}!lsu!;{u1{LQD2d{8FhJ zg`uG*KV{8M@0C$~)Y)=v2=ldpa0m|4d&29MdtKb&iN#r>N>IAp(H zHv36|^?P&Jr^lPPst9(7GOH%+Jh{EsaEU({6-7zOg;1`!cRqV)r8QdBZlI8vl{JxckfT%8ZCI%Z-L*z z1`VCH^A=o`NxXeT;~d|-?Ynjzx%vC~P5b@bi-O#QPd|AQHP^DOFWez+gVvc$DFp!z z_v|H&45?2~R3Bcc*}!2U<@w z+`az!caBeNWu3FRLt>AW+>c}S277C#{cZ0{IIVPMb=AAw@3VDe?i_!zE$~;R*mPs{O444bAwm!HlcqHxZ|I{ zOt-f9`daWoPM_Qz*O}rOu@Z%=I=EIOE#fGh_Wl1o@fT%Ydn)SQ>0URmHkI>wb9T$g zH+NL3`Q;X^@lr~5>ZtwH={|Gj-Hmqj1}zs1-cQZ#xA8IVb+))?cI&~r|E2cdYu*|% z?E8P}@ScaaxXr#Y9$uMsH>&f)gJ9WxMfofrSr(sP_i3B7%mU{?1;al3-Rqs--%z<> z$|wJ#=%iq3?&4z+kNepb%ve_aSsrh}xJ&qrVcm~X*=OnMjH*XIZc;gIloOhi#gG%) zT2yiGyk>Wg!FsRATMEruk97}E|M!q3{^urkg>L^3hs`;dqE~S3c4%QU-p6Fjw6>l* zdGn5A*8{^B`CU-_T)5-dz6otTyCzZrPA z8ZNvHzf*J8F0I_3@x!abf_LM#it>KwFbc7GGp!(@`iTDAtsIL|rf%9}=CdkvVfZ0k z@#?6Pmlqr=x_&|X)pw>vE4Y{xg7%99x+vLwXbyG>?7Utm7Ty)0ZKAP)O=(KH?3~XX zGY**U(beo~s@vYaSu`=ubVg@~QiWCRd0uhiCVP#*25>AVG+qb7r1V{HMJ3n+h&z*$Tp{4=kwd4%uOzv; zN7fIgmfee!EIRdetE$!8&}(60AN|-rzZKnAasIl5wDiHK@?ELjUh~2)UOIK_u=D5p kzaPJR|L&VD!$19(7Z+>3Tq5|Efq{X+)78&qol`;+0Mg2*_5c6? literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hotsprings.png b/app/assets/images/emoji/hotsprings.png new file mode 100755 index 0000000000000000000000000000000000000000..a0bc9d75f21878b0d9a663dc72b129c345215e55 GIT binary patch literal 3538 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 bpD}pD=WP+Wld2dP7#KWV{an^LB{Ts5q;#D? literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/hurtrealbad.png b/app/assets/images/emoji/hurtrealbad.png new file mode 100755 index 0000000000000000000000000000000000000000..146ef1a6a87c299c712aaba364f513a1f06203ff GIT binary patch literal 1456 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/icecream.png b/app/assets/images/emoji/icecream.png new file mode 100755 index 0000000000000000000000000000000000000000..871ce097689eb1fc452fcd8b2a0fc00833849ce6 GIT binary patch literal 4603 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 Ib4q9e03yepF#rGn literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/id.png b/app/assets/images/emoji/id.png new file mode 100755 index 0000000000000000000000000000000000000000..47437a76d39258a854a52ce98d7b2839b7f4f9a5 GIT binary patch literal 3905 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 IbxsLQ0N%%70RR91 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/ideograph_advantage.png b/app/assets/images/emoji/ideograph_advantage.png new file mode 100755 index 0000000000000000000000000000000000000000..e79af78442eb453059b8a8523cee71df02ca99d0 GIT binary patch literal 3095 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 COTYvG literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/inbox_tray.png b/app/assets/images/emoji/inbox_tray.png new file mode 100755 index 0000000000000000000000000000000000000000..e2df0f8970524c92f3ed147c889fe5e66a3acf5c GIT binary patch literal 3700 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/information_desk_person.png b/app/assets/images/emoji/information_desk_person.png new file mode 100755 index 0000000000000000000000000000000000000000..52c0a50a3f61ada64000b53eac14887f228aebc8 GIT binary patch literal 6605 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/innocent.png b/app/assets/images/emoji/innocent.png new file mode 100755 index 0000000000000000000000000000000000000000..503b614f8dcc32bad7a6f17f49d12602792215b0 GIT binary patch literal 7000 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/interrobang.png b/app/assets/images/emoji/interrobang.png new file mode 100755 index 0000000000000000000000000000000000000000..64304b9f5fb0120bf666e4ab13e6def7f9fbb846 GIT binary patch literal 2875 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE7llD zjxJS4*BoZ@Jd%C$)K^XUt8RZ|YFr-w*tsx0-eRK`lb`77Rz};oOD)?az1^4=T3McU zSvl+ep+`P@U(0T1nL9IH=8o-`&9Z-Om4zH02-R%tncp+Pjp>}T))Ax3Lq5M|ec05y zUEsvsLQTD=_dlOgkJbHm=-Tu6A9>NNA{|FJXE4(^tUohv`5 z=D08aap9l#cPbyb+!143WOR?`gPm}jqPIKi9;thOEOc)en_Q86y4byK(@WViA{zc8 zAB*{T6**W~PUy&7WiU?8E9-N6XtFX~{iU4TiISWbKi^KezvKN@?e%+-Q%X#d1jW{} z@PGe)e~x$i|4qJ!&Pp&>QsN!*y*Tfn5gc z6gTY1HBNvsoK| zrGHxWC&2dn?v{MD-aix5K7TlU@9)v?!r!ayOWr+x{%f(`&r6%_ejcp1I=)2fmew}O z!o7}exw~J#sQBMybl_Z3MnQoN;}wVL5wVpAk{|0dPP$xgC;ZEQn(zL(67fo&d~z$o z)FT`23!Xgt_3J&$^luNMgI3;gP+;NiS^dyvWr#=c6SD{T;USz_Rkvm?)R9eZFgPZ( z!u?|Tsvq%wT}$U%1?c>XU44@I&&tTR|8Bl`xaoWO+@SZ;*Q~f_otu0hRQnVIL+G(N z4P4%b8dyB0sHPrRe&*DHmq ztA%j`XV^p?nJ>qx*OrP2Eq*D=y+PrG^@{2foC!L9N^X~PLRm`=&kQ&qCNY_T^FlzD zw%7!d*_HQauGDzK6A%=r@ywFg>UvCI15011mg{=6*GB>v z7nd@BNUK=-=zLeQ=u57q?PaZsEaLsntgF(l9O+wY!OS<~<-x{A&iprRDdNrya)jH0Irp>Bk8`5oIVaOD_kWxDRBf>qr`rk!1xAyG z>sO4I{p%F>etMp9OQ^$&sBewWrWUX_aBk6S?)04`dFx2v#FDD-C#G+2J-9Auqt{){ zg$xBAO@E6r=lC(?COR;vCm6UzPq4Q32?~7lpeBZ; z+ECM zpeDIs(a&X%Os53&bbn|NKFoelGOR=RX8MVzyvtWeeEulV;?lE9>e=7L4B2W2xGRlwhY`cP7Hn>p`}Ne zgsz?zVc2cZ*I+F0uzJ46)UIr;2X`JGnk`~;?U5SC9>J@L(?lgqTB|Zv9BF3D<0X>C^FrnMNG-qDb|BeBZO~;X{2K67NMB} zdI`}D48QIPFtTn{PupOn`@;0MUarFWUu!w!%5=^+B_2(MyAKRt#PShs< z-?z5?d;HGE&?hVRR#)@={c$h%`LF-tOnh;hpU0m6cclOC;}6$(-OJzXc(e3$TU)%% zr*D7#?Thc4$}i}(DZYF4ef7WG{Mw@L=N2wLY+b&mWL^EcH}8x8?@wgnd$;pbad=6& z>^`gOmG17Aw}j`&$a|d?aW5-fmUsL1)_VXUgw(`&;Q=Q=d&NLIwH=c#&#@3^6S3Hum7(9zqDr0 zvgHT+zkmCea_Y^(dkPia{7zm6q(cl(rKt;T{=F|^rOh#}o$AwfoAMmCzpb%pxwN84 z!RJD+RrkZMR_~8kZTq=Rrrlm?((4!R_K8m1-f7ekaq&!_nd`oP->053$$iwUR694_ zRiP+2VH4-ZCiCCxU)}7q&l9`IcI`cLh45y*gxCYS8cG@ev+JE|DwE!MdIi#%N%Ln`9l&d%(K39V|I zUpzhPcJB7O@5-v<3-@+pRG@##fBzApREejs_uk}0$J*082s7w};I!XVGc-ebt> z<{`xFru@hBz~1$HK6!Zu2VX9K_3D*}ijYO0^7&(7Ny$3yfkz%ZP>79=BA6Bm-!Q+X_rbc~_S=mXR&KF1v#iVY*!g50yj(tC%s1lU@v4x{{f3pF zQsz}YlN8g9N_lVl@5kfsc0V38-@VF^aC7VRxa$2Gb?4{V=G@xSIZ1lL$&_^}dl*z| zRNwNgmcL$F`Qu@G<+q#Zk=t@4&z?Q|xnWus%fXMrYCaij*00|_OI)F7=ba5E`u0)x zRQR;c#!F z;Gw9~3!U3t40f)oaBrDmS8KI*@7|(X)$-2!n*FwN6C}JDY7XcM=S0|PpJ!)d%Q;Z> zYUT1Z&)SqWt`b)FyKw84RszrR`#;R5sF%HqIL5#(ATJ$wp=<5a$Nl!lzW?>kG%M4r zRDV}&!Wi6Z${>1(o4?t`K=9Khg_G6?Lb)AuDp>2kUJYOTGX2W?GqX&+=kflGGiA{5 z_i8yFbmP=>XYGZ%HalupqzW)GxBhE5xQ?m$uInO&P3J`e7W^`iz(pWMJ~S2ikJ79O+0FTKH=i5mnxU+0#}@5 z?p0L`+rI77Zq<1~R^kFB5)Uf%KCh2IdMI@D%zYJxffK|N-)3w~I?9!|^QlvwZ);b&PZ&_GD8KoeNBu_3P)T7*D)RYYJpJ&}L_$OCdGhnMfhvOct}%T2X|pt`Ta-<-vFOM0eM@HuD|Ed# zEw!+c;A)t)!y%Q2!DJGTXvQa*O=>C{UH_9#cCxLMXV-Xf&5|Me)y|lC#m~=m&i9^p zS&lctVRD{B)uMjB1;OmoKh;~V-^+Sr(!aC)|7R}q6y`Y8u~_~51ka_0ocw1XCE(v)f2<(U>3;LW|F=Z~TG zhQn9ZpW9OS<47jMD#XLE`Q`d=*REwyndJE=+VbO(q#-|oaNL`RypvlJ9xBg*LuYFv2 zN2_4=gvHZWDwlqYxzXFWek=EpiRNk5ydsAt{Jy?6`Dah2i^jjI+hzM~YG)<+6~BM~ zm#zN8*Gh>8XYZ<4e4XoT;pdUr=o%E)$$m}9>uc@H%S|8F?tbSKHg8JMp1bzP6^?QI(~j_*(IVpUq&z?6Mm_vy3uYoAYhfA_rkzP&;k z$KJl3vVHB^v)A~NwL8-5=huFdoI7{!BdMbOhhD9k%Xw@Cza`)9zQY&w_a)pupuqMb zKjT2Cp5TSc*STa^7Oely!?17uhC_S5UW@+tXaAl{+B!|$r7?PptDWQw&S-9wc9kiN z;Y&5vn4(+uI^cil>4C!Vml(w}`uVu!&6_X+$3vf{#Q zK6yC@N^QD++SLC2ThW=aXHm&Y2A%WS(fkZrr-G8Ut>61iN;`ZVOTyn@Uu&|S|NG!> zZg;XRKhH(;#-Gh+ZGOKi=j5ERu|o3x-FfE=%{_wtP9ex802M%P)W1zo7BafshXeco!P4NHJlyt>&nB^}Kdr^_!rPh6>gos~;OK$Knb4YP*!gBa8@5jwkZ5nMeb<<#-7 zvJ6Fk8E0`ME7hD=o$ABXR$}Q?T`X*h{e^pdBRiD#{eM;HH^1NG=arhoC5!CzSDW(j zxgEBbtDd~?U7VBtqu0%^BZ9VzB>(zR8EwmM$I7E)5q#eKl~9KL;q_ga|NiYiU^+o^ z#)<8d?c&mGn42r5?*AA3QRy&QX2;x;zd1&J3-3Hxz0V?QrvjH*ynp(oYf~u8Y|3QYBzh^{jQZd%xiO%M9$y%@GyJ5-jcPudGCLov8{lsGt;hZ-KE^YIs{t6Sd*sHCA!tQYoALdPE zJ#~$-xNQFUTU)cATIFdU^CS5+a24s zGbydOYqh`l`MDjpw7<9Ab$_F_s6#xi!toWq7|VekQwGL@gzxX}o;6NC_h;IVkLvSl z4t+jvf4*J5&O@T@@W+RrSXMl$vWODbj@q2Y+i&-4MXaw?d*&wI`9{b0JmEpq%z zezDg|u>{qE@1LHYo}IVjVcTnIY3bvhA0|~jkO;mRx5UB0z`bAY@6m0!w{P_r{%3ll zBirBi)!+uF49k~)e}9KhwO~(S5Dy4x?@8ro*nFU#=|AtB_1EOpHy;RDAUT8M3Zv(N zrB+KC1x_&Ubzr}c)swlFjlqzEbAez6!zPDKU10)@iW8WBHRvgunlIpD2w`~0n0bI* p=AqV%{cK7L5_(P=Rz3R9z`r8n5Tk^HD+2=qgQu&X%Q~loCIDM}e_#Lr literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/it.png b/app/assets/images/emoji/it.png new file mode 100755 index 0000000000000000000000000000000000000000..70bc9f32463c11f26cf129ab031795a271f15b35 GIT binary patch literal 3495 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 V?|A&41Oo#DgQu&X%Q~loCIFsRVZ8tV literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/izakaya_lantern.png b/app/assets/images/emoji/izakaya_lantern.png new file mode 100755 index 0000000000000000000000000000000000000000..18730ad559737ba68461687736483c1cb9bedb23 GIT binary patch literal 4064 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 KpUXO@geCyZMskz@ literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/jack_o_lantern.png b/app/assets/images/emoji/jack_o_lantern.png new file mode 100755 index 0000000000000000000000000000000000000000..1f7667ea45897409431a8069a56d8a2683d7b345 GIT binary patch literal 5633 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/japanese_goblin.png b/app/assets/images/emoji/japanese_goblin.png new file mode 100755 index 0000000000000000000000000000000000000000..bd21b187570ae2263db7e1d50cc1aaee27358c4f GIT binary patch literal 5159 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 WSB^O^y_kW4fx*+&&t;ucLK6UKJgMpc literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/japanese_ogre.png b/app/assets/images/emoji/japanese_ogre.png new file mode 100755 index 0000000000000000000000000000000000000000..e9f5471c9a28822445e6382e1c71dd9bda013c43 GIT binary patch literal 7147 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 II;Vst0Bp}sB>(^b literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/joy.png b/app/assets/images/emoji/joy.png new file mode 100755 index 0000000000000000000000000000000000000000..47df693d424f94fc2db1a0392148ca8f2cdb4923 GIT binary patch literal 6339 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 Gp$PzE;v8E5 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/joy_cat.png b/app/assets/images/emoji/joy_cat.png new file mode 100755 index 0000000000000000000000000000000000000000..6c60cb0efc83a744ab2774a5ce4f5f774c7b3de9 GIT binary patch literal 7190 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/jp.png b/app/assets/images/emoji/jp.png new file mode 100755 index 0000000000000000000000000000000000000000..b786efbbd8aa214f0dcc30b4859629a6f3feff47 GIT binary patch literal 2827 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 F1OU|MPW=D? literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/key.png b/app/assets/images/emoji/key.png new file mode 100755 index 0000000000000000000000000000000000000000..34673213f64990f557e373c5736693b94e47dce1 GIT binary patch literal 3452 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/emoji/keycap_ten.png b/app/assets/images/emoji/keycap_ten.png new file mode 100755 index 0000000000000000000000000000000000000000..71dac1c1cc0484787804a817c702bec235264acd GIT binary patch literal 4095 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