Skip to content

Commit

Permalink
[PRD] TCI/Assembla Handshake with SVN/P4 (#259)
Browse files Browse the repository at this point in the history
  • Loading branch information
AndriiMysko authored and vitalie committed Aug 16, 2023
1 parent b09edd4 commit d71a340
Show file tree
Hide file tree
Showing 16 changed files with 101 additions and 61 deletions.
10 changes: 5 additions & 5 deletions lib/travis/yml/configs/config/api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ module Travis
module Yml
module Configs
module Config
class Api < Struct.new(:ctx, :parent, :slug, :ref, :defns, :mode, :provider)
class Api < Struct.new(:ctx, :parent, :slug, :ref, :defns, :mode, :provider, :vcs_id)
include Base, Memoize

attr_reader :defn, :path, :input

def initialize(ctx, parent, slug, ref, defns, mode = nil, provider = nil)
super(ctx, parent, slug, ref, defns, mode, provider)
def initialize(ctx, parent, slug, ref, defns, mode = nil, provider = nil, vcs_id = nil)
super(ctx, parent, slug, ref, defns, mode, provider, vcs_id)
@defn = defns.shift
defn.update(source: source)
end
Expand Down Expand Up @@ -74,11 +74,11 @@ def child
end

def api
Api.new(ctx, self, slug, ref, defns, defn[:mode], provider)
Api.new(ctx, self, slug, ref, defns, defn[:mode], provider, vcs_id)
end

def travis_yml
TravisYml.new(ctx, self, slug, ref, defn[:mode], provider)
TravisYml.new(ctx, self, slug, ref, defn[:mode], provider, vcs_id)
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions lib/travis/yml/configs/config/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def travis_yml?
end

def repo
@repo ||= ctx.repos[slug, provider]
@repo ||= ctx.repos[vcs_id, provider]
end

def config
Expand All @@ -47,7 +47,7 @@ def imports
imports = Array(config['import'])
imports = imports.select { |import| import.is_a?(Hash) }
imports.map do |import|
Config::File.new(ctx, self, provider, import)
Config::File.new(ctx, self, vcs_id, provider, import)
end
end
memoize :imports
Expand Down
34 changes: 31 additions & 3 deletions lib/travis/yml/configs/config/file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,25 @@ module Travis
module Yml
module Configs
module Config
class File < Obj.new(:ctx, :parent, :provider, :defn)
class File < Obj.new(:ctx, :parent, :vcs_id, :provider, :defn)
include Base

attr_reader :path, :ref, :raw

def initialize(ctx, parent, provider, defn)
def initialize(ctx, parent, vcs_id, provider, defn)
defn = stringify(defn)
@vcs_id = vcs_id
super
end

def vcs_id
if parent.nil? || (!parent.nil? && parent.repo.slug == slug)
@vcs_id
else
slug
end
end

def load(&block)
super
_, @path, @ref = expand(source)
Expand Down Expand Up @@ -66,14 +75,33 @@ def serialize

private

def path_suffix
return '' if repo.vcs_type != 'AssemblaRepository'

branch_name = ctx.data[:branch] || repo.default_branch

case ctx.data[:server_type]
when 'subversion'
if branch_name == 'trunk'
"#{branch_name}/"
elsif !ctx.data[:tag].nil?
"tags/#{branch_name}/"
else
"branches/#{branch_name}/"
end
when 'perforce'
"//depot/#{branch_name}/"
end
end

def expand(source)
ref = local? ? parent&.ref : repo.default_branch
ref = Ref.new(source, repo: repo.slug, ref: ref, path: parent&.path)
ref.parts
end

def fetch
Content.new(repo, path, ref).content
Content.new(repo, "#{path_suffix}#{path}", ref).content
rescue FileNotFound => e
required? ? raise : nil
end
Expand Down
4 changes: 2 additions & 2 deletions lib/travis/yml/configs/config/travis_yml.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Yml
module Configs
module Config
class TravisYml < File
def initialize(ctx, parent, slug, ref, mode = nil, provider = nil)
super(ctx, parent, provider, source: "#{slug}:.travis.yml@#{ref}", mode: mode)
def initialize(ctx, parent, slug, ref, mode = nil, provider = nil, vcs_id = nil)
super(ctx, parent, vcs_id, provider, source: "#{slug}:.travis.yml@#{ref}", mode: mode)
end

def travis_yml?
Expand Down
7 changes: 4 additions & 3 deletions lib/travis/yml/configs/configs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -136,16 +136,17 @@ def unique_jobs
end

def api
Config::Api.new(ctx, nil, repo.slug, ref, defns, nil, repo.provider)
Config::Api.new(ctx, nil, repo.slug, ref, defns, nil, repo.provider, repo.vcs_id)
end

def travis_yml
Config::TravisYml.new(ctx, nil, repo.slug, ref, nil, repo.provider)
Config::TravisYml.new(ctx, nil, repo.slug, ref, nil, repo.provider, repo.vcs_id)
end

def repo
repo = Model::Repo.new(super || {})
repo.complete? ? ctx.repos[repo.slug] = repo : ctx.repos[repo.slug, repo.provider]
key = "#{repo.provider}_#{repo.vcs_id}"
repo.complete? ? ctx.repos[key] = repo : ctx.repos[repo.vcs_id, repo.provider]
end
memoize :repo

Expand Down
4 changes: 4 additions & 0 deletions lib/travis/yml/configs/model/repo.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ def github_id
attrs[:github_id]
end

def vcs_id
attrs[:vcs_id] || github_id
end

def slug
attrs[:slug]
end
Expand Down
23 changes: 12 additions & 11 deletions lib/travis/yml/configs/model/repos.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,26 @@ def initialize
@mutexes = {}
end

def [](slug, provider = 'github')
mutex_for(slug).synchronize do
return repos[slug] if repos.key?(slug)
repo = repos[slug] = Repo.new(fetch(slug, provider))
def [](vcs_id, provider = 'github')
key = "#{provider}_#{vcs_id}"
mutex_for(key).synchronize do
return repos[key] if repos.key?(key)
repo = repos[key] = Repo.new(fetch(vcs_id, provider))
repo
end
end

def []=(slug, repo)
repos[slug] = repo
def []=(key, repo)
repos[key] = repo
end

def fetch(slug, provider)
logger.info "Get Repo for #{slug} #{provider}"
Travis::Repo.new(slug, provider).fetch
def fetch(vcs_id, provider)
logger.info "Get Repo for #{vcs_id} #{provider}"
Travis::Repo.new(vcs_id, provider).fetch
end

def mutex_for(slug)
mutexes[slug] ||= Mutex.new
def mutex_for(key)
mutexes[key] ||= Mutex.new
end
synchronize :mutex

Expand Down
13 changes: 9 additions & 4 deletions lib/travis/yml/configs/travis/repo.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,39 @@ module Travis
module Yml
module Configs
module Travis
class Repo < Struct.new(:slug, :provider)
class Repo < Struct.new(:vcs_id, :provider)
include Errors, Helper::Obj

def fetch
get(path, representation: :internal)
end

def to_s
slug
vcs_id
end

private

def path
"repo/#{provider}/#{url_encode(slug)}"
if url_encode(vcs_id.to_s).match(%r{[^/]+%2[fF][^/]+})
"repo/#{provider}/#{url_encode(vcs_id)}"
else
"repo_vcs/#{provider}/#{url_encode(vcs_id.to_s)}"
end
end

def get(path, opts)
resp = client(opts).get(path, only(opts, :representation))
map(Oj.load(resp.body) || {})
rescue Error => e
api_error('Travis CI', :repo, slug, e)
api_error('Travis CI', :repo, vcs_id, e)
end

def map(attrs)
{
id: attrs['id'],
vcs_type: attrs['vcs_type'],
vcs_id: attrs['vcs_id'],
github_id: attrs['github_id'],
slug: attrs['slug'],
private: attrs['private'],
Expand Down
5 changes: 3 additions & 2 deletions spec/support/webmock.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ def stub_content(id, path, data)
stub_request(:get, url).to_return(body: body, status: status)
end

def stub_repo(slug, data = {}, provider = 'github')
url = "https://api.travis-ci.com/repo/#{provider}/#{slug.sub('/', '%2F')}"
def stub_repo(vcs_id, slug, data: {}, provider: 'github', by_slug: false)
url = by_slug ? "https://api.travis-ci.com/repo/#{provider}/#{CGI.escape(slug)}" : "https://api.travis-ci.com/repo_vcs/#{provider}/#{vcs_id}"
url = "#{url}?representation=internal" if data[:internal]

body = data[:body] && JSON.dump(data[:body].merge(
slug: slug,
vcs_id: vcs_id,
id: data[:id] || 1,
default_branch: { name: data[:body][:default_branch] },
user_settings: { settings: data[:body].delete(:config_imports) ? [name: 'allow_config_imports', value: true] : [] }
Expand Down
4 changes: 2 additions & 2 deletions spec/travis/yml/configs/allow_failures_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
describe Travis::Yml::Configs, 'allow_failures' do
let(:repo) { { id: 1, github_id: 1, slug: 'travis-ci/travis-yml', private: false, default_branch: 'master', token: 'repo-token', private_key: 'key', allow_config_imports: true } }
let(:repo) { { id: 1, github_id: 1, vcs_id: 1, slug: 'travis-ci/travis-yml', private: false, default_branch: 'master', token: 'repo-token', private_key: 'key', allow_config_imports: true } }
let(:data) { {} }
let(:configs) { described_class.new(repo, 'ref', nil, data, {}) }

before { stub_repo(repo[:slug], token: 'user-token') } # authorization
before { stub_repo(repo[:vcs_id], repo[:slug], data: { token: 'user-token' }) } # authorization
before { stub_content(repo[:id], '.travis.yml', yaml) }

subject { configs.tap(&:load).jobs }
Expand Down
4 changes: 2 additions & 2 deletions spec/travis/yml/configs/conditionals_spec.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
describe Travis::Yml::Configs, 'conditionals' do
let(:repo) { { id: 1, github_id: 1, slug: 'travis-ci/travis-yml' } }
let(:repo) { { id: 1, github_id: 1, vcs_id: 1, slug: 'travis-ci/travis-yml' } }
let(:configs) { described_class.new(repo, 'master', nil, data, opts).tap(&:load) }
let(:data) { { branch: 'master', env: [{ SETTING: 'on' }] } }

Expand All @@ -8,7 +8,7 @@
let(:stages) { configs.stages }
let(:msgs) { configs.msgs.to_a }

before { stub_repo(repo[:slug], internal: true, body: repo.merge(token: 'token')) }
before { stub_repo(repo[:vcs_id], repo[:slug], data: { internal: true, body: repo.merge(token: 'token') }) }
before { stub_content(repo[:id], '.travis.yml', yaml) }

describe 'jobs' do
Expand Down
24 changes: 12 additions & 12 deletions spec/travis/yml/configs/import_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
let(:user_token) { 'user-token' }
let(:private) { false }
let(:imports) { true }
let(:repo) { { id: 1, github_id: 1, slug: 'travis-ci/travis-yml', private: private, default_branch: 'master', token: repo_token, private_key: private_key, allow_config_imports: imports } }
let(:repo) { { id: 1, github_id: 1, vcs_id: 1, slug: 'travis-ci/travis-yml', private: private, default_branch: 'master', token: repo_token, private_key: private_key, allow_config_imports: imports } }
let(:ref) { 'ref' }
let(:api) { nil }
let(:data) { nil }
Expand All @@ -20,7 +20,7 @@
let(:one_yml) { 'script: ./one' }
let(:two_yml) { 'script: ./two' }

before { stub_repo(repo[:slug], token: user_token) } # authorization
before { stub_repo(repo[:vcs_id], repo[:slug], data: { token: user_token }) } # authorization
before { stub_content(repo[:id], '.travis.yml', travis_yml) }
before { stub_content(repo[:id], 'one/one.yml', one_yml) }
before { stub_content(repo[:id], 'one/two.yml', two_yml) }
Expand All @@ -34,8 +34,8 @@ def self.imports(sources)
end

describe 'push' do
let(:repo_url) { "repo/github/#{repo[:slug].sub('/', '%2F')}?representation=internal" }
let(:auth_url) { "repo/github/#{repo[:slug].sub('/', '%2F')}" }
let(:repo_url) { "repo_vcs/github/#{repo[:vcs_id]}?representation=internal" }
let(:auth_url) { "repo_vcs/github/#{repo[:vcs_id]}" }

describe 'given a repo token' do
imports %w(
Expand All @@ -48,14 +48,14 @@ def self.imports(sources)
describe 'not given a repo token on a public repo' do
let(:repo_token) { nil }
let(:private) { false }
before { stub_repo(repo[:slug], internal: true, body: repo.merge(token: repo_token)) }
before { stub_repo(repo[:vcs_id], repo[:slug], data: { internal: true, body: repo.merge(token: repo_token) }) }
it { expect { subject }.to_not have_api_request :get, repo_url }
end

describe 'not given a repo token on a private repo' do
let(:repo_token) { nil }
let(:private) { true }
before { stub_repo(repo[:slug], internal: true, body: repo.merge(token: repo_token)) }
before { stub_repo(repo[:vcs_id], repo[:slug], data: { internal: true, body: repo.merge(token: repo_token) }) }
it { expect { subject }.to have_api_request :get, repo_url }
end
end
Expand Down Expand Up @@ -145,7 +145,7 @@ def self.imports(sources)
describe 'remote import' do
let(:travis_yml) { 'import: other/other:one.yml' }

before { stub_repo('other/other', internal: true, body: { id: 2, github_id: 2, private: false, default_branch: 'default' }) }
before { stub_repo(2, 'other/other', data: { internal: true, body: { id: 2, github_id: 2, vcs_id: 2, private: false, default_branch: 'default' } }, by_slug: true) }
before { stub_content(2, 'one.yml', one_yml) }
before { stub_content(2, 'two.yml', one_yml) }

Expand Down Expand Up @@ -184,7 +184,7 @@ def self.imports(sources)
let(:travis_yml) { 'import: other/other:one/one.yml' }
let(:one_yml) { 'import: ./two.yml' }

before { stub_repo('other/other', internal: true, body: { id: 2, github_id: 2, default_branch: 'default' }) }
before { stub_repo(2, 'other/other', data: { internal: true, body: { id: 2, github_id: 2, vcs_id: 2, default_branch: 'default' } }, by_slug: true) }
before { stub_content(2, 'one/one.yml', one_yml) }
before { stub_content(2, 'one/two.yml', two_yml) }

Expand Down Expand Up @@ -240,8 +240,8 @@ def self.imports(sources)
let(:repo) { { id: 1, slug: 'travis-ci/travis-yml', private: visibilities[0] == :private, token: repo_token, private_key: private_key, allow_config_imports: imports } }
let(:travis_yml) { "import: #{other}:one.yml" }

before { stub_repo(repo[:slug], internal: true, body: repo.merge(token: repo_token)) }
before { stub_repo(other, internal: true, body: { id: 2, github_id: 2, slug: other, private: visibilities[1] == :private, config_imports: setting }) }
before { stub_repo(repo[:vcs_id], repo[:slug], data: { internal: true, body: repo.merge(token: repo_token) }) }
before { stub_repo(2, other, data: { internal: true, body: { id: 2, github_id: 2, vcs_id: 2, slug: other, private: visibilities[1] == :private, config_imports: setting } }, by_slug: true) }
before { stub_content(2, 'one.yml', one_yml) }

describe 'a public repo referencing a public repo' do
Expand Down Expand Up @@ -372,7 +372,7 @@ def self.imports(sources)
end

describe 'import order is depth first' do
let(:repo) { { id: 1, github_id: 1, slug: 'owner/repo', token: repo_token, private: true } }
let(:repo) { { id: 1, github_id: 1, vcs_id: 1, slug: 'owner/repo', token: repo_token, private: true } }
let(:travis_yml) { 'import: [.travis.yml, 1.yml]' }
let(:y1) { 'import: [2.yml, 5.yml, 6.yml]' }
let(:y2) { 'import: [3.yml]' }
Expand All @@ -381,7 +381,7 @@ def self.imports(sources)
let(:y5) { 'script: ./5' }
let(:y6) { 'script: ./6' }

before { stub_repo(repo[:slug], internal: true, body: repo) }
before { stub_repo(repo[:vcs_id], repo[:slug], data: { internal: true, body: repo }) }
before { stub_content(repo[:id], '.travis.yml', travis_yml) }
before { 1.upto(6) { |i| stub_content(repo[:id], "#{i}.yml", send(:"y#{i}")) } }

Expand Down
4 changes: 2 additions & 2 deletions spec/travis/yml/configs/msgs_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
describe Travis::Yml::Configs, 'msgs' do
let(:repo) { { id: 1, github_id: 1, slug: 'travis-ci/travis-yml' } }
let(:repo) { { id: 1, github_id: 1, vcs_id: 1, slug: 'travis-ci/travis-yml' } }

before { stub_repo(repo[:slug], internal: true, body: repo.merge(token: 'token')) }
before { stub_repo(repo[:vcs_id], repo[:slug], data: { internal: true, body: repo.merge(token: 'token') }) }
before { stub_content(repo[:id], '.travis.yml', yaml) }

subject { described_class.new(repo, 'master', nil, {}, opts).tap(&:load) }
Expand Down
Loading

0 comments on commit d71a340

Please sign in to comment.