Auto-merged master into cd-v3 on deployment.

This commit is contained in:
carlad 2016-04-14 10:43:36 +02:00
commit 866fd2a617
16 changed files with 275 additions and 135 deletions

3
.rspec Normal file
View File

@ -0,0 +1,3 @@
--colour
--tty
--format documentation

View File

@ -7,6 +7,7 @@ gem 's3', github: 'travis-ci/s3'
gem 'travis-core', github: 'travis-ci/travis-core'
gem 'travis-support', github: 'travis-ci/travis-support'
gem 'travis-amqp', github: 'travis-ci/travis-amqp'
gem 'travis-config', '~> 0.1.0'
gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs', require: nil
gem 'travis-yaml', github: 'travis-ci/travis-yaml'
@ -16,7 +17,7 @@ gem 'sinatra-contrib', require: nil #github: 'sinatra/sinatra-contrib', require:
gem 'active_model_serializers'
gem 'unicorn'
gem 'sentry-raven', github: 'getsentry/raven-ruby'
gem 'sentry-raven'
gem 'yard-sinatra', github: 'rkh/yard-sinatra'
gem 'rack-contrib', github: 'rack/rack-contrib'
gem 'rack-cache', github: 'rtomayko/rack-cache'
@ -35,13 +36,16 @@ gem 'stackprof'
gem 'jemalloc'
gem 'customerio'
group :development, :test do
gem 'travis-migrations', github: 'travis-ci/travis-migrations'
end
group :test do
gem 'rspec', '~> 2.13'
gem 'rspec-its'
gem 'factory_girl', '~> 2.4.0'
gem 'mocha', '~> 0.12'
gem 'database_cleaner', '~> 0.8.0'
gem 'travis-migrations', github: 'travis-ci/travis-migrations'
end
group :development do

View File

@ -5,14 +5,6 @@ GIT
metriks-librato_metrics (1.0.2)
metriks (>= 0.9.9.6)
GIT
remote: git://github.com/getsentry/raven-ruby.git
revision: 84392e5db701f0b5c66802aab9cc82ef9a5ad830
specs:
sentry-raven (0.10.1)
faraday (>= 0.7.6)
uuidtools
GIT
remote: git://github.com/rack/rack-contrib.git
revision: 1b11346d729efd88b274cd7f704e0bca9eb3de7a
@ -48,9 +40,15 @@ GIT
s3 (0.3.21)
proxies (~> 0.2.0)
GIT
remote: git://github.com/travis-ci/travis-amqp.git
revision: c388299757b7eda2cc0e33cdc7d90113cf283e6a
specs:
travis-amqp (0.0.1)
GIT
remote: git://github.com/travis-ci/travis-core.git
revision: f7b3a76b3f39c28bb5cf7b9dc24acec13908a11a
revision: a66c345d44fd9c28884d694acfff3b1a0fbc5232
specs:
travis-core (0.0.1)
actionmailer (~> 3.2.19)
@ -58,7 +56,7 @@ GIT
coder (~> 0.4.0)
data_migrations (~> 0.0.1)
gh
hashr (~> 0.0.19)
hashr
metriks (~> 0.9.7)
multi_json
pusher (~> 0.14.0)
@ -286,6 +284,8 @@ GEM
rspec-core (>= 2.99.0.beta1)
rspec-expectations (>= 2.99.0.beta1)
rspec-mocks (2.99.2)
sentry-raven (0.15.3)
faraday (>= 0.7.6)
sidekiq (3.3.0)
celluloid (>= 0.16.0)
connection_pool (>= 2.0.0)
@ -331,13 +331,12 @@ GEM
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.47)
tzinfo (0.3.48)
unicorn (4.8.3)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
useragent (0.13.3)
uuidtools (2.1.5)
virtus (1.0.5)
axiom-types (~> 0.1)
coercible (~> 1.0)
@ -373,12 +372,13 @@ DEPENDENCIES
rspec (~> 2.13)
rspec-its
s3!
sentry-raven!
sentry-raven
simplecov
sinatra
sinatra-contrib
skylight (~> 0.6.0.beta.1)
stackprof
travis-amqp!
travis-api!
travis-config (~> 0.1.0)
travis-core!

View File

@ -4,51 +4,68 @@ This is the app running on https://api.travis-ci.org/
## Requirements
You will need the following packages to get travis-api to work:
1. PostgreSQL 9.3 or higher
1. Redis
1. RabbitMQ
1. Nginx *NB: If working on Ubuntu please install Nginx manually from source. [This guide](http://www.rackspace.com/knowledge_center/article/ubuntu-and-debian-installing-nginx-from-source) is helpful but make sure you install the [latest stable version](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/#stable), include the user name on your ubuntu machine when compiling (add `--user=[yourusername]` as an option when running `./configure`), and don't follow any subsequent server configuration steps. Travis-api will start and configure its own nginx server when run locally.
2. Bundler
3. Redis Server
4. *Optional:* RabbitMQ Server
5. Nginx -
*If working in Ubuntu please install nginx manually from source: Download and extract latest nginx version, open a terminal in extracted folder and then run the following:*
```sh-session
$ sudo apt-get install libpcre3 libpcre3-dev
$ auto/configure --user=$USER
$ make
$ sudo make install
$ sudo ln -s /usr/local/nginx/sbin/nginx /bin/nginx
```
## Installation
### Setup
$ bundle install
```sh-session
$ bundle install
```
### Database setup
NB detail for how `rake` sets up the database can be found in the `Rakefile`. In the `namespace :db` block you will see the database name for development is hardcoded to `travis-development`. If you are using a different configuration you will have to make your own adjustments.
1. `bundle exec rake db:create`
2. for testing 'RAILS_ENV=test bundle exec rake db:create --trace'
1. Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`):
*You might need to create a role first. For this you should run the following:*
```sh-session
cd ..
git clone https://github.com/travis-ci/travis-logs.git
cd travis-logs
rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby
psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development
pg_dump -t logs travis_logs_development | psql -U postgres travis_development
$ sudo -u postgres psql -c "CREATE USER yourusername WITH SUPERUSER PASSWORD 'yourpassword'"
```
Repeat the database steps for `RAILS_ENV=test`.
NB detail for how `rake` sets up the database can be found in the `Rakefile`. In the `namespace :db` block you will see the database name is configured using the environment variable RAILS_ENV. If you are using a different configuration you will have to make your own adjustments.
```sh-session
RAILS_ENV=test bundle exec rake db:create
pushd ../travis-logs
RAILS_ENV=test rvm jruby do bundle exec rake db:migrate
psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test
pg_dump -t logs travis_logs_test | psql -U postgres travis_test
popd
$ RAILS_ENV=development bundle exec rake db:create
$ RAILS_ENV=test bundle exec rake db:create
```
#### Optional
Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`):
```sh-session
$ cd ..
$ git clone https://github.com/travis-ci/travis-logs.git
$ cd travis-logs
$ rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby
$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development
$ pg_dump -t logs travis_logs_development | psql -U postgres travis_development
$ RAILS_ENV=test bundle exec rake db:create
$ pushd ../travis-logs
$ RAILS_ENV=test rvm jruby do bundle exec rake db:migrate
$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test
$ pg_dump -t logs travis_logs_test | psql -U postgres travis_test
$ popd
```
### Run tests
$ rake spec
```sh-session
$ bundle exec rspec
```
### Run the server
$ bundle exec script/server
```sh-session
$ bundle exec script/server
```
If you have problems with Nginx because the websocket is already in use, try restarting your computer.
## Contributing

View File

@ -1,45 +1,35 @@
require 'rake'
require 'travis/migrations'
task default: :spec
namespace :db do
if ENV["RAILS_ENV"] == 'test'
desc 'Create and migrate the test database'
env = ENV["RAILS_ENV"]
if env != 'production'
desc "Create and migrate the #{env} database"
task :create do
sh 'createdb travis_test' rescue nil
sh "psql -q travis_test < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql"
end
else
desc 'Create and migrate the development database'
task :create do
sh 'createdb travis_development' rescue nil
sh "psql -q travis_development < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql"
sh "createdb travis_#{env}" rescue nil
sh "psql -q travis_#{env} < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql"
end
end
end
desc "generate gemspec"
task 'travis-api.gemspec' do
content = File.read 'travis-api.gemspec'
content = File.read 'travis-api.gemspec'
fields = {
authors: `git shortlog -sn`.scan(/[^\d\s].*/),
email: `git shortlog -sne`.scan(/[^<]+@[^>]+/),
files: `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ }
}
fields = {
authors: `git shortlog -sn`.scan(/[^\d\s].*/),
email: `git shortlog -sne`.scan(/[^<]+@[^>]+/),
files: `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ }
}
fields.each do |field, values|
updated = " s.#{field} = ["
updated << values.map { |v| "\n %p" % v }.join(',')
updated << "\n ]"
content.sub!(/ s\.#{field} = \[\n( .*\n)* \]/, updated)
end
fields.each do |field, values|
updated = " s.#{field} = ["
updated << values.map { |v| "\n %p" % v }.join(',')
updated << "\n ]"
content.sub!(/ s\.#{field} = \[\n( .*\n)* \]/, updated)
end
File.open('travis-api.gemspec', 'w') { |f| f << content }
end
File.open('travis-api.gemspec', 'w') { |f| f << content }
end
task default: 'travis-api.gemspec'
task default: 'travis-api.gemspec'
tasks_path = File.expand_path('../lib/tasks/*.rake', __FILE__)
Dir.glob(tasks_path).each { |r| import r }
## can this be removed? what other rakefiles need to be included?
# tasks_path = File.expand_path('../lib/tasks/*.rake', __FILE__)
# Dir.glob(tasks_path).each { |r| import r }

View File

@ -4,12 +4,14 @@ require 'active_record_postgres_variables'
# now actually load travis
require 'travis'
require 'travis/amqp'
require 'travis/model'
require 'travis/support/amqp'
require 'travis/states_cache'
require 'rack'
require 'rack/protection'
require 'rack/contrib'
require 'rack/contrib/config'
require 'rack/contrib/jsonp'
require 'rack/contrib/post_body_content_type_parser'
require 'dalli'
require 'memcachier'
require 'rack/cache'
@ -18,11 +20,14 @@ require 'active_record'
require 'redis'
require 'gh'
require 'raven'
require 'raven/integrations/rack'
require 'sidekiq'
require 'metriks/reporter/logger'
require 'metriks/librato_metrics_reporter'
require 'travis/support/log_subscriber/active_record_metrics'
require 'fileutils'
require 'travis/api/app/endpoint'
require 'travis/api/app/middleware'
require 'travis/api/instruments'
require 'travis/api/v2/http'
require 'travis/api/v3'
@ -171,14 +176,13 @@ module Travis::Api
def self.setup!
setup_travis
load_endpoints
setup_endpoints
@setup = true
end
def self.setup_travis
Travis::Async.enabled = true
Travis::Amqp.config = Travis.config.amqp
Travis::Amqp.setup(Travis.config.amqp)
setup_database_connections
@ -214,11 +218,6 @@ module Travis::Api
Travis::Metrics.setup
end
def self.load_endpoints
Dir.glob("#{__dir__}/app/middleware/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] }
Dir.glob("#{__dir__}/app/endpoint/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] }
end
def self.setup_endpoints
Base.subclasses.each(&:setup)
end

View File

@ -1,6 +1,8 @@
require 'travis/api/app'
require 'sinatra/base'
require 'mustermann'
require 'travis/api/app'
require 'travis/api/app/extensions'
require 'travis/api/app/helpers'
class Travis::Api::App
# Superclass for any endpoint and middleware.

View File

@ -1,6 +1,7 @@
require 'travis/api/app'
require 'addressable/uri'
require 'active_record/base'
require 'travis/api/app'
require 'travis/api/app/base'
class Travis::Api::App
# Superclass for HTTP endpoints. Takes care of prefixing.
@ -48,3 +49,23 @@ class Travis::Api::App
end
end
end
require 'travis/api/app/endpoint/accounts'
require 'travis/api/app/endpoint/authorization'
require 'travis/api/app/endpoint/branches'
require 'travis/api/app/endpoint/broadcasts'
require 'travis/api/app/endpoint/builds'
require 'travis/api/app/endpoint/documentation'
require 'travis/api/app/endpoint/endpoints'
require 'travis/api/app/endpoint/env_vars'
require 'travis/api/app/endpoint/home'
require 'travis/api/app/endpoint/hooks'
require 'travis/api/app/endpoint/jobs'
require 'travis/api/app/endpoint/lint'
require 'travis/api/app/endpoint/logs'
require 'travis/api/app/endpoint/repos'
require 'travis/api/app/endpoint/requests'
require 'travis/api/app/endpoint/setting_endpoint'
require 'travis/api/app/endpoint/singleton_settings_endpoint'
require 'travis/api/app/endpoint/uptime'
require 'travis/api/app/endpoint/users'

View File

@ -1,8 +1,4 @@
require 'travis/api/app'
class Travis::Api::App
# Namespace for Sinatra extensions.
module Extensions
Dir.glob("#{__dir__}/extensions/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] }
end
end
require 'travis/api/app/extensions/expose_pattern'
require 'travis/api/app/extensions/scoping'
require 'travis/api/app/extensions/smart_constants'
require 'travis/api/app/extensions/subclass_tracker'

View File

@ -1,8 +1,7 @@
require 'travis/api/app'
class Travis::Api::App
# Namespace for helpers.
module Helpers
Dir.glob("#{__dir__}/helpers/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] }
end
end
require 'travis/api/app/helpers/accept'
require 'travis/api/app/helpers/current_user'
require 'travis/api/app/helpers/db_follower'
require 'travis/api/app/helpers/flash'
require 'travis/api/app/helpers/mime_types'
require 'travis/api/app/helpers/respond_with'

View File

@ -3,5 +3,11 @@ require 'travis/api/app'
class Travis::Api::App
# Superclass for all middleware.
class Middleware < Base
require 'travis/api/app/middleware/logging'
require 'travis/api/app/middleware/metriks'
require 'travis/api/app/middleware/rewrite'
require 'travis/api/app/middleware/scope_check'
require 'travis/api/app/middleware/skylight'
require 'travis/api/app/middleware/user_agent_tracker'
end
end

View File

@ -50,9 +50,9 @@ class Rack::Attack
# Ban time: 5 hours
# Ban after: 10 POST requests within five minutes to /auth/github
blacklist('hammering /auth/github') do |request|
Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 2, findtime: 5.minutes, bantime: bantime(5.hours)) do
request.post? and request.path == '/auth/github'
end
Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 2, findtime: 5.minutes, bantime: bantime(5.hours)) do
request.post? and request.path == '/auth/github'
end
end
####
@ -60,9 +60,9 @@ class Rack::Attack
# Ban time: 1 hour
# Ban after: 10 POST requests within 30 seconds
blacklist('spamming with POST requests') do |request|
Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 10, findtime: 30.seconds, bantime: bantime(1.hour)) do
request.post? and not POST_WHITELISTED.include? request.path
end
Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 10, findtime: 30.seconds, bantime: bantime(1.hour)) do
request.post? and not POST_WHITELISTED.include? request.path
end
end

View File

@ -62,5 +62,9 @@ module Travis::API::V3
__send__(name, *args, &block)
end
def settings
@settings ||= JSON.load(super)
end
end
end

View File

@ -1,7 +1,7 @@
module Travis::API::V3
class Services::Requests::Create < Service
TIME_FRAME = 1.hour
LIMIT = 10
LIMIT = 10
private_constant :TIME_FRAME, :LIMIT
result_type :request
@ -22,14 +22,19 @@ module Travis::API::V3
accepted(remaining_requests: remaining, repository: repository, request: payload)
end
def limit
Travis.config.requests_create_api_limit || LIMIT
def limit(repository)
if repository.settings.nil?
Travis.config.requests_create_api_limit || LIMIT
else
repository.settings["api_builds_rate_limit"] || Travis.config.requests_create_api_limit || LIMIT
end
end
def remaining_requests(repository)
return limit if access_control.full_access?
api_builds_rate_limit = limit(repository)
return api_builds_rate_limit if access_control.full_access?
count = query(:requests).count(repository, TIME_FRAME)
count > limit ? 0 : limit - count
count > api_builds_rate_limit ? 0 : api_builds_rate_limit - count
end
end
end

View File

@ -239,6 +239,26 @@ describe Travis::API::V3::Services::Requests::Create do
}
end
describe "overrides default request limit if included in repository.settings" do
before { repo.update_attribute(:settings, { api_builds_rate_limit: 12 }.to_json) }
before { 10.times { repo.requests.create(event_type: 'api', result: 'accepted') } }
before { post("/v3/repo/#{repo.id}/requests", {}, headers) }
example { expect(last_response.status).to be == 202 }
example { expect(JSON.load(body).to_s).to include(
"@type",
"repository",
"remaining_requests",
"2",
"request",
"representation",
"minimal",
"slug",
"svenfuchs/minimal")
}
end
describe "passing the token in params" do
let(:params) {{ request: { token: 'foo-bar' }}}
example { expect(sidekiq_params[:credentials]).to be == {

View File

@ -11,75 +11,85 @@ Gem::Specification.new do |s|
s.authors = [
"Konstantin Haase",
"Piotr Sarnacki",
"carlad",
"Sven Fuchs",
"Hiro Asari",
"Mathias Meyer",
"Josh Kalderimis",
"Henrik Hodne",
"carlad",
"Tyranja",
"Andre Arko",
"Dan Buch",
"Andre Arko",
"C. Scott Ananian",
"Erik Michaels-Ober",
"Brian Ford",
"Lisa P",
"Steve Richert",
"Bryan Goldstein",
"Dan Rice",
"James Dennes",
"María de Antón",
"Nick Schonning",
"Patrick Williams",
"Puneeth Chaganti",
"Thais Camilo and Konstantin Haase",
"Tim Carey-Smith",
"Bryan Goldstein",
"Zachary Scott",
"James Dennes",
"rainsun",
"Nick Schonning",
"Patrick Williams",
"Dan Rice"
"rainsun"
]
s.email = [
"konstantin.mailinglists@googlemail.com",
"drogus@gmail.com",
"me@svenfuchs.com",
"carla@travis-ci.com",
"asari.ruby@gmail.com",
"meyer@paperplanes.de",
"josh.kalderimis@gmail.com",
"me@henrikhodne.com",
"carlad@users.noreply.github.com",
"henrik@hodne.io",
"konstantin.haase@gmail.com",
"carla@travis-ci.org",
"konstantin.haase@gmail.com",
"tyranja@cassiopeia.uberspace.de",
"andre@arko.net",
"svenfuchs@artweb-design.de",
"dan@travis-ci.org",
"sferik@gmail.com",
"svenfuchs@artweb-design.de",
"cscott@cscott.net",
"henrik@travis-ci.com",
"steve.richert@gmail.com",
"sferik@gmail.com",
"bford@engineyard.com",
"henrik@travis-ci.com",
"mail@lislis.de",
"steve.richert@gmail.com",
"brysgo@gmail.com",
"dan@meatballhat.com",
"dan@zoombody.com",
"jdennes@gmail.com",
"MariadeAnton@users.noreply.github.com",
"nschonni@gmail.com",
"patrick@bittorrent.com",
"punchagan@muse-amuse.in",
"carlad@users.noreply.github.com",
"dan@zoombody.com",
"rainsuner@gmail.com",
"dev+narwen+rkh@rkh.im",
"tim@spork.in",
"brysgo@gmail.com",
"e@zzak.io",
"jdennes@gmail.com",
"nschonni@gmail.com",
"dan@meatballhat.com"
"rainsuner@gmail.com"
]
s.files = [
"CONTRIBUTING.md",
"LICENSE",
"Procfile",
"README.md",
"Rakefile",
"bin/start-nginx",
"config.ru",
"config/database.yml",
"config/mime.types",
"config/nginx.conf.erb",
"config/puma-config.rb",
"config/ruby_config.sh",
"config/unicorn.rb",
"lib/active_record_postgres_variables.rb",
"lib/conditional_skylight.rb",
"lib/tasks/build_update_branch.rake",
"lib/tasks/build_update_pull_request_data.rake",
@ -141,6 +151,7 @@ Gem::Specification.new do |s|
"lib/travis/api/app/responders/xml.rb",
"lib/travis/api/app/services/schedule_request.rb",
"lib/travis/api/app/stack_instrumentation.rb",
"lib/travis/api/attack.rb",
"lib/travis/api/instruments.rb",
"lib/travis/api/serializer.rb",
"lib/travis/api/v2.rb",
@ -184,6 +195,7 @@ Gem::Specification.new do |s|
"lib/travis/api/v3/extensions/encrypted_column.rb",
"lib/travis/api/v3/features.rb",
"lib/travis/api/v3/github.rb",
"lib/travis/api/v3/metrics.rb",
"lib/travis/api/v3/model.rb",
"lib/travis/api/v3/models.rb",
"lib/travis/api/v3/models/account.rb",
@ -201,14 +213,30 @@ Gem::Specification.new do |s|
"lib/travis/api/v3/models/repository.rb",
"lib/travis/api/v3/models/request.rb",
"lib/travis/api/v3/models/ssl_key.rb",
"lib/travis/api/v3/models/star.rb",
"lib/travis/api/v3/models/subscription.rb",
"lib/travis/api/v3/models/token.rb",
"lib/travis/api/v3/models/user.rb",
"lib/travis/api/v3/opt_in.rb",
"lib/travis/api/v3/paginator.rb",
"lib/travis/api/v3/paginator/url_generator.rb",
"lib/travis/api/v3/permissions.rb",
"lib/travis/api/v3/permissions/account.rb",
"lib/travis/api/v3/permissions/build.rb",
"lib/travis/api/v3/permissions/generic.rb",
"lib/travis/api/v3/permissions/job.rb",
"lib/travis/api/v3/permissions/organization.rb",
"lib/travis/api/v3/permissions/repository.rb",
"lib/travis/api/v3/permissions/user.rb",
"lib/travis/api/v3/queries.rb",
"lib/travis/api/v3/queries/accounts.rb",
"lib/travis/api/v3/queries/branch.rb",
"lib/travis/api/v3/queries/branches.rb",
"lib/travis/api/v3/queries/broadcasts.rb",
"lib/travis/api/v3/queries/build.rb",
"lib/travis/api/v3/queries/builds.rb",
"lib/travis/api/v3/queries/job.rb",
"lib/travis/api/v3/queries/jobs.rb",
"lib/travis/api/v3/queries/organization.rb",
"lib/travis/api/v3/queries/organizations.rb",
"lib/travis/api/v3/queries/owner.rb",
@ -224,15 +252,24 @@ Gem::Specification.new do |s|
"lib/travis/api/v3/renderer/accounts.rb",
"lib/travis/api/v3/renderer/avatar_url.rb",
"lib/travis/api/v3/renderer/branch.rb",
"lib/travis/api/v3/renderer/branches.rb",
"lib/travis/api/v3/renderer/broadcast.rb",
"lib/travis/api/v3/renderer/broadcasts.rb",
"lib/travis/api/v3/renderer/build.rb",
"lib/travis/api/v3/renderer/builds.rb",
"lib/travis/api/v3/renderer/collection_renderer.rb",
"lib/travis/api/v3/renderer/commit.rb",
"lib/travis/api/v3/renderer/error.rb",
"lib/travis/api/v3/renderer/job.rb",
"lib/travis/api/v3/renderer/jobs.rb",
"lib/travis/api/v3/renderer/lint.rb",
"lib/travis/api/v3/renderer/model_renderer.rb",
"lib/travis/api/v3/renderer/organization.rb",
"lib/travis/api/v3/renderer/organizations.rb",
"lib/travis/api/v3/renderer/owner.rb",
"lib/travis/api/v3/renderer/repositories.rb",
"lib/travis/api/v3/renderer/repository.rb",
"lib/travis/api/v3/renderer/request.rb",
"lib/travis/api/v3/renderer/requests.rb",
"lib/travis/api/v3/renderer/user.rb",
"lib/travis/api/v3/result.rb",
@ -245,19 +282,34 @@ Gem::Specification.new do |s|
"lib/travis/api/v3/services.rb",
"lib/travis/api/v3/services/accounts/for_current_user.rb",
"lib/travis/api/v3/services/branch/find.rb",
"lib/travis/api/v3/services/branches/find.rb",
"lib/travis/api/v3/services/broadcasts/for_current_user.rb",
"lib/travis/api/v3/services/build/cancel.rb",
"lib/travis/api/v3/services/build/find.rb",
"lib/travis/api/v3/services/build/restart.rb",
"lib/travis/api/v3/services/builds/find.rb",
"lib/travis/api/v3/services/job/cancel.rb",
"lib/travis/api/v3/services/job/debug.rb",
"lib/travis/api/v3/services/job/find.rb",
"lib/travis/api/v3/services/job/restart.rb",
"lib/travis/api/v3/services/jobs/find.rb",
"lib/travis/api/v3/services/lint/lint.rb",
"lib/travis/api/v3/services/organization/find.rb",
"lib/travis/api/v3/services/organization/sync.rb",
"lib/travis/api/v3/services/organizations/for_current_user.rb",
"lib/travis/api/v3/services/owner/find.rb",
"lib/travis/api/v3/services/repositories/for_current_user.rb",
"lib/travis/api/v3/services/repositories/for_owner.rb",
"lib/travis/api/v3/services/repository/disable.rb",
"lib/travis/api/v3/services/repository/enable.rb",
"lib/travis/api/v3/services/repository/find.rb",
"lib/travis/api/v3/services/repository/star.rb",
"lib/travis/api/v3/services/repository/unstar.rb",
"lib/travis/api/v3/services/requests/create.rb",
"lib/travis/api/v3/services/requests/find.rb",
"lib/travis/api/v3/services/user/current.rb",
"lib/travis/api/v3/services/user/find.rb",
"lib/travis/api/v3/services/user/sync.rb",
"lib/travis/api/workers/build_cancellation.rb",
"lib/travis/api/workers/build_restart.rb",
"lib/travis/api/workers/job_cancellation.rb",
@ -280,6 +332,8 @@ Gem::Specification.new do |s|
"script/console",
"script/repos_stats.rb",
"script/server",
"script/web_concurrency",
"spec/active_record_postgres_variables_spec.rb",
"spec/integration/error_handling_spec.rb",
"spec/integration/formats_handling_spec.rb",
"spec/integration/responders_spec.rb",
@ -344,7 +398,7 @@ Gem::Specification.new do |s|
"spec/unit/endpoint/lint_spec.rb",
"spec/unit/endpoint/logs_spec.rb",
"spec/unit/endpoint/repos_spec.rb",
"spec/unit/endpoint/requests_spec.rb",
"spec/unit/endpoint/requests/throttle_spec.rb",
"spec/unit/endpoint/users_spec.rb",
"spec/unit/endpoint_spec.rb",
"spec/unit/extensions/expose_pattern_spec.rb",
@ -358,20 +412,40 @@ Gem::Specification.new do |s|
"spec/unit/middleware/user_agent_tracker_spec.rb",
"spec/unit/responders/json_spec.rb",
"spec/unit/responders/service_spec.rb",
"spec/v3/error_handling_spec.rb",
"spec/v3/extensions/belongs_to_spec.rb",
"spec/v3/metrics_spec.rb",
"spec/v3/renderer/avatar_url_spec.rb",
"spec/v3/result_spec.rb",
"spec/v3/service_index_spec.rb",
"spec/v3/services/accounts/for_current_user_spec.rb",
"spec/v3/services/branch/find_spec.rb",
"spec/v3/services/branches/find_spec.rb",
"spec/v3/services/broadcasts/for_current_user_spec.rb",
"spec/v3/services/build/cancel_spec.rb",
"spec/v3/services/build/find_spec.rb",
"spec/v3/services/build/restart_spec.rb",
"spec/v3/services/builds/find_spec.rb",
"spec/v3/services/job/cancel_spec.rb",
"spec/v3/services/job/debug_sepc.rb",
"spec/v3/services/job/find_spec.rb",
"spec/v3/services/job/restart_spec.rb",
"spec/v3/services/jobs/find_spec.rb",
"spec/v3/services/lint/lint_spec.rb",
"spec/v3/services/organization/find_spec.rb",
"spec/v3/services/organizations/for_current_user_spec.rb",
"spec/v3/services/owner/find_spec.rb",
"spec/v3/services/repositories/for_current_user_spec.rb",
"spec/v3/services/repositories/for_owner_spec.rb",
"spec/v3/services/repository/disable_spec.rb",
"spec/v3/services/repository/enable_spec.rb",
"spec/v3/services/repository/find_spec.rb",
"spec/v3/services/repository/star_spec.rb",
"spec/v3/services/repository/unstar_spec.rb",
"spec/v3/services/requests/create_spec.rb",
"spec/v3/services/user/current_spec.rb",
"spec/v3/services/user/find_spec.rb",
"spec/v3/services/user/sync_spec.rb",
"tmp/.gitkeep",
"travis-api.gemspec"
]