cyclid 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 52003b67cb59f27d6ef7bea410f715d6b8714c33
4
- data.tar.gz: 08e3f06342e7ac69bc8917dd17d47c1ba72aec65
3
+ metadata.gz: eff5a90aeccc36b649701ec2ec970f4dc1c11e9d
4
+ data.tar.gz: 103987b807c2b04930a68d96787d64cb3864b359
5
5
  SHA512:
6
- metadata.gz: 400fc554727abcbdfcdd65ca57005ea912e7b725d6568d972cdcb07f0c9bea30c4c90feee27660f00f9fa9d54cb607d9d471f3895c4433593cef1174526dbd34
7
- data.tar.gz: 172919cb2f58442730393e9c6c6cce91423c25dabeeec13641925304374d84ed55fd6c9247895cc0b05be85cef3286c5f84edb031b52111c2d6bc62b5d1901a5
6
+ metadata.gz: 802e3bce3fdd10e988997c282f635dda5cb81715bf6e0c6755bfc32ef1ef5491a424caa8d0cd1b03fee9befe18a5cd825e5ad053725b726070322e5d03dc19f4
7
+ data.tar.gz: 2562e60cf0591decaba4bb01ac515072695b3834cfd3c18c6589794655ea9cf0451d575bbbc006ae3f160d5a9e2fc6504ad2fa2b7c209fe528d9e54943518fda
@@ -233,6 +233,8 @@ module Cyclid
233
233
  hash = {}
234
234
  hash[:job_id] = job_record.id
235
235
  hash[:status] = job_record.status
236
+ hash[:started] = job_record.started if job_record.started
237
+ hash[:ended] = job_record.ended if job_record.ended
236
238
 
237
239
  return hash.to_json
238
240
  end
@@ -237,13 +237,22 @@ module Cyclid
237
237
  # Find and create a suitable source plugin instance for each source and have it check out
238
238
  # the given source using the transport.
239
239
  def checkout_sources(transport, ctx, sources)
240
+ # Group each entry by type
241
+ groups = {}
240
242
  sources.each do |job_source|
241
243
  raise 'no type given in source definition' unless job_source.key? :type
242
244
 
243
- source = Cyclid.plugins.find(job_source[:type], Cyclid::API::Plugins::Source)
244
- raise "can't find a plugin for #{job_source[:type]} source" if source.nil?
245
+ type = job_source[:type]
246
+ groups[type] = [] unless groups.key? type
247
+ groups[type] << job_source
248
+ end
249
+
250
+ # Find the appropriate plugin for each type and pass it the list of repositories
251
+ groups.each do |group, group_sources|
252
+ plugin = Cyclid.plugins.find(group, Cyclid::API::Plugins::Source)
253
+ raise "can't find a plugin for #{group} source" if plugin.nil?
245
254
 
246
- success = source.new.checkout(transport, ctx, job_source)
255
+ success = plugin.new.checkout(transport, ctx, group_sources)
247
256
  raise 'failed to check out source' unless success
248
257
  end
249
258
  end
@@ -28,7 +28,7 @@ module Cyclid
28
28
 
29
29
  # Process the source to produce a copy of the remote code in a
30
30
  # directory in the working directory
31
- def checkout(_transport, _ctx, _source = {})
31
+ def checkout(_transport, _ctx, _sources = [])
32
32
  false
33
33
  end
34
34
  end
@@ -23,41 +23,100 @@ module Cyclid
23
23
  class Git < Source
24
24
  # Run commands via. the transport to check out a given Git remote
25
25
  # repository
26
- def checkout(transport, ctx, source = {})
27
- source.symbolize_keys!
26
+ def checkout(transport, ctx, sources = [])
27
+ normalized_sources = normalize_and_dedup(sources)
28
+ normalized_sources.each do |source|
29
+ source.symbolize_keys!
28
30
 
29
- raise 'invalid git source definition' \
30
- unless source.key? :url
31
+ raise 'invalid git source definition' \
32
+ unless source.key? :url
31
33
 
32
- # Add any context data (which could include secrets)
33
- source = source.interpolate(ctx)
34
+ # Add any context data (which could include secrets)
35
+ source = source.interpolate(ctx)
34
36
 
35
- url = URI(source[:url])
37
+ url = URI(source[:url])
36
38
 
37
- # If the source includes an OAuth token, add it to the URL as the
38
- # username
39
- url.user = source[:token] if source.key? :token
39
+ # If the source includes an OAuth token, add it to the URL as the
40
+ # username
41
+ url.user = source[:token] if source.key? :token
40
42
 
41
- success = transport.exec "git clone #{url}"
42
- return false unless success
43
+ success = transport.exec "git clone #{url}"
44
+ return false unless success
45
+
46
+ # If a branch was given, check it out
47
+ next unless source.key? :branch
43
48
 
44
- # If a branch was given, check it out
45
- if source.key? :branch
46
49
  branch = source[:branch]
47
50
 
48
51
  match = url.path.match(%r{^.*\/(\w*)})
49
52
  source_dir = "#{ctx[:workspace]}/#{match[1]}"
50
53
 
51
54
  success = transport.exec("git fetch origin #{branch}:#{branch}", source_dir)
52
- success = transport.exec("git checkout #{branch}", source_dir) \
53
- unless success == false
55
+ return false unless success
56
+
57
+ success = transport.exec("git checkout #{branch}", source_dir)
58
+ return false unless success
54
59
  end
55
60
 
56
- return success
61
+ return true
57
62
  end
58
63
 
59
64
  # Register this plugin
60
65
  register_plugin 'git'
66
+
67
+ private
68
+
69
+ # Remove any duplicate source definitions:
70
+ #
71
+ # 1. Normalize the source URLs
72
+ # 2. Find all of the definitions for a given URL and merge them
73
+ def normalize_and_dedup(sources)
74
+ normalized_sources = normalize(sources)
75
+ Cyclid.logger.debug "normalized_sources=#{normalized_sources}"
76
+ deduped_sources = dedup(normalized_sources)
77
+ Cyclid.logger.debug("deduped_sources=#{deduped_sources}")
78
+
79
+ return deduped_sources
80
+ end
81
+
82
+ # Standardise the Git URLs. Git urls can be of the form:
83
+ #
84
+ # git://github.com/user/project.git#commit-ish
85
+ # git+ssh://user@hostname:project.git#commit-ish
86
+ # git+ssh://user@hostname/project.git#commit-ish
87
+ # git+http://user@hostname/project/blah.git#commit-ish
88
+ # git+https://user@hostname/project/blah.git#commit-ish
89
+ #
90
+ # 1. We won't support SSH; HTTP(s) only
91
+ # 2. Extract the user and treat it as the token parameter
92
+ # 3. Extract the fragment and treat it as the branch parameter
93
+ #
94
+ # So:
95
+ #
96
+ # http[s]://[user@]hostname/project/blah.git[#commit-ish]
97
+ #
98
+ def normalize(sources)
99
+ normalized = sources.map do |source|
100
+ uri = URI.parse(source[:url])
101
+ next unless uri.scheme =~ /\Ahttps?\z/
102
+
103
+ s = {}
104
+ s[:url] = "#{uri.scheme}://#{uri.host}#{uri.path.gsub(/.git$/, '')}"
105
+ s[:token] = uri.user if uri.user
106
+ s[:branch] = uri.fragment if uri.fragment
107
+ source.merge(s)
108
+ end
109
+ normalized.compact
110
+ end
111
+
112
+ # Merge any duplicate source definitions
113
+ def dedup(sources)
114
+ merged = sources.map do |source|
115
+ all = sources.select { |el| el[:url] == source[:url] }
116
+ all.inject(&:merge)
117
+ end
118
+ merged.uniq
119
+ end
61
120
  end
62
121
  end
63
122
  end
data/app/db.rb CHANGED
@@ -19,20 +19,20 @@ require 'logger'
19
19
  begin
20
20
  case ENV['RACK_ENV']
21
21
  when 'development'
22
- database = if defined? Cyclid
23
- Cyclid.config.database
24
- else
22
+ database = if defined? Rake
25
23
  'sqlite3:development.db'
24
+ else
25
+ Cyclid.config.database
26
26
  end
27
27
 
28
28
  ActiveRecord::Base.establish_connection(
29
29
  database
30
30
  )
31
31
 
32
- ActiveRecord::Base.logger = if defined? Cyclid
33
- Cyclid.logger
34
- else
32
+ ActiveRecord::Base.logger = if defined? Rake
35
33
  Logger.new(STDERR)
34
+ else
35
+ Cyclid.logger
36
36
  end
37
37
  when 'production'
38
38
  ActiveRecord::Base.establish_connection(
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ module Cyclid
3
+ module Api
4
+ VERSION = '0.2.1'
5
+ end
6
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyclid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kristian Van Der Vliet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-20 00:00:00.000000000 Z
11
+ date: 2016-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -380,6 +380,7 @@ files:
380
380
  - bin/cyclid-db-init
381
381
  - db/schema.rb
382
382
  - lib/cyclid/app.rb
383
+ - lib/cyclid/version.rb
383
384
  homepage: https://cyclid.io
384
385
  licenses:
385
386
  - Apache-2.0