kintsugi 0.6.1 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1bb4d750b89e3f7648a84bb65fefe78abcba67a04f4c92bde7a636a3af0e5b0
4
- data.tar.gz: eec2d98b161b7079af42c8fbfb1da27960d4557bb1a1fcda1473c82873fc6c62
3
+ metadata.gz: f9f20babc40a6ddf7228d2455e23d165a2d696929f5507fc8de0a9878353280f
4
+ data.tar.gz: 8ffd34dd7f504193c0a35d1347fa92c6edde6976602b5e62658ba9a637b6bc81
5
5
  SHA512:
6
- metadata.gz: '09aaa8afe8d45faa843182e86d883e60996782967ce3d6f03fac9310a5197659c4c3f218293d71752d3feabd3aa44b8f9f36ddeae6a78ec1da2317ed48fcb1be'
7
- data.tar.gz: 9eb2ebc3653c1d6ecf3467b9d0a125902313c3221ef53599e5a5b343bc6eda346f31306651a8ec8014086f695abd68b9283983b6f10136c1e854e1975d66eae7
6
+ metadata.gz: d8477aaafe2a4afed13fce37f5a5963b79ab2d3e26e4816abf4cd7b082b5a9a09cd189260713bbd5f82eaf9f8f8227b92bcd5dc79ad90acf1c0cc5d4ee9e8971
7
+ data.tar.gz: d63cf3848b727c894a9c294b75023c46e12b5672f03144bb7068477edc7765372b2e5e586c03bc69560f71a8145b7c2b3074a5246a4726a965b98a87050a59cb
@@ -103,6 +103,12 @@ module Kintsugi
103
103
  group_type = Module.const_get("Xcodeproj::Project::#{change["isa"]}")
104
104
  containing_group = path.empty? ? project.main_group : project[path]
105
105
 
106
+ if containing_group.nil?
107
+ raise MergeError, "Trying to add or move a group with change #{change} to a group that " \
108
+ "no longer exists with path '#{path}'. This is considered a conflict that should be " \
109
+ "resolved manually."
110
+ end
111
+
106
112
  next if !Settings.allow_duplicates &&
107
113
  !find_group_in_group(containing_group, group_type, change).nil?
108
114
 
@@ -144,6 +150,12 @@ module Kintsugi
144
150
  containing_group = path.empty? ? project.main_group : project[path]
145
151
  change_key = file_reference_key(change)
146
152
 
153
+ if containing_group.nil?
154
+ raise MergeError, "Trying to add or move a file with change #{change} to a group that " \
155
+ "no longer exists with path '#{path}'. This is considered a conflict that should be " \
156
+ "resolved manually."
157
+ end
158
+
147
159
  if (removal_keys_to_references[change_key] || []).empty?
148
160
  apply_file_addition(containing_group, change, "rootObject/mainGroup/#{path}")
149
161
  elsif addition_keys_to_paths[change_key].length == 1 &&
@@ -195,12 +207,17 @@ module Kintsugi
195
207
  end
196
208
 
197
209
  def apply_group_removals(project, removals)
198
- removals.each do |change, path|
210
+ removals.sort_by(&:last).reverse.each do |change, path|
199
211
  next unless %w[PBXGroup PBXVariantGroup].include?(change["isa"])
200
212
 
201
213
  group_path = join_path(path, change["displayName"])
202
214
 
203
- remove_component(project[group_path], change)
215
+ # by now we've deleted all of this group's children in the project, so we need to adapt the
216
+ # change to the expected current state of the group, that is, without any children.
217
+ change_without_children = change.dup
218
+ change_without_children["children"] = []
219
+
220
+ remove_component(project[group_path], change_without_children)
204
221
  end
205
222
  end
206
223
 
@@ -687,7 +704,7 @@ module Kintsugi
687
704
  end
688
705
 
689
706
  existing_build_file = build_phase.files.find do |build_file|
690
- build_file.file_ref.path == change["fileRef"]["path"]
707
+ build_file.file_ref && build_file.file_ref.path == change["fileRef"]["path"]
691
708
  end
692
709
  return if !Settings.allow_duplicates && !existing_build_file.nil?
693
710
 
@@ -3,6 +3,6 @@
3
3
  module Kintsugi
4
4
  # This module holds the Kintsugi version information.
5
5
  module Version
6
- STRING = "0.6.1"
6
+ STRING = "0.6.3"
7
7
  end
8
8
  end
@@ -159,6 +159,59 @@ describe Kintsugi, :apply_change_to_project do
159
159
  expect(base_project).to be_equivalent_to_project(theirs_project)
160
160
  end
161
161
 
162
+ it "raises if trying to move file to another group that no longer exists" do
163
+ base_project.main_group.find_subpath("new_group", true)
164
+ base_project.save
165
+
166
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
167
+ new_group = theirs_project.main_group.find_subpath("new_group")
168
+ file_reference = theirs_project.main_group.find_file_by_path(filepath)
169
+ file_reference.move(new_group)
170
+
171
+ changes_to_apply = get_diff(theirs_project, base_project)
172
+
173
+ base_project.main_group.find_subpath("new_group").remove_from_project
174
+
175
+ expect {
176
+ described_class.apply_change_to_project(base_project, changes_to_apply)
177
+ }.to raise_error(Kintsugi::MergeError)
178
+ end
179
+
180
+ it "raises if trying to add file to a group that no longer exists" do
181
+ base_project.main_group.find_subpath("new_group", true)
182
+ base_project.save
183
+
184
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
185
+ theirs_project.main_group.find_subpath("new_group").new_reference("foo")
186
+
187
+ changes_to_apply = get_diff(theirs_project, base_project)
188
+
189
+ base_project.main_group.find_subpath("new_group").remove_from_project
190
+
191
+ expect {
192
+ described_class.apply_change_to_project(base_project, changes_to_apply)
193
+ }.to raise_error(Kintsugi::MergeError)
194
+ end
195
+
196
+ it "does nothing if trying to remove a file from a group that no longer exists" do
197
+ base_project.main_group.find_subpath("new_group", true).new_reference("foo")
198
+ base_project.save
199
+
200
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
201
+ theirs_project.main_group.find_subpath("new_group/foo").remove_from_project
202
+
203
+ changes_to_apply = get_diff(theirs_project, base_project)
204
+
205
+ base_project.main_group.find_subpath("new_group").remove_from_project
206
+
207
+ base_project.save
208
+ expected_project = create_copy_of_project(base_project.path, "expected")
209
+
210
+ described_class.apply_change_to_project(base_project, changes_to_apply)
211
+
212
+ expect(base_project).to be_equivalent_to_project(expected_project)
213
+ end
214
+
162
215
  it "raises when a file is split into two" do
163
216
  base_project.main_group.find_subpath("new_group", true)
164
217
  base_project.main_group.find_subpath("new_group2", true)
@@ -203,6 +256,88 @@ describe Kintsugi, :apply_change_to_project do
203
256
  expect(base_project).to be_equivalent_to_project(theirs_project)
204
257
  end
205
258
 
259
+ it "moves a group with files in it" do
260
+ new_group = base_project.main_group.find_subpath("new_group", true)
261
+ new_group.new_reference("new_file")
262
+ base_project.save
263
+
264
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
265
+ new_group2 = theirs_project.main_group.find_subpath("new_group2", true)
266
+ theirs_project["new_group"].move(new_group2)
267
+
268
+ changes_to_apply = get_diff(theirs_project, base_project)
269
+
270
+ described_class.apply_change_to_project(base_project, changes_to_apply)
271
+
272
+ expect(base_project).to be_equivalent_to_project(theirs_project)
273
+ end
274
+
275
+ it "raises when trying to add a group to a group that no longer exists" do
276
+ base_project.main_group.find_subpath("new_group", true)
277
+ base_project.save
278
+
279
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
280
+ theirs_project["new_group"].find_subpath("sub_group", true)
281
+
282
+ changes_to_apply = get_diff(theirs_project, base_project)
283
+
284
+ base_project.main_group.find_subpath("new_group").remove_from_project
285
+
286
+ expect {
287
+ described_class.apply_change_to_project(base_project, changes_to_apply)
288
+ }.to raise_error(Kintsugi::MergeError)
289
+ end
290
+
291
+ it "raises when trying to move a group to a group that no longer exists" do
292
+ base_project.main_group.find_subpath("new_group", true)
293
+ base_project.main_group.find_subpath("other_group", true)
294
+ base_project.save
295
+
296
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
297
+ theirs_project["other_group"].move(theirs_project["new_group"])
298
+
299
+ changes_to_apply = get_diff(theirs_project, base_project)
300
+
301
+ base_project.main_group.find_subpath("new_group").remove_from_project
302
+
303
+ expect {
304
+ described_class.apply_change_to_project(base_project, changes_to_apply)
305
+ }.to raise_error(Kintsugi::MergeError)
306
+ end
307
+
308
+ it "moves a group with a group in it" do
309
+ new_group = base_project.main_group.find_subpath("new_group", true)
310
+ new_group.find_subpath("sub_group", true)
311
+ base_project.save
312
+
313
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
314
+ new_group2 = theirs_project.main_group.find_subpath("new_group2", true)
315
+ theirs_project["new_group"].move(new_group2)
316
+
317
+ changes_to_apply = get_diff(theirs_project, base_project)
318
+
319
+ described_class.apply_change_to_project(base_project, changes_to_apply)
320
+
321
+ expect(base_project).to be_equivalent_to_project(theirs_project)
322
+ end
323
+
324
+ it "moves a group with a group with a file in it" do
325
+ new_group = base_project.main_group.find_subpath("new_group", true)
326
+ sub_group = new_group.find_subpath("sub_group", true)
327
+ sub_group.new_reference("new_file")
328
+ base_project.save
329
+
330
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
331
+ new_group2 = theirs_project.main_group.find_subpath("new_group2", true)
332
+ theirs_project["new_group"].move(new_group2)
333
+
334
+ changes_to_apply = get_diff(theirs_project, base_project)
335
+
336
+ described_class.apply_change_to_project(base_project, changes_to_apply)
337
+
338
+ expect(base_project).to be_equivalent_to_project(theirs_project)
339
+ end
340
+
206
341
  it "adds file with include in index and last known file type as nil" do
207
342
  theirs_project = create_copy_of_project(base_project.path, "theirs")
208
343
  file_reference = theirs_project.main_group.new_reference("#{filepath}.h")
@@ -595,6 +730,22 @@ describe Kintsugi, :apply_change_to_project do
595
730
  expect(base_project).to be_equivalent_to_project(theirs_project, ignore_keys: ["containerPortal"])
596
731
  end
597
732
 
733
+ it "adds build when there is a build file without file ref" do
734
+ target = base_project.new_target("com.apple.product-type.library.static", "foo", :ios)
735
+ target.frameworks_build_phase.add_file_reference(nil)
736
+ base_project.save
737
+
738
+ theirs_project = create_copy_of_project(base_project.path, "theirs")
739
+ file_reference = theirs_project.main_group.new_reference("bar")
740
+ theirs_project.targets[0].frameworks_build_phase.add_file_reference(file_reference)
741
+
742
+ changes_to_apply = get_diff(theirs_project, base_project)
743
+ other_project = create_copy_of_project(base_project.path, "theirs")
744
+ described_class.apply_change_to_project(other_project, changes_to_apply)
745
+
746
+ expect(other_project).to be_equivalent_to_project(theirs_project)
747
+ end
748
+
598
749
  it "adds product ref to build file" do
599
750
  base_project.main_group.new_reference("bar")
600
751
  base_project.save
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kintsugi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Yohay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-29 00:00:00.000000000 Z
11
+ date: 2022-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xcodeproj
@@ -168,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
168
  - !ruby/object:Gem::Version
169
169
  version: '0'
170
170
  requirements: []
171
- rubygems_version: 3.3.21
171
+ rubygems_version: 3.3.26
172
172
  signing_key:
173
173
  specification_version: 4
174
174
  summary: pbxproj files git conflicts solver