smorg-rb 7.1.3 → 7.1.4

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: e7aa889fb625e2e139a19101b23291fd91f8bfec64fdfb11f8c4635265a400aa
4
- data.tar.gz: c5fbedc4b98a1e50822e67516e61e6172a8f28111e3b516d0388e3e417e85163
3
+ metadata.gz: 12f587107d9a170feee761ed0191d98959c214d4507ea7d7212256947760ccea
4
+ data.tar.gz: deb44e4aaa799376879ec3d0f1183a55707529f5ac01420344733e6836e0c9ad
5
5
  SHA512:
6
- metadata.gz: cf8b2baf7de0ce383932a0278d6e7f1cf44d7ca08cc15715c713f06792ab1ff90e12b0d7d30b4265d00b02ba3a1d90930a64d6a0dfa7b5e353612dd4824bf47c
7
- data.tar.gz: 9de42f40bab39d40d17d6ee3c1d6a2e899621cb2503ce478e87e859a5ac25c233d146fd17af0029c6c18292f2481fe69d305eae8ad775d7fbd053227ba9ed08c
6
+ metadata.gz: a0b5b8de7fad58ef0489c375fd2010f32f2031a25363c1ee28ee0a77a0827cf87d2852212cd57f91a4bd552b04ce001297fd4a67defe770b2481528a1f4c534d
7
+ data.tar.gz: 448d2f9ad40cb86205f60f9d00e938b001c0595d6d12f654a51fab5cd02aabd07c75d2ad4412d50a69bc9a604fa5dd6f57a7d73e48dae7283d9183edc6fa204c
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -253,7 +253,7 @@ If none of the available licenses suit your use case, please [contact us](mailto
253
253
  [📌gitmoji]: https://gitmoji.dev
254
254
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
255
255
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
256
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.494-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
256
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.460-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
257
257
  [🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md
258
258
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
259
259
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -5,7 +5,7 @@ module Smorg
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = '7.1.3'
8
+ VERSION = '7.1.4'
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
data/lib/smorg/rb.rb CHANGED
@@ -16,14 +16,14 @@ require 'kettle/jem/tasks/install_task'
16
16
  require 'markdown/merge'
17
17
  require 'plain-merge'
18
18
  require 'rbs/merge'
19
- require 'ruby/merge'
20
19
  require 'toml/merge'
21
20
  require 'typescript/merge'
22
- require 'yaml/merge'
21
+ require 'prism/merge'
22
+ require 'psych/merge'
23
23
  require_relative 'rb/version'
24
24
 
25
25
  module Smorg
26
- module RB
26
+ module RB # rubocop:disable Metrics/ModuleLength
27
27
  EXIT_SUCCESS = 0
28
28
  EXIT_UNRESOLVED_CONFLICT = 1
29
29
  EXIT_USER_ERROR = 2
@@ -668,216 +668,73 @@ module Smorg
668
668
  EXIT_SUCCESS
669
669
  end
670
670
 
671
+ MERGE_PROVIDER_OPTIONS = {
672
+ 'bash' => {
673
+ provider_id: 'ruby.bash', family: 'bash', dialect: 'bash', backend: 'kreuzberg-language-pack'
674
+ },
675
+ 'go' => {
676
+ provider_id: 'ruby.go', family: 'go', dialect: 'go', backend: 'kreuzberg-language-pack'
677
+ },
678
+ 'html' => {
679
+ provider_id: 'ruby.html', family: 'html', dialect: 'html', backend: 'kreuzberg-language-pack'
680
+ },
681
+ 'dotenv' => { family: 'dotenv', dialect: 'dotenv', backend: 'dotenv-line' },
682
+ 'json' => { family: 'json', dialect: 'json' },
683
+ 'jsonc' => { family: 'json', dialect: 'jsonc' },
684
+ 'json5' => { family: 'json', dialect: 'json5' },
685
+ 'markdown' => {
686
+ provider_id: 'ruby.markdown', family: 'markdown', dialect: 'markdown', backend: 'kreuzberg-language-pack'
687
+ },
688
+ 'ruby' => { family: 'ruby', dialect: 'ruby', backend: 'prism' },
689
+ 'rbs' => { provider_id: 'ruby.rbs', family: 'rbs', dialect: 'rbs', backend: 'rbs' },
690
+ 'rust' => {
691
+ provider_id: 'ruby.rust', family: 'rust', dialect: 'rust', backend: 'kreuzberg-language-pack'
692
+ },
693
+ 'toml' => {
694
+ provider_id: 'ruby.toml', family: 'toml', dialect: 'toml', backend: 'kreuzberg-language-pack'
695
+ },
696
+ 'typescript' => {
697
+ provider_id: 'ruby.typescript', family: 'typescript', dialect: 'typescript',
698
+ backend: 'kreuzberg-language-pack'
699
+ },
700
+ 'tsx' => {
701
+ provider_id: 'ruby.typescript', family: 'typescript', dialect: 'tsx', backend: 'kreuzberg-language-pack'
702
+ },
703
+ 'yaml' => { provider_id: 'ruby.yaml.psych', family: 'yaml', dialect: 'yaml', backend: 'psych' },
704
+ 'text' => { family: 'text', dialect: 'text', profile_id: 'coarse_document' }
705
+ }.freeze
706
+
671
707
  def merge_by_path(path_name, language, conflict_marker_size, fallback_policy, ancestor_source, current_source,
672
708
  other_source)
673
- case normalize_language(language, path_name)
674
- when 'bash'
675
- merge3_result(
676
- Ast::Merge::Git.merge3(
677
- base_source: ancestor_source,
678
- ours_source: current_source,
679
- theirs_source: other_source,
680
- path_name: path_name,
681
- provider_id: 'ruby.bash',
682
- family: 'bash',
683
- dialect: 'bash',
684
- backend: 'kreuzberg-language-pack',
685
- profile_id: 'source_preserving',
686
- fallback_policy: fallback_policy,
687
- conflict_marker_size: conflict_marker_size
688
- )
689
- )
690
- when 'go'
691
- merge3_result(
692
- Ast::Merge::Git.merge3(
693
- base_source: ancestor_source,
694
- ours_source: current_source,
695
- theirs_source: other_source,
696
- path_name: path_name,
697
- provider_id: 'ruby.go',
698
- family: 'go',
699
- dialect: 'go',
700
- backend: 'kreuzberg-language-pack',
701
- profile_id: 'source_preserving',
702
- fallback_policy: fallback_policy,
703
- conflict_marker_size: conflict_marker_size
704
- )
705
- )
706
- when 'html'
707
- merge3_result(
708
- Ast::Merge::Git.merge3(
709
- base_source: ancestor_source,
710
- ours_source: current_source,
711
- theirs_source: other_source,
712
- path_name: path_name,
713
- provider_id: 'ruby.html',
714
- family: 'html',
715
- dialect: 'html',
716
- backend: 'kreuzberg-language-pack',
717
- profile_id: 'source_preserving',
718
- fallback_policy: fallback_policy,
719
- conflict_marker_size: conflict_marker_size
720
- )
721
- )
722
- when 'dotenv'
723
- merge3_result(
724
- Ast::Merge::Git.merge3(
725
- base_source: ancestor_source,
726
- ours_source: current_source,
727
- theirs_source: other_source,
728
- path_name: path_name,
729
- family: 'dotenv',
730
- dialect: 'dotenv',
731
- backend: 'dotenv-line',
732
- profile_id: 'source_preserving',
733
- fallback_policy: fallback_policy,
734
- conflict_marker_size: conflict_marker_size
735
- )
736
- )
737
- when 'json', 'jsonc', 'json5'
738
- merge3_result(
739
- Ast::Merge::Git.merge3(
740
- base_source: ancestor_source,
741
- ours_source: current_source,
742
- theirs_source: other_source,
743
- path_name: path_name,
744
- family: 'json',
745
- dialect: normalize_language(language, path_name),
746
- profile_id: 'source_preserving',
747
- fallback_policy: fallback_policy,
748
- conflict_marker_size: conflict_marker_size
749
- )
750
- )
751
- when 'markdown'
752
- merge3_result(
753
- Ast::Merge::Git.merge3(
754
- base_source: ancestor_source,
755
- ours_source: current_source,
756
- theirs_source: other_source,
757
- path_name: path_name,
758
- provider_id: 'ruby.markdown',
759
- family: 'markdown',
760
- dialect: 'markdown',
761
- backend: 'kreuzberg-language-pack',
762
- profile_id: 'source_preserving',
763
- fallback_policy: fallback_policy,
764
- conflict_marker_size: conflict_marker_size
765
- )
766
- )
767
- when 'ruby'
768
- merge3_result(
769
- Ast::Merge::Git.merge3(
770
- base_source: ancestor_source,
771
- ours_source: current_source,
772
- theirs_source: other_source,
773
- path_name: path_name,
774
- provider_id: 'ruby.ruby',
775
- family: 'ruby',
776
- dialect: 'ruby',
777
- backend: 'prism',
778
- profile_id: 'source_preserving',
779
- fallback_policy: fallback_policy,
780
- conflict_marker_size: conflict_marker_size
781
- )
782
- )
783
- when 'rbs'
784
- merge3_result(
785
- Ast::Merge::Git.merge3(
786
- base_source: ancestor_source,
787
- ours_source: current_source,
788
- theirs_source: other_source,
789
- path_name: path_name,
790
- provider_id: 'ruby.rbs',
791
- family: 'rbs',
792
- dialect: 'rbs',
793
- backend: 'rbs',
794
- profile_id: 'source_preserving',
795
- fallback_policy: fallback_policy,
796
- conflict_marker_size: conflict_marker_size
797
- )
798
- )
799
- when 'rust'
800
- merge3_result(
801
- Ast::Merge::Git.merge3(
802
- base_source: ancestor_source,
803
- ours_source: current_source,
804
- theirs_source: other_source,
805
- path_name: path_name,
806
- provider_id: 'ruby.rust',
807
- family: 'rust',
808
- dialect: 'rust',
809
- backend: 'kreuzberg-language-pack',
810
- profile_id: 'source_preserving',
811
- fallback_policy: fallback_policy,
812
- conflict_marker_size: conflict_marker_size
813
- )
814
- )
815
- when 'toml'
816
- merge3_result(
817
- Ast::Merge::Git.merge3(
818
- base_source: ancestor_source,
819
- ours_source: current_source,
820
- theirs_source: other_source,
821
- path_name: path_name,
822
- provider_id: 'ruby.toml',
823
- family: 'toml',
824
- dialect: 'toml',
825
- backend: 'kreuzberg-language-pack',
826
- profile_id: 'source_preserving',
827
- fallback_policy: fallback_policy,
828
- conflict_marker_size: conflict_marker_size
829
- )
830
- )
831
- when 'typescript', 'tsx'
832
- dialect = normalize_language(language, path_name)
833
- merge3_result(
834
- Ast::Merge::Git.merge3(
835
- base_source: ancestor_source,
836
- ours_source: current_source,
837
- theirs_source: other_source,
838
- path_name: path_name,
839
- provider_id: 'ruby.typescript',
840
- family: 'typescript',
841
- dialect: dialect,
842
- backend: 'kreuzberg-language-pack',
843
- profile_id: 'source_preserving',
844
- fallback_policy: fallback_policy,
845
- conflict_marker_size: conflict_marker_size
846
- )
847
- )
848
- when 'yaml'
849
- merge3_result(
850
- Ast::Merge::Git.merge3(
851
- base_source: ancestor_source,
852
- ours_source: current_source,
853
- theirs_source: other_source,
854
- path_name: path_name,
855
- provider_id: 'ruby.yaml',
856
- family: 'yaml',
857
- dialect: 'yaml',
858
- backend: 'kreuzberg-language-pack',
859
- profile_id: 'source_preserving',
860
- fallback_policy: fallback_policy,
861
- conflict_marker_size: conflict_marker_size
862
- )
863
- )
864
- when 'text'
865
- merge3_result(
866
- Ast::Merge::Git.merge3(
867
- base_source: ancestor_source,
868
- ours_source: current_source,
869
- theirs_source: other_source,
870
- path_name: path_name,
871
- family: 'text',
872
- dialect: 'text',
873
- profile_id: 'coarse_document',
874
- fallback_policy: fallback_policy,
875
- conflict_marker_size: conflict_marker_size
876
- )
709
+ normalized_language = normalize_language(language, path_name)
710
+ provider_options = MERGE_PROVIDER_OPTIONS[normalized_language]
711
+ return unsupported_language_result(normalized_language, path_name) unless provider_options
712
+
713
+ merge_with_provider(
714
+ path_name, provider_options,
715
+ merge_options_for(ancestor_source, current_source, other_source, fallback_policy, conflict_marker_size)
716
+ )
717
+ end
718
+
719
+ def merge_options_for(ancestor_source, current_source, other_source, fallback_policy, conflict_marker_size)
720
+ {
721
+ base_source: ancestor_source,
722
+ ours_source: current_source,
723
+ theirs_source: other_source,
724
+ fallback_policy: fallback_policy,
725
+ conflict_marker_size: conflict_marker_size
726
+ }
727
+ end
728
+
729
+ def merge_with_provider(path_name, provider_options, merge_options)
730
+ merge3_result(
731
+ Ast::Merge::Git.merge3(
732
+ **merge_options,
733
+ path_name: path_name,
734
+ profile_id: provider_options.fetch(:profile_id, 'source_preserving'),
735
+ **provider_options.except(:profile_id)
877
736
  )
878
- else
879
- unsupported_language_result(normalize_language(language, path_name), path_name)
880
- end
737
+ )
881
738
  end
882
739
 
883
740
  def unsupported_language_result(language, path_name)
@@ -895,90 +752,69 @@ module Smorg
895
752
  end
896
753
 
897
754
  def merge3_result(result)
898
- merge3_report_fields = {
755
+ if result[:ok] && result[:merged_source]
756
+ return merge3_result_payload(result, true, result.fetch(:merged_source))
757
+ elsif !result[:ok] && result[:conflicted_source]
758
+ return merge3_result_payload(result, false, result.fetch(:conflicted_source))
759
+ end
760
+
761
+ merge3_result_payload(result, false, nil)
762
+ end
763
+
764
+ def merge3_result_payload(result, success, output)
765
+ payload = {
766
+ ok: success,
767
+ diagnostics: result.fetch(:diagnostics),
768
+ owned_regions: result.fetch(:owned_regions, []),
769
+ render_report: result.fetch(:render_report),
770
+ profile: result.fetch(:profile),
771
+ policies: [],
772
+ **merge3_report_fields(result)
773
+ }
774
+ output ? payload.merge(output: output) : payload
775
+ end
776
+
777
+ def merge3_report_fields(result)
778
+ {
899
779
  change_classifications: result.fetch(:change_classifications, []),
900
780
  conflicts: result.fetch(:conflicts, []),
901
781
  fallbacks: result.fetch(:fallbacks, []),
902
782
  provider: result.fetch(:provider, {}),
903
783
  verification: result.fetch(:verification, {})
904
784
  }
905
- if result[:ok] && result[:merged_source]
906
- {
907
- ok: true,
908
- diagnostics: result.fetch(:diagnostics),
909
- output: result.fetch(:merged_source),
910
- owned_regions: result.fetch(:owned_regions, []),
911
- render_report: result.fetch(:render_report),
912
- profile: result.fetch(:profile),
913
- policies: [],
914
- **merge3_report_fields
915
- }
916
- elsif !result[:ok] && result[:conflicted_source]
917
- {
918
- ok: false,
919
- diagnostics: result.fetch(:diagnostics),
920
- output: result.fetch(:conflicted_source),
921
- owned_regions: result.fetch(:owned_regions, []),
922
- render_report: result.fetch(:render_report),
923
- profile: result.fetch(:profile),
924
- policies: [],
925
- **merge3_report_fields
926
- }
927
- else
928
- {
929
- ok: false,
930
- diagnostics: result.fetch(:diagnostics),
931
- owned_regions: result.fetch(:owned_regions, []),
932
- render_report: result.fetch(:render_report),
933
- profile: result.fetch(:profile),
934
- policies: [],
935
- **merge3_report_fields
936
- }
937
- end
938
785
  end
939
786
 
940
787
  def normalize_language(language, path_name)
941
- return 'bash' if language.to_s.strip.empty? && %w[.bash .sh].include?(File.extname(path_name.to_s).downcase)
942
- return 'go' if language.to_s.strip.empty? && File.extname(path_name.to_s).downcase == '.go'
943
- return 'html' if language.to_s.strip.empty? && %w[.htm .html].include?(File.extname(path_name.to_s).downcase)
944
- return 'rust' if language.to_s.strip.empty? && File.extname(path_name.to_s).downcase == '.rs'
945
- return 'typescript' if language.to_s.strip.empty? && File.extname(path_name.to_s).downcase == '.ts'
946
- return 'tsx' if language.to_s.strip.empty? && File.extname(path_name.to_s).downcase == '.tsx'
947
-
948
- case language.to_s.strip.downcase
949
- when 'bash', 'sh', 'application/x-sh', 'text/x-shellscript'
950
- 'bash'
951
- when 'go', 'golang'
952
- 'go'
953
- when 'html', 'htm', 'text/html', 'html5'
954
- 'html'
955
- when 'dotenv', 'env', 'config-env'
956
- 'dotenv'
957
- when 'json'
958
- 'json'
959
- when 'jsonc', 'json with comments'
960
- 'jsonc'
961
- when 'json5'
962
- 'json5'
963
- when 'markdown', 'md', 'gfm', 'text/markdown'
964
- 'markdown'
965
- when 'ruby', 'rb', 'application/x-ruby'
966
- 'ruby'
967
- when 'rbs'
968
- 'rbs'
969
- when 'rust', 'rs', 'application/rust', 'text/rust'
970
- 'rust'
971
- when 'toml', 'application/toml'
972
- 'toml'
973
- when 'typescript', 'ts', 'application/typescript', 'text/typescript'
974
- 'typescript'
975
- when 'tsx', 'typescriptreact'
976
- 'tsx'
977
- when 'yaml', 'yml', 'application/yaml', 'text/yaml'
978
- 'yaml'
979
- when 'plain', 'text', 'plaintext', 'text/plain'
980
- 'text'
981
- else
788
+ normalized_language = language.to_s.strip.downcase
789
+ return language_from_path(path_name) if normalized_language.empty?
790
+
791
+ LANGUAGE_ALIASES.fetch(normalized_language) do
792
+ Ast::Merge.classify_template_target_path(path_name)[:family]
793
+ end
794
+ end
795
+
796
+ LANGUAGE_BY_EXTENSION = {
797
+ '.bash' => 'bash', '.sh' => 'bash', '.go' => 'go', '.htm' => 'html', '.html' => 'html',
798
+ '.rs' => 'rust', '.ts' => 'typescript', '.tsx' => 'tsx'
799
+ }.freeze
800
+
801
+ LANGUAGE_ALIASES = {
802
+ 'bash' => 'bash', 'sh' => 'bash', 'application/x-sh' => 'bash', 'text/x-shellscript' => 'bash',
803
+ 'go' => 'go', 'golang' => 'go', 'html' => 'html', 'htm' => 'html', 'text/html' => 'html', 'html5' => 'html',
804
+ 'dotenv' => 'dotenv', 'env' => 'dotenv', 'config-env' => 'dotenv', 'json' => 'json', 'jsonc' => 'jsonc',
805
+ 'json with comments' => 'jsonc', 'json5' => 'json5', 'markdown' => 'markdown', 'md' => 'markdown',
806
+ 'gfm' => 'markdown', 'text/markdown' => 'markdown', 'ruby' => 'ruby', 'rb' => 'ruby',
807
+ 'application/x-ruby' => 'ruby', 'rbs' => 'rbs', 'rust' => 'rust', 'rs' => 'rust',
808
+ 'application/rust' => 'rust', 'text/rust' => 'rust', 'toml' => 'toml', 'application/toml' => 'toml',
809
+ 'typescript' => 'typescript', 'ts' => 'typescript', 'application/typescript' => 'typescript',
810
+ 'text/typescript' => 'typescript', 'tsx' => 'tsx', 'typescriptreact' => 'tsx', 'yaml' => 'yaml',
811
+ 'yml' => 'yaml', 'application/yaml' => 'yaml', 'text/yaml' => 'yaml', 'plain' => 'text', 'text' => 'text',
812
+ 'plaintext' => 'text', 'text/plain' => 'text'
813
+ }.freeze
814
+
815
+ def language_from_path(path_name)
816
+ extension = File.extname(path_name.to_s).downcase
817
+ LANGUAGE_BY_EXTENSION.fetch(extension) do
982
818
  Ast::Merge.classify_template_target_path(path_name)[:family]
983
819
  end
984
820
  end
@@ -994,50 +830,63 @@ module Smorg
994
830
  end
995
831
 
996
832
  def attribute_files_for_path(path_name)
997
- clean_path = if File.expand_path(path_name,
998
- Dir.pwd).start_with?(Dir.pwd)
999
- Pathname.new(path_name).cleanpath.to_s
1000
- else
1001
- path_name
1002
- end
833
+ clean_path = normalized_attribute_path(path_name)
834
+ return ['.gitattributes'] if root_attribute_path?(clean_path)
835
+
836
+ ['.gitattributes', *attribute_directory_paths(File.dirname(clean_path))]
837
+ end
838
+
839
+ def normalized_attribute_path(path_name)
840
+ expanded_path = File.expand_path(path_name, Dir.pwd)
841
+ return Pathname.new(path_name).cleanpath.to_s if expanded_path.start_with?(Dir.pwd)
842
+
843
+ path_name
844
+ end
845
+
846
+ def root_attribute_path?(clean_path)
1003
847
  dir = File.dirname(clean_path)
1004
- return ['.gitattributes'] if dir == '.' || clean_path.start_with?('..') || Pathname.new(clean_path).absolute?
848
+ dir == '.' || clean_path.start_with?('..') || Pathname.new(clean_path).absolute?
849
+ end
1005
850
 
1006
- files = ['.gitattributes']
851
+ def attribute_directory_paths(dir)
1007
852
  parts = dir.split(File::SEPARATOR).reject(&:empty?)
1008
- parts.each_index do |index|
1009
- files << File.join(*parts[0..index], '.gitattributes')
853
+ parts.each_index.map do |index|
854
+ File.join(*parts[0..index], '.gitattributes')
1010
855
  end
1011
- files
1012
856
  end
1013
857
 
1014
858
  def apply_attributes(settings, path_name, source)
1015
859
  source.each_line do |raw_line|
1016
- line = raw_line.strip
1017
- next if line.empty? || line.start_with?('#')
1018
-
1019
- pattern, *fields = line.split(/\s+/)
1020
- next if fields.empty? || !attribute_pattern_matches?(pattern, path_name)
1021
-
1022
- fields.each do |field|
1023
- key, value = field.split('=', 2)
1024
- next unless value
1025
-
1026
- case key
1027
- when 'smorg.language', 'linguist-language'
1028
- settings[:language] = value
1029
- when 'smorg.profile'
1030
- settings[:profile_id] = value
1031
- when 'smorg.requireProfileStatus'
1032
- settings[:require_profile_status] = value
1033
- when 'conflict-marker-size'
1034
- marker_size = value.to_i
1035
- settings[:conflict_marker_size] = marker_size if marker_size.positive?
1036
- end
1037
- end
860
+ attribute_fields(raw_line, path_name).each { |field| apply_attribute_field(settings, field) }
1038
861
  end
1039
862
  end
1040
863
 
864
+ def attribute_fields(raw_line, path_name)
865
+ line = raw_line.strip
866
+ return [] if line.empty? || line.start_with?('#')
867
+
868
+ pattern, *fields = line.split(/\s+/)
869
+ return [] if fields.empty? || !attribute_pattern_matches?(pattern, path_name)
870
+
871
+ fields
872
+ end
873
+
874
+ ATTRIBUTE_KEYS = {
875
+ 'smorg.language' => :language,
876
+ 'linguist-language' => :language,
877
+ 'smorg.profile' => :profile_id,
878
+ 'smorg.requireProfileStatus' => :require_profile_status
879
+ }.freeze
880
+
881
+ def apply_attribute_field(settings, field)
882
+ key, value = field.split('=', 2)
883
+ return unless value
884
+ return settings[ATTRIBUTE_KEYS[key]] = value if ATTRIBUTE_KEYS.key?(key)
885
+
886
+ marker_size = value.to_i
887
+ settings[:conflict_marker_size] = marker_size if key == 'conflict-marker-size' && marker_size.positive?
888
+ end
889
+
1041
890
  def attribute_pattern_matches?(pattern, path_name)
1042
891
  return true if pattern == path_name
1043
892
 
@@ -1049,26 +898,33 @@ module Smorg
1049
898
  end
1050
899
 
1051
900
  def find_conflict_regions(source, marker_size)
1052
- marker_size = [marker_size.to_i, 1].max
1053
- start_prefix = '<' * marker_size
1054
- separator_prefix = '=' * marker_size
1055
- end_prefix = '>' * marker_size
901
+ prefixes = conflict_marker_prefixes(marker_size)
1056
902
  regions = []
1057
903
  current = nil
1058
904
  source.split("\n").each_with_index do |line, index|
1059
- line_number = index + 1
1060
- if line.start_with?(start_prefix)
1061
- current = { start_line: line_number, separator_line: 0 }
1062
- elsif current && current[:separator_line].zero? && line.start_with?(separator_prefix)
1063
- current[:separator_line] = line_number
1064
- elsif current && line.start_with?(end_prefix)
1065
- regions << current.merge(end_line: line_number)
1066
- current = nil
1067
- end
905
+ current, completed = conflict_region_state(current, line, index + 1, prefixes)
906
+ regions << completed if completed
1068
907
  end
1069
908
  regions
1070
909
  end
1071
910
 
911
+ def conflict_marker_prefixes(marker_size)
912
+ size = [marker_size.to_i, 1].max
913
+ { start: '<' * size, separator: '=' * size, end: '>' * size }
914
+ end
915
+
916
+ def conflict_region_state(current, line, line_number, prefixes)
917
+ if line.start_with?(prefixes[:start])
918
+ [{ start_line: line_number, separator_line: 0 }, nil]
919
+ elsif current && current[:separator_line].zero? && line.start_with?(prefixes[:separator])
920
+ [current.merge(separator_line: line_number), nil]
921
+ elsif current && line.start_with?(prefixes[:end])
922
+ [nil, current.merge(end_line: line_number)]
923
+ else
924
+ [current, nil]
925
+ end
926
+ end
927
+
1072
928
  def print_conflict_diff(stdout, path_name, regions)
1073
929
  stdout.puts("conflicts #{path_name}")
1074
930
  stdout.puts("count #{regions.length}")
@@ -1088,7 +944,7 @@ module Smorg
1088
944
  stderr.puts("#{diagnostic[:category]}: #{diagnostic[:message]}")
1089
945
  end
1090
946
  end
1091
- end
947
+ end # rubocop:enable Metrics/ModuleLength
1092
948
  end
1093
949
 
1094
950
  require 'rust/merge'
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smorg-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.3
4
+ version: 7.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -43,42 +43,42 @@ dependencies:
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 7.1.3
46
+ version: 7.1.4
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 7.1.3
53
+ version: 7.1.4
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: ast-merge-git
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 7.1.3
60
+ version: 7.1.4
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 7.1.3
67
+ version: 7.1.4
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: bash-merge
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - '='
73
73
  - !ruby/object:Gem::Version
74
- version: 7.1.3
74
+ version: 7.1.4
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - '='
80
80
  - !ruby/object:Gem::Version
81
- version: 7.1.3
81
+ version: 7.1.4
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: diff-lcs
84
84
  requirement: !ruby/object:Gem::Requirement
@@ -99,56 +99,56 @@ dependencies:
99
99
  requirements:
100
100
  - - '='
101
101
  - !ruby/object:Gem::Version
102
- version: 7.1.3
102
+ version: 7.1.4
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - '='
108
108
  - !ruby/object:Gem::Version
109
- version: 7.1.3
109
+ version: 7.1.4
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: go-merge
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - '='
115
115
  - !ruby/object:Gem::Version
116
- version: 7.1.3
116
+ version: 7.1.4
117
117
  type: :runtime
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - '='
122
122
  - !ruby/object:Gem::Version
123
- version: 7.1.3
123
+ version: 7.1.4
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: html-merge
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - '='
129
129
  - !ruby/object:Gem::Version
130
- version: 7.1.3
130
+ version: 7.1.4
131
131
  type: :runtime
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - '='
136
136
  - !ruby/object:Gem::Version
137
- version: 7.1.3
137
+ version: 7.1.4
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: json-merge
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - '='
143
143
  - !ruby/object:Gem::Version
144
- version: 7.1.3
144
+ version: 7.1.4
145
145
  type: :runtime
146
146
  prerelease: false
147
147
  version_requirements: !ruby/object:Gem::Requirement
148
148
  requirements:
149
149
  - - '='
150
150
  - !ruby/object:Gem::Version
151
- version: 7.1.3
151
+ version: 7.1.4
152
152
  - !ruby/object:Gem::Dependency
153
153
  name: kettle-jem
154
154
  requirement: !ruby/object:Gem::Requirement
@@ -158,7 +158,7 @@ dependencies:
158
158
  version: '7.1'
159
159
  - - ">="
160
160
  - !ruby/object:Gem::Version
161
- version: 7.1.3
161
+ version: 7.1.5
162
162
  type: :runtime
163
163
  prerelease: false
164
164
  version_requirements: !ruby/object:Gem::Requirement
@@ -168,105 +168,119 @@ dependencies:
168
168
  version: '7.1'
169
169
  - - ">="
170
170
  - !ruby/object:Gem::Version
171
- version: 7.1.3
171
+ version: 7.1.5
172
172
  - !ruby/object:Gem::Dependency
173
173
  name: markdown-merge
174
174
  requirement: !ruby/object:Gem::Requirement
175
175
  requirements:
176
176
  - - '='
177
177
  - !ruby/object:Gem::Version
178
- version: 7.1.3
178
+ version: 7.1.4
179
179
  type: :runtime
180
180
  prerelease: false
181
181
  version_requirements: !ruby/object:Gem::Requirement
182
182
  requirements:
183
183
  - - '='
184
184
  - !ruby/object:Gem::Version
185
- version: 7.1.3
185
+ version: 7.1.4
186
186
  - !ruby/object:Gem::Dependency
187
187
  name: plain-merge
188
188
  requirement: !ruby/object:Gem::Requirement
189
189
  requirements:
190
190
  - - '='
191
191
  - !ruby/object:Gem::Version
192
- version: 7.1.3
192
+ version: 7.1.4
193
193
  type: :runtime
194
194
  prerelease: false
195
195
  version_requirements: !ruby/object:Gem::Requirement
196
196
  requirements:
197
197
  - - '='
198
198
  - !ruby/object:Gem::Version
199
- version: 7.1.3
199
+ version: 7.1.4
200
200
  - !ruby/object:Gem::Dependency
201
- name: rbs-merge
201
+ name: prism-merge
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - '='
205
+ - !ruby/object:Gem::Version
206
+ version: 7.1.4
207
+ type: :runtime
208
+ prerelease: false
209
+ version_requirements: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - '='
212
+ - !ruby/object:Gem::Version
213
+ version: 7.1.4
214
+ - !ruby/object:Gem::Dependency
215
+ name: psych-merge
202
216
  requirement: !ruby/object:Gem::Requirement
203
217
  requirements:
204
218
  - - '='
205
219
  - !ruby/object:Gem::Version
206
- version: 7.1.3
220
+ version: 7.1.4
207
221
  type: :runtime
208
222
  prerelease: false
209
223
  version_requirements: !ruby/object:Gem::Requirement
210
224
  requirements:
211
225
  - - '='
212
226
  - !ruby/object:Gem::Version
213
- version: 7.1.3
227
+ version: 7.1.4
214
228
  - !ruby/object:Gem::Dependency
215
- name: ruby-merge
229
+ name: rbs-merge
216
230
  requirement: !ruby/object:Gem::Requirement
217
231
  requirements:
218
232
  - - '='
219
233
  - !ruby/object:Gem::Version
220
- version: 7.1.3
234
+ version: 7.1.4
221
235
  type: :runtime
222
236
  prerelease: false
223
237
  version_requirements: !ruby/object:Gem::Requirement
224
238
  requirements:
225
239
  - - '='
226
240
  - !ruby/object:Gem::Version
227
- version: 7.1.3
241
+ version: 7.1.4
228
242
  - !ruby/object:Gem::Dependency
229
243
  name: rust-merge
230
244
  requirement: !ruby/object:Gem::Requirement
231
245
  requirements:
232
246
  - - '='
233
247
  - !ruby/object:Gem::Version
234
- version: 7.1.3
248
+ version: 7.1.4
235
249
  type: :runtime
236
250
  prerelease: false
237
251
  version_requirements: !ruby/object:Gem::Requirement
238
252
  requirements:
239
253
  - - '='
240
254
  - !ruby/object:Gem::Version
241
- version: 7.1.3
255
+ version: 7.1.4
242
256
  - !ruby/object:Gem::Dependency
243
257
  name: toml-merge
244
258
  requirement: !ruby/object:Gem::Requirement
245
259
  requirements:
246
260
  - - '='
247
261
  - !ruby/object:Gem::Version
248
- version: 7.1.3
262
+ version: 7.1.4
249
263
  type: :runtime
250
264
  prerelease: false
251
265
  version_requirements: !ruby/object:Gem::Requirement
252
266
  requirements:
253
267
  - - '='
254
268
  - !ruby/object:Gem::Version
255
- version: 7.1.3
269
+ version: 7.1.4
256
270
  - !ruby/object:Gem::Dependency
257
271
  name: typescript-merge
258
272
  requirement: !ruby/object:Gem::Requirement
259
273
  requirements:
260
274
  - - '='
261
275
  - !ruby/object:Gem::Version
262
- version: 7.1.3
276
+ version: 7.1.4
263
277
  type: :runtime
264
278
  prerelease: false
265
279
  version_requirements: !ruby/object:Gem::Requirement
266
280
  requirements:
267
281
  - - '='
268
282
  - !ruby/object:Gem::Version
269
- version: 7.1.3
283
+ version: 7.1.4
270
284
  - !ruby/object:Gem::Dependency
271
285
  name: version_gem
272
286
  requirement: !ruby/object:Gem::Requirement
@@ -287,20 +301,6 @@ dependencies:
287
301
  - - ">="
288
302
  - !ruby/object:Gem::Version
289
303
  version: 1.1.15
290
- - !ruby/object:Gem::Dependency
291
- name: yaml-merge
292
- requirement: !ruby/object:Gem::Requirement
293
- requirements:
294
- - - '='
295
- - !ruby/object:Gem::Version
296
- version: 7.1.3
297
- type: :runtime
298
- prerelease: false
299
- version_requirements: !ruby/object:Gem::Requirement
300
- requirements:
301
- - - '='
302
- - !ruby/object:Gem::Version
303
- version: 7.1.3
304
304
  - !ruby/object:Gem::Dependency
305
305
  name: kettle-dev
306
306
  requirement: !ruby/object:Gem::Requirement
@@ -310,7 +310,7 @@ dependencies:
310
310
  version: '3.0'
311
311
  - - ">="
312
312
  - !ruby/object:Gem::Version
313
- version: 3.0.0
313
+ version: 3.0.7
314
314
  type: :development
315
315
  prerelease: false
316
316
  version_requirements: !ruby/object:Gem::Requirement
@@ -320,7 +320,7 @@ dependencies:
320
320
  version: '3.0'
321
321
  - - ">="
322
322
  - !ruby/object:Gem::Version
323
- version: 3.0.0
323
+ version: 3.0.7
324
324
  - !ruby/object:Gem::Dependency
325
325
  name: bundler-audit
326
326
  requirement: !ruby/object:Gem::Requirement
@@ -418,7 +418,7 @@ dependencies:
418
418
  version: '2.0'
419
419
  - - ">="
420
420
  - !ruby/object:Gem::Version
421
- version: 2.0.19
421
+ version: 2.0.20
422
422
  type: :development
423
423
  prerelease: false
424
424
  version_requirements: !ruby/object:Gem::Requirement
@@ -428,7 +428,7 @@ dependencies:
428
428
  version: '2.0'
429
429
  - - ">="
430
430
  - !ruby/object:Gem::Version
431
- version: 2.0.19
431
+ version: 2.0.20
432
432
  - !ruby/object:Gem::Dependency
433
433
  name: turbo_tests2
434
434
  requirement: !ruby/object:Gem::Requirement
@@ -438,7 +438,7 @@ dependencies:
438
438
  version: '3.2'
439
439
  - - ">="
440
440
  - !ruby/object:Gem::Version
441
- version: 3.2.5
441
+ version: 3.2.6
442
442
  type: :development
443
443
  prerelease: false
444
444
  version_requirements: !ruby/object:Gem::Requirement
@@ -448,7 +448,7 @@ dependencies:
448
448
  version: '3.2'
449
449
  - - ">="
450
450
  - !ruby/object:Gem::Version
451
- version: 3.2.5
451
+ version: 3.2.6
452
452
  - !ruby/object:Gem::Dependency
453
453
  name: ruby-progressbar
454
454
  requirement: !ruby/object:Gem::Requirement
@@ -492,7 +492,7 @@ dependencies:
492
492
  version: '2.0'
493
493
  - - ">="
494
494
  - !ruby/object:Gem::Version
495
- version: 2.0.11
495
+ version: 2.0.12
496
496
  type: :development
497
497
  prerelease: false
498
498
  version_requirements: !ruby/object:Gem::Requirement
@@ -502,7 +502,7 @@ dependencies:
502
502
  version: '2.0'
503
503
  - - ">="
504
504
  - !ruby/object:Gem::Version
505
- version: 2.0.11
505
+ version: 2.0.12
506
506
  description: "\U0001F48E Git-compatible StructuredMerge command surface for the Ruby
507
507
  implementation."
508
508
  email:
@@ -525,10 +525,10 @@ licenses:
525
525
  - PolyForm-Small-Business-1.0.0
526
526
  metadata:
527
527
  homepage_uri: https://structuredmerge.org
528
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.3
529
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.3/CHANGELOG.md
528
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.4
529
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.4/CHANGELOG.md
530
530
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
531
- documentation_uri: https://www.rubydoc.info/gems/smorg-rb/7.1.3
531
+ documentation_uri: https://www.rubydoc.info/gems/smorg-rb/7.1.4
532
532
  funding_uri: https://github.com/sponsors/pboling
533
533
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
534
534
  news_uri: https://www.railsbling.com/tags/smorg-rb
metadata.gz.sig CHANGED
Binary file