kintsugi 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,148 @@
1
+ # Copyright (c) 2021 Lightricks. All rights reserved.
2
+ # Created by Ben Yohay.
3
+ # frozen_string_literal: true
4
+
5
+ require "git"
6
+ require "json"
7
+ require "rspec"
8
+ require "tempfile"
9
+ require "tmpdir"
10
+
11
+ require "kintsugi"
12
+
13
+ shared_examples "tests" do |git_command, project_name|
14
+ let(:temporary_directories_paths) { [] }
15
+ let(:git_directory_path) { make_temp_directory }
16
+ let(:git) { Git.init(git_directory_path) }
17
+
18
+ before do
19
+ git.config("user.email", "you@example.com")
20
+ git.config("user.name", "Your Name")
21
+ end
22
+
23
+ after do
24
+ temporary_directories_paths.each do |directory_path|
25
+ FileUtils.remove_entry(directory_path)
26
+ end
27
+ end
28
+
29
+ context "running 'git #{git_command}' with project name '#{project_name}'" do
30
+ it "resolves conflicts with root command" do
31
+ File.write(File.join(git_directory_path, ".gitattributes"), "*.pbxproj merge=Unset")
32
+
33
+ project = create_new_project_at_path(File.join(git_directory_path, project_name))
34
+
35
+ git.add(File.join(git_directory_path, ".gitattributes"))
36
+ git.add(project.path)
37
+ git.commit("Initial project")
38
+
39
+ project.new_target("com.apple.product-type.library.static", "foo", :ios)
40
+ project.save
41
+
42
+ git.add(all: true)
43
+ git.commit("Add target foo")
44
+ first_commit_hash = git.revparse("HEAD")
45
+
46
+ git.checkout("HEAD^")
47
+ project = Xcodeproj::Project.open(project.path)
48
+ project.new_target("com.apple.product-type.library.static", "bar", :ios)
49
+ project.save
50
+ git.add(all: true)
51
+ git.commit("Add target bar")
52
+
53
+ `git -C #{git_directory_path} #{git_command} #{first_commit_hash} &> /dev/null`
54
+ Kintsugi.run([File.join(project.path, "project.pbxproj")])
55
+
56
+ project = Xcodeproj::Project.open(project.path)
57
+ expect(project.targets.map(&:display_name)).to contain_exactly("foo", "bar")
58
+ end
59
+
60
+ it "resolves conflicts automatically with driver" do
61
+ git.config("merge.kintsugi.name", "Kintsugi driver")
62
+ git.config("merge.kintsugi.driver", "#{__dir__}/../bin/kintsugi driver %O %A %B %P")
63
+ File.write(File.join(git_directory_path, ".gitattributes"), "*.pbxproj merge=kintsugi")
64
+
65
+ project = create_new_project_at_path(File.join(git_directory_path, project_name))
66
+
67
+ git.add(File.join(git_directory_path, ".gitattributes"))
68
+ git.add(project.path)
69
+ git.commit("Initial project")
70
+
71
+ project.new_target("com.apple.product-type.library.static", "foo", :ios)
72
+ project.save
73
+
74
+ git.add(all: true)
75
+ git.commit("Add target foo")
76
+ first_commit_hash = git.revparse("HEAD")
77
+
78
+ git.checkout("HEAD^")
79
+ project = Xcodeproj::Project.open(project.path)
80
+ project.new_target("com.apple.product-type.library.static", "bar", :ios)
81
+ project.save
82
+ git.add(all: true)
83
+ git.commit("Add target bar")
84
+
85
+ `git -C #{git_directory_path} #{git_command} #{first_commit_hash} &> /dev/null`
86
+
87
+ project = Xcodeproj::Project.open(project.path)
88
+ expect(project.targets.map(&:display_name)).to contain_exactly("foo", "bar")
89
+ end
90
+
91
+ it "keeps conflicts if failed to resolve conflicts" do
92
+ File.write(File.join(git_directory_path, ".gitattributes"), "*.pbxproj merge=Unset")
93
+
94
+ project = create_new_project_at_path(File.join(git_directory_path, project_name))
95
+ project.new_target("com.apple.product-type.library.static", "foo", :ios)
96
+ project.save
97
+
98
+ git.add(File.join(git_directory_path, ".gitattributes"))
99
+ git.add(project.path)
100
+ git.commit("Initial project")
101
+
102
+ project.targets[0].build_configurations.each do |configuration|
103
+ configuration.build_settings["PRODUCT_NAME"] = "bar"
104
+ end
105
+ project.save
106
+ git.add(all: true)
107
+ git.commit("Change target product name to bar")
108
+ first_commit_hash = git.revparse("HEAD")
109
+
110
+ git.checkout("HEAD^")
111
+ project = Xcodeproj::Project.open(project.path)
112
+ project.targets[0].build_configurations.each do |configuration|
113
+ configuration.build_settings["PRODUCT_NAME"] = "baz"
114
+ end
115
+ project.save
116
+ git.add(all: true)
117
+ git.commit("Change target product name to baz")
118
+
119
+ `git -C #{git_directory_path} #{git_command} #{first_commit_hash} &> /dev/null`
120
+
121
+ expect {
122
+ Kintsugi.run([File.join(project.path, "project.pbxproj")])
123
+ }.to raise_error(Kintsugi::MergeError)
124
+ expect(`git -C #{git_directory_path} diff --name-only --diff-filter=U`.chomp)
125
+ .to eq("#{project_name}/project.pbxproj")
126
+ end
127
+ end
128
+
129
+ def make_temp_directory
130
+ directory_path = Dir.mktmpdir
131
+ temporary_directories_paths << directory_path
132
+ directory_path
133
+ end
134
+ end
135
+
136
+ def create_new_project_at_path(path)
137
+ project = Xcodeproj::Project.new(path)
138
+ project.save
139
+ project
140
+ end
141
+
142
+ describe Kintsugi, :kintsugi do
143
+ %w[rebase cherry-pick merge].each do |git_command|
144
+ ["foo.xcodeproj", "foo with space.xcodeproj"].each do |project_name|
145
+ it_behaves_like("tests", git_command, project_name)
146
+ end
147
+ end
148
+ end
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.5.2
4
+ version: 0.6.0
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-05-02 00:00:00.000000000 Z
11
+ date: 2022-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xcodeproj
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 1.19.0
20
20
  - - "<="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.21.0
22
+ version: 1.22.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,21 @@ dependencies:
29
29
  version: 1.19.0
30
30
  - - "<="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.21.0
32
+ version: 1.22.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: git
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.11'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.11'
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: rake
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -125,12 +139,15 @@ files:
125
139
  - lib/kintsugi/apply_change_to_project.rb
126
140
  - lib/kintsugi/cli.rb
127
141
  - lib/kintsugi/error.rb
142
+ - lib/kintsugi/merge.rb
143
+ - lib/kintsugi/settings.rb
128
144
  - lib/kintsugi/utils.rb
129
145
  - lib/kintsugi/version.rb
130
146
  - lib/kintsugi/xcodeproj_extensions.rb
131
147
  - logo/kintsugi.png
132
148
  - spec/be_equivalent_to_project.rb
133
149
  - spec/kintsugi_apply_change_to_project_spec.rb
150
+ - spec/kintsugi_integration_spec.rb
134
151
  - spec/spec_helper.rb
135
152
  homepage: https://github.com/Lightricks/Kintsugi
136
153
  licenses:
@@ -151,11 +168,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
168
  - !ruby/object:Gem::Version
152
169
  version: '0'
153
170
  requirements: []
154
- rubygems_version: 3.3.12
171
+ rubygems_version: 3.3.20
155
172
  signing_key:
156
173
  specification_version: 4
157
174
  summary: pbxproj files git conflicts solver
158
175
  test_files:
159
176
  - spec/be_equivalent_to_project.rb
160
177
  - spec/kintsugi_apply_change_to_project_spec.rb
178
+ - spec/kintsugi_integration_spec.rb
161
179
  - spec/spec_helper.rb