mortar 0.8.2 → 0.8.3
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.
- data/lib/mortar/command/base.rb +6 -2
- data/lib/mortar/command/projects.rb +20 -7
- data/lib/mortar/git.rb +35 -19
- data/lib/mortar/version.rb +1 -1
- data/spec/mortar/git_spec.rb +3 -3
- metadata +129 -138
data/lib/mortar/command/base.rb
CHANGED
@@ -164,7 +164,7 @@ class Mortar::Command::Base
|
|
164
164
|
File.open(".mortar-project-remote", "w") do |f|
|
165
165
|
f.puts api_registration_result["git_url"]
|
166
166
|
end
|
167
|
-
git.sync_gitless_project(project)
|
167
|
+
git.sync_gitless_project(project, "master")
|
168
168
|
end
|
169
169
|
|
170
170
|
protected
|
@@ -400,13 +400,17 @@ protected
|
|
400
400
|
def sync_code_with_cloud
|
401
401
|
# returns git_ref
|
402
402
|
if project.gitless_project?
|
403
|
-
return git.sync_gitless_project(project)
|
403
|
+
return git.sync_gitless_project(project, embedded_project_user_branch)
|
404
404
|
else
|
405
405
|
validate_git_based_project!
|
406
406
|
return git.create_and_push_snapshot_branch(project)
|
407
407
|
end
|
408
408
|
end
|
409
409
|
|
410
|
+
def embedded_project_user_branch
|
411
|
+
return Mortar::Auth.user_s3_safe + "-base"
|
412
|
+
end
|
413
|
+
|
410
414
|
end
|
411
415
|
|
412
416
|
module Mortar::Command
|
@@ -138,6 +138,9 @@ class Mortar::Command::Projects < Mortar::Command::Base
|
|
138
138
|
# Adds a remote to your local git repository to the Mortar git repository. For example if a
|
139
139
|
# co-worker creates a Mortar project from an internal repository you would clone the internal
|
140
140
|
# repository and then after cloning call mortar projects:set_remote.
|
141
|
+
#
|
142
|
+
# --withoutgit # make this a gitless project tied to the specified remote
|
143
|
+
#
|
141
144
|
def set_remote
|
142
145
|
project_name = shift_argument
|
143
146
|
|
@@ -145,13 +148,15 @@ class Mortar::Command::Projects < Mortar::Command::Base
|
|
145
148
|
error("Usage: mortar projects:set_remote PROJECT\nMust specify PROJECT.")
|
146
149
|
end
|
147
150
|
|
148
|
-
unless
|
149
|
-
|
150
|
-
|
151
|
+
unless options[:withoutgit]
|
152
|
+
unless git.has_dot_git?
|
153
|
+
error("Can only set the remote for an existing git project. Please run:\n\ngit init\ngit add .\ngit commit -a -m \"first commit\"\n\nto initialize your project in git.")
|
154
|
+
end
|
151
155
|
|
152
|
-
|
153
|
-
|
154
|
-
|
156
|
+
if git.remotes(git_organization).include?("mortar")
|
157
|
+
display("The remote has already been set for project: #{project_name}")
|
158
|
+
return
|
159
|
+
end
|
155
160
|
end
|
156
161
|
|
157
162
|
projects = api.get_projects().body["projects"]
|
@@ -160,7 +165,15 @@ class Mortar::Command::Projects < Mortar::Command::Base
|
|
160
165
|
error("No project named: #{project_name} exists. You can create this project using:\n\n mortar projects:create")
|
161
166
|
end
|
162
167
|
|
163
|
-
|
168
|
+
if options[:withoutgit]
|
169
|
+
File.open(".mortar-project-remote", "w") do |f|
|
170
|
+
f.puts project["git_url"]
|
171
|
+
end
|
172
|
+
git.sync_gitless_project(project, embedded_project_user_branch)
|
173
|
+
else
|
174
|
+
git.remote_add("mortar", project["git_url"])
|
175
|
+
end
|
176
|
+
|
164
177
|
display("Successfully added the mortar remote to the #{project_name} project")
|
165
178
|
|
166
179
|
end
|
data/lib/mortar/git.rb
CHANGED
@@ -242,21 +242,23 @@ module Mortar
|
|
242
242
|
"/tmp/mortar-git-mirrors"
|
243
243
|
end
|
244
244
|
|
245
|
-
def sync_gitless_project(project)
|
245
|
+
def sync_gitless_project(project, branch)
|
246
246
|
# the project is not a git repo, so we manage a mirror directory that is a git repo
|
247
|
+
# branch is which branch to sync to. this will be master if the cloud repo
|
248
|
+
# is being initialized, or a branch based on the user's name in any other circumstance
|
247
249
|
|
248
250
|
project_dir = project.root_path
|
249
251
|
mirror_dir = "#{mortar_mirrors_dir}/#{project.name}"
|
250
252
|
|
251
|
-
ensure_gitless_project_mirror_exists(
|
252
|
-
sync_gitless_project_with_mirror(project_dir,
|
253
|
-
git_ref = sync_gitless_project_mirror_with_cloud(
|
253
|
+
ensure_gitless_project_mirror_exists(mirror_dir)
|
254
|
+
sync_gitless_project_with_mirror(mirror_dir, project_dir, branch)
|
255
|
+
git_ref = sync_gitless_project_mirror_with_cloud(mirror_dir, branch)
|
254
256
|
|
255
257
|
Dir.chdir(project_dir)
|
256
258
|
return git_ref
|
257
259
|
end
|
258
260
|
|
259
|
-
def ensure_gitless_project_mirror_exists(
|
261
|
+
def ensure_gitless_project_mirror_exists(mirror_dir)
|
260
262
|
# create and initialize mirror git repo if it doesn't already exist
|
261
263
|
unless File.directory? mirror_dir
|
262
264
|
unless File.directory? mortar_mirrors_dir
|
@@ -267,21 +269,35 @@ module Mortar
|
|
267
269
|
remote_path = File.open(".mortar-project-remote").read.strip
|
268
270
|
clone(remote_path, mirror_dir)
|
269
271
|
|
270
|
-
# make an initial commit to
|
272
|
+
# make an initial commit to the specified branch
|
271
273
|
Dir.chdir(mirror_dir)
|
272
|
-
File.
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
274
|
+
unless File.exists? ".gitkeep" # flag that signals that the repo has been initialized
|
275
|
+
# initialization is not necessary if this is not the first user to use it
|
276
|
+
File.open(".gitkeep", "w").close()
|
277
|
+
git("add .")
|
278
|
+
git("commit -m \"Setting up gitless Mortar project\"")
|
279
|
+
git("remote add mortar #{remote_path}")
|
280
|
+
push_with_retry("mortar", "master", "Setting up gitless Mortar project")
|
281
|
+
end
|
277
282
|
end
|
278
283
|
end
|
279
284
|
|
280
|
-
def sync_gitless_project_with_mirror(project_dir,
|
281
|
-
# pull from
|
285
|
+
def sync_gitless_project_with_mirror(mirror_dir, project_dir, branch)
|
286
|
+
# pull from remote branch and overwrite everything, if it exists.
|
287
|
+
# if it doesn't exist, create it.
|
282
288
|
Dir.chdir(mirror_dir)
|
289
|
+
git("reset --hard HEAD")
|
283
290
|
git("fetch --all")
|
284
|
-
|
291
|
+
begin
|
292
|
+
git("checkout #{branch}")
|
293
|
+
rescue Exception => e
|
294
|
+
err_msg = e.to_s
|
295
|
+
if err_msg.include?("error: pathspec") and err_msg.include?("did not match any file(s) known to git")
|
296
|
+
git("checkout -b #{branch}")
|
297
|
+
else
|
298
|
+
raise e
|
299
|
+
end
|
300
|
+
end
|
285
301
|
|
286
302
|
# wipe mirror dir and copy project files into it
|
287
303
|
# since we fetched mortar/master earlier, the git diff will now be b/tw master and the current state
|
@@ -290,7 +306,7 @@ module Mortar
|
|
290
306
|
Dir.chdir(project_dir)
|
291
307
|
FileUtils.cp_r(mortar_manifest_pathlist(false), mirror_dir)
|
292
308
|
|
293
|
-
# update
|
309
|
+
# update remote branch
|
294
310
|
Dir.chdir(mirror_dir)
|
295
311
|
unless is_clean_working_directory?
|
296
312
|
git("add .")
|
@@ -299,17 +315,17 @@ module Mortar
|
|
299
315
|
end
|
300
316
|
end
|
301
317
|
|
302
|
-
def sync_gitless_project_mirror_with_cloud(
|
318
|
+
def sync_gitless_project_mirror_with_cloud(mirror_dir, branch)
|
303
319
|
# checkout snapshot branch.
|
304
|
-
# it will permenantly keep the code in this state (as opposed to
|
320
|
+
# it will permenantly keep the code in this state (as opposed to the user's base branch, which will be updated)
|
305
321
|
Dir.chdir(mirror_dir)
|
306
322
|
snapshot_branch = "mortar-snapshot-#{Mortar::UUID.create_random.to_s}"
|
307
323
|
git("checkout -b #{snapshot_branch}")
|
308
324
|
|
309
|
-
# push everything (
|
325
|
+
# push everything (use base branch updates and snapshot branch)
|
310
326
|
git_ref = push_with_retry("mortar", snapshot_branch, "Sending code snapshot to Mortar", true)
|
311
327
|
|
312
|
-
git("checkout
|
328
|
+
git("checkout #{branch}")
|
313
329
|
return git_ref
|
314
330
|
end
|
315
331
|
|
data/lib/mortar/version.rb
CHANGED
data/spec/mortar/git_spec.rb
CHANGED
@@ -316,7 +316,7 @@ STASH
|
|
316
316
|
mock(@git).push_with_retry.with_any_args.times(2) { true }
|
317
317
|
mock(@git).is_clean_working_directory? { false }
|
318
318
|
|
319
|
-
@git.sync_gitless_project(p)
|
319
|
+
@git.sync_gitless_project(p, "master")
|
320
320
|
|
321
321
|
File.directory?(mirror_dir).should be_true
|
322
322
|
FileUtils.rm_rf(mirror_dir)
|
@@ -337,7 +337,7 @@ STASH
|
|
337
337
|
mock(@git).push_with_retry.with_any_args.times(1) { true }
|
338
338
|
mock(@git).is_clean_working_directory? { false }
|
339
339
|
|
340
|
-
@git.sync_gitless_project(p)
|
340
|
+
@git.sync_gitless_project(p, "bob-the-builder-base")
|
341
341
|
|
342
342
|
File.exists?("#{project_mirror_dir}/pigscripts/calydonian_boar.pig").should be_true
|
343
343
|
FileUtils.rm_rf(mirror_dir)
|
@@ -359,7 +359,7 @@ STASH
|
|
359
359
|
mock(@git).push_with_retry.with_any_args.times(1) { true }
|
360
360
|
mock(@git).is_clean_working_directory? { false }
|
361
361
|
|
362
|
-
@git.sync_gitless_project(p)
|
362
|
+
@git.sync_gitless_project(p, "bob-the-builder-base")
|
363
363
|
|
364
364
|
File.exists?("#{project_mirror_dir}/pigscripts/calydonian_boar.pig").should be_false
|
365
365
|
FileUtils.rm_rf(mirror_dir)
|
metadata
CHANGED
@@ -1,164 +1,167 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mortar
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.3
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 8
|
9
|
-
- 2
|
10
|
-
version: 0.8.2
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Mortar Data
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-06-05 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: mortar-api-ruby
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 1
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
- 6
|
32
|
-
- 3
|
20
|
+
- !ruby/object:Gem::Version
|
33
21
|
version: 0.6.3
|
34
22
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: netrc
|
38
23
|
prerelease: false
|
39
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
25
|
none: false
|
41
|
-
requirements:
|
26
|
+
requirements:
|
42
27
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.6.3
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: netrc
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0.7'
|
49
38
|
type: :runtime
|
50
|
-
version_requirements: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
|
-
name: launchy
|
53
39
|
prerelease: false
|
54
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
41
|
none: false
|
56
|
-
requirements:
|
42
|
+
requirements:
|
57
43
|
- - ~>
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.7'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: launchy
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.1'
|
64
54
|
type: :runtime
|
65
|
-
version_requirements: *id003
|
66
|
-
- !ruby/object:Gem::Dependency
|
67
|
-
name: excon
|
68
55
|
prerelease: false
|
69
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.1'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: excon
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
70
65
|
none: false
|
71
|
-
requirements:
|
66
|
+
requirements:
|
72
67
|
- - ~>
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
|
75
|
-
segments:
|
76
|
-
- 0
|
77
|
-
- 15
|
78
|
-
version: "0.15"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0.15'
|
79
70
|
type: :development
|
80
|
-
version_requirements: *id004
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: fakefs
|
83
71
|
prerelease: false
|
84
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.15'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: fakefs
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
85
81
|
none: false
|
86
|
-
requirements:
|
82
|
+
requirements:
|
87
83
|
- - ~>
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
hash: 11
|
90
|
-
segments:
|
91
|
-
- 0
|
92
|
-
- 4
|
93
|
-
- 2
|
84
|
+
- !ruby/object:Gem::Version
|
94
85
|
version: 0.4.2
|
95
86
|
type: :development
|
96
|
-
version_requirements: *id005
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: gem-release
|
99
87
|
prerelease: false
|
100
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
101
89
|
none: false
|
102
|
-
requirements:
|
103
|
-
- -
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.4.2
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: gem-release
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
109
102
|
type: :development
|
110
|
-
version_requirements: *id006
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rake
|
113
103
|
prerelease: false
|
114
|
-
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rake
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
115
113
|
none: false
|
116
|
-
requirements:
|
117
|
-
- -
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
|
120
|
-
segments:
|
121
|
-
- 0
|
122
|
-
version: "0"
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
123
118
|
type: :development
|
124
|
-
version_requirements: *id007
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rr
|
127
119
|
prerelease: false
|
128
|
-
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rr
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
129
|
none: false
|
130
|
-
requirements:
|
131
|
-
- -
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
|
134
|
-
segments:
|
135
|
-
- 0
|
136
|
-
version: "0"
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
137
134
|
type: :development
|
138
|
-
version_requirements: *id008
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rspec
|
141
135
|
prerelease: false
|
142
|
-
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
143
137
|
none: false
|
144
|
-
requirements:
|
145
|
-
- -
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: rspec
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
151
150
|
type: :development
|
152
|
-
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
153
158
|
description: Client library and command-line tool to interact with the Mortar service.
|
154
159
|
email: support@mortardata.com
|
155
|
-
executables:
|
160
|
+
executables:
|
156
161
|
- mortar
|
157
162
|
extensions: []
|
158
|
-
|
159
163
|
extra_rdoc_files: []
|
160
|
-
|
161
|
-
files:
|
164
|
+
files:
|
162
165
|
- README.md
|
163
166
|
- bin/mortar
|
164
167
|
- css/illustrate.css
|
@@ -249,38 +252,26 @@ files:
|
|
249
252
|
- spec/support/display_message_matcher.rb
|
250
253
|
homepage: http://mortardata.com/
|
251
254
|
licenses: []
|
252
|
-
|
253
255
|
post_install_message:
|
254
256
|
rdoc_options: []
|
255
|
-
|
256
|
-
require_paths:
|
257
|
+
require_paths:
|
257
258
|
- lib
|
258
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
259
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
259
260
|
none: false
|
260
|
-
requirements:
|
261
|
-
- -
|
262
|
-
- !ruby/object:Gem::Version
|
263
|
-
hash: 57
|
264
|
-
segments:
|
265
|
-
- 1
|
266
|
-
- 8
|
267
|
-
- 7
|
261
|
+
requirements:
|
262
|
+
- - ! '>='
|
263
|
+
- !ruby/object:Gem::Version
|
268
264
|
version: 1.8.7
|
269
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
265
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
270
266
|
none: false
|
271
|
-
requirements:
|
272
|
-
- -
|
273
|
-
- !ruby/object:Gem::Version
|
274
|
-
|
275
|
-
segments:
|
276
|
-
- 0
|
277
|
-
version: "0"
|
267
|
+
requirements:
|
268
|
+
- - ! '>='
|
269
|
+
- !ruby/object:Gem::Version
|
270
|
+
version: '0'
|
278
271
|
requirements: []
|
279
|
-
|
280
272
|
rubyforge_project:
|
281
|
-
rubygems_version: 1.8.
|
273
|
+
rubygems_version: 1.8.25
|
282
274
|
signing_key:
|
283
275
|
specification_version: 3
|
284
276
|
summary: Client library and CLI to interact with the Mortar service.
|
285
277
|
test_files: []
|
286
|
-
|