git_duplicator 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +94 -16
- data/lib/git_duplicator.rb +9 -3
- data/lib/git_duplicator/{duplicator.rb → duplicator/duplicator.rb} +16 -13
- data/lib/git_duplicator/duplicator/mirror_duplicator.rb +18 -0
- data/lib/git_duplicator/duplicator/update_duplicator.rb +17 -0
- data/lib/git_duplicator/duplicators.rb +5 -0
- data/lib/git_duplicator/errors.rb +4 -0
- data/lib/git_duplicator/repositories.rb +1 -0
- data/lib/git_duplicator/repository/repository.rb +86 -10
- data/lib/git_duplicator/repository/service_repository.rb +3 -2
- data/lib/git_duplicator/services/bitbucket.rb +18 -17
- data/lib/git_duplicator/services/github.rb +15 -16
- data/lib/git_duplicator/version.rb +2 -2
- data/spec/git_duplicator/duplicator/duplicator_spec.rb +112 -0
- data/spec/git_duplicator/duplicator/mirror_duplicator_spec.rb +35 -0
- data/spec/git_duplicator/duplicator/update_duplicator_spec.rb +39 -0
- data/spec/git_duplicator/git_duplicator_acceptance_spec.rb +188 -0
- data/spec/git_duplicator/git_duplicator_spec.rb +22 -92
- data/spec/git_duplicator/helpers/authorization_header_spec.rb +29 -0
- data/spec/git_duplicator/repository/repository_spec.rb +81 -33
- data/spec/git_duplicator/repository/service_repository_spec.rb +17 -15
- data/spec/git_duplicator/services/bitbucket_spec.rb +48 -44
- data/spec/git_duplicator/services/github_spec.rb +50 -44
- metadata +11 -4
- data/spec/git_duplicator/duplicator_spec.rb +0 -82
@@ -1,26 +1,25 @@
|
|
1
1
|
require 'http'
|
2
|
-
require_relative '../helpers/authorization_header'
|
3
|
-
|
4
2
|
module GitDuplicator
|
5
3
|
module Services
|
6
4
|
class GithubRepository < ServiceRepository
|
7
5
|
BASE_URI = 'https://api.github.com'
|
8
6
|
|
9
|
-
attr_accessor :credentials, :
|
7
|
+
attr_accessor :credentials, :remote_options, :working_directory
|
10
8
|
|
11
9
|
# Initializer
|
12
|
-
# @param [
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# @
|
19
|
-
#
|
20
|
-
def initialize(name, owner,
|
21
|
-
|
22
|
-
self.
|
23
|
-
self.
|
10
|
+
# @param [Hash] options
|
11
|
+
# * :credentials (Hash) credentials for remote service
|
12
|
+
# * :oauth2_token (Symbol) used in oAuth2 authentication
|
13
|
+
# * :username (Symbol) used in basic authentication
|
14
|
+
# * :password (Symbol) used in basic authentication
|
15
|
+
# * :remote_options (Hash) creation options for remote service
|
16
|
+
# @see @see https://developer.github.com/v3/repos/#create
|
17
|
+
# * :working_directory (String) assing a working directory
|
18
|
+
def initialize(name, owner, options = {})
|
19
|
+
self.credentials = options.fetch(:credentials) { {} }
|
20
|
+
self.remote_options = options.fetch(:remote_options) { {} }
|
21
|
+
self.working_directory = options.fetch(:working_directory) { nil }
|
22
|
+
super(name, owner, working_directory)
|
24
23
|
end
|
25
24
|
|
26
25
|
# URL of the repositroy
|
@@ -33,7 +32,7 @@ module GitDuplicator
|
|
33
32
|
def create
|
34
33
|
request_url = BASE_URI + '/user/repos'
|
35
34
|
response = HTTP.with(headers(:post, request_url))
|
36
|
-
.post(request_url, json:
|
35
|
+
.post(request_url, json: remote_options.merge(name: name))
|
37
36
|
code, body = response.code.to_i, response.body
|
38
37
|
fail(RepositoryCreationError, body) unless 201 == code
|
39
38
|
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require_relative '../../helper'
|
2
|
+
|
3
|
+
module GitDuplicator
|
4
|
+
|
5
|
+
describe Duplicator do
|
6
|
+
let(:path) { '/somepath' }
|
7
|
+
let(:from) do
|
8
|
+
double(name: 'somename', bare_clone: nil, mirror: nil, url: 'somewhere1')
|
9
|
+
end
|
10
|
+
let(:to) { double(delete: nil, create: nil, url: 'somewhere2') }
|
11
|
+
let(:duplicator) { described_class.new(from, to, options) }
|
12
|
+
|
13
|
+
describe '#perform_mirror' do
|
14
|
+
let(:options) { {} }
|
15
|
+
it 'raises an exception in case of not defined' do
|
16
|
+
expect { duplicator.perform_mirror }
|
17
|
+
.to raise_error(NotImplementedError)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#perform_clone_source' do
|
22
|
+
let(:options) { {} }
|
23
|
+
it 'raises an exception in case of not defined' do
|
24
|
+
expect { duplicator.perform_clone_source }
|
25
|
+
.to raise_error(NotImplementedError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#perform_clean_up' do
|
30
|
+
let(:options) { {} }
|
31
|
+
it 'raises an exception in case of not defined' do
|
32
|
+
expect { duplicator.perform_clean_up }
|
33
|
+
.to raise_error(NotImplementedError)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#perform' do
|
38
|
+
before do
|
39
|
+
allow(duplicator).to receive(:perform_clone_source)
|
40
|
+
allow(duplicator).to receive(:perform_mirror)
|
41
|
+
allow(duplicator).to receive(:perform_clean_up)
|
42
|
+
end
|
43
|
+
context 'force_create_destination is set' do
|
44
|
+
let(:options) { { clone_path: path, force_create_destination: true } }
|
45
|
+
|
46
|
+
it 'deletes existing destination repo' do
|
47
|
+
expect(to).to receive(:delete)
|
48
|
+
duplicator.perform
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'creates the destination repo' do
|
52
|
+
expect(to).to receive(:create)
|
53
|
+
duplicator.perform
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'clones the source repo' do
|
57
|
+
expect(duplicator).to receive(:clone_source)
|
58
|
+
duplicator.perform
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'mirrors to destination' do
|
62
|
+
expect(duplicator).to receive(:mirror)
|
63
|
+
duplicator.perform
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'cleans up' do
|
67
|
+
expect(duplicator).to receive(:clean_up)
|
68
|
+
duplicator.perform
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'logs 5 times' do
|
72
|
+
expect(duplicator.logger).to receive(:info).exactly(5).times
|
73
|
+
duplicator.perform
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'force_create_destination is false' do
|
78
|
+
let(:options) { { clone_path: path } }
|
79
|
+
|
80
|
+
it 'deletes existing destination repo' do
|
81
|
+
expect(to).not_to receive(:delete)
|
82
|
+
duplicator.perform
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'creates the destination repo' do
|
86
|
+
expect(to).not_to receive(:create)
|
87
|
+
duplicator.perform
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'clones the source repo' do
|
91
|
+
expect(duplicator).to receive(:clone_source)
|
92
|
+
duplicator.perform
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'mirrors to destination' do
|
96
|
+
expect(duplicator).to receive(:mirror)
|
97
|
+
duplicator.perform
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'cleans up' do
|
101
|
+
expect(duplicator).to receive(:clean_up)
|
102
|
+
duplicator.perform
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'logs 3 times' do
|
106
|
+
expect(duplicator.logger).to receive(:info).exactly(3).times
|
107
|
+
duplicator.perform
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative '../../helper'
|
2
|
+
|
3
|
+
module GitDuplicator
|
4
|
+
describe MirrorDuplicator do
|
5
|
+
let(:path) { '/somepath' }
|
6
|
+
let(:from) do
|
7
|
+
double(name: 'somename', bare_clone: nil, mirror: nil, url: 'somewhere1')
|
8
|
+
end
|
9
|
+
let(:options) { { clone_path: path, force_create_destination: true } }
|
10
|
+
let(:to) { double(delete: nil, create: nil, url: 'somewhere2') }
|
11
|
+
let(:duplicator) { described_class.new(from, to, options) }
|
12
|
+
|
13
|
+
describe '#clone_source' do
|
14
|
+
it 'bare clones the source repo' do
|
15
|
+
expect(from).to receive(:bare_clone).with(path)
|
16
|
+
duplicator.perform
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#mirror' do
|
21
|
+
it 'mirrors from bare clone to destination' do
|
22
|
+
expect(from).to receive(:mirror).with(to.url)
|
23
|
+
duplicator.perform
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#clean_up' do
|
28
|
+
it 'mirrors from bare clone to destination' do
|
29
|
+
expect(FileUtils).to receive(:rm_rf)
|
30
|
+
.with("#{duplicator.clone_path}/#{from.name}")
|
31
|
+
duplicator.perform
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative '../../helper'
|
2
|
+
|
3
|
+
module GitDuplicator
|
4
|
+
describe UpdateDuplicator do
|
5
|
+
let(:path) { '/somepath' }
|
6
|
+
let(:from) do
|
7
|
+
double(name: 'somename', mirror_clone: nil, set_mirrored_remote: nil,
|
8
|
+
update_mirrored: nil, url: 'somewhere1')
|
9
|
+
end
|
10
|
+
let(:options) { { clone_path: path, force_create_destination: true } }
|
11
|
+
let(:to) { double(delete: nil, create: nil, url: 'somewhere2') }
|
12
|
+
let(:duplicator) { described_class.new(from, to, options) }
|
13
|
+
|
14
|
+
describe '#clone_source' do
|
15
|
+
it 'bare clones the source repo' do
|
16
|
+
expect(from).to receive(:mirror_clone).with(path)
|
17
|
+
duplicator.perform
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#mirror' do
|
22
|
+
it 'sets the remote for push' do
|
23
|
+
expect(from).to receive(:set_mirrored_remote).with(to.url)
|
24
|
+
duplicator.perform
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'mirrors from mirror clone to destination' do
|
28
|
+
expect(from).to receive(:update_mirrored)
|
29
|
+
duplicator.perform
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#clean_up' do
|
34
|
+
it 'mirrors from bare clone to destination' do
|
35
|
+
expect(duplicator.perform).to be_nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
|
3
|
+
def random_name
|
4
|
+
rand(36**5).to_s(36)
|
5
|
+
end
|
6
|
+
|
7
|
+
describe GitDuplicator do
|
8
|
+
before(:each) { WebMock.allow_net_connect! }
|
9
|
+
let(:clone_path) { '/tmp' }
|
10
|
+
let(:credentials) do
|
11
|
+
{ consumer_key: ENV['BITBUCKET_CONSUMER_KEY'],
|
12
|
+
consumer_secret: ENV['BITBUCKET_CONSUMER_SECRET'],
|
13
|
+
token: ENV['BITBUCKET_TOKEN'],
|
14
|
+
token_secret: ENV['BITBUCKET_TOKEN_SECRET'] }
|
15
|
+
end
|
16
|
+
let(:options) { { credentials: credentials } }
|
17
|
+
|
18
|
+
describe '#perform' do
|
19
|
+
it 'mirrors from service to service without ' \
|
20
|
+
'force_create_destination option' do
|
21
|
+
skip
|
22
|
+
# Setup
|
23
|
+
from = GitDuplicator::Services::GithubRepository
|
24
|
+
.new('naught', 'avdi')
|
25
|
+
to = GitDuplicator::Services::BitbucketRepository
|
26
|
+
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], options)
|
27
|
+
to.create
|
28
|
+
GitDuplicator.perform(from, to, clone_path: clone_path)
|
29
|
+
source_name = random_name
|
30
|
+
mirrored_name = random_name
|
31
|
+
|
32
|
+
# Exercise
|
33
|
+
source = Git.clone(from.url, source_name, path: clone_path)
|
34
|
+
mirrored = Git.clone(to.url, mirrored_name, path: clone_path)
|
35
|
+
|
36
|
+
# Verify
|
37
|
+
expect(mirrored.object('HEAD^').to_s).to eq(source.object('HEAD^').to_s)
|
38
|
+
|
39
|
+
# Teardown
|
40
|
+
FileUtils.rm_rf("#{clone_path}/#{source_name}")
|
41
|
+
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
42
|
+
to.delete
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'mirrors from service to service with ' \
|
46
|
+
'force_create_destination option' do
|
47
|
+
skip
|
48
|
+
# Setup
|
49
|
+
from = GitDuplicator::Services::GithubRepository
|
50
|
+
.new('naught', 'avdi')
|
51
|
+
to = GitDuplicator::Services::BitbucketRepository
|
52
|
+
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], options)
|
53
|
+
GitDuplicator.perform(from, to,
|
54
|
+
clone_path: clone_path,
|
55
|
+
force_create_destination: true)
|
56
|
+
source_name = random_name
|
57
|
+
mirrored_name = random_name
|
58
|
+
|
59
|
+
# Exercise
|
60
|
+
source = Git.clone(from.url, source_name, path: clone_path)
|
61
|
+
mirrored = Git.clone(to.url, mirrored_name, path: clone_path)
|
62
|
+
|
63
|
+
# Verify
|
64
|
+
expect(mirrored.object('HEAD^').to_s).to eq(source.object('HEAD^').to_s)
|
65
|
+
|
66
|
+
# Teardown
|
67
|
+
FileUtils.rm_rf("#{clone_path}/#{source_name}")
|
68
|
+
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
69
|
+
to.delete
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'mirrors from basic to service with ' \
|
73
|
+
'force_create_destination option' do
|
74
|
+
skip
|
75
|
+
# Setup
|
76
|
+
from = GitDuplicator::Repository
|
77
|
+
.new('naught', 'https://github.com/avdi/naught.git')
|
78
|
+
to = GitDuplicator::Services::BitbucketRepository
|
79
|
+
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], options)
|
80
|
+
GitDuplicator.perform(from, to,
|
81
|
+
clone_path: clone_path,
|
82
|
+
force_create_destination: true)
|
83
|
+
source_name = random_name
|
84
|
+
mirrored_name = random_name
|
85
|
+
|
86
|
+
# Exercise
|
87
|
+
source = Git.clone(from.url, source_name, path: clone_path)
|
88
|
+
mirrored = Git.clone(to.url, mirrored_name, path: clone_path)
|
89
|
+
|
90
|
+
# Verify
|
91
|
+
expect(mirrored.object('HEAD^').to_s).to eq(source.object('HEAD^').to_s)
|
92
|
+
|
93
|
+
# Teardown
|
94
|
+
FileUtils.rm_rf("#{clone_path}/#{source_name}")
|
95
|
+
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
96
|
+
to.delete
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#perform_for_updates' do
|
101
|
+
it 'mirrors from service to service without ' \
|
102
|
+
'force_create_destination option' do
|
103
|
+
skip
|
104
|
+
# Setup
|
105
|
+
from = GitDuplicator::Services::GithubRepository
|
106
|
+
.new('naught', 'avdi')
|
107
|
+
to = GitDuplicator::Services::BitbucketRepository
|
108
|
+
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], options)
|
109
|
+
to.create
|
110
|
+
GitDuplicator.perform_for_update(from, to, clone_path: clone_path)
|
111
|
+
source_name = from.name
|
112
|
+
mirrored_name = random_name
|
113
|
+
|
114
|
+
# Exercise
|
115
|
+
source = Git.bare("#{clone_path}/#{source_name}")
|
116
|
+
mirrored = Git.clone(to.url, mirrored_name, path: clone_path)
|
117
|
+
|
118
|
+
# Verify
|
119
|
+
expect(mirrored.object('HEAD^').to_s).to eq(source.object('HEAD^').to_s)
|
120
|
+
|
121
|
+
# Teardown
|
122
|
+
FileUtils.rm_rf("#{clone_path}/#{source_name}")
|
123
|
+
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
124
|
+
to.delete
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'mirrors from service to service with ' \
|
128
|
+
'force_create_destination option' do
|
129
|
+
skip
|
130
|
+
# Setup
|
131
|
+
from = GitDuplicator::Services::GithubRepository
|
132
|
+
.new('naught', 'avdi')
|
133
|
+
to = GitDuplicator::Services::BitbucketRepository
|
134
|
+
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], options)
|
135
|
+
GitDuplicator.perform_for_update(from, to,
|
136
|
+
clone_path: clone_path,
|
137
|
+
force_create_destination: true)
|
138
|
+
source_name = from.name
|
139
|
+
mirrored_name = random_name
|
140
|
+
|
141
|
+
# Exercise
|
142
|
+
source = Git.bare("#{clone_path}/#{source_name}")
|
143
|
+
mirrored = Git.clone(to.url, mirrored_name, path: clone_path)
|
144
|
+
|
145
|
+
# Verify
|
146
|
+
expect(mirrored.object('HEAD^').to_s).to eq(source.object('HEAD^').to_s)
|
147
|
+
|
148
|
+
# Teardown
|
149
|
+
FileUtils.rm_rf("#{clone_path}/#{source_name}")
|
150
|
+
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
151
|
+
to.delete
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'mirrors from basic to service with ' \
|
155
|
+
'force_create_destination option' do
|
156
|
+
skip
|
157
|
+
# Setup
|
158
|
+
from = GitDuplicator::Repository
|
159
|
+
.new('naught', 'https://github.com/avdi/naught.git')
|
160
|
+
to = GitDuplicator::Services::BitbucketRepository
|
161
|
+
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], options)
|
162
|
+
GitDuplicator.perform_for_update(from, to,
|
163
|
+
clone_path: clone_path,
|
164
|
+
force_create_destination: true)
|
165
|
+
source_name = from.name
|
166
|
+
mirrored_name = random_name
|
167
|
+
|
168
|
+
# Exercise
|
169
|
+
source = Git.bare("#{clone_path}/#{source_name}")
|
170
|
+
mirrored = Git.clone(to.url, mirrored_name, path: clone_path)
|
171
|
+
|
172
|
+
# Verify
|
173
|
+
expect(mirrored.object('HEAD^').to_s).to eq(source.object('HEAD^').to_s)
|
174
|
+
|
175
|
+
local_repo = GitDuplicator::Repository.new(
|
176
|
+
'naught',
|
177
|
+
'https://github.com/avdi/naught.git',
|
178
|
+
"#{clone_path}/#{source_name}"
|
179
|
+
)
|
180
|
+
local_repo.update_mirrored
|
181
|
+
|
182
|
+
#Teardown
|
183
|
+
FileUtils.rm_rf("#{clone_path}/#{source_name}")
|
184
|
+
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
185
|
+
to.delete
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -1,102 +1,32 @@
|
|
1
1
|
require_relative '../helper'
|
2
2
|
|
3
|
-
def random_name
|
4
|
-
rand(36**5).to_s(36)
|
5
|
-
end
|
6
|
-
|
7
3
|
describe GitDuplicator do
|
8
|
-
before(:each) { WebMock.allow_net_connect! }
|
9
4
|
let(:clone_path) { '/tmp' }
|
10
|
-
|
5
|
+
let(:credentials) do
|
6
|
+
{ consumer_key: ENV['BITBUCKET_CONSUMER_KEY'],
|
7
|
+
consumer_secret: ENV['BITBUCKET_CONSUMER_SECRET'],
|
8
|
+
token: ENV['BITBUCKET_TOKEN'],
|
9
|
+
token_secret: ENV['BITBUCKET_TOKEN_SECRET'] }
|
10
|
+
end
|
11
|
+
let(:options) { { clone_path: clone_path } }
|
12
|
+
let(:from) { GitDuplicator::Repository }
|
13
|
+
let(:to) { GitDuplicator::Repository }
|
14
|
+
let(:result) { double(perform: nil) }
|
11
15
|
describe '#perform' do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
token_secret: ENV['BITBUCKET_TOKEN_SECRET'] }
|
16
|
+
it 'delegates to MirrorDuplicator' do
|
17
|
+
expect(GitDuplicator::MirrorDuplicator)
|
18
|
+
.to receive(:new).with(from, to, options).and_return(result)
|
19
|
+
expect(result).to receive(:perform)
|
20
|
+
GitDuplicator.perform(from, to, options)
|
18
21
|
end
|
22
|
+
end
|
19
23
|
|
20
|
-
|
21
|
-
'
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
.
|
26
|
-
to = GitDuplicator::Services::BitbucketRepository
|
27
|
-
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], credentials)
|
28
|
-
to.create
|
29
|
-
GitDuplicator.perform(from, to, clone_path: clone_path)
|
30
|
-
mirrored_name = random_name
|
31
|
-
result_name = random_name
|
32
|
-
|
33
|
-
# Exercise
|
34
|
-
mirrored = Git.clone(from.url, mirrored_name, path: clone_path)
|
35
|
-
result = Git.clone(from.url, result_name, path: clone_path)
|
36
|
-
|
37
|
-
# Verify
|
38
|
-
expect(result.object('HEAD^').to_s).to eq(mirrored.object('HEAD^').to_s)
|
39
|
-
|
40
|
-
# Teardown
|
41
|
-
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
42
|
-
FileUtils.rm_rf("#{clone_path}/#{result_name}")
|
43
|
-
to.delete
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'mirrors from service to service with ' \
|
47
|
-
'force_create_destination option' do
|
48
|
-
skip
|
49
|
-
# Setup
|
50
|
-
from = GitDuplicator::Services::GithubRepository
|
51
|
-
.new('naught', 'avdi')
|
52
|
-
to = GitDuplicator::Services::BitbucketRepository
|
53
|
-
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], credentials)
|
54
|
-
GitDuplicator.perform(from, to,
|
55
|
-
clone_path: clone_path,
|
56
|
-
force_create_destination: true)
|
57
|
-
mirrored_name = random_name
|
58
|
-
result_name = random_name
|
59
|
-
|
60
|
-
# Exercise
|
61
|
-
mirrored = Git.clone(from.url, mirrored_name, path: clone_path)
|
62
|
-
result = Git.clone(from.url, result_name, path: clone_path)
|
63
|
-
|
64
|
-
# Verify
|
65
|
-
expect(result.object('HEAD^').to_s).to eq(mirrored.object('HEAD^').to_s)
|
66
|
-
|
67
|
-
# Teardown
|
68
|
-
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
69
|
-
FileUtils.rm_rf("#{clone_path}/#{result_name}")
|
70
|
-
to.delete
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'mirrors from basic to service with ' \
|
74
|
-
'force_create_destination option' do
|
75
|
-
skip
|
76
|
-
# Setup
|
77
|
-
from = GitDuplicator::Repository
|
78
|
-
.new('naught', 'https://github.com/avdi/naught.git')
|
79
|
-
to = GitDuplicator::Services::BitbucketRepository
|
80
|
-
.new(ENV['TESTING_REPO'], ENV['BITBUCKET_USER'], credentials)
|
81
|
-
GitDuplicator.perform(from, to,
|
82
|
-
clone_path: clone_path,
|
83
|
-
force_create_destination: true)
|
84
|
-
mirrored_name = random_name
|
85
|
-
result_name = random_name
|
86
|
-
|
87
|
-
# Exercise
|
88
|
-
mirrored = Git.clone(from.url, mirrored_name, path: clone_path)
|
89
|
-
result = Git.clone(from.url, result_name, path: clone_path)
|
90
|
-
|
91
|
-
# Verify
|
92
|
-
expect(result.object('HEAD^').to_s).to eq(mirrored.object('HEAD^').to_s)
|
93
|
-
|
94
|
-
# Teardown
|
95
|
-
FileUtils.rm_rf("#{clone_path}/#{mirrored_name}")
|
96
|
-
FileUtils.rm_rf("#{clone_path}/#{result_name}")
|
97
|
-
to.delete
|
24
|
+
describe '#perform_for_update' do
|
25
|
+
it 'delegates to UpdateDuplicator' do
|
26
|
+
expect(GitDuplicator::UpdateDuplicator)
|
27
|
+
.to receive(:new).with(from, to, options).and_return(result)
|
28
|
+
expect(result).to receive(:perform)
|
29
|
+
GitDuplicator.perform_for_update(from, to, options)
|
98
30
|
end
|
99
|
-
|
100
31
|
end
|
101
|
-
|
102
32
|
end
|